diff --git a/src/Artemis.UI.Linux/ApplicationStateManager.cs b/src/Artemis.UI.Linux/ApplicationStateManager.cs index 997c19ef3..e580f5fdf 100644 --- a/src/Artemis.UI.Linux/ApplicationStateManager.cs +++ b/src/Artemis.UI.Linux/ApplicationStateManager.cs @@ -29,6 +29,7 @@ public class ApplicationStateManager Core.Utilities.ShutdownRequested += UtilitiesOnShutdownRequested; Core.Utilities.RestartRequested += UtilitiesOnRestartRequested; + Core.Utilities.UpdateRequested += UtilitiesOnUpdateRequested; // On OS shutdown dispose the IOC container just so device providers get a chance to clean up if (Application.Current?.ApplicationLifetime is IControlledApplicationLifetime controlledApplicationLifetime) @@ -138,4 +139,35 @@ public class ApplicationStateManager //todo } + + private void UtilitiesOnUpdateRequested(object? sender, UpdateEventArgs e) + { + List argsList = new(StartupArguments); + if (e.Silent && !argsList.Contains("--minimized")) + argsList.Add("--minimized"); + + // Retain startup arguments after update by providing them to the script + string script = Path.Combine(Constants.UpdatingFolder, "installing", "Scripts", "update.sh"); + string source = $"\"{Path.Combine(Constants.UpdatingFolder, "installing")}\""; + string destination = $"\"{Constants.ApplicationFolder}\""; + string args = argsList.Any() ? string.Join(' ', argsList) : ""; + + RunScriptWithOutputFile(script, $"{source} {destination} {args}", Path.Combine(Constants.DataFolder, "update-log.txt")); + + // Lets try a graceful shutdown, the script will kill if needed + if (Application.Current?.ApplicationLifetime is IControlledApplicationLifetime controlledApplicationLifetime) + Dispatcher.UIThread.Post(() => controlledApplicationLifetime.Shutdown()); + } + + private static void RunScriptWithOutputFile(string script, string arguments, string outputFile) + { + ProcessStartInfo info = new() + { + Arguments = $"\"{script}\" {arguments} > \"{outputFile}\"", + FileName = "/bin/bash", + WindowStyle = ProcessWindowStyle.Hidden, + CreateNoWindow = true, + }; + Process.Start(info); + } } \ No newline at end of file diff --git a/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj index 7d19d5e97..3d48d5686 100644 --- a/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj +++ b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj @@ -27,4 +27,8 @@ + + + + \ No newline at end of file diff --git a/src/Artemis.UI.Linux/Icons/128x128/apps/artemis.png b/src/Artemis.UI.Linux/Icons/128x128/apps/artemis.png new file mode 100644 index 000000000..01b8149d5 Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/128x128/apps/artemis.png differ diff --git a/src/Artemis.UI.Linux/Icons/16x16/apps/artemis.png b/src/Artemis.UI.Linux/Icons/16x16/apps/artemis.png new file mode 100644 index 000000000..00d10d10d Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/16x16/apps/artemis.png differ diff --git a/src/Artemis.UI.Linux/Icons/256x256/apps/artemis.png b/src/Artemis.UI.Linux/Icons/256x256/apps/artemis.png new file mode 100644 index 000000000..22bc95aa3 Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/256x256/apps/artemis.png differ diff --git a/src/Artemis.UI.Linux/Icons/32x32/apps/artemis.png b/src/Artemis.UI.Linux/Icons/32x32/apps/artemis.png new file mode 100644 index 000000000..6434edb8e Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/32x32/apps/artemis.png differ diff --git a/src/Artemis.UI.Linux/Icons/48x48/apps/artemis.png b/src/Artemis.UI.Linux/Icons/48x48/apps/artemis.png new file mode 100644 index 000000000..b20509d12 Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/48x48/apps/artemis.png differ diff --git a/src/Artemis.UI.Linux/Icons/64x64/apps/artemis.png b/src/Artemis.UI.Linux/Icons/64x64/apps/artemis.png new file mode 100644 index 000000000..bc81ba290 Binary files /dev/null and b/src/Artemis.UI.Linux/Icons/64x64/apps/artemis.png differ diff --git a/src/Artemis.UI.Linux/Scripts/update.sh b/src/Artemis.UI.Linux/Scripts/update.sh new file mode 100644 index 000000000..9ee398d2c --- /dev/null +++ b/src/Artemis.UI.Linux/Scripts/update.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +sourceDirectory=$1 +destinationDirectory=$2 +artemisArgs=$3 + +# Wait for up to 10 seconds for the Artemis process to exit +i=0 +while [ $i -le 10 ] +do + if ! pgrep -x "Artemis.UI.Linux" > /dev/null + then + break + fi + sleep 1 + i=$((i+1)) +done + +# If the Artemis process is still running, kill it +if pgrep -x "Artemis.UI.Linux" > /dev/null +then + pkill -x "Artemis.UI.Linux" +fi + +# Check if the destination directory exists +if [ ! -d "$destinationDirectory" ] +then + echo "Destination directory does not exist" + exit 1 +fi + +# Clear the destination directory but don't remove it +echo "Cleaning up old version where needed" +rm -rf "${destinationDirectory:?}/"* + +# Move the contents of the source directory to the destination directory +echo "Installing new files" +mv "$sourceDirectory"/* "$destinationDirectory" + +# Remove the now empty source directory +rmdir "$sourceDirectory" + +# Ensure the executable is executable +chmod +x "$destinationDirectory/Artemis.UI.Linux" + +echo "Finished! Restarting Artemis" +sleep 1 + +# When finished, start Artemis again + +# quoting here breaks stuff, all arguments count as 1 +# shellcheck disable=SC2086 +"$destinationDirectory/Artemis.UI.Linux" $artemisArgs & + + +