internal override async Task <bool> OnUpdate(SafeDictionary <string, object> keys)
        {
            if (keys["noupdate"]?.ToString() == "1")
            {
                return(true);
            }
            _keys = keys;
            ReportProgress("Fetching version information..");
            _getAllVersionsResponse =
                await
                ServerRequestHelper.GetObjectFromServerAsync <GetAllVersionsResponse>(keys["hospitalserver"].ToString(),
                                                                                      "get_all_versions/");

            if (!_getAllVersionsResponse.Success)
            {
                ReportProgress("Terminal registered in management but not in hospital server");
                await Task.Delay(5000);

                ProcessHelper.StartRegistrator(_keys["server"].ToString());
                App.ShutdownSafe();
                return(false);
            }
            var files    = (await GetCoreFiles()).Concat(await GetPluginFiles()).ToList();
            var corePath =
                Path.GetFullPath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\..\\");
            var result = await CompareAndDownloadFileList(files, corePath, new[] { "cache.db" }, new[] { "txt", "csv" }, new [] { "Lib\\VLC\\x64", "Lib\\VLC\\x86" });

            return(result);
        }
        async Task <List <CoreFile> > GetPluginFiles()
        {
            var path  = Path.GetFullPath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\..\\");
            var count = _getAllVersionsResponse.Result.Plugins.Count;
            var list  = new List <CoreFile>();

            foreach (var f in _getAllVersionsResponse.Result.Plugins)
            {
                ReportProgress(String.Format("Fetching information for {0}...", f.Name));
                var files =
                    await
                    ServerRequestHelper.GetObjectFromServerAsync <List <CoreFile> >(_keys["hospitalserver"].ToString(),
                                                                                    "get_plugin_files/" + f.Name + "/" + f.Version + "/");

                var pluginPath =
                    Path.GetFullPath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) +
                                     "\\..\\ibt-plugins\\" + f.Name + "\\");
                foreach (var file in files.Result)
                {
                    file.LocalPath = Path.GetFullPath(pluginPath + file.FileName);
                }
                list.AddRange(files.Result);// await CompareAndDownloadFileList(files.Result, pluginPath);
            }
            return(list);
            //return true;
        }
        async Task <List <CoreFile> > GetCoreFiles()
        {
            var result      = _getAllVersionsResponse.Result;
            var coreVersion = result.CoreVersion.Version;

            ReportProgress(String.Format("Fetching information for {0}...", "Core"));
            var fileList =
                await
                ServerRequestHelper.GetObjectFromServerAsync <List <CoreFile> >(_keys["hospitalserver"].ToString(),
                                                                                "get_core_files/core/" + coreVersion + "/");

            if (fileList.Result == null)
            {
                throw new Exception("Bad result format from server");
            }
            var corePath =
                Path.GetFullPath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\..\\");

            foreach (var file in fileList.Result)
            {
                file.LocalPath = Path.GetFullPath(corePath + file.FileName);
            }
            return(fileList.Result);
            //return
        }
