コード例 #1
0
    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
コード例 #2
0
ファイル: IOSDialog.py プロジェクト: yudevan/gns3-ppa
    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
コード例 #3
0
    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
コード例 #4
0
ファイル: IOSDialog.py プロジェクト: yudevan/gns3-ppa
    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()
コード例 #5
0
    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()
コード例 #6
0
ファイル: HypervisorManager.py プロジェクト: GNS3/gns3-legacy
    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
コード例 #7
0
    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