Compare commits

...

14 Commits

Author SHA1 Message Date
grossmj
d7a51ed588 Release v3.0.3 2025-01-22 19:06:43 +10:00
grossmj
dbca1b7106 Merge branch '2.2' into 3.0
# Conflicts:
#	CHANGELOG
#	gns3/crash_report.py
#	gns3/version.py
2025-01-22 18:37:46 +10:00
grossmj
15e5cac33b Set minimum duration for progress dialog when uploading. Ref https://github.com/GNS3/gns3-gui/issues/3682 2025-01-21 16:35:11 +10:00
grossmj
342ca95bd2 Release v2.2.53 2025-01-21 11:52:12 +10:00
grossmj
8191a51b2b Add logs when uploading images to the controller 2025-01-20 11:39:19 +10:00
grossmj
7d112551a8 Option to disable SSL certificate verification for future connections. Fixes https://github.com/GNS3/gns3-gui/issues/3694 2025-01-19 13:23:06 +10:00
grossmj
b5e867f2cd Fix packet capture when connected to a controller with SSL. Fixes https://github.com/GNS3/gns3-gui/issues/3696 2025-01-19 10:49:05 +10:00
grossmj
e5632e565d Upgrade pytest to the latest version 2025-01-17 18:47:36 +10:00
grossmj
bd785bf6cd Update status after importing an image when installing a new appliance. Fixes #3691 2025-01-07 17:53:52 +07:00
grossmj
2ae788a8f5 Update file browser filters to find IOU images without extension. Fixes #3692 2025-01-07 11:36:48 +07:00
grossmj
d7c1754323 Merge branch '2.2' into 3.0
# Conflicts:
#	gns3/main_window.py
#	gns3/modules/traceng/pages/traceng_preferences_page.py
2025-01-07 11:33:41 +07:00
grossmj
187ef561fd Update file browser filters for all files and IOU images 2025-01-07 11:32:17 +07:00
grossmj
ad2ce4cfef Development on 3.0.3.dev1 2025-01-07 11:12:06 +07:00
grossmj
97070718fa Upgrade dependencies 2024-12-30 10:49:40 +07:00
22 changed files with 154 additions and 76 deletions

View File

@@ -1,5 +1,21 @@
# Change Log
## 3.0.3 22/01/2025
* Set minimum duration for progress dialog when uploading. Ref https://github.com/GNS3/gns3-gui/issues/3682
* Add logs when uploading images to the controller
* Option to disable SSL certificate verification for future connections. Fixes https://github.com/GNS3/gns3-gui/issues/3694
* Fix packet capture when connected to a controller with SSL. Fixes https://github.com/GNS3/gns3-gui/issues/3696
* Update status after importing an image when installing a new appliance. Fixes #3691
* Update file browser filters to find IOU images without extension. Fixes #3692
* Upgrade dependencies
## 2.2.53 21/01/2025
* Update file browser filters for all files and IOU images
* Upgrade dependencies
* Fix Linux Mint default terminal configuration
## 3.0.2 03/01/2025
* Add button to create templates based on images that are not used by any yet.

View File

@@ -1,2 +1,2 @@
pytest==8.3.2
pytest==8.3.4
pytest-timeout==2.3.1

View File

@@ -50,7 +50,7 @@ class CrashReport:
Report crash to a third party service
"""
DSN = "https://142c803f12d32e781a654ef31138c684@o19455.ingest.us.sentry.io/38506"
DSN = "https://14cfb02748bc82b33a35f43747dbd0e6@o19455.ingest.us.sentry.io/38506"
_instance = None
def __init__(self):

View File

@@ -522,6 +522,12 @@ Usage: {}
image_upload_manger = ImageUploadManager(image, Controller.instance(), self.parent())
image_upload_manger.upload()
# refresh the images list
if Controller.instance().isRemote() or self._compute_id != "local":
self._registry.getRemoteImageList()
else:
self.images_changed_signal.emit()
def _install(self, version):
"""
Install the appliance in GNS3

View File