Exemple #4
0
 internal async Task ReportToServer(string hospitalServer, string updateId, string packageId, int code)
 {
     await ServerRequestHelper.GetObjectFromServerAsync <object>(hospitalServer,
                                                                 "update/result/", new
     {
         timestamp =
             (long)
             DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0,
                                                   DateTimeKind.Utc))
             .TotalMilliseconds,
         updateId  = updateId,
         exitCode  = code,
         packageId = packageId
     });
 }
        internal override async Task <bool> OnPreUpdate(SafeDictionary <string, object> keys)
        {
            ReportProgress("Identifying...");

            int tries = 0;

            while (await TerminalIdentificationManager.GetIdentificationInfoAsync() == null && tries < 10)
            {
                tries++;
                await TerminalIdentificationManager.IdentifyAsync();

                if (await TerminalIdentificationManager.GetIdentificationInfoAsync() == null)
                {
                    await Task.Delay(30000);
                }
            }

            if (await TerminalIdentificationManager.GetIdentificationInfoAsync() == null)
            {
                App.ShutdownSafe();
                return(false);
            }


            keys["server"] = _server = (await PanaceaRegistry.GetServerInformation(false)).ManagementServer;
            if (string.IsNullOrEmpty(_server))
            {
                ReportProgress("Please add a terminal server in registry...");
                await Task.Delay(4000);

                App.ShutdownSafe();
                return(false);
            }
            //we can allow a failure to access TS if HS server is stored locally
            BrowserSettingsHelper.UpdateSettings(new[] { "WebBrowser.SubProcess.exe", "Panacea.exe" });
            ServerResponse <GetHospitalServersResponse> getHospitalServerResponse = null;

            try
            {
                getHospitalServerResponse =
                    await
                    ServerRequestHelper.GetObjectFromServerAsync <GetHospitalServersResponse>(_server,
                                                                                              "get_hospital_servers/");
            }
            catch
            {
                getHospitalServerResponse =
                    (await PanaceaRegistry.GetServerInformation(false)).ManagementServerResponse;
            }
            if (getHospitalServerResponse == null)
            {
                throw new Exception("Terminal Server unreachable and no information stored in registry...");
            }
            if (!getHospitalServerResponse.Success)
            {
                if (getHospitalServerResponse.Error != "self destruct")
                {
                    ReportProgress(getHospitalServerResponse.Error);
                    await Task.Delay(4000);

                    ProcessHelper.StartRegistrator(_server);
                    App.ShutdownSafe();
                    return(false);
                }
                var path = Path.GetFullPath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\..\\");
                foreach (var directory in Directory.GetDirectories(path))
                {
                    try
                    {
                        if (!directory.EndsWith("\\Updater"))
                        {
                            Directory.Delete(directory, true);
                        }
                    }
                    catch
                    {
                        // ignored
                    }
                }
                foreach (var directory in Directory.GetFiles(path))
                {
                    try
                    {
                        File.Delete(directory);
                    }
                    catch
                    {
                        // ignored
                    }
                }


                App.ShutdownSafe();
                return(false);
            }

            if (!await UpdateRegistry(getHospitalServerResponse))
            {
                return(false);
            }

            keys["hospitalserver"] = _hospitalServer = getHospitalServerResponse.Result.HospitalServers[0];
            if (string.IsNullOrEmpty(getHospitalServerResponse.Result.Crutch))
            {
                return(true);
            }

            _crutch = getHospitalServerResponse.Result.Crutch;

            ReportProgress("Waiting for traffic controller... Please wait...");

            var req =
                BuildHttpRequest(
                    new Uri(new Uri(_crutch), "api/" + Common.GetMacAddress() + "/requestAccessLock/")
                    .ToString());

            try
            {
                var resp = await req.GetHttpResponseAsync(120000);

                if (resp.StatusCode != HttpStatusCode.Conflict && resp.StatusCode != HttpStatusCode.OK)
                {
                    throw new WebException("Not conflict");
                }
            }
            catch (WebException)
            {
                ReportProgress("Traffic controller unreachable... Please wait...");
                await Task.Delay(new Random().Next(10000, 60000));

                App.Restart();
                return(false);
            }
            return(true);
        }
