Ejemplo n.º 1
0
        public MainWindow(string desktopUser)
        {
            InitializeComponent();
            Icon = BitmapFrame.Create(Icons.Utils.GetIconData(Icons.Icon.Lazurite64));

            var log            = Singleton.Resolve <WarningHandlerBase>();
            var fileSavior     = Singleton.Resolve <FileSavior>();
            var assemblyFolder = Lazurite.Windows.Utils.Utils.GetAssemblyFolder(typeof(App).Assembly);

            captionView.StartAnimateProgress();
            var message = string.Empty;
            var error   = false;

            Utils.VcRedistInstallAll();
            Utils.FirewallSettings();

            if (!fileSavior.Has(LazuriteServer.SettingsKey))
            {
                //certificate installing
                try
                {
                    var settingsStub = new ServerSettings();
                    settingsStub.CertificateHash = Lazurite.Windows.Server.Utils.AddCertificate(Path.Combine(assemblyFolder, CertificateFilename), "28021992");
                    fileSavior.Set(LazuriteServer.SettingsKey, settingsStub);
                    Lazurite.Windows.Server.Utils.NetshAddSslCert(settingsStub.CertificateHash, settingsStub.Port);
                    Lazurite.Windows.Server.Utils.NetshAddUrlacl(settingsStub.GetAddress());
                    Lazurite.Windows.Server.Utils.NetshAllowPort(settingsStub.Port);

                    message += "*Стандартный сертификат для HTTPS установлен.\r\n";
                }
                catch (Exception e)
                {
                    var msg = "*!Ошибка при установке стандартного сертификата для HTTPS. Сервер не будет запущен.\r\n";
                    message += msg;
                    log.ErrorFormat(e, msg);
                    error = true;
                }
            }

            //plugins installing
            Singleton.Add(new ScenariosRepository()); //stub for pluginsManager
            Singleton.Add(new UsersRepository());     //stub for pluginsManager
            var pluginsFolderPath = Path.Combine(Lazurite.Windows.Utils.Utils.GetAssemblyFolder(typeof(App).Assembly), "PluginsToInstall");
            var pluginsFiles      = Directory.GetFiles(pluginsFolderPath).Where(x => x.EndsWith(PluginsManager.PluginFileExtension)).ToArray();

            try
            {
                var pluginsManager = new PluginsManager(false);
                foreach (var pluginPath in pluginsFiles)
                {
                    try
                    {
                        pluginsManager.HardReplacePlugin(pluginPath);
                    }
                    catch (Exception e)
                    {
                        var msg = "*!Ошибка при установке плагина\r\n[" + pluginPath + "].\r\n";
                        message += msg;
                        log.ErrorFormat(e, msg);
                        error = true;
                    }
                }
                message += "*Плагины установлены.\r\n";
            }
            catch (Exception e)
            {
                var msg = "*!Ошибка при установке плагинов. Часть функционала может быть недоступна.\r\n";
                message += msg;
                log.ErrorFormat(e, msg);
                error = true;
            }

            //autorun installing
            try
            {
                var mainAppName = Path.Combine(Lazurite.Windows.Utils.Utils.GetAssemblyFolder(typeof(App).Assembly), LauncherExeName);
                TaskSchedulerUtils.CreateLogonTask(desktopUser, mainAppName);
                message += string.Format("*Программа добавлена в планировщик задач для пользователя [{0}].\r\n", desktopUser);
            }
            catch (Exception e)
            {
                var msg = string.Format("*!Невозможно добавить программу в автозапуск под пользователем [{0}].\r\nПрограмма не будет запускаться автоматически при логине пользователя [{0}].", desktopUser);
                message += msg;
                log.ErrorFormat(e, msg);
                error = true;
            }
            log.Info(message);
            Complete(message, error);
        }
