Пример #1
0
        private void Feature_CreateDistroShortcut(object sender, EventArgs e)
        {
            var targetItem = GetSelectedDistroBySender(sender);

            if (targetItem == null)
            {
                return;
            }

            using var saveFileDialog = new SaveFileDialog()
                  {
                      Title = $"Create Shortcut for {targetItem.DistroName}",
                      SupportMultiDottedExtensions = true,
                      Filter     = "Shortcut Link|*.lnk",
                      DefaultExt = ".lnk",
                      FileName   = $"{targetItem.DistroName}.lnk",
                  };

            if (saveFileDialog.ShowDialog(this) != DialogResult.OK)
            {
                return;
            }

            var targetShortcutPath = saveFileDialog.FileName;

            if (File.Exists(targetShortcutPath))
            {
                File.Delete(targetShortcutPath);
            }

            WslHelpers.CreateDistroShotcut(
                targetItem.DistroName,
                targetShortcutPath,
                GetDistroIconImage(targetItem.DistroName));
        }
Пример #2
0
        public static void RefreshDistroList()
        {
            var table      = dbContext.WslDistros;
            var distroList = WslHelpers.GetDistroList();

            foreach (var eachDistroInfo in distroList)
            {
                var distro = table.Where(x => x.DistroName == eachDistroInfo.DistroName).FirstOrDefault();

                if (distro != null)
                {
                    distro.DistroStatus = eachDistroInfo.DistroStatus;
                    distro.WSLVersion   = eachDistroInfo.WSLVersion;
                    distro.IsDefault    = eachDistroInfo.IsDefault;
                }
                else
                {
                    distro = new WslDistro()
                    {
                        DistroName   = eachDistroInfo.DistroName,
                        DistroStatus = eachDistroInfo.DistroStatus,
                        WSLVersion   = eachDistroInfo.WSLVersion,
                        IsDefault    = eachDistroInfo.IsDefault,
                    };
                    table.Add(distro);
                }
            }

            var distroNames            = distroList.Select(x => x.DistroName);
            var unregisteredDistroList = table.Where(x => !distroNames.Contains(x.DistroName));

            table.RemoveRange(unregisteredDistroList);
            dbContext.SaveChanges();
        }
Пример #3
0
        private void Feature_BackupDistro(object sender, EventArgs e)
        {
            var targetItem = GetSelectedDistroBySender(sender);

            if (targetItem == null)
            {
                return;
            }

            using var saveFileDialog = new SaveFileDialog()
                  {
                      Title = $"Backup {targetItem.DistroName}",
                      SupportMultiDottedExtensions = true,
                      Filter     = "Tape Archive File|*.tar",
                      DefaultExt = ".tar",
                      FileName   = $"backup-{targetItem.DistroName.ToLowerInvariant()}-{DateTime.Now:yyyy-MM-dd-HH-mm-ss}.tar",
                  };

            if (saveFileDialog.ShowDialog(this) != DialogResult.OK)
            {
                return;
            }

            var backupProcess = WslHelpers.CreateExportDistroProcess(targetItem.DistroName, saveFileDialog.FileName);

            backupProcess.Start();
            AppContext.RefreshDistroList();
        }
