def startNewHypervisor(self, port, processcheck=True): """ Create a new dynamips process and start it """ proc = QtCore.QProcess(globals.GApp.mainWindow) if self.hypervisor_wd: # set the working directory proc.setWorkingDirectory(self.hypervisor_wd) if processcheck: # test if a hypervisor is already running on this port s = socket(AF_INET, SOCK_STREAM) s.setblocking(0) s.settimeout(300) try: s.connect(('localhost', port)) s.close() reply = QtGui.QMessageBox.question(globals.GApp.mainWindow, translate("HypervisorManager", "Hypervisor Manager"), unicode(translate("HypervisorManager", "Apparently an hypervisor is already running on port %i, would you like to kill all Dynamips processes?")) % port, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: killAll(os.path.basename(self.hypervisor_path)) time.sleep(1) else: print "Incrementing +100 for base console port, base AUX port, base hypervisor port and base UDP port" self.baseConsole += 100 if self.baseAUX: self.baseAUX += 100 globals.hypervisor_baseport += 100 globals.GApp.dynagen.globaludp += 100 port = globals.hypervisor_baseport s.connect(('localhost', port)) s.close() QtGui.QMessageBox.critical(globals.GApp.mainWindow, translate("HypervisorManager", "Hypervisor Manager"), unicode(translate("HypervisorManager", "A program is still running on port %i, you will have to stop it manually or change port settings")) % port) globals.hypervisor_baseport += 1 return None except: s.close() # start dynamips in hypervisor mode (-H) proc.start( self.hypervisor_path , ['-H', str(port)]) if proc.waitForStarted() == False: QtGui.QMessageBox.critical(globals.GApp.mainWindow, 'Hypervisor Manager', unicode(translate("HypervisorManager", "Can't start Dynamips on port %i")) % port) return None hypervisor = {'port': port, 'proc_instance': proc, 'load': 0, 'image_ref': ''} self.hypervisors.append(hypervisor) return hypervisor
def slotTestSettings(self): """ Test the IOS image using Dynamips in a terminal """ image_path = unicode(self.lineEditIOSImage.text(), 'utf-8', errors='replace') if not image_path: return if self.checkBoxIntegratedHypervisor.checkState() == QtCore.Qt.Checked: QtGui.QMessageBox.critical(self, translate("IOSDialog", "Test Settings"), translate("IOSDialog", "Only local IOS images can be tested")) return if len(globals.GApp.topology.nodes): reply = QtGui.QMessageBox.question(self, translate("IOSDialog", "Test Settings"), translate("IOSDialog", "This action is going to delete your current topology, would you like to continue?"), QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.No: return globals.GApp.workspace.clear() dynamips_path = globals.GApp.systconf['dynamips'].path dynamips_workdir = globals.GApp.systconf['dynamips'].workdir if not dynamips_path: QtGui.QMessageBox.critical(self, translate("IOSDialog", "Dynamips path"), translate("IOSDialog", "Dynamips path must be set")) return if not dynamips_workdir: QtGui.QMessageBox.critical(self, translate("IOSDialog", "Dynamips working directory"), translate("IOSDialog", "Dynamips working directory must be set")) return if not sys.platform.startswith('win') and self.testedSettings: if sys.platform.startswith('darwin'): killAll(os.path.basename(globals.GApp.systconf['dynamips'].path)) else: killAll(globals.GApp.systconf['dynamips'].path) platform = str(self.comboBoxPlatform.currentText())[1:] if platform == '3700': platform = str(self.comboBoxChassis.currentText()) ram = self.spinBoxDefaultRAM.value() idlepc = str(self.lineEditIdlePC.text()).strip() if not idlepc: idlepc = '0x0' cmd = '' if sys.platform.startswith('win'): cmd = 'set PATH=%%~dp0;%%PATH%% && cd "%s" && ' % dynamips_workdir dynamips_path = os.path.realpath(dynamips_path) cmd += '"%s" -P %s -r %i --idle-pc %s "%s"' % (dynamips_path, platform, ram, idlepc, image_path) elif sys.platform.startswith('darwin'): cmd += '%s -P %s -r %i --idle-pc %s \\"%s\\"' % (dynamips_path, platform, ram, idlepc, image_path) else: cmd += '%s -P %s -r %i --idle-pc %s "%s"' % (dynamips_path, platform, ram, idlepc, image_path) if os.path.basename(image_path).startswith("c7200p"): # set NPE-G2 for 7200p platform (PPC32 processor) cmd += " -t npe-g2" runTerminal(cmd, dynamips_workdir, False) self.testedSettings = True
def __del__(self): if not sys.platform.startswith('win') and self.testedSettings and globals.GApp.systconf['dynamips'].path: if sys.platform.startswith('darwin'): killAll(os.path.basename(globals.GApp.systconf['dynamips'].path)) else: killAll(globals.GApp.systconf['dynamips'].path) # Delete nodes that use deleted IOS node_list = globals.GApp.topology.nodes.values() for node in node_list: if type(node) == IOSRouter and node.config.image != '' and not globals.GApp.iosimages.has_key(node.config.image): for link in node.getEdgeList().copy(): globals.GApp.topology.deleteLink(link) globals.GApp.topology.deleteNode(node.id) # Add a default image for node that don't have one for node in globals.GApp.topology.nodes.values(): if type(node) == IOSRouter and node.config.image == '' and not globals.GApp.iosimages.has_key(node.config.image): node.setDefaultIOSImage() globals.GApp.syncConf()
def startNewHypervisor(self, port, binding=None, processcheck=True): """ Create a new dynamips process and start it """ if binding == None: if self.dynamips.HypervisorManager_binding and self.dynamips.HypervisorManager_binding != '0.0.0.0': binding = self.dynamips.HypervisorManager_binding else: binding = '127.0.0.1' proc = QtCore.QProcess(globals.GApp.mainWindow) if self.hypervisor_wd: # set the working directory proc.setWorkingDirectory(self.hypervisor_wd) if processcheck: # test if a hypervisor is already running on this port timeout = 60.0 try: #FIXME: replace with bind() for faster process? s = socket.create_connection((binding, port), timeout) s.close() reply = QtGui.QMessageBox.question(globals.GApp.mainWindow, translate("HypervisorManager", "Hypervisor Manager"), translate("HypervisorManager", "Apparently an hypervisor is already running on %s port %i, would you like to kill all Dynamips processes?") % (binding, port), QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: killAll(os.path.basename(self.hypervisor_path)) time.sleep(1) else: print "Incrementing +100 for base console port, base AUX port, base hypervisor port and +200 for base UDP port" self.baseConsole += 100 if self.baseAUX: self.baseAUX += 100 globals.hypervisor_baseport += 100 globals.GApp.dynagen.globaludp += 200 port = globals.hypervisor_baseport #FIXME: replace with bind() for faster process? s = socket.create_connection((binding, port), timeout) s.close() QtGui.QMessageBox.critical(globals.GApp.mainWindow, translate("HypervisorManager", "Hypervisor Manager"), translate("HypervisorManager", "A program is still running on %s port %i, you will have to stop it manually or change port settings") % (binding, port)) globals.hypervisor_baseport += 1 return None except: pass try: # start dynamips in hypervisor mode (-H) # Dynamips version 0.2.8-RC3 and before cannot accept a specific port when binding on a chosen address with param -H <IP address:port> (bug is inside Dynamips). if self.dynamips.detected_version and StrictVersion(self.dynamips.detected_version.replace("-RC", "b").split('-', 1)[0]) > '0.2.8b3' and self.dynamips.HypervisorManager_binding != '0.0.0.0': debug("Starting Dynamips with -H %s:%i" % (binding, port)) proc.start(self.hypervisor_path, ['-H', binding + ':' + str(port)]) else: debug("Starting Dynamips with -H %i" % port) proc.start(self.hypervisor_path, ['-H', str(port)]) except: debug('Exception with StrictVersion()') proc.start(self.hypervisor_path, ['-H', str(port)]) if proc.waitForStarted() == False: QtGui.QMessageBox.critical(globals.GApp.mainWindow, 'Hypervisor Manager', translate("HypervisorManager", "Can't start Dynamips on %s port %i") % (binding, port)) return None hypervisor = {'host': binding, 'port': port, 'proc_instance': proc, 'load': 0, 'image_ref': ''} self.hypervisors.append(hypervisor) return hypervisor
def startNewHypervisor(self, port, binding=None, processcheck=True): """ Create a new dynamips process and start it """ if binding == None: if self.dynamips.HypervisorManager_binding and self.dynamips.HypervisorManager_binding != '0.0.0.0': binding = self.dynamips.HypervisorManager_binding else: binding = '127.0.0.1' proc = QtCore.QProcess(globals.GApp.mainWindow) if self.hypervisor_wd: # set the working directory proc.setWorkingDirectory(self.hypervisor_wd) if processcheck: # test if a hypervisor is already running on this port timeout = 60.0 try: #FIXME: replace with bind() for faster process? s = socket.create_connection((binding, port), timeout) s.close() reply = QtGui.QMessageBox.question( globals.GApp.mainWindow, translate("HypervisorManager", "Hypervisor Manager"), translate( "HypervisorManager", "Apparently an hypervisor is already running on %s port %i, would you like to kill all Dynamips processes?" ) % (binding, port), QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: killAll(os.path.basename(self.hypervisor_path)) time.sleep(1) else: print "Incrementing +100 for base console port, base AUX port, base hypervisor port and +200 for base UDP port" self.baseConsole += 100 if self.baseAUX: self.baseAUX += 100 globals.hypervisor_baseport += 100 globals.GApp.dynagen.globaludp += 200 port = globals.hypervisor_baseport #FIXME: replace with bind() for faster process? s = socket.create_connection((binding, port), timeout) s.close() QtGui.QMessageBox.critical( globals.GApp.mainWindow, translate("HypervisorManager", "Hypervisor Manager"), translate( "HypervisorManager", "A program is still running on %s port %i, you will have to stop it manually or change port settings" ) % (binding, port)) globals.hypervisor_baseport += 1 return None except: pass try: # start dynamips in hypervisor mode (-H) # Dynamips version 0.2.8-RC3 and before cannot accept a specific port when binding on a chosen address with param -H <IP address:port> (bug is inside Dynamips). if self.dynamips.detected_version and StrictVersion( self.dynamips.detected_version.replace("-RC", "b").split( '-', 1)[0] ) > '0.2.8b3' and self.dynamips.HypervisorManager_binding != '0.0.0.0': debug("Starting Dynamips with -H %s:%i" % (binding, port)) proc.start(self.hypervisor_path, ['-H', binding + ':' + str(port)]) else: debug("Starting Dynamips with -H %i" % port) proc.start(self.hypervisor_path, ['-H', str(port)]) except: debug('Exception with StrictVersion()') proc.start(self.hypervisor_path, ['-H', str(port)]) if proc.waitForStarted() == False: QtGui.QMessageBox.critical( globals.GApp.mainWindow, 'Hypervisor Manager', translate("HypervisorManager", "Can't start Dynamips on %s port %i") % (binding, port)) return None hypervisor = { 'host': binding, 'port': port, 'proc_instance': proc, 'load': 0, 'image_ref': '' } self.hypervisors.append(hypervisor) return hypervisor