From 6d97feaced0723d3e0b1b8ca2505c0d5308e5635 Mon Sep 17 00:00:00 2001
From: Xatrekak <xatrekak@gmail.com>
Date: Mon, 6 Nov 2023 19:02:29 -0500
Subject: [PATCH] Fixed updating system and GNS3.

---
 scripts/remote-install.sh |  5 +++++
 scripts/welcome.py        | 41 ++++++++++++++++++++++++++++-----------
 2 files changed, 35 insertions(+), 11 deletions(-)

diff --git a/scripts/remote-install.sh b/scripts/remote-install.sh
index 6c68a640..289ad335 100644
--- a/scripts/remote-install.sh
+++ b/scripts/remote-install.sh
@@ -304,6 +304,11 @@ log "GNS3 installed with success"
 
 if [ $WELCOME_SETUP == 1 ]
 then
+cat <<EOFI > /etc/sudoers.d/gns3
+gns3   ALL = (ALL) NOPASSWD: /usr/bin/apt-key
+gns3   ALL = (ALL) NOPASSWD: /usr/bin/apt-get
+gns3   ALL = (ALL) NOPASSWD: /usr/sbin/reboot
+EOFI
 NEEDRESTART_MODE=a apt-get install -y net-tools
 NEEDRESTART_MODE=a apt-get install -y python3-pip
 NEEDRESTART_MODE=a apt-get install -y dialog
diff --git a/scripts/welcome.py b/scripts/welcome.py
index d7e0cf4c..77de8d75 100644
--- a/scripts/welcome.py
+++ b/scripts/welcome.py
@@ -163,19 +163,38 @@ class Welcome_dialog:
 
     def update(self, force=False):
         if not force:
-            if self.display.yesno("PLEASE SNAPSHOT THE VM BEFORE RUNNING THE UPGRADE IN CASE OF FAILURE. The server will reboot at the end of the upgrade process. Continue?") != self.display.OK:
+            if self.display.yesno("It is recommended to ensure all Nodes are shutdown before upgrading. Continue?") != self.display.OK:
                 return
-        release = self.get_release()
-        if release == "2.2":
-            if self.display.yesno("It is recommended to run GNS3 version 2.2 with lastest GNS3 VM based on Ubuntu 18.04 LTS, please download this VM from our website or continue at your own risk!") != self.display.OK:
+        code, option = self.display.menu("Select an option",
+                            choices=[("Upgrade GNS3", "Upgrades only the GNS3 pakage and dependences."),
+                                    ("Upgrade All", "Upgrades all avaiable packages"),
+                                    ("Dist Upgrade", "Upgrades all avaiable packages and the Linux Kernel. Requires a reboot.")])
+        if code == Dialog.OK:
+            if option == "Upgrade GNS3":
+                ret = os.system(
+                    "sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A2E3EF7B \
+                    && sudo apt-get update \
+                    && sudo apt-get install -y --only-upgrade gns3-server"
+                )
+            elif option == "Upgrade All":
+                ret = os.system(
+                    'sudo apt-key adv --refresh-keys --keyserver keyserver.ubuntu.com \
+                    && sudo apt-get update \
+                    && sudo apt-get upgrade --yes --force-yes -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"'
+                )
+            elif option == "Dist Upgrade":
+                ret = os.system(
+                    'sudo apt-key adv --refresh-keys --keyserver keyserver.ubuntu.com \
+                    && sudo apt-get update \
+                    && sudo apt-get dist-upgrade --yes --force-yes -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"'
+                )
+            if ret != 0:
+                print("ERROR DURING UPGRADE PROCESS PLEASE TAKE A SCREENSHOT IF YOU NEED SUPPORT")
+                time.sleep(15)
                 return
-        if release.endswith("dev"):
-            ret = os.system("curl -Lk https://raw.githubusercontent.com/GNS3/gns3-vm/unstable/scripts/update_{}.sh > /tmp/update.sh && bash -x /tmp/update.sh".format(release))
-        else:
-            ret = os.system("curl -Lk https://raw.githubusercontent.com/GNS3/gns3-vm/master/scripts/update_{}.sh > /tmp/update.sh && bash -x /tmp/update.sh".format(release))
-        if ret != 0:
-            print("ERROR DURING UPGRADE PROCESS PLEASE TAKE A SCREENSHOT IF YOU NEED SUPPORT")
-            time.sleep(15)
+            if option == "Dist Upgrade":
+                if self.display.yesno("Reboot now?") == self.display.OK:
+                    os.system("sudo reboot now")
 
 
     def migrate(self):