Ejemplo n.º 2
0
        private void PrepareLazurite(string desktopUser)
        {
            var log = Singleton.Resolve <WarningHandlerBase>();

            var error = false;

            void appendTb(string text)
            {
                Dispatcher.BeginInvoke(new Action(() =>
                {
                    tbInfo.Text += "\r\n" + text;
                }));
            }

            void appendError(string msg, Exception e = null)
            {
                appendTb(msg);
                log.Error(msg, e);
                error = true;
            }

            void appendInfo(string msg)
            {
                appendTb(msg);
                log.Info(msg);
            }

            try
            {
                Dispatcher.BeginInvoke(new Action(() => captionView.StartAnimateProgress()));

                // Prepare environment
                var fileDataManager = Singleton.Resolve <FileDataManager>();
                var assemblyFolder  = Lazurite.Windows.Utils.Utils.GetAssemblyFolder(typeof(App).Assembly);

                // Create data backup
                var dataFolder    = Path.Combine(assemblyFolder, "data");
                var pluginsFolder = Path.Combine(assemblyFolder, "plugins");
                var backupFolder  = Path.Combine(assemblyFolder, "backup");

                try
                {
                    if (Directory.Exists(backupFolder))
                    {
                        // Clear old backups
                        var files = new DirectoryInfo(backupFolder).EnumerateFiles().ToArray();
                        if (files.Length >= 8)
                        {
                            var oldFiles = files
                                           .OrderBy(x => x.Name)
                                           .OrderBy(x => x.LastWriteTime)
                                           .Take(files.Length - 6);

                            foreach (var oldFile in oldFiles)
                            {
                                File.Delete(oldFile.FullName);
                            }
                        }
                    }
                    else
                    {
                        Directory.CreateDirectory(backupFolder);
                    }

                    var dateTimeNowSafeString = DateTime.Now.ToString("dd.MM.yyyy_hh.mm.ss");
                    var zip = new FastZip();
                    zip.CreateZip(Path.Combine(backupFolder, dateTimeNowSafeString + "_data_backup.zip"), dataFolder, true, string.Empty);
                    zip.CreateZip(Path.Combine(backupFolder, dateTimeNowSafeString + "_plugins_backup.zip"), pluginsFolder, true, string.Empty);
                }
                catch (Exception e)
                {
                    appendError("!Ошибка при создании/удалении файлов бэкапов.", e);
                }

                if (!Utils.VcRedistInstallAll())
                {
                    appendError("!Ошибка установки пакетов VcRedist.");
                }
                else
                {
                    appendInfo("Пакеты VcRedist установлены.");
                }

                try
                {
                    if (!fileDataManager.Has(LazuriteServer.SettingsKey))
                    {
                        // Certificate installing
                        var settingsStub = new ServerSettings();
                        settingsStub.CertificateHash = SecurityHelper.AddCertificateInWindows(Path.Combine(assemblyFolder, CertificateFilename), "28021992", (msg) => log.Info(msg));
                        fileDataManager.Set(LazuriteServer.SettingsKey, settingsStub);
                        appendInfo("Настройки сервера созданы.");
                    }
                }
                catch (Exception e)
                {
                    appendError("!Ошибка при создании настроек сервера.", e);
                }

                // Plugins installing
                var pluginsFolderPath = Path.Combine(Lazurite.Windows.Utils.Utils.GetAssemblyFolder(typeof(App).Assembly), "PluginsToInstall");
                var pluginsFiles      = Directory.GetFiles(pluginsFolderPath).Where(x => x.EndsWith(PluginsManager.PluginFileExtension)).ToArray();
                try
                {
                    var pluginsManager = new PluginsManager(false);
                    foreach (var pluginPath in pluginsFiles)
                    {
                        try
                        {
                            pluginsManager.HardReplacePlugin(pluginPath);
                        }
                        catch (Exception e)
                        {
                            appendError($"!Ошибка при установке плагина\r\n[{pluginPath}].", e);
                        }
                    }
                    appendInfo("Плагины установлены.");
                }
                catch (Exception e)
                {
                    appendError("!Ошибка при установке плагинов. Часть функционала может быть недоступна.", e);
                }

                // Autorun installing
                try
                {
                    var mainAppName = Path.Combine(Lazurite.Windows.Utils.Utils.GetAssemblyFolder(typeof(App).Assembly), LauncherExeName);
                    TaskSchedulerUtils.CreateLogonTask(desktopUser, mainAppName);
                    appendInfo($"Программа добавлена в планировщик задач для пользователя [{desktopUser}].");
                    // When task has been added or changed, it immediately starts the launcher
                    appendInfo($"Запуск Lazurite...");
                    Thread.Sleep(1500); // Extra crutch;
                }
                catch (Exception e)
                {
                    appendError($"!Невозможно добавить программу в автозапуск для пользователем [{desktopUser}].\r\n" +
                                $"Программа не будет запускаться автоматически при логине пользователя [{desktopUser}].", e);
                }

                Dispatcher.BeginInvoke(new Action(() => btOk.IsEnabled = true));
                Dispatcher.BeginInvoke(new Action(() => captionView.StopAnimateProgress()));

                if (!error)
                {
                    Dispatcher.BeginInvoke(new Action(() => App.Current.Shutdown()));
                }
            }
            catch (Exception e)
            {
                appendError("Непредвиденная ошибка! " + e.Message, e);
            }
        }