@@ -55,13 +55,13 @@ class ImageDialog(QtWidgets.QDialog, Ui_ImageDialog):
self,
"Select one or more images to upload",
QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.DownloadLocation),
"Images (*.bin *.image *.iol *.qcow2 *.vmdk *.iso);;All files (*.*)"
"Images (*.bin *.image *.iol *.qcow2 *.vmdk *.iso x86_64* i86bi*);;All files (*)"
)
error_msgs = ""
for path in files:
log.debug("Uploading image '{}' to controller".format(path))
image_filename = os.path.basename(path)
install_appliances = self.uiInstallApplianceCheckBox.isChecked()
log.info("Uploading image '{}' to controller".format(image_filename))
try:
Controller.instance().post(
f"/images/upload/{image_filename}",

View File

@@ -83,7 +83,7 @@ class SetupWizard(QtWidgets.QWizard, Ui_SetupWizard):
filter = ""
if sys.platform.startswith("win"):
filter = "Executable (*.exe);;All files (*.*)"
filter = "Executable (*.exe);;All files (*)"
server_path = shutil.which("gns3server")
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select the local server", server_path, filter)
if not path:
@@ -204,7 +204,8 @@ class SetupWizard(QtWidgets.QWizard, Ui_SetupWizard):
remote_controller_settings["remote"] = True
remote_controller_settings["host"] = self.uiRemoteMainServerHostLineEdit.text()
remote_controller_settings["port"] = self.uiRemoteMainServerPortSpinBox.value()
remote_controller_settings["protocol"] = "http"
remote_controller_settings["protocol"] = self.uiRemoteMainServerProtocolComboBox.currentText().lower()
remote_controller_settings["accept_insecure_ssl_certificate"] = False
remote_controller_settings["username"] = self.uiRemoteMainServerUserLineEdit.text()
remote_controller_settings["password"] = self.uiRemoteMainServerPasswordLineEdit.text()
Controller.instance().setSettings(remote_controller_settings)

View File

@@ -184,7 +184,7 @@ class SymbolSelectionDialog(QtWidgets.QDialog, Ui_SymbolSelectionDialog):
def _symbolBrowserSlot(self):
# supported image file formats
file_formats = "Image files (*.svg *.bmp *.jpeg *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm *.gif);;All files (*.*)"
file_formats = "Image files (*.svg *.bmp *.jpeg *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm *.gif);;All files (*)"
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Image", SymbolSelectionDialog._symbols_dir, file_formats)
if not path:
return

View File

@@ -1281,7 +1281,7 @@ class GraphicsView(QtWidgets.QGraphicsView):
path, _ = QtWidgets.QFileDialog.getOpenFileName(self,
"Import {}".format(os.path.basename(config_file)),
self._import_config_directory,
"All files (*.*);;Config files (*.cfg)",
"All files (*);;Config files (*.cfg)",
"Config files (*.cfg)")
if not path:
continue
@@ -1328,7 +1328,7 @@ class GraphicsView(QtWidgets.QGraphicsView):
for item in items:
for config_file in item.node().configFiles():
path, ok = QtWidgets.QFileDialog.getSaveFileName(self, "Export file", os.path.join(self._export_config_directory, item.node().name() + "_" + os.path.basename(config_file)), "All files (*.*);;Config files (*.cfg)")
path, ok = QtWidgets.QFileDialog.getSaveFileName(self, "Export file", os.path.join(self._export_config_directory, item.node().name() + "_" + os.path.basename(config_file)), "All files (*);;Config files (*.cfg)")
if not path:
continue
self._export_config_directory = os.path.dirname(path)

View File

@@ -67,6 +67,7 @@ class QNetworkReplyWatcher(QtCore.QObject):
self._progress = QtWidgets.QProgressDialog(progress_text, "Cancel", 0, 0, parent)
self._progress.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
self._progress.setWindowModality(QtCore.Qt.ApplicationModal)
self._progress.setMinimumDuration(0)
else:
self._progress = None
@@ -102,11 +103,11 @@ class QNetworkReplyWatcher(QtCore.QObject):
reply.finished.connect(loop.quit)
if self._progress:
reply.finished.connect(self._progress.close)
if uploading:
reply.uploadProgress.connect(self._updateProgress)
else:
reply.downloadProgress.connect(self._updateProgress)
reply.finished.connect(self._progress.close)
self._progress.canceled.connect(reply.abort)
self._progress.show()
@@ -158,7 +159,7 @@ class HTTPClient(QtCore.QObject):
self._retry_connection = False
self._connected = False
self._shutdown = False # shutdown in progress
self._accept_insecure_certificate = settings.get("accept_insecure_certificate", False)
self._accept_insecure_ssl_certificate = settings.get("accept_insecure_ssl_certificate", False)
# Add custom CA
# ssl_config = QtNetwork.QSslConfiguration.defaultConfiguration()
@@ -224,12 +225,12 @@ class HTTPClient(QtCore.QObject):
return self._protocol
def setAcceptInsecureCertificate(self, certificate: bool) -> None:
def setAcceptInsecureCertificate(self, accept_insecure_ssl_certificate: bool) -> None:
"""
Does the server accept this insecure SSL certificate digest
"""
self._accept_insecure_certificate = certificate
self._accept_insecure_ssl_certificate = accept_insecure_ssl_certificate
def url(self) -> str:
"""
@@ -545,7 +546,12 @@ class HTTPClient(QtCore.QObject):
self._auth_attempted = True
content = self._executeHTTPQuery("POST", "/access/users/authenticate", body=body, wait=True)
if content:
log.info(f"Authenticated with controller {self._host} on port {self._port}")
additional_ssl_info = ""
if self._protocol == "https":
additional_ssl_info = "using SSL"
if self._accept_insecure_ssl_certificate:
additional_ssl_info += " with insecure certificate"
log.info(f"Authenticated with controller {self._host} on port {self._port} {additional_ssl_info}")
token = content.get("access_token")
if token:
self._auth_attempted = False
@@ -839,7 +845,7 @@ class HTTPClient(QtCore.QObject):
Handle SSL errors
"""
if self._accept_insecure_certificate:
if self._accept_insecure_ssl_certificate:
reply.ignoreSslErrors()
return
@@ -852,7 +858,6 @@ class HTTPClient(QtCore.QObject):
digest = peer_cert.digest()
if host_port_key in self._ssl_exceptions:
if self._ssl_exceptions[host_port_key] == digest:
reply.ignoreSslErrors()
return
@@ -865,6 +870,8 @@ class HTTPClient(QtCore.QObject):
msgbox.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
connect_button = QtWidgets.QPushButton(f"&Connect to {url.host()}:{url.port()}", msgbox)
msgbox.addButton(connect_button, QtWidgets.QMessageBox.YesRole)
checkbox = QtWidgets.QCheckBox("Accept insecure certificate for future connections", parent=msgbox)
msgbox.setCheckBox(checkbox)
abort_button = QtWidgets.QPushButton("&Abort", msgbox)
msgbox.addButton(abort_button, QtWidgets.QMessageBox.RejectRole)
msgbox.setDefaultButton(abort_button)
@@ -873,6 +880,12 @@ class HTTPClient(QtCore.QObject):
if msgbox.clickedButton() == connect_button:
self._ssl_exceptions[host_port_key] = digest
if checkbox.isChecked():
log.warning(f"Accepting insecure SSL certificate for future connections to {host_port_key}")
from gns3.controller import Controller
self._accept_insecure_ssl_certificate = True
controller_settings = {"accept_insecure_ssl_certificate": True}
Controller.instance().setSettings(controller_settings)
reply.ignoreSslErrors()
else:
for error in ssl_errors:

View File

@@ -47,7 +47,7 @@ class ImageUploadManager(object):
def _fileUploadToController(self) -> bool:
log.debug("Uploading image '{}' to controller".format(self._image.path))
log.info("Uploading image '{}' to controller".format(self._image.filename))
try:
self._controller.post(
f"/images/upload/{self._image.filename}",

View File

@@ -121,6 +121,8 @@ class Link(QtCore.QObject):
if self._network_manager is None:
self._network_manager = QtNetwork.QNetworkAccessManager(self)
self._network_manager.sslErrors.connect(Controller.instance().httpClient().handleSslError)
self._response_stream = Controller.instance().get(
"/projects/{project_id}/links/{link_id}/capture/stream".format(project_id=self.project().id(), link_id=self._link_id),
callback=None,

View File

@@ -456,7 +456,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
if not os.path.exists(self._appliance_dir):
directory = Topology.instance().projectsDirPath()
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Import appliance", directory,
"All files (*.*);;GNS3 Appliance (*.gns3appliance *.gns3a)",
"All files (*);;GNS3 Appliance (*.gns3appliance *.gns3a)",
"GNS3 Appliance (*.gns3appliance *.gns3a)")
if path:
self.loadPath(path)
@@ -475,7 +475,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
if self._project_dir is None or not os.path.exists(self._project_dir):
directory = Topology.instance().projectsDirPath()
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open project", directory,
"All files (*.*);;GNS3 Project (*.gns3);;GNS3 Portable Project (*.gns3project *.gns3p);;NET files (*.net)",
"All files (*);;GNS3 Project (*.gns3);;GNS3 Portable Project (*.gns3project *.gns3p);;NET files (*.net)",
"GNS3 Project (*.gns3)")
if path:
self.loadPath(path)
@@ -951,7 +951,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
Slot called when inserting an image on the scene.
"""
# supported image file formats
file_formats = "Image files (*.svg *.bmp *.jpeg *.jpg *.gif *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;All files (*.*)"
file_formats = "Image files (*.svg *.bmp *.jpeg *.jpg *.gif *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;All files (*)"
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Image", self._pictures_dir, file_formats)
if not path:
@@ -1489,7 +1489,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
if not os.path.exists(directory):
directory = Topology.instance().projectsDirPath()
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open project", directory,
"All files (*.*);;GNS3 Portable Project (*.gns3project *.gns3p)",
"All files (*);;GNS3 Portable Project (*.gns3project *.gns3p)",
"GNS3 Portable Project (*.gns3project *.gns3p)")
if path:
Topology.instance().importProject(path)

View File

@@ -51,7 +51,7 @@ class DynamipsPreferencesPage(QtWidgets.QWidget, Ui_DynamipsPreferencesPageWidge
file_filter = ""
if sys.platform.startswith("win"):
file_filter = "Executable (*.exe);;All files (*.*)"
file_filter = "Executable (*.exe);;All files (*)"
dynamips_path = shutil.which("dynamips")
if sys.platform.startswith("darwin") and dynamips_path is None:

View File

@@ -229,7 +229,7 @@ class IOSRouterPreferencesPage(QtWidgets.QWidget, Ui_IOSRouterPreferencesPageWid
path, _ = QtWidgets.QFileDialog.getOpenFileName(parent,
"Select an IOS image",
cls._default_images_dir,
"All files (*.*);;IOS image (*.bin *.image)",
"All files (*);;IOS image (*.bin *.image)",
"IOS image (*.bin *.image)")
if not path:

View File

@@ -299,8 +299,8 @@ class IOUDevicePreferencesPage(QtWidgets.QWidget, Ui_IOUDevicePreferencesPageWid
path, _ = QtWidgets.QFileDialog.getOpenFileName(parent,
"Select an IOU image",
cls._default_images_dir,
"All file (*);;IOU image (*.bin *.image *.iol)",
"IOU image (*.bin *.image *.iol)")
"All file (*);;IOU image (x86_64* i86bi* *.bin *.image *.iol)",
"IOU image (x86_64* i86bi* *.bin *.image *.iol)")
if not path:
return

View File

@@ -51,7 +51,7 @@ class VPCSPreferencesPage(QtWidgets.QWidget, Ui_VPCSPreferencesPageWidget):
filter = ""
if sys.platform.startswith("win"):
filter = "Executable (*.exe);;All files (*.*)"
filter = "Executable (*.exe);;All files (*)"
vpcs_path = shutil.which("vpcs")
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select VPCS", vpcs_path, filter)
if not path:

View File

@@ -109,7 +109,7 @@ class ControllerPreferencesPage(QtWidgets.QWidget, Ui_ControllerPreferencesPageW
filter = ""
if sys.platform.startswith("win"):
filter = "Executable (*.exe);;All files (*.*)"
filter = "Executable (*.exe);;All files (*)"
server_path = shutil.which("gns3server")
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select the local server", server_path, filter)
if not path:
@@ -124,7 +124,7 @@ class ControllerPreferencesPage(QtWidgets.QWidget, Ui_ControllerPreferencesPageW
filter = ""
if sys.platform.startswith("win"):
filter = "Executable (*.exe);;All files (*.*)"
filter = "Executable (*.exe);;All files (*)"
ubridge_path = shutil.which("ubridge")
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select ubridge executable", ubridge_path, filter)
@@ -286,6 +286,12 @@ class ControllerPreferencesPage(QtWidgets.QWidget, Ui_ControllerPreferencesPageW
"udp_start_port_range": self.uiUDPStartPortSpinBox.value(),
"udp_end_port_range": self.uiUDPEndPortSpinBox.value()})
# reset the accept_insecure_ssl_certificate setting if the host or port has changed
current_host_port_key = f"{local_server_settings['host']}:{local_server_settings['port']}"
new_host_port_key = f"{new_local_server_settings['host']}:{new_local_server_settings['port']}"
if current_host_port_key != new_host_port_key:
new_local_server_settings["accept_insecure_ssl_certificate"] = False
if new_local_server_settings["console_end_port_range"] <= new_local_server_settings["console_start_port_range"]:
QtWidgets.QMessageBox.critical(self, "Port range", "Invalid console port range from {} to {}".format(new_local_server_settings["console_start_port_range"],
new_local_server_settings["console_end_port_range"]))

View File

@@ -195,7 +195,7 @@ class GeneralPreferencesPage(QtWidgets.QWidget, Ui_GeneralPreferencesPageWidget)
configuration_file_path = LocalConfig.instance().configFilePath()
directory = os.path.dirname(configuration_file_path)
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Import configuration file", directory, "Configuration file (*.ini *.conf);;All files (*.*)")
path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Import configuration file", directory, "Configuration file (*.ini *.conf);;All files (*)")
if not path:
return
@@ -240,7 +240,7 @@ class GeneralPreferencesPage(QtWidgets.QWidget, Ui_GeneralPreferencesPageWidget)
configuration_file_path = LocalConfig.instance().configFilePath()
directory = os.path.dirname(configuration_file_path)
path, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Export configuration file", directory, "Configuration file (*.ini *.conf);;All files (*.*)")
path, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Export configuration file", directory, "Configuration file (*.ini *.conf);;All files (*)")
if not path:
return

View File

@@ -340,6 +340,7 @@ CONTROLLER_SETTINGS = {
"ubridge_path": "ubridge",
"host": DEFAULT_CONTROLLER_HOST,
"port": DEFAULT_CONTROLLER_PORT,
"accept_insecure_ssl_certificate": False,
"images_path": DEFAULT_IMAGES_PATH,
"projects_path": DEFAULT_PROJECTS_PATH,
"appliances_path": DEFAULT_APPLIANCES_PATH,

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>603</width>
<height>287</height>
<width>644</width>
<height>290</height>
</rect>
</property>
<property name="windowTitle">
@@ -159,27 +159,37 @@
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="uiRemoteMainServerProtocolLabel">
<property name="text">
<string>Protocol:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="uiRemoteMainServerProtocolComboBox">
<item>
<property name="text">
<string>HTTP</string>
</property>
</item>
<item>
<property name="text">
<string>HTTPS</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Host:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="uiRemoteMainServerPasswordLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
<item row="1" column="1">
<widget class="QLineEdit" name="uiRemoteMainServerHostLineEdit"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Password:</string>
</property>
</widget>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Port:</string>
@@ -187,9 +197,6 @@
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="uiRemoteMainServerUserLineEdit"/>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="uiRemoteMainServerPortSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
@@ -208,16 +215,30 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="uiRemoteMainServerHostLineEdit"/>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Username:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="uiRemoteMainServerUserLineEdit"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Password:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="uiRemoteMainServerPasswordLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="uiSummaryWizardPage">

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file '/home/grossmj/PycharmProjects/gns3-gui/gns3/ui/setup_wizard.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
@@ -13,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_SetupWizard(object):
def setupUi(self, SetupWizard):
SetupWizard.setObjectName("SetupWizard")
SetupWizard.resize(603, 287)
SetupWizard.resize(644, 290)
SetupWizard.setModal(True)
SetupWizard.setWizardStyle(QtWidgets.QWizard.ModernStyle)
SetupWizard.setOptions(QtWidgets.QWizard.NoBackButtonOnStartPage)
@@ -81,22 +82,23 @@ class Ui_SetupWizard(object):
self.uiRemoteControllerWizardPage.setObjectName("uiRemoteControllerWizardPage")
self.gridLayout = QtWidgets.QGridLayout(self.uiRemoteControllerWizardPage)
self.gridLayout.setObjectName("gridLayout")
self.uiRemoteMainServerProtocolLabel = QtWidgets.QLabel(self.uiRemoteControllerWizardPage)
self.uiRemoteMainServerProtocolLabel.setObjectName("uiRemoteMainServerProtocolLabel")
self.gridLayout.addWidget(self.uiRemoteMainServerProtocolLabel, 0, 0, 1, 1)
self.uiRemoteMainServerProtocolComboBox = QtWidgets.QComboBox(self.uiRemoteControllerWizardPage)
self.uiRemoteMainServerProtocolComboBox.setObjectName("uiRemoteMainServerProtocolComboBox")
self.uiRemoteMainServerProtocolComboBox.addItem("")
self.uiRemoteMainServerProtocolComboBox.addItem("")
self.gridLayout.addWidget(self.uiRemoteMainServerProtocolComboBox, 0, 1, 1, 1)
self.label_3 = QtWidgets.QLabel(self.uiRemoteControllerWizardPage)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 0, 0, 1, 1)
self.uiRemoteMainServerPasswordLineEdit = QtWidgets.QLineEdit(self.uiRemoteControllerWizardPage)
self.uiRemoteMainServerPasswordLineEdit.setEchoMode(QtWidgets.QLineEdit.Password)
self.uiRemoteMainServerPasswordLineEdit.setObjectName("uiRemoteMainServerPasswordLineEdit")
self.gridLayout.addWidget(self.uiRemoteMainServerPasswordLineEdit, 3, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(self.uiRemoteControllerWizardPage)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 3, 0, 1, 1)
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
self.uiRemoteMainServerHostLineEdit = QtWidgets.QLineEdit(self.uiRemoteControllerWizardPage)
self.uiRemoteMainServerHostLineEdit.setObjectName("uiRemoteMainServerHostLineEdit")
self.gridLayout.addWidget(self.uiRemoteMainServerHostLineEdit, 1, 1, 1, 1)
self.label_4 = QtWidgets.QLabel(self.uiRemoteControllerWizardPage)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 1, 0, 1, 1)
self.uiRemoteMainServerUserLineEdit = QtWidgets.QLineEdit(self.uiRemoteControllerWizardPage)
self.uiRemoteMainServerUserLineEdit.setObjectName("uiRemoteMainServerUserLineEdit")
self.gridLayout.addWidget(self.uiRemoteMainServerUserLineEdit, 2, 1, 1, 1)
self.gridLayout.addWidget(self.label_4, 2, 0, 1, 1)
self.uiRemoteMainServerPortSpinBox = QtWidgets.QSpinBox(self.uiRemoteControllerWizardPage)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
@@ -106,13 +108,20 @@ class Ui_SetupWizard(object):
self.uiRemoteMainServerPortSpinBox.setMaximum(65535)
self.uiRemoteMainServerPortSpinBox.setProperty("value", 3080)
self.uiRemoteMainServerPortSpinBox.setObjectName("uiRemoteMainServerPortSpinBox")
self.gridLayout.addWidget(self.uiRemoteMainServerPortSpinBox, 1, 1, 1, 1)
self.uiRemoteMainServerHostLineEdit = QtWidgets.QLineEdit(self.uiRemoteControllerWizardPage)
self.uiRemoteMainServerHostLineEdit.setObjectName("uiRemoteMainServerHostLineEdit")
self.gridLayout.addWidget(self.uiRemoteMainServerHostLineEdit, 0, 1, 1, 1)
self.gridLayout.addWidget(self.uiRemoteMainServerPortSpinBox, 2, 1, 1, 1)
self.label_5 = QtWidgets.QLabel(self.uiRemoteControllerWizardPage)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 2, 0, 1, 1)
self.gridLayout.addWidget(self.label_5, 3, 0, 1, 1)
self.uiRemoteMainServerUserLineEdit = QtWidgets.QLineEdit(self.uiRemoteControllerWizardPage)
self.uiRemoteMainServerUserLineEdit.setObjectName("uiRemoteMainServerUserLineEdit")
self.gridLayout.addWidget(self.uiRemoteMainServerUserLineEdit, 3, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(self.uiRemoteControllerWizardPage)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 4, 0, 1, 1)
self.uiRemoteMainServerPasswordLineEdit = QtWidgets.QLineEdit(self.uiRemoteControllerWizardPage)
self.uiRemoteMainServerPasswordLineEdit.setEchoMode(QtWidgets.QLineEdit.Password)
self.uiRemoteMainServerPasswordLineEdit.setObjectName("uiRemoteMainServerPasswordLineEdit")
self.gridLayout.addWidget(self.uiRemoteMainServerPasswordLineEdit, 4, 1, 1, 1)
SetupWizard.addPage(self.uiRemoteControllerWizardPage)
self.uiSummaryWizardPage = QtWidgets.QWizardPage()
self.uiSummaryWizardPage.setObjectName("uiSummaryWizardPage")
@@ -149,11 +158,14 @@ class Ui_SetupWizard(object):
self.uiLocalServerPortLabel.setText(_translate("SetupWizard", "Port:"))
self.uiRemoteControllerWizardPage.setTitle(_translate("SetupWizard", "Remote controller"))
self.uiRemoteControllerWizardPage.setSubTitle(_translate("SetupWizard", "Please configure the settings to connect to a remote GNS3 controller"))
self.uiRemoteMainServerProtocolLabel.setText(_translate("SetupWizard", "Protocol:"))
self.uiRemoteMainServerProtocolComboBox.setItemText(0, _translate("SetupWizard", "HTTP"))
self.uiRemoteMainServerProtocolComboBox.setItemText(1, _translate("SetupWizard", "HTTPS"))
self.label_3.setText(_translate("SetupWizard", "Host:"))
self.label_6.setText(_translate("SetupWizard", "Password:"))
self.label_4.setText(_translate("SetupWizard", "Port:"))
self.uiRemoteMainServerPortSpinBox.setSuffix(_translate("SetupWizard", " TCP"))
self.label_5.setText(_translate("SetupWizard", "Username:"))
self.label_6.setText(_translate("SetupWizard", "Password:"))
self.uiSummaryWizardPage.setTitle(_translate("SetupWizard", "Summary"))
self.uiSummaryWizardPage.setSubTitle(_translate("SetupWizard", "The controller has been configured, please see the summary of the settings below"))
self.uiSummaryTreeWidget.headerItem().setText(0, _translate("SetupWizard", "1"))

View File

@@ -23,8 +23,8 @@
# or negative for a release candidate or beta (after the base version
# number has been incremented)
__version__ = "3.0.2"
__version_info__ = (3, 0, 2, 0)
__version__ = "3.0.3"
__version_info__ = (3, 0, 3, 0)
if "dev" in __version__:
try: