Example #1
0
        private void ImportFromCSV_Click(object sender, RoutedEventArgs e)
        {
            if (Preferences.ShowWarningWhenImportingFromCSVFile)
            {
                GetInput.ShowInfoDialog("CSV Import Warning", "About importing from CSV",
                                        "When you use this tool to import data from a CSV, you are making many modifications quickly, " +
                                        "which can be hard to undo. \n" +
                                        "To import a CSV, make sure that, in the CSV you want to import, the column with Device IDs is named " +
                                        "\"deviceId\", without the quotes. That will allow ChromebookGUI to run the mass operation.\n" +
                                        "If you want to silence this warning in the future, go to File -> Preferences and untick the appropriate " +
                                        "box."
                                        );
            }
            string filePath = GetInput.GetFileSelection("csv");

            if (filePath == null)
            {
                GetInput.ShowInfoDialog("ChromebookGUI: No file selected", "No File Selected", "You didn't select a file or pressed cancel. Either way no changes have been made.");
                return;
            }
            Globals.ClearGlobals();
            Globals.CsvLocation = filePath;
            Globals.DeviceId    = "csv";
            currentView.ToggleMainWindowButtons(true);
        }
        /// <summary>
        /// Returns "true" if an update is available, "false" if one is not and "error" if there was an error.
        /// String because I need more options. If a new update is available or there was an error it already opens a dialog!
        /// </summary>
        /// <returns></returns>
        public static string CheckForUpdates()
        {
            Dictionary <string, string> isNewestVersion = Updates.IsNewestVersion();

            if (isNewestVersion["isNewestVersion"] == "false")
            {
                bool extraButtonPressed = GetInput.ShowInfoDialog(
                    "Update Available",
                    "An update for this app is currently available.",
                    "You are running " + Software.Type + " " + Software.Version + " and the newest version is " + isNewestVersion["newestVersion"] + ".\nClick the button on the bottom left to upgrade.\n\nNew in version " + isNewestVersion["newestVersion"] + ":\n" + isNewestVersion["changes"],
                    new Button {
                    IsEnabled = true, Text = "Download newest build"
                });
                if (extraButtonPressed)
                {
                    Process.Start(isNewestVersion["updateUrl"]);
                }
                return("true");
            }
            else if (isNewestVersion["isNewestVersion"] == "error")
            {
                return("error");
                // nothing
            }
            else
            {
                return("false");
                // nothing
            }
        }
Example #3
0
        private async void ImportFromGoogleAdminQueryStringBulk_Click(object sender, RoutedEventArgs e)
        {
            currentView.IsLoading = true;
            string inputBoxPrefill = "example: user:jsmith\nThat imports all devices with the user:jsmith.\nClick the link on the bottom left for more information.";
            string queryString     = GetInput.getInput(
                "Enter an Admin Console query string.",
                inputBoxPrefill,
                "Import from Google Admin query string",
                new Button()
            {
                IsEnabled = true,
                Text      = "Open Help Page"
            }
                );

            if (queryString == "ExtraButtonClicked")
            {
                Process.Start("https://support.google.com/chrome/a/answer/1698333#search");
                ImportFromGoogleAdminQueryStringBulk_Click(sender, e);
                return;
            }
            else if (queryString == inputBoxPrefill || queryString == null)
            {
                GetInput.ShowInfoDialog("ChromebookGUI: No input", "No Input", "No query string entered, silly goose!");
                currentView.IsLoading = false;
                return;
            }

            List <string> gamResult = await Task.Run(() => GAM.RunGAM("print cros query \"" + queryString + "\""));

            if (gamResult.Count == 0)
            {
                GetInput.ShowInfoDialog("ChromebookGUI: Invalid Query String", "Invalid Query String", "That's an invalid query string. If you don't think it is, try running this in cmd:\n\ngam print cros query \"" + queryString + "\"");
                currentView.IsLoading = false;
                return;
            }
            else if (gamResult.Count < 2)
            {
                GetInput.ShowInfoDialog("ChromebookGUI: No Results", "No Results from Query String", "No results from that query (" + queryString + ")");
                currentView.IsLoading = false;
                return;
            }
            File.WriteAllLines(System.IO.Path.GetTempPath() + "ChromebookGUI.csv", gamResult.ToArray());
            Globals.ClearGlobals();
            Globals.CsvLocation   = System.IO.Path.GetTempPath() + "ChromebookGUI.csv";
            Globals.DeviceId      = "csv";
            currentView.IsLoading = false;
            GetInput.ShowInfoDialog("ChromebookGUI: Success", "Successful Query", "Found " + (gamResult.Count - 1) + " devices using query " + queryString + "."); // subtract 1 because the first is "deviceId"
        }
        public static Dictionary <string, string> IsNewestVersion()
        {
            Console.WriteLine("Starting newest version check...");
            HttpClient    http = Globals.HttpClientObject;
            Task <string> newestVersionsString         = http.GetStringAsync("https://iamtheyammer.github.io/gam-cros-win-wrapper/updates/" + Software.Type + ".json");
            Dictionary <string, string> newestVersions = null;

            try
            {
                newestVersionsString.Wait();
                newestVersions = JsonConvert.DeserializeObject <Dictionary <string, string> >(newestVersionsString.Result);
            } catch /*(Exception e)*/
            {
                GetInput.ShowInfoDialog("Internet Issue", "No internet connection", "Could not connect to the internet to check for updates.\nPlease make sure that github.io is accessible on your network.\n\nThe full URL this software is trying to access is:\nhttps://iamtheyammer.github.io/gam-cros-win-wrapper/releases.json");
                return(new Dictionary <string, string>()
                {
                    ["error"] = "true",
                    ["errorCode"] = "2" // no internet
                });
            }

            if (newestVersions == null)
            {
                GetInput.ShowInfoDialog("Error", "error checking for updates", "error!");
            }
            string currentVersion = Software.Version;
            string newestVersion  = newestVersions["newestVersion"];

            if (newestVersion == currentVersion)
            {
                return(new Dictionary <string, string>()
                {
                    ["isNewestVersion"] = "true"
                });
            }
            else
            {
                Console.WriteLine(newestVersions["newestVersion"]);
                return(new Dictionary <string, string>()
                {
                    ["isNewestVersion"] = "false",
                    ["newestVersion"] = !String.IsNullOrEmpty(newestVersions["newestVersion"]) ? newestVersions["newestVersion"] : "(could not be determined)",
                    ["changes"] = !String.IsNullOrEmpty(newestVersions["changes"]) ? newestVersions["changes"] : "(there was an issue getting the changelog)",
                    ["updateUrl"] = (newestVersions["updateUrl"].StartsWith("https://github.com/iamtheyammer") ||
                                     newestVersions["updateUrl"].StartsWith("https://iamtheyammer.github.io"))
                        ? newestVersions["updateUrl"] : "The update URL was deemed to be unsafe (not from iamtheyammmer!!!!). This is a MASSIVE DEAL. REPORT IMMEDIATELY."
                });
            }
        }
Example #5
0
        private void HelpCheckForUpdates_Click(object sender, RoutedEventArgs e)
        {
            string updates = Updates.CheckForUpdates();

            switch (updates)
            {
            case "false":
                GetInput.ShowInfoDialog("ChromebookGUI Updater", "No updates available", "This product, ChromebookGUI by iamtheyammer, is up to date. You are running " + Software.Type + " " + Software.Version + ".");
                return;

            case "true":
                return;
                //case "error":
                //    GetInput.ShowInfoDialog("ChromebookGUI Updater", "Error checking for updates.", "There was an error checking for updates."); // this should never happen!
                //    return;
            }
        }
 private void copyId_Click(object sender, RoutedEventArgs e)
 {
     if (Globals.DeviceId != null && Globals.DeviceId != "csv")
     {
         Clipboard.SetText(Globals.DeviceId, TextDataFormat.UnicodeText);
         outputField.Text += "\n\nCopied to clipboard.";
     }
     else if (Globals.DeviceId == "csv")
     {
         GetInput.ShowInfoDialog("Not Supported", "This action is not supported from a CSV", "We don't support copying all IDs from a CSV at this time.");
         return;
     }
     else
     {
         outputField.Text += "\n\nNo device ID currently in memory.";
     }
 }
        /// <summary>
        /// Get info about the device. Does NOT support CSVs.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void getInfoButton_Click(object sender, RoutedEventArgs e)
        {
            if (Globals.DeviceIdExists() == false)
            {
                outputField.Text = "No device ID currently in memory. Press " + submitDeviceId.Content + " then try again.";
                return;
            }
            else if (Globals.DeviceId == "csv")
            {
                GetInput.ShowInfoDialog("Not Supported", "This action is not supported with a CSV", "We don't support using CSVs for info because they put out unreadable output.");
                return;
            }
            string deviceId = Globals.DeviceId;

            //if (deviceId == null || deviceId.Length < 1) ;
            outputField.Text = GAM.RunGAMFormatted("info cros " + Globals.DeviceId + " allfields");
        }
Example #8
0
        /// <summary>
        /// Returns "true" if an update is available, "false" if one is not and "error" if there was an error.
        /// String because I need more options. If a new update is available or there was an error it already opens a dialog!
        /// </summary>
        /// <returns></returns>
        public static string CheckForUpdates()
        {
            Dictionary <string, string> isNewestVersion = Updates.IsNewestVersion();

            if (isNewestVersion["isNewestVersion"] == "false")
            {
                bool extraButtonPressed = GetInput.ShowInfoDialog(
                    "Update Available",
                    "An update for this app is currently available.",
                    "You are running " + Software.Type + " " + Software.Version + " and the newest version is " + isNewestVersion["newestVersion"] + ".\nClick the button on the bottom left to upgrade.\n\nNew in version " + isNewestVersion["newestVersion"] + ":\n" + isNewestVersion["changes"],
                    new Button {
                    IsEnabled = true, Text = "Download newest build"
                });
                if (extraButtonPressed)
                {
                    switch (Software.Type)
                    {
                    case "alpha":
                        Process.Start("https://github.com/iamtheyammer/gam-cros-win-wrapper/raw/master/ChromebookGUI/Installer/Tool+Installer/Installer.msi");
                        break;

                    default:
                        Process.Start("https://github.com/iamtheyammer/releases/latest");
                        break;
                    }
                }
                return("true");
            }
            else if (isNewestVersion["isNewestVersion"] == "error")
            {
                return("error");
                // nothing
            }
            else
            {
                return("false");
                // nothing
            }
        }
        private async void OrganizationalUnitBrowseButton_Click(object sender, RoutedEventArgs e)
        {
            string currentOutput = outputField.Text;

            IsLoading = true;
            string orgUnit = OrgUnit.HandleAwaitableGetOrgUnitFromSelector(await Task.Run(OrgUnit.AwaitableGetOrgUnitFromSelector));

            IsLoading = false;
            if (string.IsNullOrEmpty(orgUnit))
            {
                GetInput.ShowInfoDialog("No org unit selected",
                                        "No org unit selected",
                                        "For best results, please select an org unit.");
                outputField.Text = currentOutput;
                return;
            }
            else
            {
                OrganizationalUnitField.Text = orgUnit;
            }
            outputField.Text = currentOutput;
        }
Example #10
0
 private void FileAboutChromebookGUI_Click(object sender, RoutedEventArgs e)
 {
     GetInput.ShowInfoDialog("About ChromebookGUI", "Open source, by iamtheyammer", "This project was made by iamtheyammer on GitHub. It lives at https://git.io/fxYBf, and was made because of my disdain for the speed of Google's Admin Console.\n\nI hope you enjoy it! If you'd like to contribute (this project is written in C# with .NET) please submit a pull request!\n\nThank you for using my software.");
 }
        private async void ApplyChangesButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                IsLoading = true;
                // check to see which fields have been changed (ones that aren't the global or "<no value present>", should make this an independent function)
                ProgressBarDialog progressBar = GetInput.ShowProgressBarDialog("Updating Device", 50, "Updating device info...");
                progressBar.UpdateBarAndText(50, "Updating device info...");
                string gamCommand = "update cros " + Globals.DeviceId + " ";
                string outputText = "";

                if (LocationField.Text != Globals.Location)
                {
                    if (ShouldEmptyField(LocationField.Text, Globals.Location))
                    {
                        switch (GetInput.GetYesOrNo("Empty Location?", "Clear the field?", "Click yes if you want to empty the Location field. Click no to cancel."))
                        {
                        case "yes":
                            break;

                        case "no":
                            outputField.Text = "Cancelling because you didn't want to empty a field.";
                            progressBar.Close();
                            IsLoading = false;
                            return;

                        default:
                            progressBar.Close();
                            return;
                        }
                    }
                    gamCommand      += "location \"" + LocationField.Text + "\" ";
                    Globals.Location = LocationField.Text;
                    outputText      += "Location, ";
                }
                if (AssetIdField.Text != Globals.AssetId)
                {
                    if (ShouldEmptyField(AssetIdField.Text, Globals.AssetId))
                    {
                        switch (GetInput.GetYesOrNo("Empty Asset ID?", "Clear the field?", "Click yes if you want to empty the Asset ID field. Click no to cancel."))
                        {
                        case "yes":
                            break;

                        case "no":
                            outputField.Text = "Cancelling because you didn't want to empty a field.";
                            progressBar.Close();
                            IsLoading = false;
                            return;

                        default:
                            progressBar.Close();
                            return;
                        }
                    }
                    gamCommand     += "asset_id \"" + AssetIdField.Text + "\" ";
                    Globals.AssetId = LocationField.Text;
                    outputText     += "Asset ID, ";
                }
                if (UserField.Text != Globals.User)
                {
                    if (ShouldEmptyField(UserField.Text, Globals.User))
                    {
                        switch (GetInput.GetYesOrNo("Empty User?", "Clear the field?", "Click yes if you want to empty the User field. Click no to cancel."))
                        {
                        case "yes":
                            break;

                        case "no":
                            outputField.Text = "Cancelling because you didn't want to empty a field.";
                            progressBar.Close();
                            return;

                        default:
                            progressBar.Close();
                            return;
                        }
                    }
                    gamCommand  += "user \"" + UserField.Text + "\" ";
                    Globals.User = UserField.Text;
                    outputText  += "User, ";
                }
                if (NoteField.Text != Globals.Note)
                {
                    if (ShouldEmptyField(NoteField.Text, Globals.Note))
                    {
                        switch (GetInput.GetYesOrNo("Empty Note?", "Clear the field?", "Click yes if you want to empty the Note field. Click no to cancel."))
                        {
                        case "yes":
                            break;

                        case "no":
                            outputField.Text = "Cancelling because you didn't want to empty a field.";
                            progressBar.Close();
                            IsLoading = false;
                            return;

                        default:
                            progressBar.Close();
                            return;
                        }
                    }
                    gamCommand  += "notes \"" + NoteField.Text.Replace("\"", "\\\"") + "\" "; // will output a note like this: "He told me \"Hello!\" yesterday."
                    Globals.Note = NoteField.Text;
                    outputText  += "Note, ";
                }
                if (StatusDisabledRadio.IsChecked == true && Globals.Status != "DISABLED")
                {
                    progressBar.UpdateBarAndText(55, "Disabling...");
                    await Task.Run(() => GAM.RunGAM("update cros " + Globals.DeviceId + " action disable"));

                    Globals.Status = "DISABLED";
                    outputText    += "Status, ";
                }
                if (StatusActiveRadio.IsChecked == true && Globals.Status != "ACTIVE")
                {
                    progressBar.UpdateBarAndText(55, "Enabling...");
                    await Task.Run(() => GAM.RunGAM("update cros " + Globals.DeviceId + " action reenable"));

                    Globals.Status = "ACTIVE";
                    outputText    += "Status, ";
                }
                if (StatusDeprovisionedRadio.IsChecked == true && Globals.Status != "DEPROVISIONED")
                {
                    //deprovision_same_model_replace|deprovision_different_model_replace|deprovision_retiring_device [acknowledge_device_touch_requirement]
                    int depReason = GetInput.GetDeprovisionReason();
                    switch (depReason)
                    {
                    case 1:
                        progressBar.UpdateBarAndText(55, "Deprovisioning...");
                        await Task.Run(() => GAM.RunGAM("update cros " + Globals.DeviceId + " action deprovision_same_model_replace acknowledge_device_touch_requirement"));

                        break;

                    case 2:
                        progressBar.UpdateBarAndText(55, "Deprovisioning...");
                        await Task.Run(() => GAM.RunGAM("update cros " + Globals.DeviceId + " action deprovision_different_model_replace acknowledge_device_touch_requirement"));

                        break;  // different

                    case 3:     // retire
                        progressBar.UpdateBarAndText(55, "Deprovisioning...");
                        await Task.Run(() => GAM.RunGAM("update cros " + Globals.DeviceId + " action deprovision_retiring_device acknowledge_device_touch_requirement"));

                        break;

                    default:
                        outputField.Text = "No deprovision reason was selected so that choice was not saved.\n";
                        break;     // do nothing: they selected nothing.
                    }
                    if (depReason != 0)
                    {
                        Globals.Status = "DEPROVISIONED";
                        outputText    += "Status, ";
                        StatusActiveRadio.IsEnabled        = false;
                        StatusDeprovisionedRadio.IsEnabled = false;
                        StatusDisabledRadio.IsEnabled      = false;
                    }
                }

                if (OrganizationalUnitField.Text != Globals.OrgUnitPath)
                {
                    if (ShouldEmptyField(OrganizationalUnitField.Text, Globals.OrgUnitPath))
                    {
                        GetInput.ShowInfoDialog("Empty org unit path.", "Your org unit path can't be blank.", "You can't have a blank org unit path.");
                        return;
                    }
                    gamCommand         += "ou \"" + OrganizationalUnitField.Text + "\" ";
                    Globals.OrgUnitPath = OrganizationalUnitField.Text;
                    outputText         += "Organizational Unit ";
                }

                progressBar.UpdateBarAndText(75, "Updating info...");
                if (gamCommand != "update cros " + Globals.DeviceId + " ") // if something was changed
                {
                    string decision = GetInput.GetYesOrNo("GAM Confirmation", "Do you want to send this GAM command?",
                                                          "gam " + gamCommand.Replace("\\", "\\\\"));
                    if (decision != "yes")
                    {
                        IsLoading = false;
                        progressBar.Close();
                        return;
                    }
                    string gamOutput = await Task.Run(() => GAM.RunGAMFormatted(gamCommand));

                    Console.WriteLine(gamOutput);
                }
                progressBar.UpdateBarAndText(99, "Finishing up...");
                IsLoading = false;
                if (outputText.Length > 1)
                {
                    outputField.Text = outputText += "was updated.";
                }
                progressBar.Close();
                // build a GAM command from that information
                // run it
                // update globals
                // show success in output field
            }
            catch (Exception err)
            {
                Debug.CaptureRichException(err, CollectFieldsForRichException());
                Debug.ShowErrorMessage();
            }
        }