Exemple #6
0
        internal override async Task <bool> OnAfterUpdate(SafeDictionary <string, object> keys)
        {
            if (Debugger.IsAttached)
            {
                if (MessageBox.Show("Install updates?", "Caution", MessageBoxButton.YesNo) == MessageBoxResult.No)
                {
                    return(true);
                }
            }
            ReportProgress("Installing Updates");
            await Task.Delay(1000);

            var dir = new DirectoryInfo(Common.Path() + "Updates");

            if (!dir.Exists)
            {
                dir.Create();
            }

            var name = Environment.MachineName;

            try
            {
                var resp =
                    await
                    ServerRequestHelper.GetObjectFromServerAsync <TerminalInfoResponse>(keys["hospitalserver"].ToString(),
                                                                                        "get_terminal_info/");

                name = resp.Result.TerminalName;
            }
            catch
            {
                //maybe get_terminal_info not implemented - compatibility
            }

            var nameRequiresChange = name != Environment.MachineName;

            ////throw new Exception("Sfgfg");
            var response =
                await
                ServerRequestHelper.GetObjectFromServerAsync <List <UpdatePackage> >(keys["hospitalserver"].ToString(), "get_terminal_updates/");

            var updates = new List <Update>();
            var freeze  = FreezeHelper.IsFreezeEnabled();

            if (!response.Success)
            {
                return(true);
            }
            if (nameRequiresChange)
            {
                if (await LockdownManager.IsFrozen() == true)
                {
                    ReportProgress("Rebooting to unfreeze");
                    await Task.Delay(1500);

                    LockdownManager.Unfreeze();
                    App.ShutdownSafe(false);
                    return(true);
                }
            }
            response.Result.ForEach(p => p.Updates.ForEach(u => u.PackageId = p.Id));

            if (nameRequiresChange)
            {
                if (Debugger.IsAttached)
                {
                    if (MessageBox.Show("Change hostname?", "Question", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                    {
                        Common.SetMachineName(name);
                    }
                }
                else
                {
                    Common.SetMachineName(name);
                    ReportProgress("Rebooting to change hostname");
                    await Task.Delay(3000);

                    ProcessHelper.Reboot();
                    return(true);
                }
            }
            foreach (var package in response.Result)
            {
                ReportProgress(package.Name);
                foreach (var update in package.Updates)
                {
                    try
                    {
                        if (SkipUpdate(update.Id))
                        {
                            continue;
                        }
                        if (await LockdownManager.IsFrozen() == true)
                        {
                            ReportProgress("Rebooting to unfreeze");
                            await Task.Delay(1500);

                            LockdownManager.Unfreeze();
                            App.ShutdownSafe(false);
                            return(true);
                        }
                        updates.Add(update);
                        var tempPath  = System.IO.Path.GetTempPath(); //C:\\Users\\<UserName>\\AppData\\Local\\Temp
                        var updateDir = new DirectoryInfo(tempPath + "PanaceaUpdates\\" + update.Id);
                        if (!updateDir.Exists)
                        {
                            updateDir.Create();
                        }

                        await _webClient.DownloadFileTaskAsync(
                            new Uri(keys["hospitalserver"] + "/" + update.PatchScript),
                            updateDir + "\\" + Path.GetFileName(update.PatchScript));

                        foreach (var file in update.RequiredFiles)
                        {
                            await _webClient.DownloadFileTaskAsync(
                                new Uri(keys["hospitalserver"] + "/" + file),
                                updateDir + "\\" + Path.GetFileName(file));
                        }
                        ReportProgress("Installing...");
                        var code = await Task.Run(() =>
                        {
                            var info = new ProcessStartInfo()
                            {
                                WorkingDirectory = updateDir.ToString(),
                                FileName         = updateDir + "\\" + Path.GetFileName(update.PatchScript),
                                CreateNoWindow   = true,
                                UseShellExecute  = false,
                                Verb             = "runas"
                            };
                            var p = new Process {
                                StartInfo = info
                            };
                            try
                            {
                                p.Start();
                                p.WaitForExit();
                                return(p.ExitCode);
                            }
                            catch
                            {
                                return(9001);
                            }
                        });

                        //OnProgressFiles(code == 0 ? "Installation successful!" : "Installation failed");
                        await Task.Delay(1000);

                        update.Installed = code == 0;
                        update.ExitCode  = code;

                        if (code != 0)
                        {
                            continue;
                        }
                        AddRegistryUpdate(update);
                        await ReportToServer(keys["hospitalserver"].ToString(), update.Id, package.Id, code);

                        try
                        {
                            File.Delete(updateDir + "\\" + Path.GetFileName(update.PatchScript));
                            foreach (var file in update.RequiredFiles)
                            {
                                File.Delete(updateDir + "\\" + Path.GetFileName(file));
                            }
                        }
                        catch { }

                        if (update.RequiresReboot != "yes")
                        {
                            continue;
                        }
                        ProcessHelper.Reboot();
                        return(false);
                    }
                    catch
                    {
                        update.ExitCode = 9999;
                        AddRegistryUpdate(update);
                        await ReportToServer(keys["hospitalserver"].ToString(), update.Id, package.Id, 9999);
                    }
                }
            }
            if (updates.All(u => u.ExitCode != 0))
            {
                foreach (var update in updates)
                {
                    AddRegistryUpdate(update);
                    await ReportToServer(keys["hospitalserver"].ToString(), update.Id, update.PackageId, update.ExitCode);
                }
            }
            if (updates.Any(u => u.RequiresReboot == "batch" && u.ExitCode == 0))
            {
                ReportProgress("Restarting...");
                await Task.Delay(1500);

                ProcessHelper.Reboot();
                return(false);
            }

            if (updates.Any(u => u.ExitCode != 0) && updates.Any(u => u.ExitCode == 0))
            {
                ReportProgress("Rebooting to retry updates that failed...");
                await Task.Delay(1500);

                ProcessHelper.Reboot();
                return(false);
            }
            if (await LockdownManager.IsFrozen() == false && freeze)
            {
                if (updates.All(u => u.ExitCode == 0) || updates.All(u => u.ExitCode != 0))
                {
                    ReportProgress("Rebooting to freeze");
                    await Task.Delay(1500);

                    LockdownManager.Freeze();
                }
                App.ShutdownSafe(false);
                return(false);
            }
            return(true);
        }
        internal override async Task <bool> OnAfterUpdate(SafeDictionary <string, object> keys)
        {
            if (Debugger.IsAttached)
            {
                return(true);
            }
            string hostsEntries = null;

            try
            {
                hostsEntries = File.ReadAllText(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) +
                                                "/AdBlock/hosts.txt");
            } catch { }
            try
            {
                hostsEntries = Start + Environment.NewLine + (await ServerRequestHelper.GetObjectFromServerAsync <string>(keys["hospitalserver"].ToString(),
                                                                                                                          "get_hosts_modifications/")).Result + Environment.NewLine + End;
            }
            catch { }
            if (hostsEntries == null)
            {
                return(true);
            }
            try
            {
                ReportProgress("Updating domains...");
                using (
                    var sr =
                        new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System),
                                                      "drivers/etc/hosts")))
                {
                    var hosts = await sr.ReadToEndAsync();

                    sr.Close();
                    var index = hosts.IndexOf(Start, StringComparison.InvariantCulture);
                    if (index >= 0)
                    {
                        var endIndex = hosts.IndexOf(End, index, StringComparison.InvariantCulture);
                        hosts = hosts.Remove(index, endIndex + End.Length - index);
                    }
                    using (
                        var sw =
                            new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System),
                                                          "drivers/etc/hosts")))
                    {
                        if (hosts.EndsWith(Environment.NewLine))
                        {
                            await sw.WriteAsync(hosts);
                        }
                        else
                        {
                            await sw.WriteLineAsync(hosts);
                        }
                        await sw.WriteLineAsync(hostsEntries);
                    }
                }
            }
            catch
            {
            }
            return(true);
        }