def saveSettings(self, settings, node=None, group=False): """ Saves the VirtualBox VM settings. :param settings: the settings (dictionary) :param node: Node instance :param group: indicates the settings apply to a group of VMs """ # these settings cannot be shared by nodes and updated # in the node configurator. if not group: if "name" in settings: name = self.uiNameLineEdit.text() if not name: QtGui.QMessageBox.critical( self, "Name", "VirtualBox name cannot be empty!") else: settings["name"] = name if "console" in settings: settings["console"] = self.uiConsolePortSpinBox.value() if "linked_base" in settings: settings["linked_base"] = self.uiBaseVMCheckBox.isChecked() settings[ "enable_remote_console"] = self.uiEnableConsoleCheckBox.isChecked( ) else: del settings["name"] del settings["console"] del settings["enable_remote_console"] settings["ram"] = self.uiVMRamSpinBox.value() settings["adapter_type"] = self.uiAdapterTypesComboBox.currentText() settings["headless"] = self.uiHeadlessModeCheckBox.isChecked() settings["use_any_adapter"] = self.uiUseAnyAdapterCheckBox.isChecked() adapters = self.uiAdaptersSpinBox.value() if node: if settings["adapters"] != adapters: # check if the adapters settings have changed node_ports = node.ports() for node_port in node_ports: if not node_port.isFree(): QtGui.QMessageBox.critical( self, node.name(), "Changing the number of adapters while links are connected isn't supported yet! Please delete all the links first." ) raise ConfigurationError() settings["adapters"] = adapters
def _checkForLinkConnectedToWIC(self, wic_number, settings, node): """ Checks if links are connected to a WIC. :param wic_number: WIC slot number :param settings: IOS router settings :param node: Node instance """ node_ports = node.ports() for node_port in node_ports: # ports > 15 are WICs ones. if node_port.adapterNumber() == wic_number and node_port.portNumber() > 15 and not node_port.isFree(): wic = settings["wic" + str(wic_number)] index = self._widget_wics[wic_number].findText(wic) if index != -1: self._widget_wics[wic_number].setCurrentIndex(index) QtGui.QMessageBox.critical(self, node.name(), "A link is connected to port {} on {}, please remove it first".format(node_port.name(), wic)) raise ConfigurationError()
def _checkForLinkConnectedToAdapter(self, slot_number, settings, node): """ Checks if links are connected to an adapter. :param slot_number: adapter slot number :param settings: IOS router settings :param node: Node instance """ node_ports = node.ports() for node_port in node_ports: # ports > 15 are WICs ones. if node_port.adapterNumber() == slot_number and node_port.portNumber() <= 15 and not node_port.isFree(): adapter = settings["slot" + str(slot_number)] index = self._widget_slots[slot_number].findText(adapter) if index != -1: self._widget_slots[slot_number].setCurrentIndex(index) QtGui.QMessageBox.critical(self, node.name(), "A link is connected to port {} on adapter {}, please remove it first".format(node_port.name(), adapter)) raise ConfigurationError()
def saveSettings(self, settings, node, group=False): """ Saves the Ethernet hub settings. :param settings: the settings (dictionary) :param node: Node instance :param group: indicates the settings apply to a group """ if not group: # set the device name name = self.uiNameLineEdit.text() if not name: QtGui.QMessageBox.critical( self, "Name", "Ethernet hub name cannot be empty!") else: settings["name"] = name else: del settings["name"] nbports = self.uiPortsSpinBox.value() # check that a link isn't connected to a port # before we delete it ports = node.ports() for port in ports: if not port.isFree() and port.portNumber() > nbports: self.loadSettings(settings, node) QtGui.QMessageBox.critical( self, node.name(), "A link is connected to port {}, please remove it first". format(port.name())) raise ConfigurationError() settings["ports"] = [] for port in range(1, nbports + 1): settings["ports"].append(str(port))
def saveSettings(self, settings, node=None, group=False): """ Saves the IOU device settings. :param settings: the settings (dictionary) :param node: Node instance :param group: indicates the settings apply to a group of routers """ # these settings cannot be shared by nodes and updated # in the node configurator. if not group: # set the device name name = self.uiNameLineEdit.text() if not name: QtGui.QMessageBox.critical(self, "Name", "IOU device name cannot be empty!") elif node and not node.validateHostname(name): QtGui.QMessageBox.critical( self, "Name", "Invalid name detected for IOU device: {}".format(name)) else: settings["name"] = name if "console" in settings: settings["console"] = self.uiConsolePortSpinBox.value() # save the IOU image path ios_path = self.uiIOUImageLineEdit.text().strip() if ios_path: settings["path"] = ios_path else: del settings["name"] del settings["console"] if not node: initial_config = self.uiInitialConfigLineEdit.text().strip() if not initial_config: settings["initial_config"] = "" elif initial_config != settings["initial_config"]: if os.access(initial_config, os.R_OK): settings["initial_config"] = initial_config else: QtGui.QMessageBox.critical( self, "Initial-config", "Cannot read the initial-config file") # save advanced settings settings["l1_keepalives"] = self.uiL1KeepalivesCheckBox.isChecked() settings[ "use_default_iou_values"] = self.uiDefaultValuesCheckBox.isChecked( ) settings["ram"] = self.uiRamSpinBox.value() settings["nvram"] = self.uiNvramSpinBox.value() ethernet_adapters = self.uiEthernetAdaptersSpinBox.value() serial_adapters = self.uiSerialAdaptersSpinBox.value() if ethernet_adapters + serial_adapters > 16: QtGui.QMessageBox.warning( self, settings["name"], "The total number of adapters cannot exceed 16") raise ConfigurationError() if node: if settings["ethernet_adapters"] != ethernet_adapters or settings[ "serial_adapters"] != serial_adapters: # check if the adapters settings have changed node_ports = node.ports() for node_port in node_ports: if not node_port.isFree(): QtGui.QMessageBox.critical( self, node.name(), "Changing the number of adapters while links are connected isn't supported yet! Please delete all the links first." ) raise ConfigurationError() settings["ethernet_adapters"] = ethernet_adapters settings["serial_adapters"] = serial_adapters
def saveSettings(self, settings, node=None, group=False): """ Saves the QEMU VM settings. :param settings: the settings (dictionary) :param node: Node instance :param group: indicates the settings apply to a group of VMs """ # these settings cannot be shared by nodes and updated # in the node configurator. if not group: name = self.uiNameLineEdit.text() if not name: QtGui.QMessageBox.critical(self, "Name", "The QEMU VM name cannot be empty!") else: settings["name"] = name if "console" in settings: settings["console"] = self.uiConsolePortSpinBox.value() settings["hda_disk_image"] = self.uiHdaDiskImageLineEdit.text().strip() settings["hdb_disk_image"] = self.uiHdbDiskImageLineEdit.text().strip() settings["hdc_disk_image"] = self.uiHdcDiskImageLineEdit.text().strip() settings["hdd_disk_image"] = self.uiHddDiskImageLineEdit.text().strip() settings["initrd"] = self.uiInitrdLineEdit.text().strip() settings["kernel_image"] = self.uiKernelImageLineEdit.text().strip() else: del settings["name"] if "console" in settings: del settings["console"] del settings["hda_disk_image"] del settings["hdb_disk_image"] del settings["hdc_disk_image"] del settings["hdd_disk_image"] del settings["initrd"] del settings["kernel_image"] if self.uiQemuListComboBox.count(): qemu_path = self.uiQemuListComboBox.itemData(self.uiQemuListComboBox.currentIndex()) settings["qemu_path"] = qemu_path settings["adapter_type"] = self.uiAdapterTypesComboBox.itemData(self.uiAdapterTypesComboBox.currentIndex()) settings["kernel_command_line"] = self.uiKernelCommandLineEdit.text() adapters = self.uiAdaptersSpinBox.value() if node and settings["adapters"] != adapters: # check if the adapters settings have changed node_ports = node.ports() for node_port in node_ports: if not node_port.isFree(): QtGui.QMessageBox.critical(self, node.name(), "Changing the number of adapters while links are connected isn't supported yet! Please delete all the links first.") raise ConfigurationError() settings["adapters"] = adapters settings["legacy_networking"] = self.uiLegacyNetworkingCheckBox.isChecked() settings["ram"] = self.uiRamSpinBox.value() if self.uiActivateCPUThrottlingCheckBox.isChecked(): settings["cpu_throttling"] = self.uiCPUThrottlingSpinBox.value() else: settings["cpu_throttling"] = 0 settings["process_priority"] = self.uiProcessPriorityComboBox.currentText().lower() settings["options"] = self.uiQemuOptionsLineEdit.text()
def saveSettings(self, settings, node=None, group=False): """ Saves the router settings. :param settings: the settings (dictionary) :param node: Node instance :param group: indicates the settings apply to a group of routers """ if not group: # Check if the Idle-PC value has been validated okay if not self._idle_valid: idle_pc = self.uiIdlepcLineEdit.text() QtGui.QMessageBox.critical(self, "Idle-PC", "{} is not a valid Idle-PC value ".format(idle_pc)) raise ConfigurationError() # set the device name name = self.uiNameLineEdit.text() if not name: QtGui.QMessageBox.critical(self, "Name", "IOS router name cannot be empty!") elif node and not node.validateHostname(name): QtGui.QMessageBox.critical(self, "Name", "Invalid name detected for IOS router: {}".format(name)) else: settings["name"] = name settings["console"] = self.uiConsolePortSpinBox.value() aux = self.uiAuxPortSpinBox.value() if aux: settings["aux"] = aux # check and save the base MAC address # mac = self.uiBaseMACLineEdit.text() # if mac and not re.search(r"""^([0-9a-fA-F]{4}\.){2}[0-9a-fA-F]{4}$""", mac): # QtGui.QMessageBox.critical(self, "MAC address", "Invalid MAC address (format required: hhhh.hhhh.hhhh)") # elif mac != "": # settings["mac_addr"] = mac # save the IOS image path path = self.uiIOSImageLineEdit.text() # settings["path"] = path settings["image"] = path # os.path.basename(path) else: del settings["name"] del settings["console"] del settings["aux"] del settings["mac_addr"] del settings["startup_config"] del settings["private_config"] del settings["image"] if not node: startup_config = self.uiStartupConfigLineEdit.text().strip() if startup_config and startup_config != settings["startup_config"]: if os.access(startup_config, os.R_OK): settings["startup_config"] = startup_config else: QtGui.QMessageBox.critical(self, "Startup-config", "Cannot read the startup-config file") private_config = self.uiPrivateConfigLineEdit.text().strip() if private_config and private_config != settings["private_config"]: if os.access(private_config, os.R_OK): settings["private_config"] = private_config else: QtGui.QMessageBox.critical(self, "Private-config", "Cannot read the private-config file") # get the platform and chassis if applicable platform = settings["platform"] if "chassis" in settings: settings["chassis"] = self.uiChassisTextLabel.text() if platform == "c7200": # save the midplane and NPE settings settings["midplane"] = self.uiMidplaneComboBox.currentText() settings["npe"] = self.uiNPEComboBox.currentText() sensors = [] sensors.append(self.uiSensor1SpinBox.value()) sensors.append(self.uiSensor2SpinBox.value()) sensors.append(self.uiSensor3SpinBox.value()) sensors.append(self.uiSensor4SpinBox.value()) settings["sensors"] = sensors power_supplies = [] if self.uiPowerSupply1ComboBox.currentIndex() == 0: power_supplies.append(1) else: power_supplies.append(0) if self.uiPowerSupply2ComboBox.currentIndex() == 0: power_supplies.append(1) else: power_supplies.append(0) settings["power_supplies"] = power_supplies else: # save the I/O memory setting settings["iomem"] = self.uiIomemSpinBox.value() # save the memories and disks settings settings["ram"] = self.uiRamSpinBox.value() settings["nvram"] = self.uiNvramSpinBox.value() settings["disk0"] = self.uiDisk0SpinBox.value() settings["disk1"] = self.uiDisk1SpinBox.value() # save the system ID (processor board ID in IOS) setting settings["system_id"] = self.uiSystemIdLineEdit.text() # save the exec area setting settings["exec_area"] = self.uiExecAreaSpinBox.value() # save the Idle-PC setting # TODO: check the format? settings["idlepc"] = self.uiIdlepcLineEdit.text() # save the idlemax setting settings["idlemax"] = self.uiIdlemaxSpinBox.value() # save the idlesleep setting settings["idlesleep"] = self.uiIdlesleepSpinBox.value() # save the mmap setting settings["mmap"] = self.uiMmapCheckBox.isChecked() # load the sparsemem setting settings["sparsemem"] = self.uiSparseMemoryCheckBox.isChecked() # save the adapters and WICs configuration and # check if a module port is connected before removing or replacing. for slot_number, widget in self._widget_slots.items(): if not widget.isEnabled(): break module = widget.currentText() if module: if settings["slot" + str(slot_number)] and settings["slot" + str(slot_number)] != module: if node: self._checkForLinkConnectedToAdapter(slot_number, settings, node) settings["slot" + str(slot_number)] = module elif settings["slot" + str(slot_number)]: if node: self._checkForLinkConnectedToAdapter(slot_number, settings, node) settings["slot" + str(slot_number)] = None for wic_number, widget in self._widget_wics.items(): if not widget.isEnabled(): break wic_name = str(widget.currentText()) if wic_name: if settings["wic" + str(wic_number)] and settings["wic" + str(wic_number)] != wic_name: if node: self._checkForLinkConnectedToWIC(wic_number, settings, node) settings["wic" + str(wic_number)] = wic_name elif settings["wic" + str(wic_number)]: if node: self._checkForLinkConnectedToWIC(wic_number, settings, node) settings["wic" + str(wic_number)] = None