|
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 | import sys |
| 3 | +from ipaddress import ip_network |
3 | 4 |
|
4 | 5 | from PySide6.QtWidgets import * |
5 | | -from PySide6.QtCore import Qt, Slot, QSettings, QTranslator |
| 6 | +from PySide6.QtCore import QSettings, Qt, QTranslator, Slot |
6 | 7 | from PySide6.QtGui import QAction |
7 | 8 |
|
8 | 9 | from constants import GTDB_IPS, ONLINE_SERVICES, DefaultConfig |
@@ -71,7 +72,7 @@ def __init__(self, parent=None): |
71 | 72 | self.ui.actResetSettings.triggered.connect(self._reset_settings) |
72 | 73 | self.settings = QSettings('GoodCoder666', 'IPFinder') |
73 | 74 | if set(self.settings.allKeys()) == { |
74 | | - 'appearance/style', 'appearance/font', 'appearance/language', 'test/host', |
| 75 | + 'appearance/style', 'appearance/font', 'appearance/language', 'scan/ranges', 'test/host', |
75 | 76 | 'test/template', 'test/num_threads', 'test/timeout', 'test/repeat', 'saveHosts'}: |
76 | 77 | self._update_ui() |
77 | 78 | else: |
@@ -130,6 +131,7 @@ def _reset_settings(self): |
130 | 131 | self.settings.setValue('appearance/style', QApplication.style().objectName()) |
131 | 132 | self.settings.setValue('appearance/font', self.default_font) |
132 | 133 | self.settings.setValue('appearance/language', DefaultConfig.language) |
| 134 | + self.settings.setValue('scan/ranges', DefaultConfig.scan_ranges) |
133 | 135 | self.settings.setValue('test/host', DefaultConfig.test_host) |
134 | 136 | self.settings.setValue('test/template', DefaultConfig.template) |
135 | 137 | self.settings.setValue('test/num_threads', DefaultConfig.num_threads) |
@@ -363,21 +365,36 @@ def on_btnWait_Scan_clicked(self): |
363 | 365 | self.ui.btnWait_Scan.setEnabled(False) |
364 | 366 | self.sthread.cancel() |
365 | 367 | return |
366 | | - dlg = dlgScan(self) |
| 368 | + |
| 369 | + dlg = dlgScan(self, self.settings.value('scan/ranges')) |
367 | 370 | if dlg.exec() == QDialog.Accepted: |
368 | 371 | max_ips = dlg.ui.spinBox_MaxIP.value() |
369 | 372 | num_workers = int(dlg.ui.comboBox_threads.currentText()) |
370 | 373 | timeout = dlg.ui.spinBox_timeout.value() |
371 | | - enableOptimization = dlg.ui.chkBox_optimize.isChecked() |
372 | 374 | autoTest = dlg.ui.chkBox_autoTest.isChecked() |
373 | | - extend4 = dlg.ui.chkBox_extend4.isChecked() |
374 | | - extend6 = dlg.ui.chkBox_extend6.isChecked() |
375 | 375 | randomized = dlg.ui.chkBox_randomizeScan.isChecked() |
376 | 376 |
|
| 377 | + # process IP ranges |
| 378 | + ip_ranges = dlg.ip_ranges |
| 379 | + try: |
| 380 | + ip_networks = [ip_network(ip_range) for enabled, ip_range, _ in ip_ranges if enabled] |
| 381 | + except ValueError: |
| 382 | + for enabled, ip_range, _ in ip_ranges: |
| 383 | + if not enabled: continue |
| 384 | + try: |
| 385 | + ip_network(ip_range) |
| 386 | + except ValueError: |
| 387 | + QMessageBox.critical(self, self.tr('错误'), self.tr('%s 不是一个合法的 IP 段。') % ip_range) |
| 388 | + return |
| 389 | + if not ip_networks: |
| 390 | + QMessageBox.critical(self, self.tr('错误'), self.tr('请至少选择一个 IP 段。')) |
| 391 | + return |
| 392 | + self.settings.setValue('scan/ranges', ip_ranges) |
| 393 | + |
377 | 394 | self._set_buttons_enabled(False) |
378 | 395 | self.ui.ipList.clear() |
379 | | - thread = ScanThread(self, max_ips, num_workers, timeout, |
380 | | - enableOptimization, extend4, extend6, randomized) |
| 396 | + |
| 397 | + thread = ScanThread(self, ip_networks, max_ips, num_workers, timeout, randomized) |
381 | 398 | thread.finished.connect(self._test_ips if autoTest else self._after_scan) |
382 | 399 | thread.foundAvailable.connect(self._report_single_scan_result) |
383 | 400 | thread.progressUpdate.connect(self._scan_update) |
|
0 commit comments