Пример #4
0
        private void Feature_RunAsDistro(object sender, EventArgs e)
        {
            var targetItem = GetSelectedDistroBySender(sender);

            if (targetItem == null)
            {
                return;
            }

            using var dialog = new RunAsForm(new DistroRunAsRequest()
            {
                DistroName      = targetItem.DistroName,
                DistroList      = AppContext.WslDistroList.Select(x => x.DistroName).Distinct().ToArray(),
                User            = "******",
                ExecCommandLine = "",
            });

            if (dialog.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            var targetDistro    = dialog.ViewModel.DistroName;
            var targetUserId    = dialog.ViewModel.User;
            var execCommandLine = dialog.ViewModel.ExecCommandLine;

            var process = WslHelpers.CreateLaunchSpecificDistroAsUserProcess(
                targetDistro, targetUserId, execCommandLine);

            process.Start();
            process.WaitForExit();

            AppContext.RefreshDistroList();
        }
        private void PropertiesCalculator_DoWork(object sender, DoWorkEventArgs e)
        {
            var model = e.Argument as DistroPropertyRequest;

            if (model == null)
            {
                throw new ArgumentException("Cannot obtain internal model reference.");
            }

            var distroName = model.DistroName;

            if (string.IsNullOrWhiteSpace(distroName))
            {
                return;
            }

            var distroGuid = WslHelpers.GetDistroGuid(distroName);

            if (!distroGuid.HasValue)
            {
                return;
            }

            var distroLocation = WslHelpers.GetDistroLocation(distroGuid.Value);

            Invoke(new Action(() => model.Location = distroLocation));

            var totalSize = 0L;

            Invoke(new Action(() => model.DistroSize = totalSize));

            if (distroLocation != null)
            {
                var directoryInfo = new DirectoryInfo(distroLocation);
                foreach (var eachFileInfo in directoryInfo.GetFiles("*.*", SearchOption.AllDirectories))
                {
                    totalSize += eachFileInfo.Length;
                    Invoke(new Action(() => model.DistroSize = (long)(totalSize / 1024L)));
                }

                Invoke(new Action(() => model.DistroSize = totalSize));
            }

            var table = ToDataTable(WslHelpers.GetLinuxUserInfo(distroName));

            Invoke(new Action(() =>
            {
                userListBindingSource.DataSource = table;
            }));
        }
Пример #6
0
        private void Feature_OpenDistroFileSystem(object sender, EventArgs e)
        {
            var targetItem = GetSelectedDistroBySender(sender);

            if (targetItem == null)
            {
                return;
            }

            var process = WslHelpers.CreateLaunchSpecificDistroExplorerProcess(targetItem.DistroName);

            process.Start();

            AppContext.RefreshDistroList();
        }
Пример #7
0
        private void Feature_ShutdownWsl(object sender, EventArgs e)
        {
            if (MessageBox.Show(this, $"Really shutdown WSL entirely? Please save all of the files before shutdown.",
                                Text, MessageBoxButtons.YesNo, MessageBoxIcon.Warning,
                                MessageBoxDefaultButton.Button2) != DialogResult.Yes)
            {
                return;
            }

            var process = WslHelpers.CreateShutdownDistroProcess();

            process.Start();
            process.WaitForExit();
            AppContext.RefreshDistroList();
        }
Пример #8
0
        private void Feature_TerminateDistro(object sender, EventArgs e)
        {
            var targetItem = GetSelectedDistroBySender(sender);

            if (targetItem == null)
            {
                return;
            }

            var process = WslHelpers.CreateTerminateSpecificDistroProcess(targetItem.DistroName);

            process.Start();
            process.WaitForExit();

            AppContext.RefreshDistroList();
        }
        private void UserQueryWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var request = e.Argument as DistroRootFsFindRequest;

            var targetUrl   = new Uri("https://wslhub.com/WslManager/data/install-source.json", UriKind.Absolute);
            var httpRequest = (HttpWebRequest)HttpWebRequest.CreateHttp(targetUrl);

            using var httpResponse   = (HttpWebResponse)httpRequest.GetResponse();
            using var responseStream = httpResponse.GetResponseStream();
            using var streamReader   = new StreamReader(responseStream, new UTF8Encoding(false), true);

            var content = streamReader.ReadToEnd();
            var model   = (InstallSourceModel)JsonConvert.DeserializeObject(content, typeof(InstallSourceModel));

            request.RootFsCandidates = model.RootFs.Where(x => string.Equals(WslHelpers.GetArchitectureName(), x.Value.Architecture, StringComparison.OrdinalIgnoreCase)).Select(x => x.Value).ToList();
            e.Result = request.RootFsCandidates;
        }
        private void ListView_ItemActivate(object sender, EventArgs e)
        {
            if (listView.SelectedItems.Count != 1)
            {
                return;
            }

            var targetItem = listView.SelectedItem?.RowObject as WslDistro;

            if (targetItem == null)
            {
                return;
            }

            var process = WslHelpers.CreateLaunchSpecificDistroProcess(targetItem.DistroName);

            process.Start();

            AppContext.RefreshDistroList();
        }
        private void MainForm_Load(object sender, EventArgs e)
        {
            if (!File.Exists(WslHelpers.GetCanonicalWslExePath()))
            {
                MessageBox.Show(this, "This system does not have wsl CLI.",
                                Text, MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1);
                Close();
                return;
            }

            if (!File.Exists(WslHelpers.GetCanonicalWslHostExePath()))
            {
                MessageBox.Show(this, "It looks like WSL does not available on this system. Please install WSL first.",
                                Text, MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1);
                Close();
                return;
            }

            AppContext.RefreshDistroList();
        }
Пример #12
0
        private void Feature_RestoreDistro(object sender, EventArgs e)
        {
            using var dialog = new RestoreForm();

            if (dialog.ShowDialog(this) != DialogResult.OK)
            {
                return;
            }

            var restoreRequest = dialog.ViewModel;

            if (restoreRequest == null)
            {
                return;
            }

            var process = WslHelpers.CreateImportDistroProcess(restoreRequest.NewName, restoreRequest.RestoreDirPath, restoreRequest.TarFilePath);

            process.Start();
            AppContext.RefreshDistroList();
        }
Пример #13
0
        private void Feature_InstallDistro(object sender, EventArgs e)
        {
            using var dialog = new InstallForm();

            if (dialog.ShowDialog(this) != DialogResult.OK)
            {
                return;
            }

            var installRequest = dialog.ViewModel;

            if (installRequest == null)
            {
                return;
            }

            var process = WslHelpers.CreateImportDistroProcess(installRequest.NewName, installRequest.InstallDirPath, installRequest.DownloadedTarFilePath);

            process.Start();
            AppContext.RefreshDistroList();
        }
Пример #14
0
        private void NotepadProcess_Exited(object sender, EventArgs e)
        {
            if (InvokeRequired)
            {
                Invoke(new EventHandler(NotepadProcess_Exited), sender, e);
                return;
            }

            if (MessageBox.Show(this, $"To apply change, you need to shutdown the LXSS service. Please save all of the files before shutdown. Shtudown now?",
                                Text, MessageBoxButtons.YesNo, MessageBoxIcon.Warning,
                                MessageBoxDefaultButton.Button2) != DialogResult.Yes)
            {
                return;
            }

            var process = WslHelpers.CreateShutdownDistroProcess();

            process.Start();
            process.WaitForExit();
            AppContext.RefreshDistroList();
        }
Пример #15
0
        private void Feature_UnregisterDistro(object sender, EventArgs e)
        {
            var targetItem = GetSelectedDistroBySender(sender);

            if (targetItem == null)
            {
                return;
            }

            if (MessageBox.Show(this, $"Really unregister `{targetItem.DistroName}` distro? This cannot be undone.",
                                Text, MessageBoxButtons.YesNo, MessageBoxIcon.Warning,
                                MessageBoxDefaultButton.Button2) != DialogResult.Yes)
            {
                return;
            }

            var process = WslHelpers.CreateUnregisterDistroProcess(targetItem.DistroName);

            process.Start();
            process.WaitForExit();

            AppContext.RefreshDistroList();
        }