class App(QMainWindow): # Signal emitted from database sig_changed_rpcServers = pyqtSignal() def __init__(self, imgDir, app, start_args): # Create the userdir if it doesn't exist if not os.path.exists(user_dir): os.makedirs(user_dir) # Initialize Logs initLogs() super().__init__() self.app = app # Register the signal handlers signal.signal(signal.SIGTERM, service_shutdown) signal.signal(signal.SIGINT, service_shutdown) # Get version and title self.version = getSPMTVersion() self.title = 'SPMT - Secure PIVX Masternode Tool - v.%s-%s' % (self.version['number'], self.version['tag']) # Open database self.db = Database(self) self.db.openDB() # Clean v4 migration (read data from old files and delete them) clean_v4_migration(self) # Check for startup args (clear data) if start_args.clearAppData: settings = QSettings('PIVX', 'SecurePivxMasternodeTool') settings.clear() if start_args.clearRpcData: self.db.clearTable('CUSTOM_RPC_SERVERS') if start_args.clearMnData: self.db.clearTable('MASTERNODES') if start_args.clearTxCache: self.db.clearTable('RAWTXES') # Clear Rewards and Governance DB (in case of forced shutdown) self.db.clearTable('REWARDS') self.db.clearTable('PROPOSALS') self.db.clearTable('MY_VOTES') # Remove raw txes updated earlier than two months ago (if not already cleared) if not start_args.clearTxCache: self.db.clearRawTxes(time() - SECONDS_IN_2_MONTHS) # Read Masternode List masternode_list = self.db.getMasternodeList() # Read cached app data self.cache = readCacheSettings() # Initialize user interface self.initUI(masternode_list, imgDir) def initUI(self, masternode_list, imgDir): # Set title and geometry self.setWindowTitle(self.title) self.resize(self.cache.get("window_width"), self.cache.get("window_height")) # Set Icons self.spmtIcon = QIcon(os.path.join(imgDir, 'spmtLogo_shield.png')) self.pivx_icon = QIcon(os.path.join(imgDir, 'icon_pivx.png')) self.script_icon = QIcon(os.path.join(imgDir, 'icon_script.png')) self.setWindowIcon(self.spmtIcon) # Sort masternode list (by alias if no previous order set) if self.cache.get('mnList_order') != {} and ( len(self.cache.get('mnList_order')) == len(masternode_list)): try: masternode_list.sort(key=self.extract_order) except Exception as e: print(e) masternode_list.sort(key=self.extract_name) else: masternode_list.sort(key=self.extract_name) # Create main window self.mainWindow = MainWindow(self, masternode_list, imgDir) self.setCentralWidget(self.mainWindow) # Add RPC server menu mainMenu = self.menuBar() confMenu = mainMenu.addMenu('Setup') self.rpcConfMenu = QAction(self.pivx_icon, 'RPC Servers config...', self) self.rpcConfMenu.triggered.connect(self.onEditRPCServer) confMenu.addAction(self.rpcConfMenu) self.loadMNConfAction = QAction(self.script_icon, 'Import "masternode.conf" file', self) self.loadMNConfAction.triggered.connect(self.loadMNConf) confMenu.addAction(self.loadMNConfAction) toolsMenu = mainMenu.addMenu('Tools') self.signVerifyAction = QAction('Sign/Verify message', self) self.signVerifyAction.triggered.connect(self.onSignVerifyMessage) toolsMenu.addAction(self.signVerifyAction) # Show self.show() self.activateWindow() def extract_name(self, json): try: return json['name'].lower() except KeyError: return 0 def extract_order(self, json): try: name = json['name'] if name in self.cache.get('mnList_order'): return self.cache.get('mnList_order').get(name) return 0 except KeyError: return 0 def closeEvent(self, *args, **kwargs): # Terminate the running threads. # Set the shutdown flag on each thread to trigger a clean shutdown of each thread. self.mainWindow.myRpcWd.shutdown_flag.set() logging.debug("Saving stuff & closing...") try: self.mainWindow.hwdevice.clearDevice() except Exception as e: logging.warning(str(e)) # Update window/splitter size self.cache['window_width'] = self.width() self.cache['window_height'] = self.height() self.cache['splitter_x'] = self.mainWindow.splitter.sizes()[0] self.cache['splitter_y'] = self.mainWindow.splitter.sizes()[1] self.cache['console_hidden'] = (self.mainWindow.btn_consoleToggle.text() == 'Show') # Update mnList order to cache settings mnOrder = {} mnList = self.mainWindow.tabMain.myList for i in range(mnList.count()): mnName = mnList.itemWidget(mnList.item(i)).alias mnOrder[mnName] = i self.cache['mnList_order'] = mnOrder # persist cache saveCacheSettings(self.cache) # Clear Rewards and Governance DB try: self.db.openDB() except Exception: pass self.db.removeTable('REWARDS') self.db.removeTable('PROPOSALS') self.db.removeTable('MY_VOTES') # close database self.db.close() # Adios print("Bye Bye.") # Return return QMainWindow.closeEvent(self, *args, **kwargs) def loadMNConf(self): options = QFileDialog.Options() fileName, _ = QFileDialog.getOpenFileName(self, 'Open masternode.conf', 'masternode.conf', 'Text Files (*.conf)', options=options) if fileName: self.mainWindow.loadMNConf(fileName) def onEditRPCServer(self): # Create Dialog ui = ConfigureRPCservers_dlg(self) if ui.exec(): printDbg("Configuring RPC Servers...") def onSignVerifyMessage(self): # Create Dialog ui = SignMessage_dlg(self.mainWindow) if ui.exec(): printDbg("Sign/Verify message...")
class App(QMainWindow): def __init__(self, masternode_list, imgDir, app): super().__init__() self.app = app # Register the signal handlers signal.signal(signal.SIGTERM, service_shutdown) signal.signal(signal.SIGINT, service_shutdown) # Get version and title self.version = getSPMTVersion() self.title = 'SPMT - Secure PIVX Masternode Tool - v.%s-%s' % ( self.version['number'], self.version['tag']) # Create the userdir if it doesn't exist if not os.path.exists(user_dir): os.makedirs(user_dir) # Read cache self.cache = readCacheFile() # Initialize user interface self.initUI(masternode_list, imgDir) def initUI(self, masternode_list, imgDir): # Set title and geometry self.setWindowTitle(self.title) self.resize(self.cache.get("window_width"), self.cache.get("window_height")) # Set Icons self.spmtIcon = QIcon(os.path.join(imgDir, 'spmtLogo_shield.png')) self.pivx_icon = QIcon(os.path.join(imgDir, 'icon_pivx.png')) self.script_icon = QIcon(os.path.join(imgDir, 'icon_script.png')) self.setWindowIcon(self.spmtIcon) # Add RPC server menu mainMenu = self.menuBar() confMenu = mainMenu.addMenu('Setup') self.rpcConfMenu = QAction(self.pivx_icon, 'Local RPC Server...', self) self.rpcConfMenu.triggered.connect(self.onEditRPCServer) confMenu.addAction(self.rpcConfMenu) self.loadMNConfAction = QAction(self.script_icon, 'Import "masternode.conf" file', self) self.loadMNConfAction.triggered.connect(self.loadMNConf) confMenu.addAction(self.loadMNConfAction) # Sort masternode list (by alias if no previous order set) if self.cache.get('mnList_order') != {}: masternode_list.sort(key=self.extract_order) else: masternode_list.sort(key=self.extract_name) # Create main window self.mainWindow = MainWindow(self, masternode_list, imgDir) self.setCentralWidget(self.mainWindow) # Show self.show() self.activateWindow() def extract_name(self, json): try: return json['name'].lower() except KeyError: return 0 def extract_order(self, json): try: name = json['name'] return self.cache.get('mnList_order').get(name) except KeyError: return 0 def closeEvent(self, *args, **kwargs): sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ # Terminate the running threads. # Set the shutdown flag on each thread to trigger a clean shutdown of each thread. self.mainWindow.myRpcWd.shutdown_flag.set() print("Saving stuff & closing...") if getattr(self.mainWindow.hwdevice, 'dongle', None) is not None: self.mainWindow.hwdevice.dongle.close() print("Dongle closed") # Save window/splitter size to cache file self.cache["window_width"] = self.width() self.cache["window_height"] = self.height() self.cache["splitter_sizes"] = self.mainWindow.splitter.sizes() self.cache["console_hidden"] = ( self.mainWindow.btn_consoleToggle.text() == 'Show') # Save mnList order to cache file mnOrder = {} mnList = self.mainWindow.tabMain.myList for i in range(mnList.count()): mnName = mnList.itemWidget(mnList.item(i)).alias mnOrder[mnName] = i self.cache['mnList_order'] = mnOrder # Write cache file writeToFile(self.cache, cache_File) print("Bye Bye.") return QMainWindow.closeEvent(self, *args, **kwargs) def loadMNConf(self): options = QFileDialog.Options() fileName, _ = QFileDialog.getOpenFileName(self, 'Open masternode.conf', 'masternode.conf', 'Text Files (*.conf)', options=options) if fileName: self.mainWindow.loadMNConf(fileName) def onEditRPCServer(self): # Create Dialog ui = ConfigureRPCserver_dlg(self) if ui.exec(): printDbg("Configuring RPC Server...")