diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7e3a226f..6bb63e40 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,34 +1,32 @@ # Contributing to PSGSuite - +Thank you for your interest in helping PSGSuite grow! Below you'll find some guidelines around developing additional features and squashing bugs, including some how-to's to get started quick, general style guidelines, etc. + - [Git and Pull requests](#git-and-pull-requests) - [Overview](#overview) - - [Step by Step (High-Level)](#step-by-step-high-level) - - [Contributing Guidelines](#contributing-guidelines) - - [Updating the Wiki](#updating-the-wiki) + - [Code Guidelines](#code-guidelines) + - [Documentation Guidelines](#documentation-guidelines) + - [Requirements](#requirements) + - [Setting up MkDocs Locally](#setting-up-mkdocs-locally) - [Getting Started](#getting-started) - [Enabling Debug Mode](#enabling-debug-mode) - [Google .NET SDK Documentation](#google-net-sdk-documentation) - - [.NET/API Documentation Links](#netapi-documentation-links) - [Keeping in Touch](#keeping-in-touch) - - -Thank you for your interest in helping PSGSuite grow! Below you'll find some guidelines around developing additional features and squashing bugs, including some how-to's to get started quick, general style guidelines, etc. - -[![Waffle.io - Columns and their card count](https://badge.waffle.io/scrthq/PSGSuite.svg?columns=all)](https://waffle.io/scrthq/PSGSuite) - ## Git and Pull requests -* Contributions are submitted, reviewed, and accepted using Github pull requests. [Read this article](https://help.github.com/articles/using-pull-requests) for some details. We use the _Fork and Pull_ model, as described there. More info can be found here: [Forking Projects](https://guides.github.com/activities/forking/) -* Please make sure to leave the `Allow edits from maintainers` box checked when submitting PR's so that any edits can be made by maintainers of the repo directly to the source branch and into the same PR. More info can be found here: [Allowing changes to a pull request branch created from a fork](https://help.github.com/articles/allowing-changes-to-a-pull-request-branch-created-from-a-fork/#enabling-repository-maintainer-permissions-on-existing-pull-requests) +- Contributions are submitted, reviewed, and accepted through **GitHub Pull Requests**: + - Learn more about it [here](https://help.github.com/articles/using-pull-requests). +- We follow the **Fork and Pull*- model. + - Learn more about it [here](https://guides.github.com/activities/forking/). +- When submitting a pull request, ensure the `Allow edits from maintainers` option is checked. This allows maintainers to make necessary edits directly to your branch and include them in the same pull request. + - Learn more about it [here](https://help.github.com/articles/allowing-changes-to-a-pull-request-branch-created-from-a-fork/#enabling-repository-maintainer-permissions-on-existing-pull-requests). ## Overview -### Step by Step (High-Level) - Here's the overall flow of making contributions: + 1. Fork the repo 2. Make your edits / additions on your fork 3. Push your changes back to your fork on GitHub @@ -36,146 +34,99 @@ Here's the overall flow of making contributions: 5. Pull request is reviewed. Any necessary edits / suggestions will be made 6. Once changes are approved, the pull request is merged into the origin's main branch and deployed to the PowerShell Gallery once CI tests pass -### Contributing Guidelines +### Code Guidelines Please follow these guidelines for any content being added: -* **ALL functions must...** - * work in the supported PowerShell versions by this module - * work in any OS; - * any code that includes paths must build the path using OS-agnostic methods, i.e. by using `Resolve-Path`, `Join-Path` and `Split-Path` - * paths also need to use correct casing, as some OS's are case-sensitive in terms of paths -* **Public functions must...** - * include comment-based help (this is used to drive the Wiki updates on deployment) - * include Write-Verbose calls to describe what the function is doing (CI tests will fail the build if any don't) - * be placed in the correct APU/use-case folder in the Public sub-directory of the module path (if it's a new API/use-case, create the new folder as well) - * use `SupportsShouldProcess` if... - * the function's verb is `Remove` or `Set`. - * it can be included on `Update` functions as well, if felt that the actions executed by the function should be guarded - * `Get` functions should **never** need `SupportsShouldProcess` -* **Every Pull Request must...** +- **ALL functions must...** + - Work in the supported PowerShell versions by this module + - Work in any OS; + - Any code that includes paths must build the path using OS-agnostic methods, i.e. by using `Resolve-Path`, `Join-Path` and `Split-Path` + - Paths also need to use correct casing, as some OS's are case-sensitive in terms of paths +- **Public functions must...** + - Include comment-based help (this is used to drive the Wiki updates on deployment) + - Include Write-Verbose calls to describe what the function is doing (CI tests will fail the build if any don't) + - Be placed in the correct APU/use-case folder in the Public sub-directory of the module path (if it's a new API/use-case, create the new folder as well) + - Use `SupportsShouldProcess` if... + - The function's verb is `Remove` or `Set`. + - It can be included on `Update` functions as well, if felt that the actions executed by the function should be guarded + - `Get` functions should **never** need `SupportsShouldProcess` +- **Every Pull Request must...** + > [!NOTE] > These can be added in during the pull request review process, but are nice to have if possible - * have the module version bumped appropriately in the manifest (Major for any large updates, Minor for any new functionality, Patch for any hotfixes) - * have an entry in the Changelog describing what was added, updated and/or fixed with this version number - * *Please follow the same format already present* - * have an entry in the ReadMe's `Most recent changes` section describing what was added, updated and/or fixed with this version number - * *Please follow the same format already present* - * *This can be copied over from the Changelog entry* -### Updating the Wiki + - Have the module version bumped appropriately in the manifest (Major for any large updates, Minor for any new functionality, Patch for any hotfixes) + - Have an entry in the Changelog describing what was added, updated and/or fixed with this version number + > [!NOTE] + > Please follow the same format already present + - Have an entry in the readme's `Most recent changes` section describing what was added, updated and/or fixed with this version number + > [!NOTE] + > Please follow the same format already present + > + >This can be copied over from the Changelog entry -* Wiki updates are scripted during deployment builds, so there is no need to manually update the Wiki. -* Any new or updated comment-based help content will be transformed to Markdown using `platyPS` and pushed to the Wiki repo when deployment conditions are met. +### Documentation Guidelines -## Getting Started +The PSGSuite documentation site is built using MkDocs. Follow these steps to spin up MkDocs locally, make changes, and preview your updates before submitting them. -### Enabling Debug Mode +#### Requirements -To enable debug mode and export the `New-GoogleService` function with the module, you can run the `Debub Mode.ps1` script in the root of the repo or the following lines of code from the root of the repo in PowerShell: +- Python (version 3.7 or higher): + - Download and install Python from [python.org](https://python.org). + - Ensure `pip` (Python's package manager) is installed and available in your `PATH`. +- MkDocs and Dependencies: + - Install MkDocs and its dependencies using the provided `requirements.txt` file. -```powershell -$env:EnablePSGSuiteDebug = $true -Import-Module (Join-Path (Join-Path "." "PSGSuite") "PSGSuite.psd1") -Force +#### Setting up MkDocs Locally + +- Fork the PSGSuite repository +- Clone your forked repository to your local machine + +```plaintext +git clone https://github.com//PSGSuite.git ``` -Debug mode is useful as it gives you access to the `New-GoogleService` function. This is normally a private function that is used by most other functions to create `Google Service` object with which to create and execute requests with. For example: +- Navigate to the cloned repository directory -```powershell -$serviceParams = @{ - # This needs to be one of the scopes that the request method invoked by the function needs - Scope = 'https://www.googleapis.com/auth/admin.directory.user' - # This is the Google SDK Service Type used by all classes/methods in that category. - # Most of the calls in PSGSuite use the below DirectoryService, as that houses the Google Admin SDK - ServiceType = 'Google.Apis.Admin.Directory.directory_v1.DirectoryService' -} +```plaintext +cd //path/to/PSGSuite +``` -# Create the Google Service object and store that in the $service variable -$service = New-GoogleService @serviceParams +1. Install dependencies -# Create the request object using the $service and store that in the $request variable -$request = $service.Users.List() +```plaintext +pip install -r requirements.txt +``` + +1. Start the MkDocs development server and navigate to `http://127.0.0.1:8000` in your web browser -# Execute the request to return the results -$request.Execute() +```plaintext +mkdocs serve ``` -### Google .NET SDK Documentation +1. Make your edits and submit a pull request -PSGSuite uses Google's .NET SDK's for 99% of its functions. The easiest way to pull up the documentation for the function you are writing is by doing the following (*using the Admin Directory API as an example*): - -1. Find Google's API information for the function you're writing - * Usually the first result when searching for specific API's in Google: - * Search: `google admin directory api` - * Result: [G Suite Admin SDK Directory API](https://developers.google.com/admin-sdk/directory/) - * **See the [Documentation Links](#netapi-documentation-links) section below for some handy links** -2. Open the **Guides** tab -3. Click the **.NET** section under the `Quickstarts` header in the side menu -4. Scroll to the bottom of the page and click the link for the **.NET reference documentation** under the **Further reading** header. For the Admin Directory API, it's: [Directory API .NET reference documentation](https://developers.google.com/resources/api-libraries/documentation/admin/directory_v1/csharp/latest/) -5. Click the **Classes** dropdown on the top-left of the page, then click **Class List** -6. Find the resource class you are looking for. Resource classes all end in `Resource`, i.e. `UsersResource` or `OrgunitResource`. -7. Find the request method specific to your function. Request methods all end in `Request`, i.e. `ListRequest` or `InsertRequest`. - -#### .NET/API Documentation Links - -Here are some links to the most commonly used SDK's and API's in PSGSuite: - -* **Admin SDK: Directory API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/admin/directory_v1/csharp/latest/index.html) - * [API Documentation](https://developers.google.com/admin-sdk/directory/v1/reference/) -* **Apps Activity API - Updating to Drive Activity API v2 (new name) - Sunset scheduled December 2019** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/appsactivity/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/drive/activity/v1/reference/) -* **Contacts API - To be replaced soon with People API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/contacts/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/contacts/v3/reference) -* **Data Transfer API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/admin/datatransfer_v1/csharp/latest/) - * [API Documentation](https://developers.google.com/admin-sdk/data-transfer/v1/reference) -* **Drive Activity API v2** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/driveactivity/v2/csharp/latest/) - * [API Documentation](https://developers.google.com/drive/activity/v2/reference/rest/) -* **Enterprise License Manager API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/licensing/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/admin-sdk/licensing/v1/reference/) -* **Gmail API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/gmail/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/gmail/api/v1/reference/) -* **Google Calendar API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/calendar/v3/csharp/latest/) - * [API Documentation](https://developers.google.com/calendar/v3/reference/) -* **Google Classroom API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/classroom/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/classroom/reference/rest/) -* **Google Docs API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/docs/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/docs/api/reference/rest/) -* **Google Drive API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/drive/v3/csharp/latest/) - * [API Documentation](https://developers.google.com/drive/api/v3/reference/) -* **Google Sheets API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/sheets/v4/csharp/latest/) - * [API Documentation](https://developers.google.com/sheets/api/reference/rest/) -* **Google Slides API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/slides/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/slides/reference/rest/) -* **Groups Settings API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/groupssettings/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/admin-sdk/groups-settings/v1/reference/groups) -* **Hangouts Chat API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/chat/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/hangouts/chat/reference/) -* **People API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/people/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/people/api/rest/) -* **Tasks API** - * [.NET SDK Documentation](https://developers.google.com/resources/api-libraries/documentation/tasks/v1/csharp/latest/) - * [API Documentation](https://developers.google.com/tasks/v1/reference/) +> [!NOTE] +> +> The `Function Help` content is automatically updated during the deployment builds. Any new or updated comment-based help will be transformed to Markdown using `platyPS` and pushed when deployment conditions are met. +Install MkDocs and its dependencies using the provided requirements.txt file. +## Getting Started + +### Enabling Debug Mode + +> [!WARNING] +> TODO: Add instructions for how to use `build.ps1` to enable debug mode for the module. + +### Google .NET SDK Documentation + +PSGSuite uses Google's .NET SDK's for 99% of its functions. The easiest way to pull up the documentation for the function you are writing is by visiting Google's API .NET [GitHub repository](https://github.com/googleapis/google-api-dotnet-client). Scroll down to [`API-specific Libraries`](https://github.com/googleapis/google-api-dotnet-client?tab=readme-ov-file#api-specific-libraries) for more .NET SDK Documentation and API documentation. ## Keeping in Touch For any questions, comments or concerns outside of opening an issue, please reach out: -* on the SCRT HQ Slack: `scrthq.slack.com`. [Click here](https://scrthq-slack-invite.herokuapp.com/) to get an invite! -* on the SCRT HQ Discord: [Click here](https://discord.gg/G66zVG7) to get an invite! -* `@scrthq` on the [PowerShell Slack](http://slack.poshcode.org/) if you're on there as well! -* [`@scrthq`](https://twitter.com/scrthq) on Twitter + +- On the SCRT HQ Slack: `scrthq.slack.com`. [Click here](https://scrthq-slack-invite.herokuapp.com/) to get an invite! +- On the SCRT HQ Discord: [Click here](https://discord.gg/G66zVG7) to get an invite! +- `@scrthq` on the [PowerShell Slack](http://slack.poshcode.org/) if you're on there as well! +- [`@scrthq`](https://twitter.com/scrthq) on Twitter diff --git a/README.md b/README.md index a9bc6917..89a830b4 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,42 @@ # PSGSuite -## IMPORTANT - PSGSUITE 3.0.0+ REQUIRES POWERSHELL 7.4+ - -This is a breaking change introduced with PSGSuite 3.0.0. Please see the +> [!CAUTION] +> +> PSGSuite 3.0.0 and later **requires** Powershell 7.4 or newer +> +> This is a breaking change introduced with PSGSuite 3.0.0. Please see the [CHANGELOG](./CHANGELOG.md) for more information. ---- +***
- - - Discord - Chat -      - - - Slack - Chat - -
-
- - - PowerShell Gallery -      - - - GitHub Releases -      - - - GitHub Releases - + + + Discord - Chat +      + + + Slack - Chat + +
+
+ + + PowerShell Gallery +      + + + GitHub Releases +      + + + GitHub Releases +

@@ -42,20 +44,12 @@ This is a breaking change introduced with PSGSuite 3.0.0. Please see the ## Documentation -Check out [PSGSuite.io](https://psgsuite.io/) for PSGSuite documentation, including [initial setup](https://psgsuite.io/Initial%20Setup/) help as well as function help! +Check out [PSGSuite.io](https://psgsuite.io/) for PSGSuite documentation, including [configuration](https://psgsuite.io/pages/configuration) help as well as function help! ## Contributing Interested in helping out with PSGSuite development? Please check out our [Contribution Guidelines](https://github.com/scrthq/PSGSuite/blob/main/CONTRIBUTING.md)! -Building the module locally to test changes is as easy as running the `build.ps1` file in the root of the repo. This will compile the module with your changes and import the newly compiled module at the end by default. - -Want to run the Pester tests locally? Pass `Test` as the value to the `Task` script parameter like so: - -```powershell -.\build.ps1 -Task Test -``` - ## Code of Conduct Please adhere to our [Code of Conduct](https://github.com/scrthq/PSGSuite/blob/main/CODE_OF_CONDUCT.md) when interacting with this repo. diff --git a/docs/.nav.yml b/docs/.nav.yml new file mode 100644 index 00000000..3657fa84 --- /dev/null +++ b/docs/.nav.yml @@ -0,0 +1,16 @@ +nav: + - PSGSuite: index.md + - Installation: + - Overview: pages/installation/overview.md + - Powershell Gallery: pages/installation/powershell_gallery.md + - GitHub Releases: pages/installation/github_releases.md + - Building From Source: pages/installation/building_from_source.md + - Configuration: + - Google Cloud: pages/configuration/google_cloud_configuration.md + - Module Configuration: pages/configuration/module_configuration.md + - Examples: + - User Management: pages/examples/user_management.md + - License Management: pages/examples/license_management.md + - Custom Schema Management: pages/examples/custom_schemas_management.md + - Multi-Use Configuration: pages/examples/multi_use_configuration.md + - Function Help: pages/function_help diff --git a/docs/Examples/Managing Users.md b/docs/Examples/Managing Users.md deleted file mode 100644 index dd041734..00000000 --- a/docs/Examples/Managing Users.md +++ /dev/null @@ -1,402 +0,0 @@ -# Managing Users - -This section goes into detail on how to manage users, licenses and custom schemas using this module. - -## Getting User Info - -### Get-GSUser - -_This function pulls info for a specific user, including orgUnitPath, aliases, custom schema values, etc._ - -* Scope(s) required: - * - * -* Mandatory parameters: - * User (must be the primary email address of an existing user in the domain) - -#### Examples - -```PowerShell tab="Get All Users" -Get-GSUser -Filter * -``` - -```PowerShell tab= -Get-GSUser -User john.smith@domain.com -Projection Full -ViewType Admin_View -``` - -```PowerShell tab= -Get-GSUser john.smith@domain.com -``` - -#### Syntax - -```PowerShell tab= -Get-GSUser [-User] [-Projection {Basic | Custom | Full}] [-CustomFieldMask ] [-ViewType {Admin_View | Domain_Public}] [-Fields ] [-AccessToken ] [-P12KeyPath ] [-AppEmail ] [-AdminEmail ] [] -``` - -## Getting User Photos - -To get a user's photo, use the `Get-GSUserPhoto` function: - -### Get-GSUserPhoto - -* Scope(s) required: - * - * -* Mandatory parameters: - * User (must be the primary email address of an existing user in the domain) - -#### Examples - -```PowerShell tab= -Get-GSUserPhoto john.smith@domain.com -``` - -#### Syntax - -```PowerShell tab= -Get-GSUserPhoto [-User] [-AccessToken ] [-P12KeyPath ] [-AppEmail ] [-AdminEmail ] [] -``` - -## Listing Users - -To list all users in the domain or in a specific organizational unit, use the `Get-GSUserList` function: - -### Get-GSUserList - -* Scope(s) required: - * - * -* Mandatory parameters: - * _None_ - -#### Examples - -```PowerShell tab= -Get-GSUserList -``` - -```PowerShell tab= -Get-GSUserList -Query "orgUnitPath='/Users/New Hires'" -``` - -```PowerShell tab= -Get-GSUserList -MaxResults 300 -Query "orgUnitPath='/Users'","email=john.smith@domain.com" -``` - -#### Syntax - -```PowerShell tab= -Get-GSUserList [[-Query] ] [[-PageSize] ] [[-OrderBy] ] [[-SortOrder] ] [[-AccessToken] ] [[-P12KeyPath] ] [[-AppEmail] ] [[-AdminEmail] ] [[-CustomerID] ] [[-Domain] ] [[-Preference] ] [] -``` - -## Creating Users - -To create new users, use the `New-GSUser` function: - -### New-GSUser - -* Scope(s) required: - * -* Mandatory parameters: - * PrimaryEmail (user's primary email, must be unique to the domain) - * GivenName (user's first name) - * FamilyName (user's last name) - * Password (user's initial password) - -#### Examples - -```PowerShell tab= -New-GSUser -PrimaryEmail john.smith@domain.com -GivenName John -FamilyName Smith -Password Password123 -``` - -```PowerShell tab= -New-GSUser -PrimaryEmail john.smith@domain.com -GivenName John -FamilyName Smith -Password Password123 -ChangePasswordAtNextLogin True -OrgUnitPath "/Users/New Hires" -IncludeInGlobalAddressList True -``` - -#### Syntax - -```PowerShell tab= -New-GSUser [-PrimaryEmail] [-GivenName] [-FamilyName] [-Password] [[-ChangePasswordAtNextLogin] ] [[-OrgUnitPath] ] [[-Suspended] ] [[-IncludeInGlobalAddressList] ] [[-IPWhitelisted] ] [[-AccessToken] ] [[-P12KeyPath] ] [[-AppEmail] ] [[-AdminEmail] ] [] -``` - -## Updating Users - -To update existing users, use the `Update-GSUser` function: - -### Update-GSUser - -* Scope(s) required: - * -* Mandatory parameters: - * User (must be the primary email address of an existing user in the domain) - -#### Examples - -```PowerShell tab= -Update-GSUser -User john.smith@domain.com -PrimaryEmail johnathan.smith@domain.com -GivenName Johnathan -Suspended False -``` - -#### Syntax - -```PowerShell tab= -Update-GSUser [-User] [[-PrimaryEmail] ] [[-GivenName] ] [[-FamilyName] ] [[-Password] ] [[-ChangePasswordAtNextLogin] ] [[-OrgUnitPath] ] [[-Suspended] ] [[-IncludeInGlobalAddressList] ] [[-IPWhitelisted] ] [[-AccessToken] ] [[-P12KeyPath] ] [[-AppEmail] ] [[-AdminEmail] ] [] -``` - -## Removing Users - -To remove users, use the `Remove-GSUser` function: - -### Remove-GSUser - -* Scope(s) required: - * -* Mandatory parameters: - * User (must be the primary email address of an existing user in the domain) - -#### Examples - -```PowerShell tab= -Remove-GSUser -User john.smith@domain.com -WhatIf -``` - -```PowerShell tab= -Remove-GSUser -User john.smith@domain.com -Confirm:$false -``` - -#### Syntax - -```PowerShell tab= -Remove-GSUser [-User] [[-AccessToken] ] [[-P12KeyPath] ] [[-AppEmail] ] [[-AdminEmail] ] [-WhatIf] [-Confirm] [] -``` - -## Restoring Users - -To undelete users, use the `Restore-GSUser` function: - -### Restore-GSUser - -* Scope(s) required: - * -* Mandatory parameters: - * User (must be the primary email address of an existing user in the domain) - * OrgUnitPath (the Org Unit path to restore the user to) - -#### Examples - -```PowerShell tab= -Restore-GSUser -User john.smith@domain.com -OrgUnitPath "/Users" -WhatIf -``` - -```PowerShell tab= -Restore-GSUser -User john.smith@domain.com -OrgUnitPath "/Users" -Confirm:$false -``` - -#### Syntax - -```PowerShell tab= -Restore-GSUser [-User] [-OrgUnitPath] [-AccessToken ] [-P12KeyPath ] [-AppEmail ] [-AdminEmail ] [-WhatIf] [-Confirm] [] -``` - -*** - -## Getting License Info - -To get license info, use the `Get-GSUserLicense` function: - -### Get-GSUserLicense - -* Scope(s) required: - * -* Mandatory parameters: - * User (must be the primary email address of an existing user in the domain) - -#### Examples - -```PowerShell tab= -Get-GSUserLicense -User john.smith@domain.com -``` - -```PowerShell tab= -Get-GSUserLicense -User john.smith@domain.com -License Google-Vault-Former-Employee -``` - -#### Syntax - -```PowerShell tab= -Get-GSUserLicense [-License ] [-ProductID ] [-PageSize ] [-Limit ] [] - -Get-GSUserLicense [[-User] ] [-License ] [] -``` - -#### Listing All Licenses - -To list all licenses in the domain, use the `Get-GSUserLicense` function with no additional parameters - -## Removing Licenses - -To remove licenses, use the `Remove-GSUserLicense` function: - -### Remove-GSUserLicense - -* Scope(s) required: - * -* Mandatory parameters: - * User (must be the primary email address of an existing user in the domain) - -#### Examples - -```PowerShell tab= -Remove-GSUserLicense -``` - -#### Syntax - -```PowerShell tab= -Remove-GSUserLicense [-User] [-License] [-WhatIf] [-Confirm] [] -``` - - -## Setting Licenses - -To set licenses, use the `Set-GSUserLicense` function: - -### Set-GSUserLicense - -* Scope(s) required: - * -* Mandatory parameters: - * User (must be the primary email address of an existing user in the domain) - -#### Examples - -```PowerShell tab= -Set-GSUserLicense -User joe.smith@domain.com -License Google-Vault-Former-Employee -``` - -#### Syntax - -```PowerShell tab= - -Set-GSUserLicense [-User] [-License] [] - -``` - -## Updating Licenses - -To update licenses, use the `Update-GSUserLicense` function: - -### Update-GSUserLicense - -* Scope(s) required: - * -* Mandatory parameters: - * User (must be the primary email address of an existing user in the domain) - -#### Examples - -```PowerShell tab= -Update-GSUserLicense -User joe.smith@domain.com -License Google-Vault-Former-Employee -``` - -#### Syntax - -```PowerShell tab= -Update-GSUserLicense [[-User] ] [-License ] [] -``` - -*** - -## Getting Custom Schema Info - -To get info about a specific custom schema, use the `Get-GSUserSchema` function: - -### Get-GSUserSchema - -* Scope(s) required: - * - -#### Examples - -```PowerShell tab= -Get-GSUserSchema -SchemaId $schemaId -``` - -#### Syntax - -```PowerShell tab= -Get-GSUserSchema [[-SchemaId] ] [] -``` - -## Listing Custom Schemas - -To list all custom schemas, use the `Get-GSUserSchema` function and do not specify a SchemaId: - -#### Examples - -```PowerShell tab= -Get-GSUserSchema -``` - -## Creating Custom Schemas - -To create custom schemas, use the `New-GSUserSchema` function: - -### New-GSUserSchema - -* Scope(s) required: - * - -#### Examples - -```PowerShell tab= -New-GSUserSchema -``` - -#### Syntax - -```PowerShell tab= -New-GSUserSchema [-SchemaName] [-Fields] [] -``` - -## Removing Custom Schemas - -To remove custom schemas, use the `Remove-GSUserSchema` function: - -### Remove-GSUserSchema - -* Scope(s) required: - * - -#### Examples - -```PowerShell tab= -Remove-GSUserSchema -``` - -#### Syntax - -```PowerShell tab= -Remove-GSUserSchema [[-SchemaId] ] [-WhatIf] [-Confirm] [] -``` - -## Updating Custom Schemas - -To update custom schemas, use the `Update-GSUserSchema` function: - -### Update-GSUserSchema - -* Scope(s) required: - * - -#### Examples - -```PowerShell tab= -Update-GSUserSchema -``` - -#### Syntax - -```PowerShell tab= -Update-GSUserSchema [-SchemaId] [-SchemaName ] [-Fields ] [] -``` diff --git a/docs/Initial Setup.md b/docs/Initial Setup.md deleted file mode 100644 index 21280227..00000000 --- a/docs/Initial Setup.md +++ /dev/null @@ -1,331 +0,0 @@ -# Initial Setup - -Getting started with PSGSuite. - -## Prerequisites - -In order to use this module, you will need the following: - -* PowerShell 4.0+ or PowerShell Core 6+ -* G Suite account (SuperAdmin needed for full functionality of the module) - -*** - -## Installing the Module - -### From the PowerShell Gallery - -Installing items from the Gallery requires the latest version of the PowerShellGet module, which is available in Windows 10, in Windows Management Framework (WMF) 5.0, or in the MSI-based installer (for PowerShell 3 and 4). - -**This will be slightly behind the GitHub repo. Please see below for installation instructions from the GitHub repo.** - -1. Open Powershell and run the following command: - -```PowerShell tab= -Install-Module -Name PSGSuite -Scope CurrentUser -``` - -For more information, please visit the [PSGSuite page on the Powershell Gallery](https://www.powershellgallery.com/packages/PSGSuite) - -### From the GitHub release page - -_**This will be equal to the Powershell Gallery, usually**_ - -**IMPORTANT: You MUST have the module 'Configuration' installed as a prerequisite! Installing the module from the repo source or the release page does not automatically install dependencies!!** - -1. [Click here](https://github.com/nferrell/PSGSuite/releases) to go to the latest releases, then download the *PSGSuite.zip* file attached to the release -2. Right-click the downloaded zip, select Properties, then unblock the file. - _This is to prevent having to unblock each file individually after unzipping._ -3. Unzip the archive. -4. (Optional) Place the module somewhere in your PSModulePath. - * You can view the paths listed by running the environment variable `$env:PSModulePath` - -### Build from the GitHub repo - -_**Bleeding edge fans, contributors, etc**_ - -**IMPORTANT: You MUST have the module 'Configuration' installed as a prerequisite! Installing the module from the repo source or the release page does not automatically install dependencies!!** - -1. Clone the repo to your computer: `git clone https://github.com/scrthq/PSGSuite.git` -2. Open the cloned directory: `cd PSGSuite` -3. Build the module: `.\build.ps1` - -To import the compiled module in a new session, run this from the repo root: - -```PowerShell -Import-Module ./BuildOutput/PSGSuite -Force -``` - -*** - -## G Suite Users _with_ SuperAdmin access - -### Creating the Project, Service Account and P12 Key in Google's Developer Console - -1. [Click here to create a new project with the following API's enabled](https://console.developers.google.com/flows/enableapi?apiid=admin,appsactivity,contacts,driveactivity.googleapis.com,licensing,gmail,calendar,classroom.googleapis.com,docs.googleapis.com,drive,sheets.googleapis.com,slides.googleapis.com,groupssettings,chat.googleapis.com,people.googleapis.com,tasks): - * Admin SDK - * Apps Activity API - * Contacts API - * Drive Activity API (Apps Activity API v2) - * Enterprise License Manager API - * Gmail API - * Google Calendar API - * Google Classroom API - * Google Docs API - * Google Drive API - * Google Sheets API - * Google Slides API - * Groups Settings API - * Hangouts Chat API - * People API - * Tasks API -2. Leave the dropdown set to 'Create a project' and click the blue 'Continue' button. - * If you encounter an error stating that `You may not have permission to create projects in this organization. Contact your Google Apps account admin to verify you have the Project Creator role.`, you may need to manually create a project instead as noted in [Issue #116](https://github.com/scrthq/PSGSuite/issues/116). If you are still unable to create a project manually, you will need to contact your domain's G Suite administrators to have them place you in the Project Creator role or create the project for you. -3. On the next screen, it will run the wizard to assist in adding credentials. Click the blue link that says 'service account' right above the '**Which API are you using?**' question to go to the Service Account Creation page. -4. On the Service Accounts page, click the blue button on the top of the screen to 'CREATE SERVICE ACCOUNT' and you'll be walked through the following 3 pages: - * **Service account details:** - 1. Set the service account name to whatever you'd like and optionally add a description - 2. Click the `CREATE` button - * **Grant this service account access to this project:** - 1. Set the Service Account permissions to _Project > Owner_ - * **Grant users access to this service account** - 1. Click the `CREATE KEY` button - 2. Set **Key type** to **P12** - 3. Click the blue `CREATE` button. You should download the P12 key file in your browser once clicking it. - 4. Click the blue `DONE` button to return to the Service accounts screen. -5. Click the 3 dots button at the right side of the service account you just created then select `Edit`. -6. Click the blue link to `SHOW DOMAIN-WIDE DELEGATION`. -7. Check the box to allow `Enable G Suite Domain-wide Delegation`. You should see additional fields appear for Product Name and Email Address. -8. Set an appropriate product name (i.e. `PSGSuite`), then click the blue `SAVE` button. -9. Once back on the Service Accounts page, click the link under where it says DwD to 'View Client ID'. You will be taken to a page that lists the AppEmail (e.g. `psgsuite@kindred-spirit-20183.iam.gserviceaccount.com`) and the ServiceAccountClientID (e.g. `10264827741861193783987`). Save these two in a Notepad, you will need them when you fill out the configuration. -10. Under [API Manager >> Library](https://console.developers.google.com/apis/dashboard), make sure the following API's are showing as enabled: - * Admin SDK - * Apps Activity API - * Contacts API - * Drive Activity API (Apps Activity API v2) - * Enterprise License Manager API - * Gmail API - * Google Calendar API - * Google Classroom API - * Google Docs API - * Google Drive API - * Google Sheets API - * Google Slides API - * Groups Settings API - * Hangouts Chat API - * People API - * Tasks API - -*** - -### Adding API Client Access in Admin Console - -1. Open a new tab or window to the [Google Admin Console](https://admin.google.com/) -2. Go to Security -3. Expand 'Advanced Settings' -4. Click 'Manage API client access' -5. Take the ServiceAccountClientID you copied to Notepad earlier (e.g. _10264827741861193783987_) and paste it in the left field for 'Client Name' - * If you have already set up a PSGSuiteConfig, you can retrieve your ServiceAccountClientId by running `(Show-PSGSuiteConfig).ServiceAccountClientId` -6. Copy / paste the following scopes together on the field on the right for 'One or more API scopes': - -```text -https://apps-apis.google.com/a/feeds/emailsettings/2.0/, -https://mail.google.com/, -https://sites.google.com/feeds, -https://www.google.com/m8/feeds/contacts, -https://www.googleapis.com/auth/activity, -https://www.googleapis.com/auth/admin.datatransfer, -https://www.googleapis.com/auth/admin.directory, -https://www.googleapis.com/auth/admin.directory.customer, -https://www.googleapis.com/auth/admin.directory.device.chromeos, -https://www.googleapis.com/auth/admin.directory.device.mobile, -https://www.googleapis.com/auth/admin.directory.domain, -https://www.googleapis.com/auth/admin.directory.group, -https://www.googleapis.com/auth/admin.directory.orgunit, -https://www.googleapis.com/auth/admin.directory.resource.calendar, -https://www.googleapis.com/auth/admin.directory.rolemanagement, -https://www.googleapis.com/auth/admin.directory.rolemanagement.readonly, -https://www.googleapis.com/auth/admin.directory.user, -https://www.googleapis.com/auth/admin.directory.user.readonly, -https://www.googleapis.com/auth/admin.directory.user.security, -https://www.googleapis.com/auth/admin.directory.userschema, -https://www.googleapis.com/auth/admin.reports.audit.readonly, -https://www.googleapis.com/auth/admin.reports.usage.readonly, -https://www.googleapis.com/auth/apps.groups.settings, -https://www.googleapis.com/auth/apps.licensing, -https://www.googleapis.com/auth/calendar, -https://www.googleapis.com/auth/chat.bot, -https://www.googleapis.com/auth/classroom.announcements, -https://www.googleapis.com/auth/classroom.courses, -https://www.googleapis.com/auth/classroom.coursework.me, -https://www.googleapis.com/auth/classroom.coursework.students, -https://www.googleapis.com/auth/classroom.guardianlinks.students, -https://www.googleapis.com/auth/classroom.profile.emails, -https://www.googleapis.com/auth/classroom.profile.photos, -https://www.googleapis.com/auth/classroom.push-notifications, -https://www.googleapis.com/auth/classroom.rosters, -https://www.googleapis.com/auth/classroom.rosters.readonly, -https://www.googleapis.com/auth/drive, -https://www.googleapis.com/auth/gmail.settings.basic, -https://www.googleapis.com/auth/gmail.settings.sharing, -https://www.googleapis.com/auth/plus.login, -https://www.googleapis.com/auth/plus.me, -https://www.googleapis.com/auth/tasks, -https://www.googleapis.com/auth/tasks.readonly, -https://www.googleapis.com/auth/userinfo.email, -https://www.googleapis.com/auth/userinfo.profile -``` - -* _Although the module does not use all of these scopes currently, additional functions are being built to leverage this entire list._ - -## Free Google Account Users and G Suite Users _without_ SuperAdmin access - -If you are not a G Suite super admin or even a G Suite user at all, you can still use PSGSuite for the following APIs: - -* Contacts API -* Gmail API -* Google Calendar API -* Google Docs API -* Google Drive API -* Google Sheets API -* Google Slides API -* People API (new Contacts API) -* Tasks API - -You will also need to take a slightly different route when creating credentials and create an OAuth Client ID instead of a Service Account and P12 Key. - -### Creating the Project and Client ID/Secret in Google's Developer Console - -1. [Click here to create a new project with the following API's enabled](https://console.developers.google.com/flows/enableapi?apiid=contacts,calendar,gmail,docs.googleapis.com,drive,sheets.googleapis.com,slides.googleapis.com,people.googleapis.com,tasks): - * Contacts API - * Gmail API - * Google Calendar API - * Google Docs API - * Google Drive API - * Google Sheets API - * Google Slides API - * People API (new Contacts API) - * Tasks API - - ![image](https://user-images.githubusercontent.com/12724445/50328194-da546100-04b7-11e9-9ddd-c151fc8e83d3.png) -2. Leave the dropdown set to `Create a project` and click the blue 'Continue' button. - * If you encounter an error stating that `You may not have permission to create projects in this organization. Contact your Google Apps account admin to verify you have the Project Creator role.`, you may need to manually create a project instead as noted in [Issue #116](https://github.com/scrthq/PSGSuite/issues/116). - * If you are still unable to create a project manually, you will need to contact your domain's G Suite administrators to have them place you in the Project Creator role or create the project for you. -3. On the next screen, it will run the wizard to assist in adding credentials. Click the blue link that says `client ID` right above the '**Which API are you using?**' question to go to the OAuth Client ID Creation page: - ![image](https://user-images.githubusercontent.com/12724445/50328262-0bcd2c80-04b8-11e9-8ffe-32ee580880c0.png) -4. On the OAuth Client ID creation page, click the blue button on the top of the screen to `Configure consent screen`: - ![image](https://user-images.githubusercontent.com/12724445/50328306-33bc9000-04b8-11e9-85d7-94a6827a312e.png) -5. On the OAuth consent screen... - ![image](https://user-images.githubusercontent.com/12724445/50328331-4f279b00-04b8-11e9-86cb-6c33d5af1a77.png) - 1. Set the Application Name. This is what you will see when authorizing the Console Project access to you data via API. - 2. Under `Scopes for Google APIs`, click the `Add scope` button. - 3. Check the check box on the top-left of the pop-up to check all of the boxes, then click `Add` on the bottom-right of the pop-up. - ![image](https://user-images.githubusercontent.com/12724445/50328360-741c0e00-04b8-11e9-82e4-667bebd1210e.png) - 4. Scroll to the bottom of the OAuth consent screen, the click the blue `Save` button. -6. Once saved, scroll up to the top of the page then click the main `Credentials` tab. -7. Click the drop-down button to `Create credentials`, then select `OAuth client ID`. -8. Choose `Other` as the Application type and enter a friendly name such as PSGSuite, then click the blue `Create` button: - ![image](https://user-images.githubusercontent.com/12724445/50328408-9877ea80-04b8-11e9-8004-ee071db4b6a7.png) -9. Once created, you'll get a pop-up with the client_id / client_secrets info, just click ok to close the pop-up: - ![image](https://user-images.githubusercontent.com/12724445/50328462-c9f0b600-04b8-11e9-9d5d-da0edc108e17.png) -10. Once back on the Credentials screen, click the ⬇️ icon on the far right next to your new OAuth Client ID to download the client_secrets.json file to your preferred location: - ![image](https://user-images.githubusercontent.com/12724445/50303600-320cb100-0453-11e9-84da-3f70b322e836.png) - -*** - -## Creating the PSGSuite Configuration File - -1. Import the module: - * Module located in PSModulePath: ```Import-Module PSGSuite``` - * or somewhere else: ```Import-Module C:\Path\To\PSGSuite\PSGSuite.psd1``` -2. Have the following information available to paste during Step 3: - * _**G Suite SuperAdmins**_ - * **P12KeyPath**: This is the full path to the P12 file that you created during Step 9 of [Creating the Project, Service Account and P12 Key in Google's Developer Console](#creating-the-project-service-account-and-p12-key-in-googles-developer-console) - * **AppEmail**: This is email address for the service account created earlier. It will look something like this: - * _{service account name}_@_{project name}_.iam.gserviceaccount.com - * **AdminEmail**: This is email address for the SuperAdmin account that created the project (usually your email) - * **CustomerId**: This is the Customer ID of the G Suite account. If you do not know it currently, you can set it later. After importing the module, you can run ```(Get-GSUser).CustomerId``` and view the Customer ID in the response. - * **Domain**: This is the primary domain name for the customer, i.e. _scrthq.com_ - * **Preference**: This is referenced by certain functions that allow either the Customer ID or Domain to be queried against. You can choose between "CustomerID" or "Domain" for this value. - * **Service Account Client ID**: This stores the Service Account Client ID to allow easy callback without having to open the project page. It is purely a convenience parameter. The Service Account Client ID is the large integer that you copy during Steps 7 & 8 while [Adding API Client Access in Admin Console](#adding-api-client-access-in-admin-console) - * _**Free account / G Suite standard users**_ - > Free accounts only need 2 pieces of information in a config for PSGSuite to work with the APIs available to them: ClientSecretsPath and AdminEmail. - * **ClientSecretsPath**: This is the full path to the JSON file that you downloaded during Step 10 of [Creating the Project and Client ID/Secret in Google's Developer Console](#creating-the-project-and-client-idsecret-in-googles-developer-console) - * **AdminEmail**: This is the email address for your account. -3. Run the appropriate command from the following to create the config file using the values from Step 2 of this section to replace the variables below: - - _**G Suite SuperAdmins**_ - - ```PowerShell - Set-PSGSuiteConfig -ConfigName MyConfig -SetAsDefaultConfig -P12KeyPath $P12KeyPath -AppEmail $AppEmail -AdminEmail $AdminEmail -CustomerID $CustomerID -Domain $Domain -Preference $Preference -ServiceAccountClientID $ServiceAccountClientID - ``` - - _**Free account / G Suite standard users**_ - - ```PowerShell - Set-PSGSuiteConfig -ConfigName MyConfig -SetAsDefaultConfig -ClientSecretsPath $ClientSecretsPath -AdminEmail $AdminEmail - ``` - - Here's another way to set multiple configs at the same time: - - ```PowerShell - @( - @{ - SetAsDefaultConfig = $true - ConfigName = "GSuite" - P12KeyPath = "C:\P12s\PSGSuite.p12" - AppEmail = "psgsuite@developer-shore.iam.gserviceaccount.com" - AdminEmail = "admin@mydomain.io" - CustomerID = "C021xxxxxx" - Domain = "mydomain.io" - Preference = "CustomerID" - ServiceAccountClientID = "98723498723489723498239" - } - @{ - ConfigName = "Gmail" - ClientSecretsPath = "C:\Keys\client_secret.json" - AdminEmail = "mypersonalinbox@gmail.com" - } - ) | ForEach-Object { - $props = $_ - Set-PSGSuiteConfig @props - } - ``` - -*** - -## First-time authentication for free/non-admin accounts - -If you are using a `client_secrets.json` for your configuration, you must also complete OAuth in browser to finalize your configuration. This will generate your `refresh_token` and initial `access_token` for the scopes listed below. Follow these steps to complete your configuration: - -1. Import the module: `Import-Module PSGSuite` -2. Run `Get-GSGmailProfile -Verbose` (or any other Gmail, Drive, Calendar, Contacts or Tasks command) to trigger the authentication/authorization process: - * If you are using Windows PowerShell, you should see your browser open with a Google login prompt: - 1. Authenticate using the AdminEmail account configured with `Set-PSGSuiteConfig`. - 2. Allow PSGSuite to access the below scopes on your account that you desire. - 3. You should see a message in your browser tab stating the following once complete: `Received verification code. You may now close this window.` - - * If you are using PowerShell Core (6+), you will be provided a URL to visit to complete authentication/authorization: - 1. Open your browser and go the the URL provided in the console output. - 2. Authenticate using the AdminEmail account configured with `Set-PSGSuiteConfig`. - 3. Allow PSGSuite to access the below scopes on your account that you desire. - 4. You should see a pop-up in your browser with a code to copy. Select and copy or click the button to the right of the code to copy, then paste the code back in your console where prompted, then hit `Enter`. -3. You should see the command complete successfully at this point. - -* Scopes included with `client_secrets.json` auth: - * - * - * - * - * - * - * - * - -* Screenshots of the PowerShell Core process: - -![image](https://user-images.githubusercontent.com/12724445/50432027-bb2d4900-0894-11e9-8aa7-fe5f22e8cdc6.png) - -![image](https://user-images.githubusercontent.com/12724445/50432132-63dba880-0895-11e9-8c96-ba23bf994757.png) - -![image](https://user-images.githubusercontent.com/12724445/50432170-99809180-0895-11e9-87db-866450e7f6bf.png) diff --git a/docs/Multiple Configurations.md b/docs/Multiple Configurations.md deleted file mode 100644 index f91f573e..00000000 --- a/docs/Multiple Configurations.md +++ /dev/null @@ -1,26 +0,0 @@ -# Multiple Configurations - -PSGSuite 2.0.0 uses a single file configuration stored outside of the module folder. If you intend to use the module with more than one account on the same machine, you will want to create your configuration with an AES key as the encryption method. - -To do this you'll want to create a key then pass the key as the first argument when importing the module. - -**You must pass `$null` after the key as shown to force the full key to be used, otherwise only the first byte in the array will be passed as the key value** - -```powershell -$key = [Byte[]]@(1..16) # Don't actually use something this easy to replicate, this is just an example - -Import-Module PSGSuite -ArgumentList $key,$null - -$props = @{ - ConfigName = "client1" - P12KeyPath = "C:\P12s\PSGSuite-theirdomain.p12" - AppEmail = "psgsuite@theirdomain.iam.gserviceaccount.com" - AdminEmail = "admin@theirdomain.io" - CustomerID = "C092xxxxxx" - Domain = "theirdomain.io" - Preference = "CustomerID" - ServiceAccountClientID = "12399898494949494994949" -} - -Set-PSGSuiteConfig @props -``` diff --git a/docs/assets/icons/icons-192.png b/docs/assets/icons/icons-192.png new file mode 100644 index 00000000..1893bac2 Binary files /dev/null and b/docs/assets/icons/icons-192.png differ diff --git a/docs/assets/icons/icons-512.png b/docs/assets/icons/icons-512.png new file mode 100644 index 00000000..4f3df8d6 Binary files /dev/null and b/docs/assets/icons/icons-512.png differ diff --git a/docs/assets/screenshots/customer_id.png b/docs/assets/screenshots/customer_id.png new file mode 100644 index 00000000..7e7e49ba Binary files /dev/null and b/docs/assets/screenshots/customer_id.png differ diff --git a/docs/assets/screenshots/google_cloud_project_creation.png b/docs/assets/screenshots/google_cloud_project_creation.png new file mode 100644 index 00000000..25a8ffed Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_creation.png differ diff --git a/docs/assets/screenshots/google_cloud_project_creation_enable_access_to_apis_confirm_project.png b/docs/assets/screenshots/google_cloud_project_creation_enable_access_to_apis_confirm_project.png new file mode 100644 index 00000000..95212429 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_creation_enable_access_to_apis_confirm_project.png differ diff --git a/docs/assets/screenshots/google_cloud_project_creation_enable_access_to_apis_enable_apis_standard.png b/docs/assets/screenshots/google_cloud_project_creation_enable_access_to_apis_enable_apis_standard.png new file mode 100644 index 00000000..fdb73076 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_creation_enable_access_to_apis_enable_apis_standard.png differ diff --git a/docs/assets/screenshots/google_cloud_project_creation_enable_access_to_apis_enable_apis_superadmin.png b/docs/assets/screenshots/google_cloud_project_creation_enable_access_to_apis_enable_apis_superadmin.png new file mode 100644 index 00000000..6507034f Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_creation_enable_access_to_apis_enable_apis_superadmin.png differ diff --git a/docs/assets/screenshots/google_cloud_project_creation_new_project.png b/docs/assets/screenshots/google_cloud_project_creation_new_project.png new file mode 100644 index 00000000..797bec73 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_creation_new_project.png differ diff --git a/docs/assets/screenshots/google_cloud_project_credentials.png b/docs/assets/screenshots/google_cloud_project_credentials.png new file mode 100644 index 00000000..cbe1aea4 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_credentials.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_client_id.png b/docs/assets/screenshots/google_cloud_project_oauth_client_id.png new file mode 100644 index 00000000..10fd64c7 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_client_id.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_client_id_download.png b/docs/assets/screenshots/google_cloud_project_oauth_client_id_download.png new file mode 100644 index 00000000..9fa99053 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_client_id_download.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_consent_screen.png b/docs/assets/screenshots/google_cloud_project_oauth_consent_screen.png new file mode 100644 index 00000000..bfe83f82 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_consent_screen.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_consent_screen_app_name.png b/docs/assets/screenshots/google_cloud_project_oauth_consent_screen_app_name.png new file mode 100644 index 00000000..0b2edf5d Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_consent_screen_app_name.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_consent_screen_finish.png b/docs/assets/screenshots/google_cloud_project_oauth_consent_screen_finish.png new file mode 100644 index 00000000..67f41279 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_consent_screen_finish.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_consent_screen_overview.png b/docs/assets/screenshots/google_cloud_project_oauth_consent_screen_overview.png new file mode 100644 index 00000000..88f95880 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_consent_screen_overview.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_playground.png b/docs/assets/screenshots/google_cloud_project_oauth_playground.png new file mode 100644 index 00000000..18c02f19 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_playground.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_playground_authorization_code.png b/docs/assets/screenshots/google_cloud_project_oauth_playground_authorization_code.png new file mode 100644 index 00000000..ac1f167a Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_playground_authorization_code.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_playground_external_testing.png b/docs/assets/screenshots/google_cloud_project_oauth_playground_external_testing.png new file mode 100644 index 00000000..3111375b Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_playground_external_testing.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_playground_scopes.png b/docs/assets/screenshots/google_cloud_project_oauth_playground_scopes.png new file mode 100644 index 00000000..3f93b93d Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_playground_scopes.png differ diff --git a/docs/assets/screenshots/google_cloud_project_oauth_playground_sign_in_to_app.png b/docs/assets/screenshots/google_cloud_project_oauth_playground_sign_in_to_app.png new file mode 100644 index 00000000..8bbad6b1 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_oauth_playground_sign_in_to_app.png differ diff --git a/docs/assets/screenshots/google_cloud_project_selection.png b/docs/assets/screenshots/google_cloud_project_selection.png new file mode 100644 index 00000000..be21528a Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_selection.png differ diff --git a/docs/assets/screenshots/google_cloud_project_service_account_add_key.png b/docs/assets/screenshots/google_cloud_project_service_account_add_key.png new file mode 100644 index 00000000..84d5d962 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_service_account_add_key.png differ diff --git a/docs/assets/screenshots/google_cloud_project_service_account_advanced_settings.png b/docs/assets/screenshots/google_cloud_project_service_account_advanced_settings.png new file mode 100644 index 00000000..ccadb410 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_service_account_advanced_settings.png differ diff --git a/docs/assets/screenshots/google_cloud_project_service_account_create_key.png b/docs/assets/screenshots/google_cloud_project_service_account_create_key.png new file mode 100644 index 00000000..48034114 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_service_account_create_key.png differ diff --git a/docs/assets/screenshots/google_cloud_project_service_account_details.png b/docs/assets/screenshots/google_cloud_project_service_account_details.png new file mode 100644 index 00000000..bcd4c431 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_service_account_details.png differ diff --git a/docs/assets/screenshots/google_cloud_project_service_account_domain_wide_delegation.png b/docs/assets/screenshots/google_cloud_project_service_account_domain_wide_delegation.png new file mode 100644 index 00000000..efbce315 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_service_account_domain_wide_delegation.png differ diff --git a/docs/assets/screenshots/google_cloud_project_service_account_domain_wide_delegation_add.png b/docs/assets/screenshots/google_cloud_project_service_account_domain_wide_delegation_add.png new file mode 100644 index 00000000..ab6486b9 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_service_account_domain_wide_delegation_add.png differ diff --git a/docs/assets/screenshots/google_cloud_project_service_account_done.png b/docs/assets/screenshots/google_cloud_project_service_account_done.png new file mode 100644 index 00000000..970131b9 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_service_account_done.png differ diff --git a/docs/assets/screenshots/google_cloud_project_service_account_edit.png b/docs/assets/screenshots/google_cloud_project_service_account_edit.png new file mode 100644 index 00000000..248958f1 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_service_account_edit.png differ diff --git a/docs/assets/screenshots/google_cloud_project_service_account_key_download.png b/docs/assets/screenshots/google_cloud_project_service_account_key_download.png new file mode 100644 index 00000000..e3a7a895 Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_service_account_key_download.png differ diff --git a/docs/assets/screenshots/google_cloud_project_service_account_role.png b/docs/assets/screenshots/google_cloud_project_service_account_role.png new file mode 100644 index 00000000..96abcaaf Binary files /dev/null and b/docs/assets/screenshots/google_cloud_project_service_account_role.png differ diff --git a/docs/assets/screenshots/oauth_allow_access.png b/docs/assets/screenshots/oauth_allow_access.png new file mode 100644 index 00000000..f8b918d6 Binary files /dev/null and b/docs/assets/screenshots/oauth_allow_access.png differ diff --git a/docs/assets/screenshots/oauth_authorization_code.png b/docs/assets/screenshots/oauth_authorization_code.png new file mode 100644 index 00000000..9d07fa9c Binary files /dev/null and b/docs/assets/screenshots/oauth_authorization_code.png differ diff --git a/docs/assets/screenshots/oauth_select_account.png b/docs/assets/screenshots/oauth_select_account.png new file mode 100644 index 00000000..d72bc221 Binary files /dev/null and b/docs/assets/screenshots/oauth_select_account.png differ diff --git a/docs/assets/screenshots/powershell_oauth_link.png b/docs/assets/screenshots/powershell_oauth_link.png new file mode 100644 index 00000000..421478f9 Binary files /dev/null and b/docs/assets/screenshots/powershell_oauth_link.png differ diff --git a/docs/assets/screenshots/powershell_oauth_success.png b/docs/assets/screenshots/powershell_oauth_success.png new file mode 100644 index 00000000..e46af81c Binary files /dev/null and b/docs/assets/screenshots/powershell_oauth_success.png differ diff --git a/docs/assets/screenshots/service_account_email_address.png b/docs/assets/screenshots/service_account_email_address.png new file mode 100644 index 00000000..82a86bf5 Binary files /dev/null and b/docs/assets/screenshots/service_account_email_address.png differ diff --git a/docs/images/icons-192.png b/docs/images/icons-192.png deleted file mode 100644 index 1176232e..00000000 Binary files a/docs/images/icons-192.png and /dev/null differ diff --git a/docs/images/icons-512.png b/docs/images/icons-512.png deleted file mode 100644 index 0d19f116..00000000 Binary files a/docs/images/icons-512.png and /dev/null differ diff --git a/docs/index.md b/docs/index.md index 22ac45b8..09a1781c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,23 +1,29 @@ # PSGSuite +
+ Azure Pipelines      + Discord - Chat      + Slack - Chat      +

- -
- Codacy -      + PowerShell Gallery      + GitHub Releases      + +* [Google Workspace Super Admin](#project-creation-super-admin) +* [Google Workspace User or Google Personal Account](#project-creation-user-or-personal-account) + +!!! info + If **you are not** a Google Workspace Super Admin, the APIs you can enable are limited. + + * Google Workspace Super Admins: Admin SDK, Drive Activity, Enterprise License Manager, Gmail, Google Calendar, Google Chat, Google Classroom, Google Docs, Google Drive, Google Sheets, Google Slides, Google Tasks, Groups Settings, and People API. + + * Google Workspace Users or Google Personal Accounts: Contacts, Gmail, Google Calendar, Google Docs, Google Drive, Google Sheets, Google Slides, People, and Tasks API. + +!!! warning + If you are a Google Workspace Standard user, you **must** have the `Project Creator` role assigned to your user account by a Google Workspace Super Admin. If you do not have this role, you will receive an error similar to: + + ``` + You may not have permission to create projects in this organization. + Contact your Google Apps account admin to verify you have the Project Creator role. + ``` + +*** + +## Project Creation Super Admin + +1. Follow this [link](https://console.developers.google.com/flows/enableapi?apiid=admin.googleapis.com,calendar-json.googleapis.com,chat.googleapis.com,classroom.googleapis.com,docs.googleapis.com,drive.googleapis.com,driveactivity.googleapis.com,licensing.googleapis.com,gmail.googleapis.com,groupssettings.googleapis.com,people.googleapis.com,sheets.googleapis.com,slides.googleapis.com,tasks.googleapis.com) to create or edit an existing project and enable all applicable APIs. + 1. If creating a new project for the very first time, click on `Create Project`. + ![google_cloud_project_creation.png](../../assets/screenshots/google_cloud_project_creation.png) + 1. If you have existing projects, make sure to select the correct project from the dropdown menu or create a new one. + ![google_cloud_project_selection.png](../../assets/screenshots/google_cloud_project_selection.png) + +1. On the `New Project` page: + 1. Give your project a meaningful name, e.g. `PSGSuite Powershell Module`. + 1. Click `Create`. + + ![google_cloud_project_creation_info.png](../../assets/screenshots/google_cloud_project_creation_new_project.png) + +1. On the `Enable access to APIs` page: + 1. On the `Confirm Project` page, click `Next` + ![google_cloud_project_creation_enable_access_to_apis_confirm_project.png](../../assets/screenshots/google_cloud_project_creation_enable_access_to_apis_confirm_project.png) + 1. On the `Enable APIs` page: + 1. Review the APIs that will be enabled for your project and click `Enable`. + ![google_cloud_project_creation_enable_access_to_apis_enable_apis_superadmin.png](../../assets/screenshots/google_cloud_project_creation_enable_access_to_apis_enable_apis_superadmin.png) + +*** + +## Project Creation User or Personal Account + +1. Follow this [link](https://console.developers.google.com/flows/enableapi?apiid=calendar-json.googleapis.com,docs.googleapis.com,drive.googleapis.com,gmail.googleapis.com,people.googleapis.com,sheets.googleapis.com,slides.googleapis.com,tasks.googleapis.com) to create or edit an existing project and enable all applicable APIs. + 1. If creating a new project for the very first time, click on `Create Project`. + ![google_cloud_project_creation.png](../../assets/screenshots/google_cloud_project_creation.png) + 1. If you have existing projects, make sure to select the correct project from the dropdown menu or create a new one. + ![google_cloud_project_selection.png](../../assets/screenshots/google_cloud_project_selection.png) + +1. On the `New Project` page: + * Give your project a meaningful name, e.g. `PSGSuite Powershell Module`. + * Click `Create`. + + ![google_cloud_project_creation_info.png](../../assets/screenshots/google_cloud_project_creation_new_project.png) + +1. On the `Enable access to APIs` page: + 1. On the `Confirm Project` page, click `Next` + ![google_cloud_project_creation_enable_access_to_apis_confirm_project.png](../../assets/screenshots/google_cloud_project_creation_enable_access_to_apis_confirm_project.png) + 1. On the `Enable APIs` page: + 1. Review the APIs that will be enabled for your project and click `Enable`. + ![google_cloud_project_creation_enable_access_to_apis_enable_apis_standard.png](../../assets/screenshots/google_cloud_project_creation_enable_access_to_apis_enable_apis_standard.png) + +*** + +## Credentials + +1. Navigate to [Credentials](https://console.cloud.google.com/apis/credentials) +1. Click on `Create Credentials` +1. Choose one of the credential types depending on your needs: + * [OAuth 2.0 Client ID](#oauth-20) + * [Service Account](#service-account) + +!!! tip + For Super Admins, it is recommended to use the Service Account method + + For Users or Personal Accounts, it is recommended to use the OAuth 2.0 Client ID method. + +![google_cloud_project_credentials.png](../../assets/screenshots/google_cloud_project_credentials.png) + +### OAuth 2.0 + +#### OAuth Consent Screen + +Before setting up OAuth 2.0 credentials, you need to set up the OAuth consent screen. The consent screen is what the user will see when they are asked to authorize your application to access the data associated with the enabled APIs. + +![google_cloud_project_oauth_consent_screen.png](../../assets/screenshots/google_cloud_project_oauth_consent_screen.png) + +1. On the `OAuth Overview` page click `Get Started` +![google_cloud_project_oauth_consent_screen_overview.png](../../assets/screenshots/google_cloud_project_oauth_consent_screen_overview.png) + +1. On the `Project Configuration` page: + 1. Under `App Information`: + 1. On the `App name` field, give your app a meaningful name, e.g. `PSGSuite Powershell Module`. + 1. On the `User support email` field, enter your email address. + ![google_cloud_project_oauth_consent_screen_app_name.png](../../assets/screenshots/google_cloud_project_oauth_consent_screen_app_name.png) + 1. Under `Audience`: + 1. If using Google Workspace, select `Internal`. + 1. If using a Google Personal Account, select `External`. + 1. Under `Contact Information`, enter your email address. + 1. Under `Finish`, check the box next to `I agree to the Google API Services User Data Policy`. + 1. Click `Continue` and click `Create` + ![google_cloud_project_oauth_consent_screen_finish.png](../../assets/screenshots/google_cloud_project_oauth_consent_screen_finish.png) + +#### OAuth 2.0 Audience For External Apps + +1. Navigate to [OAuth Overview](https://console.cloud.google.com/auth/overview) +1. Click on `Audience` +1. You have two options: + 1. Publish your app + 1. If you choose, to publish your app anyone can use it. + 1. Leave your app as `Testing` + 1. If you choose to leave your app as `Testing`, you will need to add users to the `Test Users` list. + +!!! warning + Be aware of some of the limitations of an `External` application that is under `Testing` mode. + + The refresh token will expire after 7 days. + + If you want to have a non-expiring refresh token, you need to publish your application or use an `Internal` application. + +#### OAuth 2.0 Credentials + +1. Navigate to [Credentials](https://console.cloud.google.com/apis/credentials) +1. Click on `Create Credentials` +1. Choose `OAuth client ID` +1. On the `Create OAuth client ID` page: + 1. Under the `Application type` dropdown, select `Desktop App` + 1. Under `Name`, give your OAuth client ID a meaningful name, e.g. `PSGSuite Powershell Module OAuth Credentials`. + ![google_cloud_project_oauth_client_id.png](../../assets/screenshots/google_cloud_project_oauth_client_id.png) + 1. Click `Create`. +1. On the `OAuth client created` pop-up, download the JSON file and save it to a location on your computer. You will need the path where you saved the JSON file later on. + ![google_cloud_project_oauth_client_id_download.png](../../assets/screenshots/google_cloud_project_oauth_client_id_download.png) +1. [You can now begin configuring the module](../configuration/module_configuration.md) + +*** + +### Service Account + +1. On the `Create service account` page: + 1. Under `Service Account Details`: + 1. On the `Service account name` field, give your service a meaningful name, e.g. `svc_psgsuite_pwsh_module`. + 1. (Optional) On the `Service account description` field, give your service a meaningful description, e.g. `PSGSuite PowerShell Module Service Account`. + 1. Click on `Create and continue`. + ![google_cloud_project_service_account_details.png](../../assets/screenshots/google_cloud_project_service_account_details.png) + 1. Under `Grant this service account access to project (optional)`: + 1. Click on `Select a role` dropdown menu. + 1. Select --> `Project` --> `Owner` + 1. Click on `Continue`. + ![google_cloud_project_service_account_role.png](../../assets/screenshots/google_cloud_project_service_account_role.png) + 1. Under `Grant users access to this service account (optional)`: + 1. If you want to grant users access to this service account, you can do so here. Otherwise, you can skip this step. + ![google_cloud_project_service_account_done.png](../../assets/screenshots/google_cloud_project_service_account_done.png) +1. On the `Credentials` page: + 1. Under the `Actions` column, click on the pencil icon to edit the service account you just created. + ![google_cloud_project_service_account_edit.png](../../assets/screenshots/google_cloud_project_service_account_edit.png) + 1. Select `Keys`. + 1. Click on `Add Key` and select `Create new key`. + ![google_cloud_project_service_account_add_key.png](../../assets/screenshots/google_cloud_project_service_account_add_key.png) + 1. Select `P12` and click `Create` + ![google_cloud_project_service_account_create_key.png](../../assets/screenshots/google_cloud_project_service_account_create_key.png) + 1. Save the key to a location on your computer. You will need the path where you saved the key later on. + ![google_cloud_project_service_account_key_download.png](../../assets/screenshots/google_cloud_project_service_account_key_download.png) + +#### Domain Wide Delegation + +In order for the service account to impersonate one or more users in your domain, you need to enable domain-wide delegation. + +1. On the `Credentials` page: + 1. Under the `Actions` column, click on the pencil icon to edit the service account you just created. + ![google_cloud_project_service_account_edit.png](../../assets/screenshots/google_cloud_project_service_account_edit.png) +1. On the `Details` tab, expand `Advanced Settings`: + 1. Copy your `Client ID` + 1. Click on `View Google Workspace Admin Console` +![google_cloud_project_service_account_advanced_settings.png](../../assets/screenshots/google_cloud_project_service_account_advanced_settings.png) +1. On the `Google Admin Console` page, navigate to `Security` --> `Access and data control` --> `API Controls` --> `Manage Domain Wide Delegation` +![google_cloud_project_service_account_domain_wide_delegation.png](../../assets/screenshots/google_cloud_project_service_account_domain_wide_delegation.png) +1. On the `Domain-wide Delegation` page, click on `Add new` + 1. Paste your client ID from step 2.2 into the `Client ID` field. + 1. Copy/paste the OAuth scopes below into the `OAuth Scopes` field and click `Authorize` + ![google_cloud_project_service_account_domain_wide_delegation_add.png](../../assets/screenshots/google_cloud_project_service_account_domain_wide_delegation_add.png) + !!! info + Although the module does not use **all** of these scopes currently, additional functions are being built to leverage this entire list. + If for security reasons you want to limit the scopes, please remove the ones you do not need. + + ```plaintext {linenums="1"} + https://mail.google.com/, + https://www.googleapis.com/auth/activity, + https://www.googleapis.com/auth/admin.datatransfer, + https://www.googleapis.com/auth/admin.directory.customer, + https://www.googleapis.com/auth/admin.directory.device.chromeos, + https://www.googleapis.com/auth/admin.directory.device.mobile, + https://www.googleapis.com/auth/admin.directory.domain, + https://www.googleapis.com/auth/admin.directory.group, + https://www.googleapis.com/auth/admin.directory.orgunit, + https://www.googleapis.com/auth/admin.directory.resource.calendar, + https://www.googleapis.com/auth/admin.directory.rolemanagement, + https://www.googleapis.com/auth/admin.directory.rolemanagement.readonly, + https://www.googleapis.com/auth/admin.directory.user, + https://www.googleapis.com/auth/admin.directory.user.readonly, + https://www.googleapis.com/auth/admin.directory.user.security, + https://www.googleapis.com/auth/admin.directory.userschema, + https://www.googleapis.com/auth/admin.reports.audit.readonly, + https://www.googleapis.com/auth/admin.reports.usage.readonly, + https://www.googleapis.com/auth/apps.groups.settings, + https://www.googleapis.com/auth/apps.licensing, + https://www.googleapis.com/auth/calendar, + https://www.googleapis.com/auth/chat.bot, + https://www.googleapis.com/auth/classroom.announcements, + https://www.googleapis.com/auth/classroom.courses, + https://www.googleapis.com/auth/classroom.coursework.me, + https://www.googleapis.com/auth/classroom.coursework.students, + https://www.googleapis.com/auth/classroom.guardianlinks.students, + https://www.googleapis.com/auth/classroom.profile.emails, + https://www.googleapis.com/auth/classroom.profile.photos, + https://www.googleapis.com/auth/classroom.push-notifications, + https://www.googleapis.com/auth/classroom.rosters, + https://www.googleapis.com/auth/classroom.rosters.readonly, + https://www.googleapis.com/auth/drive, + https://www.googleapis.com/auth/gmail.settings.basic, + https://www.googleapis.com/auth/gmail.settings.sharing, + https://www.googleapis.com/auth/tasks, + https://www.googleapis.com/auth/tasks.readonly, + https://www.googleapis.com/auth/userinfo.email, + https://www.googleapis.com/auth/userinfo.profile + ``` + +1. [You can now begin configuring the module](../configuration/module_configuration.md) diff --git a/docs/pages/configuration/module_configuration.md b/docs/pages/configuration/module_configuration.md new file mode 100644 index 00000000..957a167e --- /dev/null +++ b/docs/pages/configuration/module_configuration.md @@ -0,0 +1,166 @@ +# Configuring the PSGSuite Configuration File + +You will need certain information to configure the PSGSuite configuration file. Depending on the credential type you are using, please click the appropriate link below to collect the information you need before configuring the module. + + +- [OAuth 2.0 Client ID](#oauth-20-client-id) +- [Service Account](#service-account) + +*** + +## Import PSGSuite Module + +1. Import the module to your PowerShell session: + 1. If the module is located in your `$PSModulePath` + + ```powershell {linenums="1"} + Import-Module PSGSuite -Verbose + ``` + + 1. If the module is located in a different path, use the `-Path` parameter: + + ```powershell {linenums="1"} + Import-Module -Path 'C:\Path\To\PSGSuite\PSGSuite.psd1' -Verbose + ``` + +## OAuth 2.0 Client ID + +In your Powershell session, create the following variables with the requested information: + +1. `$clientSecretsPath`: Path to the OAuth 2.0 JSON file you downloaded previously, e.g. `C:\Path\To\OAuth.json`. +1. `$adminEmail`: Your email. + +```powershell {linenums="1"} +$params = @{ + ConfigName = 'PersonalGoogle' + ClientSecretsPath = $clientSecretsPath + AdminEmail = $adminEmail + } + +Set-PSGSuiteConfig @params +``` + +### First Time Authentication + +When using OAuth Client ID, must also complete OAuth in browser to finalize your configuration. This step will generate your `refresh_token` and initial `access_token` for the scopes listed below. + +```plaintext {linenums="1"} + https://mail.google.com/, + https://mail.google.com/, + https://www.googleapis.com/auth/calendar, + https://www.googleapis.com/auth/drive, + https://www.googleapis.com/auth/gmail.settings.basic, + https://www.googleapis.com/auth/gmail.settings.sharing, + https://www.googleapis.com/auth/tasks, + https://www.googleapis.com/auth/tasks.readonly, + https://www.googleapis.com/auth/userinfo.email, + https://www.googleapis.com/auth/userinfo.profile +``` + +Run the following command to start the authentication process: + +```powershell {linenums="1"} + # We are just running a random cmdlet to force the authentication process to start. + Get-GSGmailProfile -Verbose +``` + +After running the above command, if you are using Powershell 6.0 or later: + +1. Click on the link in the console output to open a browser window. + ![powershell_oauth_link.png](../../assets/screenshots/powershell_oauth_link.png) +1. On the `Choose an account` page, select the appropriate account. + ![oauth_select_account.png](../../assets/screenshots/oauth_select_account.png) + +!!! info + If you are using an `External` application that is set to `Testing` you might see a message similar to the following: + + ```plaintext + Google hasn’t verified this app + + You’ve been given access to an app that’s currently being tested. + + You should only continue if you know the developer that invited you. + ``` + +1. On the next page, you will be asked to allow the application to access your data. + 1. Place a checkmark next to `Select All` + 1. Click `Continue` + + ![oauth_allow_access.png](../../assets/screenshots/oauth_allow_access.png) + +1. On the next page, you will see your authorization code you need to enter in the console window. + + ![oauth_authorization_code.png](../../assets/screenshots/oauth_authorization_code.png) + +1. If the authentication was successful, your Powershell console should look similar to the following: + + ![powershell_oauth_success.png](../../assets/screenshots/powershell_oauth_success.png) + +*** + +## Service Account + +In your Powershell session, create the following variables with the requested information: + +1. `$p12KeyPath`: Path to P12 Key File you downloaded previously, e.g. `C:\Path\To\Key.p12`. +1. `$appEmail`: Service Account Email Address + - Navigate to [Credentials](https://console.cloud.google.com/apis/credentials) + - Click on the the service account you created. + - Copy the value under 'Email' + ![Service Account Email Address](../../assets/screenshots/service_account_email_address.png) +1. `$adminEmail`: This is email address for the SuperAdmin account that created the project (usually your email) +1. (Optional) `$customerId`: This is the customer ID associated with your Google Workspace account. + - Navigate to the [Google Workspace Account Settings](https://admin.google.com/ac/accountsettings/profile) + ![Customer ID](../../assets/screenshots/customer_id.png) +1. `$domain`: This is the domain name associated with your Google Workspace account. +1. `$preference`: This is referenced by certain functions that allow either the Customer ID or Domain to be queried against. You can choose between "CustomerID" or "Domain" for this value. +1. `$serviceAccountClientId`: This will store the service account client ID in the configuration file and it is purely a convenience parameter. The service account client ID is what you copied on Step 2 when you were setting up [Domain Wide Delegation](../configuration/google_cloud_configuration.md/#domain-wide-delegation) + +Run the following command to create the configuration file: + +```powershell {linenums="1"} +$params = @{ + AdminEmail = $adminEmail + AppEmail = $appEmail + ConfigName = 'GoogleWorkspace' + CustomerID = $customerID + Domain = $domain + P12KeyPath = $p12KeyPath + Preference = $preference + ServiceAccountClientID = $serviceAccountClientID + SetAsDefaultConfig = $true +} +Set-PSGSuiteConfig @params +``` + +## Multiple Configurations At Once + +If you wanted to configure multiple configurations at once, i.e., one for your personal account and one for your work account, you can do so by following the example below: + +```powershell {linenums="1"} +@( + @{ + AdminEmail = $googleWorkspaceAdminEmail + AppEmail = $appEmail + ConfigName = 'GoogleWorkspace' + CustomerID = $customerID + Domain = $domain + P12KeyPath = $p12KeyPath + Preference = $preference + ServiceAccountClientID = $serviceAccountClientID + SetAsDefaultConfig = $true + } + @{ + ConfigName = 'PersonalGoogle' + ClientSecretsPath = $clientSecretsPath + AdminEmail = $gmailEmail + } +) | ForEach-Object { + $props = $_ + Set-PSGSuiteConfig @props +} +``` + +## Configuration File Location + +The configuration file is located in `$env:LOCALAPPDATA\powershell\SCRT HQ\PSGSuite\Configuration.psd1`. diff --git a/docs/pages/examples/custom_schemas_management.md b/docs/pages/examples/custom_schemas_management.md new file mode 100644 index 00000000..bb83ce36 --- /dev/null +++ b/docs/pages/examples/custom_schemas_management.md @@ -0,0 +1,99 @@ +# Custom Schemas Management + +## Getting Custom Schema Info + +To get info about a specific custom schema, use the `Get-GSUserSchema` function: + +### Get-GSUserSchema + +* Scope(s) required: + * + +#### Get-GSUserSchema Syntax + +```powershell +Get-GSUserSchema [[-SchemaId] ] [] +``` + +#### Get-GSUserSchema Examples + +=== "Get all custom schemas" + + ```powershell {linenums="1"} + Get-GSUserSchema + ``` + +=== "Get a specific custom schema" + + ```powershell {linenums="1"} + Get-GSUserSchema -SchemaId $schemaId + ``` + +## Creating Custom Schemas + +To create custom schemas, use the `New-GSUserSchema` function: + +### New-GSUserSchema + +* Scope(s) required: + * + +#### New-GSUserSchema Syntax + +```powershell +New-GSUserSchema [-SchemaName] [-Fields] [] +``` + +#### New-GSUserSchema Examples + +=== "Create a new custom schema" + + ```powershell {linenums="1"} + New-GSUserSchema + ``` + +## Removing Custom Schemas + +To remove custom schemas, use the `Remove-GSUserSchema` function: + +### Remove-GSUserSchema + +* Scope(s) required: + * + +#### Remove-GSUserSchema Syntax + +```powershell +Remove-GSUserSchema [[-SchemaId] ] [-WhatIf] [-Confirm] [] +``` + +#### Remove-GSUserSchema Examples + +=== "Remove a specific custom schema" + + ```powershell {linenums="1"} + Remove-GSUserSchema + ``` + +## Updating Custom Schemas + +To update custom schemas, use the `Update-GSUserSchema` function: + +### Update-GSUserSchema + +* Scope(s) required: + * + +#### Update-GSUserSchema Syntax + +```powershell +Update-GSUserSchema [-SchemaId] [-SchemaName ] [-Fields ] [] +``` + +#### Update-GSUserSchema Example + +=== "Update a specific custom schema" + + ```powershell {linenums="1"} + Update-GSUserSchema -SchemaId $schemaId + ``` diff --git a/docs/pages/examples/license_management.md b/docs/pages/examples/license_management.md new file mode 100644 index 00000000..2e52d2c5 --- /dev/null +++ b/docs/pages/examples/license_management.md @@ -0,0 +1,116 @@ +# License Management + +## Getting License Info + +To get license info, use the `Get-GSUserLicense` function: + +### Get-GSUserLicense + +* Scope(s) required: + * +* Mandatory parameters: + * User (must be the primary email address of an existing user in the domain) + +#### Get-GSUserLicense Syntax + +```powershell +Get-GSUserLicense [-License ] [-ProductID ] [-PageSize ] [-Limit ] [] +``` + +```powershell +Get-GSUserLicense [[-User] ] [-License ] [] +``` + +#### Get-GSUserLicense Examples + +=== "Get all licenses in the domain" + + ```powershell {linenums="1"} + Get-GSUserLicense + ``` + +=== "Get a user's license info" + + ```powershell {linenums="1"} + Get-GSUserLicense -User john.smith@domain.com + ``` + +=== "Get a user's license info for a specific product" + + ```powershell {linenums="1"} + Get-GSUserLicense -User john.smith@domain.com -License Google-Vault-Former-Employee + ``` + +## Removing Licenses + +To remove licenses, use the `Remove-GSUserLicense` function: + +### Remove-GSUserLicense + +* Scope(s) required: + * +* Mandatory parameters: + * User (must be the primary email address of an existing user in the domain) + +#### Remove-GSUserLicense Syntax + +```powershell +Remove-GSUserLicense [-User] [-License] [-WhatIf] [-Confirm] [] +``` + +#### Remove-GSUserLicense Examples + +=== "Remove a user's license" + + ```powershell {linenums="1"} + Remove-GSUserLicense + ``` + +## Setting Licenses + +To set licenses, use the `Set-GSUserLicense` function: + +### Set-GSUserLicense + +* Scope(s) required: + * +* Mandatory parameters: + * User (must be the primary email address of an existing user in the domain) + +#### Set-GSUserLicense Syntax + +```powershell +Set-GSUserLicense [-User] [-License] [] +``` + +#### Set-GSUserLicense Examples + +=== "Set a user's license" + ```powershell {linenums="1"} + Set-GSUserLicense -User joe.smith@domain.com -License Google-Vault-Former-Employee + ``` + +## Updating Licenses + +To update licenses, use the `Update-GSUserLicense` function: + +### Update-GSUserLicense + +* Scope(s) required: + * +* Mandatory parameters: + * User (must be the primary email address of an existing user in the domain) + +#### Update-GSUserLicense Syntax + +```powershell +Update-GSUserLicense [[-User] ] [-License ] [] +``` + +#### Update-GSUserLicense Examples + +=== "Update a user's license" + +```powershell {linenums="1"} +Update-GSUserLicense -User joe.smith@domain.com -License Google-Vault-Former-Employee +``` diff --git a/docs/pages/examples/multi_use_configuration.md b/docs/pages/examples/multi_use_configuration.md new file mode 100644 index 00000000..5cb7c2f2 --- /dev/null +++ b/docs/pages/examples/multi_use_configuration.md @@ -0,0 +1,28 @@ +# Multi-Use Configuration + +PSGSuite 2.0.0 and later uses a single file configuration stored outside of the module folder. The file is normally located in `$env:LOCALAPPDATA\powershell\SCRT HQ\PSGSuite\Configuration.psd1`. + +If you intend to use the module with more than one user account on the same machine, you will want to create your configuration with an AES key as the encryption method. To do this you'll want to create a key then pass the key as the first argument when importing the module. + +!!! danger + You **must** pass `$null` after the `$key` argument as shown to force the full key to be used, otherwise only the first byte in the array will be passed as the key value + +```powershell {linenums="1"} +$key = [byte[]]::new(32) # 32 bytes for AES-256 +[Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($key) + +Import-Module PSGSuite -ArgumentList $key,$null + +$props = @{ + ConfigName = 'MyMultiUseConfig' + P12KeyPath = '\\path\to\your\p12key.p12' + AppEmail = 'service_account_email' + AdminEmail = 'admin_email' + CustomerID = 'customer_id' + Domain = "domain.com" + Preference = "CustomerID" + ServiceAccountClientID = "service_account_client_id" +} + +Set-PSGSuiteConfig @props +``` diff --git a/docs/pages/examples/user_management.md b/docs/pages/examples/user_management.md new file mode 100644 index 00000000..397c8d6b --- /dev/null +++ b/docs/pages/examples/user_management.md @@ -0,0 +1,233 @@ +# User Management + +This section goes into detail on how to manage users, licenses and custom schemas using this module. + +## Getting User Info + +### Get-GSUser + +This function pulls info for a specific user, including orgUnitPath, aliases, custom schema values, etc. + +* Scope(s) required: + * + * +* Mandatory parameters: + * User (must be the primary email address of an existing user in the domain) + +#### Get-GSUser Syntax + +```powershell +Get-GSUser [-User] [-Projection {Basic | Custom | Full}] [-CustomFieldMask ] [-ViewType {Admin_View | Domain_Public}] [-Fields ] [-AccessToken ] [-P12KeyPath ] [-AppEmail ] [-AdminEmail ] [] +``` + +#### Get-GSUser Examples + +=== "Get all users" + + ```powershell {linenums="1"} + Get-GSUser -Filter * + ``` + +=== "Get full details for a user" + + ```powershell {linenums="1"} + $params = @{ + User = 'john.smith@domain.com' + Projection = 'Full' + ViewType = 'Admin_View' + } + + Get-GSUser @params + ``` + +=== "Get basic details for a user" + + ```powershell {linenums="1"} + Get-GSUser john.smith@domain.com + ``` + +## Getting User Photos + +To get a user's photo, use the `Get-GSUserPhoto` function: + +### Get-GSUserPhoto + +* Scope(s) required: + * + * +* Mandatory parameters: + * User (must be the primary email address of an existing user in the domain) + +#### Get-GSUserPhoto Syntax + +```powershell +Get-GSUserPhoto [-User] [-AccessToken ] [-P12KeyPath ] [-AppEmail ] [-AdminEmail ] [] +``` + +#### Get-GSUserPhoto Examples + +=== "Get a user's photo" + + ```powershell {linenums="1"} + Get-GSUserPhoto john.smith@domain.com + ``` + +## Listing Users + +To list all users in the domain or in a specific organizational unit, use the `Get-GSUserList` function: + +### Get-GSUserList + +* Scope(s) required: + * + * +* Mandatory parameters: + * None + +#### Get-GSUserList Syntax + +```powershell +Get-GSUserList [[-Query] ] [[-PageSize] ] [[-OrderBy] ] [[-SortOrder] ] [[-AccessToken] ] [[-P12KeyPath] ] [[-AppEmail] ] [[-AdminEmail] ] [[-CustomerID] ] [[-Domain] ] [[-Preference] ] [] +``` + +#### Get-GSUserList Examples + +=== "Get all users in the domain" + + ```powershell {linenums="1"} + Get-GSUserList + ``` + +=== "Get all users in an OU" + + ```powershell {linenums="1"} + Get-GSUserList -Query "orgUnitPath='/Users/New Hires'" + ``` + +=== "Get a specific user in a specific OU" + + ```powershell {linenums="1"} + Get-GSUserList -MaxResults 300 -Query "orgUnitPath='/Users'","email=john.smith@domain.com" + ``` + +## Creating Users + +To create new users, use the `New-GSUser` function: + +### New-GSUser + +* Scope(s) required: + * +* Mandatory parameters: + * PrimaryEmail (user's primary email, must be unique to the domain) + * GivenName (user's first name) + * FamilyName (user's last name) + * Password (user's initial password) + +#### New-GSUser Syntax + +```powershell {linenums="1"} +New-GSUser [-PrimaryEmail] [-GivenName] [-FamilyName] [-Password] [[-ChangePasswordAtNextLogin] ] [[-OrgUnitPath] ] [[-Suspended] ] [[-IncludeInGlobalAddressList] ] [[-IPWhitelisted] ] [[-AccessToken] ] [[-P12KeyPath] ] [[-AppEmail] ] [[-AdminEmail] ] [] +``` + +#### New-GSUser Examples + +=== "Create a new user in the root OU" + + ```powershell {linenums="1"} + New-GSUser -PrimaryEmail john.smith@domain.com -GivenName John -FamilyName Smith -Password Password123 + ``` + +=== "Create a new user in a specific OU" + + ```powershell {linenums="1"} + New-GSUser -PrimaryEmail john.smith@domain.com -GivenName John -FamilyName Smith -Password Password123 -ChangePasswordAtNextLogin True -OrgUnitPath "/Users/New Hires" -IncludeInGlobalAddressList True + ``` + +## Updating Users + +To update existing users, use the `Update-GSUser` function: + +### Update-GSUser + +* Scope(s) required: + * +* Mandatory parameters: + * User (must be the primary email address of an existing user in the domain) + +#### Update-GSUser Syntax + +```powershell +Update-GSUser [-User] [[-PrimaryEmail] ] [[-GivenName] ] [[-FamilyName] ] [[-Password] ] [[-ChangePasswordAtNextLogin] ] [[-OrgUnitPath] ] [[-Suspended] ] [[-IncludeInGlobalAddressList] ] [[-IPWhitelisted] ] [[-AccessToken] ] [[-P12KeyPath] ] [[-AppEmail] ] [[-AdminEmail] ] [] +``` + +#### Update-GSUser Examples + +=== "Update a user's email address and name" + +```powershell {linenums="1"} +Update-GSUser -User john.smith@domain.com -PrimaryEmail johnathan.smith@domain.com -GivenName Johnathan -Suspended False +``` + +## Removing Users + +To remove users, use the `Remove-GSUser` function: + +### Remove-GSUser + +* Scope(s) required: + * +* Mandatory parameters: + * User (must be the primary email address of an existing user in the domain) + +#### Remove-GSUser Syntax + +```powershell {linenums="1"} +Remove-GSUser [-User] [[-AccessToken] ] [[-P12KeyPath] ] [[-AppEmail] ] [[-AdminEmail] ] [-WhatIf] [-Confirm] [] +``` + +#### Remove-GSUser Examples + +=== "Attempt to remove a user" + +```powershell {linenums="1"} +Remove-GSUser -User john.smith@domain.com -WhatIf +``` + +=== "Remove a user" + +```powershell {linenums="1"} +Remove-GSUser -User john.smith@domain.com -Confirm:$false +``` + +## Restoring Users + +To restore users, use the `Restore-GSUser` function: + +### Restore-GSUser + +* Scope(s) required: + * +* Mandatory parameters: + * User (must be the primary email address of an existing user in the domain) + * OrgUnitPath (the Org Unit path to restore the user to) + +#### Restore-GSUser Syntax + +```powershell +Restore-GSUser [-User] [-OrgUnitPath] [-AccessToken ] [-P12KeyPath ] [-AppEmail ] [-AdminEmail ] [-WhatIf] [-Confirm] [] +``` + +#### Restore-GSUser Examples + +=== "Attempt to restore a user" + +```powershell {linenums="1"} +Restore-GSUser -User john.smith@domain.com -OrgUnitPath "/Users" -WhatIf +``` + +=== "Restore a user" + +```powershell {linenums="1"} +Restore-GSUser -User john.smith@domain.com -OrgUnitPath "/Users" -Confirm:$false +``` diff --git a/docs/Function Help/Authentication/Clear-PSGSuiteServiceCache.md b/docs/pages/function_help/Authentication/Clear-PSGSuiteServiceCache.md similarity index 100% rename from docs/Function Help/Authentication/Clear-PSGSuiteServiceCache.md rename to docs/pages/function_help/Authentication/Clear-PSGSuiteServiceCache.md diff --git a/docs/Function Help/Authentication/Get-GSToken.md b/docs/pages/function_help/Authentication/Get-GSToken.md similarity index 100% rename from docs/Function Help/Authentication/Get-GSToken.md rename to docs/pages/function_help/Authentication/Get-GSToken.md diff --git a/docs/Function Help/Authentication/Get-PSGSuiteServiceCache.md b/docs/pages/function_help/Authentication/Get-PSGSuiteServiceCache.md similarity index 100% rename from docs/Function Help/Authentication/Get-PSGSuiteServiceCache.md rename to docs/pages/function_help/Authentication/Get-PSGSuiteServiceCache.md diff --git a/docs/Function Help/Authentication/New-GoogleService.md b/docs/pages/function_help/Authentication/New-GoogleService.md similarity index 100% rename from docs/Function Help/Authentication/New-GoogleService.md rename to docs/pages/function_help/Authentication/New-GoogleService.md diff --git a/docs/Function Help/Calendar/Add-GSCalendarSubscription.md b/docs/pages/function_help/Calendar/Add-GSCalendarSubscription.md similarity index 100% rename from docs/Function Help/Calendar/Add-GSCalendarSubscription.md rename to docs/pages/function_help/Calendar/Add-GSCalendarSubscription.md diff --git a/docs/Function Help/Calendar/Get-GSCalendar.md b/docs/pages/function_help/Calendar/Get-GSCalendar.md similarity index 100% rename from docs/Function Help/Calendar/Get-GSCalendar.md rename to docs/pages/function_help/Calendar/Get-GSCalendar.md diff --git a/docs/Function Help/Calendar/Get-GSCalendarAcl.md b/docs/pages/function_help/Calendar/Get-GSCalendarAcl.md similarity index 100% rename from docs/Function Help/Calendar/Get-GSCalendarAcl.md rename to docs/pages/function_help/Calendar/Get-GSCalendarAcl.md diff --git a/docs/Function Help/Calendar/Get-GSCalendarEvent.md b/docs/pages/function_help/Calendar/Get-GSCalendarEvent.md similarity index 100% rename from docs/Function Help/Calendar/Get-GSCalendarEvent.md rename to docs/pages/function_help/Calendar/Get-GSCalendarEvent.md diff --git a/docs/Function Help/Calendar/Get-GSCalendarSubscription.md b/docs/pages/function_help/Calendar/Get-GSCalendarSubscription.md similarity index 100% rename from docs/Function Help/Calendar/Get-GSCalendarSubscription.md rename to docs/pages/function_help/Calendar/Get-GSCalendarSubscription.md diff --git a/docs/Function Help/Calendar/New-GSCalendarAcl.md b/docs/pages/function_help/Calendar/New-GSCalendarAcl.md similarity index 100% rename from docs/Function Help/Calendar/New-GSCalendarAcl.md rename to docs/pages/function_help/Calendar/New-GSCalendarAcl.md diff --git a/docs/Function Help/Calendar/New-GSCalendarEvent.md b/docs/pages/function_help/Calendar/New-GSCalendarEvent.md similarity index 100% rename from docs/Function Help/Calendar/New-GSCalendarEvent.md rename to docs/pages/function_help/Calendar/New-GSCalendarEvent.md diff --git a/docs/Function Help/Calendar/Remove-GSCalendarAcl.md b/docs/pages/function_help/Calendar/Remove-GSCalendarAcl.md similarity index 100% rename from docs/Function Help/Calendar/Remove-GSCalendarAcl.md rename to docs/pages/function_help/Calendar/Remove-GSCalendarAcl.md diff --git a/docs/Function Help/Calendar/Remove-GSCalendarEvent.md b/docs/pages/function_help/Calendar/Remove-GSCalendarEvent.md similarity index 100% rename from docs/Function Help/Calendar/Remove-GSCalendarEvent.md rename to docs/pages/function_help/Calendar/Remove-GSCalendarEvent.md diff --git a/docs/Function Help/Calendar/Remove-GSCalendarSubscription.md b/docs/pages/function_help/Calendar/Remove-GSCalendarSubscription.md similarity index 100% rename from docs/Function Help/Calendar/Remove-GSCalendarSubscription.md rename to docs/pages/function_help/Calendar/Remove-GSCalendarSubscription.md diff --git a/docs/Function Help/Calendar/Update-GSCalendarEvent.md b/docs/pages/function_help/Calendar/Update-GSCalendarEvent.md similarity index 100% rename from docs/Function Help/Calendar/Update-GSCalendarEvent.md rename to docs/pages/function_help/Calendar/Update-GSCalendarEvent.md diff --git a/docs/Function Help/Calendar/Update-GSCalendarSubscription.md b/docs/pages/function_help/Calendar/Update-GSCalendarSubscription.md similarity index 100% rename from docs/Function Help/Calendar/Update-GSCalendarSubscription.md rename to docs/pages/function_help/Calendar/Update-GSCalendarSubscription.md diff --git a/docs/Function Help/Chat/Get-GSChatMember.md b/docs/pages/function_help/Chat/Get-GSChatMember.md similarity index 100% rename from docs/Function Help/Chat/Get-GSChatMember.md rename to docs/pages/function_help/Chat/Get-GSChatMember.md diff --git a/docs/Function Help/Chat/Get-GSChatMessage.md b/docs/pages/function_help/Chat/Get-GSChatMessage.md similarity index 100% rename from docs/Function Help/Chat/Get-GSChatMessage.md rename to docs/pages/function_help/Chat/Get-GSChatMessage.md diff --git a/docs/Function Help/Chat/Get-GSChatSpace.md b/docs/pages/function_help/Chat/Get-GSChatSpace.md similarity index 100% rename from docs/Function Help/Chat/Get-GSChatSpace.md rename to docs/pages/function_help/Chat/Get-GSChatSpace.md diff --git a/docs/Function Help/Chat/Remove-GSChatMessage.md b/docs/pages/function_help/Chat/Remove-GSChatMessage.md similarity index 100% rename from docs/Function Help/Chat/Remove-GSChatMessage.md rename to docs/pages/function_help/Chat/Remove-GSChatMessage.md diff --git a/docs/Function Help/Chat/Send-GSChatMessage.md b/docs/pages/function_help/Chat/Send-GSChatMessage.md similarity index 100% rename from docs/Function Help/Chat/Send-GSChatMessage.md rename to docs/pages/function_help/Chat/Send-GSChatMessage.md diff --git a/docs/Function Help/Chat/Update-GSChatMessage.md b/docs/pages/function_help/Chat/Update-GSChatMessage.md similarity index 100% rename from docs/Function Help/Chat/Update-GSChatMessage.md rename to docs/pages/function_help/Chat/Update-GSChatMessage.md diff --git a/docs/Function Help/Classroom/Add-GSCourseParticipant.md b/docs/pages/function_help/Classroom/Add-GSCourseParticipant.md similarity index 100% rename from docs/Function Help/Classroom/Add-GSCourseParticipant.md rename to docs/pages/function_help/Classroom/Add-GSCourseParticipant.md diff --git a/docs/Function Help/Classroom/Confirm-GSCourseInvitation.md b/docs/pages/function_help/Classroom/Confirm-GSCourseInvitation.md similarity index 100% rename from docs/Function Help/Classroom/Confirm-GSCourseInvitation.md rename to docs/pages/function_help/Classroom/Confirm-GSCourseInvitation.md diff --git a/docs/Function Help/Classroom/Get-GSClassroomUserProfile.md b/docs/pages/function_help/Classroom/Get-GSClassroomUserProfile.md similarity index 100% rename from docs/Function Help/Classroom/Get-GSClassroomUserProfile.md rename to docs/pages/function_help/Classroom/Get-GSClassroomUserProfile.md diff --git a/docs/Function Help/Classroom/Get-GSCourse.md b/docs/pages/function_help/Classroom/Get-GSCourse.md similarity index 100% rename from docs/Function Help/Classroom/Get-GSCourse.md rename to docs/pages/function_help/Classroom/Get-GSCourse.md diff --git a/docs/Function Help/Classroom/Get-GSCourseAlias.md b/docs/pages/function_help/Classroom/Get-GSCourseAlias.md similarity index 100% rename from docs/Function Help/Classroom/Get-GSCourseAlias.md rename to docs/pages/function_help/Classroom/Get-GSCourseAlias.md diff --git a/docs/Function Help/Classroom/Get-GSCourseInvitation.md b/docs/pages/function_help/Classroom/Get-GSCourseInvitation.md similarity index 100% rename from docs/Function Help/Classroom/Get-GSCourseInvitation.md rename to docs/pages/function_help/Classroom/Get-GSCourseInvitation.md diff --git a/docs/Function Help/Classroom/Get-GSCourseParticipant.md b/docs/pages/function_help/Classroom/Get-GSCourseParticipant.md similarity index 100% rename from docs/Function Help/Classroom/Get-GSCourseParticipant.md rename to docs/pages/function_help/Classroom/Get-GSCourseParticipant.md diff --git a/docs/Function Help/Classroom/Get-GSStudentGuardian.md b/docs/pages/function_help/Classroom/Get-GSStudentGuardian.md similarity index 100% rename from docs/Function Help/Classroom/Get-GSStudentGuardian.md rename to docs/pages/function_help/Classroom/Get-GSStudentGuardian.md diff --git a/docs/Function Help/Classroom/Get-GSStudentGuardianInvitation.md b/docs/pages/function_help/Classroom/Get-GSStudentGuardianInvitation.md similarity index 100% rename from docs/Function Help/Classroom/Get-GSStudentGuardianInvitation.md rename to docs/pages/function_help/Classroom/Get-GSStudentGuardianInvitation.md diff --git a/docs/Function Help/Classroom/New-GSCourse.md b/docs/pages/function_help/Classroom/New-GSCourse.md similarity index 100% rename from docs/Function Help/Classroom/New-GSCourse.md rename to docs/pages/function_help/Classroom/New-GSCourse.md diff --git a/docs/Function Help/Classroom/New-GSCourseAlias.md b/docs/pages/function_help/Classroom/New-GSCourseAlias.md similarity index 100% rename from docs/Function Help/Classroom/New-GSCourseAlias.md rename to docs/pages/function_help/Classroom/New-GSCourseAlias.md diff --git a/docs/Function Help/Classroom/New-GSCourseInvitation.md b/docs/pages/function_help/Classroom/New-GSCourseInvitation.md similarity index 100% rename from docs/Function Help/Classroom/New-GSCourseInvitation.md rename to docs/pages/function_help/Classroom/New-GSCourseInvitation.md diff --git a/docs/Function Help/Classroom/New-GSStudentGuardianInvitation.md b/docs/pages/function_help/Classroom/New-GSStudentGuardianInvitation.md similarity index 100% rename from docs/Function Help/Classroom/New-GSStudentGuardianInvitation.md rename to docs/pages/function_help/Classroom/New-GSStudentGuardianInvitation.md diff --git a/docs/Function Help/Classroom/Remove-GSCourse.md b/docs/pages/function_help/Classroom/Remove-GSCourse.md similarity index 100% rename from docs/Function Help/Classroom/Remove-GSCourse.md rename to docs/pages/function_help/Classroom/Remove-GSCourse.md diff --git a/docs/Function Help/Classroom/Remove-GSCourseAlias.md b/docs/pages/function_help/Classroom/Remove-GSCourseAlias.md similarity index 100% rename from docs/Function Help/Classroom/Remove-GSCourseAlias.md rename to docs/pages/function_help/Classroom/Remove-GSCourseAlias.md diff --git a/docs/Function Help/Classroom/Remove-GSCourseInvitation.md b/docs/pages/function_help/Classroom/Remove-GSCourseInvitation.md similarity index 100% rename from docs/Function Help/Classroom/Remove-GSCourseInvitation.md rename to docs/pages/function_help/Classroom/Remove-GSCourseInvitation.md diff --git a/docs/Function Help/Classroom/Remove-GSCourseParticipant.md b/docs/pages/function_help/Classroom/Remove-GSCourseParticipant.md similarity index 100% rename from docs/Function Help/Classroom/Remove-GSCourseParticipant.md rename to docs/pages/function_help/Classroom/Remove-GSCourseParticipant.md diff --git a/docs/Function Help/Classroom/Remove-GSStudentGuardian.md b/docs/pages/function_help/Classroom/Remove-GSStudentGuardian.md similarity index 100% rename from docs/Function Help/Classroom/Remove-GSStudentGuardian.md rename to docs/pages/function_help/Classroom/Remove-GSStudentGuardian.md diff --git a/docs/Function Help/Classroom/Revoke-GSStudentGuardianInvitation.md b/docs/pages/function_help/Classroom/Revoke-GSStudentGuardianInvitation.md similarity index 100% rename from docs/Function Help/Classroom/Revoke-GSStudentGuardianInvitation.md rename to docs/pages/function_help/Classroom/Revoke-GSStudentGuardianInvitation.md diff --git a/docs/Function Help/Classroom/Update-GSCourse.md b/docs/pages/function_help/Classroom/Update-GSCourse.md similarity index 100% rename from docs/Function Help/Classroom/Update-GSCourse.md rename to docs/pages/function_help/Classroom/Update-GSCourse.md diff --git a/docs/Function Help/Configuration/Export-PSGSuiteConfig.md b/docs/pages/function_help/Configuration/Export-PSGSuiteConfig.md similarity index 100% rename from docs/Function Help/Configuration/Export-PSGSuiteConfig.md rename to docs/pages/function_help/Configuration/Export-PSGSuiteConfig.md diff --git a/docs/Function Help/Configuration/Get-GSChatConfig.md b/docs/pages/function_help/Configuration/Get-GSChatConfig.md similarity index 100% rename from docs/Function Help/Configuration/Get-GSChatConfig.md rename to docs/pages/function_help/Configuration/Get-GSChatConfig.md diff --git a/docs/Function Help/Configuration/Get-PSGSuiteConfig.md b/docs/pages/function_help/Configuration/Get-PSGSuiteConfig.md similarity index 100% rename from docs/Function Help/Configuration/Get-PSGSuiteConfig.md rename to docs/pages/function_help/Configuration/Get-PSGSuiteConfig.md diff --git a/docs/Function Help/Configuration/Import-PSGSuiteConfig.md b/docs/pages/function_help/Configuration/Import-PSGSuiteConfig.md similarity index 100% rename from docs/Function Help/Configuration/Import-PSGSuiteConfig.md rename to docs/pages/function_help/Configuration/Import-PSGSuiteConfig.md diff --git a/docs/Function Help/Configuration/Set-PSGSuiteConfig.md b/docs/pages/function_help/Configuration/Set-PSGSuiteConfig.md similarity index 100% rename from docs/Function Help/Configuration/Set-PSGSuiteConfig.md rename to docs/pages/function_help/Configuration/Set-PSGSuiteConfig.md diff --git a/docs/Function Help/Configuration/Show-PSGSuiteConfig.md b/docs/pages/function_help/Configuration/Show-PSGSuiteConfig.md similarity index 100% rename from docs/Function Help/Configuration/Show-PSGSuiteConfig.md rename to docs/pages/function_help/Configuration/Show-PSGSuiteConfig.md diff --git a/docs/Function Help/Configuration/Switch-PSGSuiteConfig.md b/docs/pages/function_help/Configuration/Switch-PSGSuiteConfig.md similarity index 100% rename from docs/Function Help/Configuration/Switch-PSGSuiteConfig.md rename to docs/pages/function_help/Configuration/Switch-PSGSuiteConfig.md diff --git a/docs/Function Help/Contacts/Get-GSContactList.md b/docs/pages/function_help/Contacts/Get-GSContactList.md similarity index 100% rename from docs/Function Help/Contacts/Get-GSContactList.md rename to docs/pages/function_help/Contacts/Get-GSContactList.md diff --git a/docs/Function Help/Contacts/Remove-GSContact.md b/docs/pages/function_help/Contacts/Remove-GSContact.md similarity index 100% rename from docs/Function Help/Contacts/Remove-GSContact.md rename to docs/pages/function_help/Contacts/Remove-GSContact.md diff --git a/docs/Function Help/Customers/Get-GSCustomer.md b/docs/pages/function_help/Customers/Get-GSCustomer.md similarity index 100% rename from docs/Function Help/Customers/Get-GSCustomer.md rename to docs/pages/function_help/Customers/Get-GSCustomer.md diff --git a/docs/Function Help/Customers/Update-GSCustomer.md b/docs/pages/function_help/Customers/Update-GSCustomer.md similarity index 100% rename from docs/Function Help/Customers/Update-GSCustomer.md rename to docs/pages/function_help/Customers/Update-GSCustomer.md diff --git a/docs/Function Help/Data Transfer/Get-GSDataTransferApplication.md b/docs/pages/function_help/Data Transfer/Get-GSDataTransferApplication.md similarity index 100% rename from docs/Function Help/Data Transfer/Get-GSDataTransferApplication.md rename to docs/pages/function_help/Data Transfer/Get-GSDataTransferApplication.md diff --git a/docs/Function Help/Data Transfer/Start-GSDataTransfer.md b/docs/pages/function_help/Data Transfer/Start-GSDataTransfer.md similarity index 100% rename from docs/Function Help/Data Transfer/Start-GSDataTransfer.md rename to docs/pages/function_help/Data Transfer/Start-GSDataTransfer.md diff --git a/docs/Function Help/Delegation/Add-GSGmailDelegate.md b/docs/pages/function_help/Delegation/Add-GSGmailDelegate.md similarity index 100% rename from docs/Function Help/Delegation/Add-GSGmailDelegate.md rename to docs/pages/function_help/Delegation/Add-GSGmailDelegate.md diff --git a/docs/Function Help/Delegation/Get-GSGmailDelegate.md b/docs/pages/function_help/Delegation/Get-GSGmailDelegate.md similarity index 100% rename from docs/Function Help/Delegation/Get-GSGmailDelegate.md rename to docs/pages/function_help/Delegation/Get-GSGmailDelegate.md diff --git a/docs/Function Help/Delegation/Remove-GSGmailDelegate.md b/docs/pages/function_help/Delegation/Remove-GSGmailDelegate.md similarity index 100% rename from docs/Function Help/Delegation/Remove-GSGmailDelegate.md rename to docs/pages/function_help/Delegation/Remove-GSGmailDelegate.md diff --git a/docs/Function Help/Domains/Get-GSDomain.md b/docs/pages/function_help/Domains/Get-GSDomain.md similarity index 100% rename from docs/Function Help/Domains/Get-GSDomain.md rename to docs/pages/function_help/Domains/Get-GSDomain.md diff --git a/docs/Function Help/Domains/Get-GSDomainAlias.md b/docs/pages/function_help/Domains/Get-GSDomainAlias.md similarity index 100% rename from docs/Function Help/Domains/Get-GSDomainAlias.md rename to docs/pages/function_help/Domains/Get-GSDomainAlias.md diff --git a/docs/Function Help/Domains/New-GSDomain.md b/docs/pages/function_help/Domains/New-GSDomain.md similarity index 100% rename from docs/Function Help/Domains/New-GSDomain.md rename to docs/pages/function_help/Domains/New-GSDomain.md diff --git a/docs/Function Help/Domains/New-GSDomainAlias.md b/docs/pages/function_help/Domains/New-GSDomainAlias.md similarity index 100% rename from docs/Function Help/Domains/New-GSDomainAlias.md rename to docs/pages/function_help/Domains/New-GSDomainAlias.md diff --git a/docs/Function Help/Domains/Remove-GSDomain.md b/docs/pages/function_help/Domains/Remove-GSDomain.md similarity index 100% rename from docs/Function Help/Domains/Remove-GSDomain.md rename to docs/pages/function_help/Domains/Remove-GSDomain.md diff --git a/docs/Function Help/Domains/Remove-GSDomainAlias.md b/docs/pages/function_help/Domains/Remove-GSDomainAlias.md similarity index 100% rename from docs/Function Help/Domains/Remove-GSDomainAlias.md rename to docs/pages/function_help/Domains/Remove-GSDomainAlias.md diff --git a/docs/Function Help/Drive/Add-GSDocContent.md b/docs/pages/function_help/Drive/Add-GSDocContent.md similarity index 100% rename from docs/Function Help/Drive/Add-GSDocContent.md rename to docs/pages/function_help/Drive/Add-GSDocContent.md diff --git a/docs/Function Help/Drive/Add-GSDrivePermission.md b/docs/pages/function_help/Drive/Add-GSDrivePermission.md similarity index 100% rename from docs/Function Help/Drive/Add-GSDrivePermission.md rename to docs/pages/function_help/Drive/Add-GSDrivePermission.md diff --git a/docs/Function Help/Drive/Copy-GSDriveFile.md b/docs/pages/function_help/Drive/Copy-GSDriveFile.md similarity index 100% rename from docs/Function Help/Drive/Copy-GSDriveFile.md rename to docs/pages/function_help/Drive/Copy-GSDriveFile.md diff --git a/docs/Function Help/Drive/Export-GSDriveFile.md b/docs/pages/function_help/Drive/Export-GSDriveFile.md similarity index 100% rename from docs/Function Help/Drive/Export-GSDriveFile.md rename to docs/pages/function_help/Drive/Export-GSDriveFile.md diff --git a/docs/Function Help/Drive/Get-GSDocContent.md b/docs/pages/function_help/Drive/Get-GSDocContent.md similarity index 100% rename from docs/Function Help/Drive/Get-GSDocContent.md rename to docs/pages/function_help/Drive/Get-GSDocContent.md diff --git a/docs/Function Help/Drive/Get-GSDrive.md b/docs/pages/function_help/Drive/Get-GSDrive.md similarity index 100% rename from docs/Function Help/Drive/Get-GSDrive.md rename to docs/pages/function_help/Drive/Get-GSDrive.md diff --git a/docs/Function Help/Drive/Get-GSDriveFile.md b/docs/pages/function_help/Drive/Get-GSDriveFile.md similarity index 100% rename from docs/Function Help/Drive/Get-GSDriveFile.md rename to docs/pages/function_help/Drive/Get-GSDriveFile.md diff --git a/docs/Function Help/Drive/Get-GSDriveFileList.md b/docs/pages/function_help/Drive/Get-GSDriveFileList.md similarity index 100% rename from docs/Function Help/Drive/Get-GSDriveFileList.md rename to docs/pages/function_help/Drive/Get-GSDriveFileList.md diff --git a/docs/Function Help/Drive/Get-GSDriveFileUploadStatus.md b/docs/pages/function_help/Drive/Get-GSDriveFileUploadStatus.md similarity index 100% rename from docs/Function Help/Drive/Get-GSDriveFileUploadStatus.md rename to docs/pages/function_help/Drive/Get-GSDriveFileUploadStatus.md diff --git a/docs/Function Help/Drive/Get-GSDriveFolderSize.md b/docs/pages/function_help/Drive/Get-GSDriveFolderSize.md similarity index 100% rename from docs/Function Help/Drive/Get-GSDriveFolderSize.md rename to docs/pages/function_help/Drive/Get-GSDriveFolderSize.md diff --git a/docs/Function Help/Drive/Get-GSDrivePermission.md b/docs/pages/function_help/Drive/Get-GSDrivePermission.md similarity index 100% rename from docs/Function Help/Drive/Get-GSDrivePermission.md rename to docs/pages/function_help/Drive/Get-GSDrivePermission.md diff --git a/docs/Function Help/Drive/Get-GSDriveProfile.md b/docs/pages/function_help/Drive/Get-GSDriveProfile.md similarity index 100% rename from docs/Function Help/Drive/Get-GSDriveProfile.md rename to docs/pages/function_help/Drive/Get-GSDriveProfile.md diff --git a/docs/Function Help/Drive/Get-GSDriveRevision.md b/docs/pages/function_help/Drive/Get-GSDriveRevision.md similarity index 100% rename from docs/Function Help/Drive/Get-GSDriveRevision.md rename to docs/pages/function_help/Drive/Get-GSDriveRevision.md diff --git a/docs/Function Help/Drive/Hide-GSDrive.md b/docs/pages/function_help/Drive/Hide-GSDrive.md similarity index 100% rename from docs/Function Help/Drive/Hide-GSDrive.md rename to docs/pages/function_help/Drive/Hide-GSDrive.md diff --git a/docs/Function Help/Drive/New-GSDrive.md b/docs/pages/function_help/Drive/New-GSDrive.md similarity index 100% rename from docs/Function Help/Drive/New-GSDrive.md rename to docs/pages/function_help/Drive/New-GSDrive.md diff --git a/docs/Function Help/Drive/New-GSDriveFile.md b/docs/pages/function_help/Drive/New-GSDriveFile.md similarity index 100% rename from docs/Function Help/Drive/New-GSDriveFile.md rename to docs/pages/function_help/Drive/New-GSDriveFile.md diff --git a/docs/Function Help/Drive/Remove-GSDrive.md b/docs/pages/function_help/Drive/Remove-GSDrive.md similarity index 100% rename from docs/Function Help/Drive/Remove-GSDrive.md rename to docs/pages/function_help/Drive/Remove-GSDrive.md diff --git a/docs/Function Help/Drive/Remove-GSDriveFile.md b/docs/pages/function_help/Drive/Remove-GSDriveFile.md similarity index 100% rename from docs/Function Help/Drive/Remove-GSDriveFile.md rename to docs/pages/function_help/Drive/Remove-GSDriveFile.md diff --git a/docs/Function Help/Drive/Remove-GSDrivePermission.md b/docs/pages/function_help/Drive/Remove-GSDrivePermission.md similarity index 100% rename from docs/Function Help/Drive/Remove-GSDrivePermission.md rename to docs/pages/function_help/Drive/Remove-GSDrivePermission.md diff --git a/docs/Function Help/Drive/Remove-GSDriveRevision.md b/docs/pages/function_help/Drive/Remove-GSDriveRevision.md similarity index 100% rename from docs/Function Help/Drive/Remove-GSDriveRevision.md rename to docs/pages/function_help/Drive/Remove-GSDriveRevision.md diff --git a/docs/Function Help/Drive/Set-GSDocContent.md b/docs/pages/function_help/Drive/Set-GSDocContent.md similarity index 100% rename from docs/Function Help/Drive/Set-GSDocContent.md rename to docs/pages/function_help/Drive/Set-GSDocContent.md diff --git a/docs/Function Help/Drive/Show-GSDrive.md b/docs/pages/function_help/Drive/Show-GSDrive.md similarity index 100% rename from docs/Function Help/Drive/Show-GSDrive.md rename to docs/pages/function_help/Drive/Show-GSDrive.md diff --git a/docs/Function Help/Drive/Start-GSDriveFileUpload.md b/docs/pages/function_help/Drive/Start-GSDriveFileUpload.md similarity index 100% rename from docs/Function Help/Drive/Start-GSDriveFileUpload.md rename to docs/pages/function_help/Drive/Start-GSDriveFileUpload.md diff --git a/docs/Function Help/Drive/Stop-GSDriveFileUpload.md b/docs/pages/function_help/Drive/Stop-GSDriveFileUpload.md similarity index 100% rename from docs/Function Help/Drive/Stop-GSDriveFileUpload.md rename to docs/pages/function_help/Drive/Stop-GSDriveFileUpload.md diff --git a/docs/Function Help/Drive/Update-GSDrive.md b/docs/pages/function_help/Drive/Update-GSDrive.md similarity index 100% rename from docs/Function Help/Drive/Update-GSDrive.md rename to docs/pages/function_help/Drive/Update-GSDrive.md diff --git a/docs/Function Help/Drive/Update-GSDriveFile.md b/docs/pages/function_help/Drive/Update-GSDriveFile.md similarity index 100% rename from docs/Function Help/Drive/Update-GSDriveFile.md rename to docs/pages/function_help/Drive/Update-GSDriveFile.md diff --git a/docs/Function Help/Drive/Update-GSDriveRevision.md b/docs/pages/function_help/Drive/Update-GSDriveRevision.md similarity index 100% rename from docs/Function Help/Drive/Update-GSDriveRevision.md rename to docs/pages/function_help/Drive/Update-GSDriveRevision.md diff --git a/docs/Function Help/Drive/Watch-GSDriveUpload.md b/docs/pages/function_help/Drive/Watch-GSDriveUpload.md similarity index 100% rename from docs/Function Help/Drive/Watch-GSDriveUpload.md rename to docs/pages/function_help/Drive/Watch-GSDriveUpload.md diff --git a/docs/Function Help/Gmail/Add-GSGmailFilter.md b/docs/pages/function_help/Gmail/Add-GSGmailFilter.md similarity index 100% rename from docs/Function Help/Gmail/Add-GSGmailFilter.md rename to docs/pages/function_help/Gmail/Add-GSGmailFilter.md diff --git a/docs/Function Help/Gmail/Add-GSGmailForwardingAddress.md b/docs/pages/function_help/Gmail/Add-GSGmailForwardingAddress.md similarity index 100% rename from docs/Function Help/Gmail/Add-GSGmailForwardingAddress.md rename to docs/pages/function_help/Gmail/Add-GSGmailForwardingAddress.md diff --git a/docs/Function Help/Gmail/Get-GSGmailAutoForwardingSettings.md b/docs/pages/function_help/Gmail/Get-GSGmailAutoForwardingSettings.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailAutoForwardingSettings.md rename to docs/pages/function_help/Gmail/Get-GSGmailAutoForwardingSettings.md diff --git a/docs/Function Help/Gmail/Get-GSGmailFilter.md b/docs/pages/function_help/Gmail/Get-GSGmailFilter.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailFilter.md rename to docs/pages/function_help/Gmail/Get-GSGmailFilter.md diff --git a/docs/Function Help/Gmail/Get-GSGmailForwardingAddress.md b/docs/pages/function_help/Gmail/Get-GSGmailForwardingAddress.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailForwardingAddress.md rename to docs/pages/function_help/Gmail/Get-GSGmailForwardingAddress.md diff --git a/docs/Function Help/Gmail/Get-GSGmailImapSettings.md b/docs/pages/function_help/Gmail/Get-GSGmailImapSettings.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailImapSettings.md rename to docs/pages/function_help/Gmail/Get-GSGmailImapSettings.md diff --git a/docs/Function Help/Gmail/Get-GSGmailLabel.md b/docs/pages/function_help/Gmail/Get-GSGmailLabel.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailLabel.md rename to docs/pages/function_help/Gmail/Get-GSGmailLabel.md diff --git a/docs/Function Help/Gmail/Get-GSGmailLanguageSettings.md b/docs/pages/function_help/Gmail/Get-GSGmailLanguageSettings.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailLanguageSettings.md rename to docs/pages/function_help/Gmail/Get-GSGmailLanguageSettings.md diff --git a/docs/Function Help/Gmail/Get-GSGmailMessage.md b/docs/pages/function_help/Gmail/Get-GSGmailMessage.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailMessage.md rename to docs/pages/function_help/Gmail/Get-GSGmailMessage.md diff --git a/docs/Function Help/Gmail/Get-GSGmailMessageList.md b/docs/pages/function_help/Gmail/Get-GSGmailMessageList.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailMessageList.md rename to docs/pages/function_help/Gmail/Get-GSGmailMessageList.md diff --git a/docs/Function Help/Gmail/Get-GSGmailPopSettings.md b/docs/pages/function_help/Gmail/Get-GSGmailPopSettings.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailPopSettings.md rename to docs/pages/function_help/Gmail/Get-GSGmailPopSettings.md diff --git a/docs/Function Help/Gmail/Get-GSGmailProfile.md b/docs/pages/function_help/Gmail/Get-GSGmailProfile.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailProfile.md rename to docs/pages/function_help/Gmail/Get-GSGmailProfile.md diff --git a/docs/Function Help/Gmail/Get-GSGmailSMIMEInfo.md b/docs/pages/function_help/Gmail/Get-GSGmailSMIMEInfo.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailSMIMEInfo.md rename to docs/pages/function_help/Gmail/Get-GSGmailSMIMEInfo.md diff --git a/docs/Function Help/Gmail/Get-GSGmailSendAsAlias.md b/docs/pages/function_help/Gmail/Get-GSGmailSendAsAlias.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailSendAsAlias.md rename to docs/pages/function_help/Gmail/Get-GSGmailSendAsAlias.md diff --git a/docs/Function Help/Gmail/Get-GSGmailVacationSettings.md b/docs/pages/function_help/Gmail/Get-GSGmailVacationSettings.md similarity index 100% rename from docs/Function Help/Gmail/Get-GSGmailVacationSettings.md rename to docs/pages/function_help/Gmail/Get-GSGmailVacationSettings.md diff --git a/docs/Function Help/Gmail/New-GSGmailLabel.md b/docs/pages/function_help/Gmail/New-GSGmailLabel.md similarity index 100% rename from docs/Function Help/Gmail/New-GSGmailLabel.md rename to docs/pages/function_help/Gmail/New-GSGmailLabel.md diff --git a/docs/Function Help/Gmail/New-GSGmailSMIMEInfo.md b/docs/pages/function_help/Gmail/New-GSGmailSMIMEInfo.md similarity index 100% rename from docs/Function Help/Gmail/New-GSGmailSMIMEInfo.md rename to docs/pages/function_help/Gmail/New-GSGmailSMIMEInfo.md diff --git a/docs/Function Help/Gmail/New-GSGmailSendAsAlias.md b/docs/pages/function_help/Gmail/New-GSGmailSendAsAlias.md similarity index 100% rename from docs/Function Help/Gmail/New-GSGmailSendAsAlias.md rename to docs/pages/function_help/Gmail/New-GSGmailSendAsAlias.md diff --git a/docs/Function Help/Gmail/Remove-GSGmailFilter.md b/docs/pages/function_help/Gmail/Remove-GSGmailFilter.md similarity index 100% rename from docs/Function Help/Gmail/Remove-GSGmailFilter.md rename to docs/pages/function_help/Gmail/Remove-GSGmailFilter.md diff --git a/docs/Function Help/Gmail/Remove-GSGmailLabel.md b/docs/pages/function_help/Gmail/Remove-GSGmailLabel.md similarity index 100% rename from docs/Function Help/Gmail/Remove-GSGmailLabel.md rename to docs/pages/function_help/Gmail/Remove-GSGmailLabel.md diff --git a/docs/Function Help/Gmail/Remove-GSGmailMessage.md b/docs/pages/function_help/Gmail/Remove-GSGmailMessage.md similarity index 100% rename from docs/Function Help/Gmail/Remove-GSGmailMessage.md rename to docs/pages/function_help/Gmail/Remove-GSGmailMessage.md diff --git a/docs/Function Help/Gmail/Remove-GSGmailSMIMEInfo.md b/docs/pages/function_help/Gmail/Remove-GSGmailSMIMEInfo.md similarity index 100% rename from docs/Function Help/Gmail/Remove-GSGmailSMIMEInfo.md rename to docs/pages/function_help/Gmail/Remove-GSGmailSMIMEInfo.md diff --git a/docs/Function Help/Gmail/Remove-GSGmailSendAsAlias.md b/docs/pages/function_help/Gmail/Remove-GSGmailSendAsAlias.md similarity index 100% rename from docs/Function Help/Gmail/Remove-GSGmailSendAsAlias.md rename to docs/pages/function_help/Gmail/Remove-GSGmailSendAsAlias.md diff --git a/docs/Function Help/Gmail/Restore-GSGmailMessage.md b/docs/pages/function_help/Gmail/Restore-GSGmailMessage.md similarity index 100% rename from docs/Function Help/Gmail/Restore-GSGmailMessage.md rename to docs/pages/function_help/Gmail/Restore-GSGmailMessage.md diff --git a/docs/Function Help/Gmail/Send-GSGmailSendAsConfirmation.md b/docs/pages/function_help/Gmail/Send-GSGmailSendAsConfirmation.md similarity index 100% rename from docs/Function Help/Gmail/Send-GSGmailSendAsConfirmation.md rename to docs/pages/function_help/Gmail/Send-GSGmailSendAsConfirmation.md diff --git a/docs/Function Help/Gmail/Send-GmailMessage.md b/docs/pages/function_help/Gmail/Send-GmailMessage.md similarity index 100% rename from docs/Function Help/Gmail/Send-GmailMessage.md rename to docs/pages/function_help/Gmail/Send-GmailMessage.md diff --git a/docs/Function Help/Gmail/Update-GSGmailAutoForwardingSettings.md b/docs/pages/function_help/Gmail/Update-GSGmailAutoForwardingSettings.md similarity index 100% rename from docs/Function Help/Gmail/Update-GSGmailAutoForwardingSettings.md rename to docs/pages/function_help/Gmail/Update-GSGmailAutoForwardingSettings.md diff --git a/docs/Function Help/Gmail/Update-GSGmailImapSettings.md b/docs/pages/function_help/Gmail/Update-GSGmailImapSettings.md similarity index 100% rename from docs/Function Help/Gmail/Update-GSGmailImapSettings.md rename to docs/pages/function_help/Gmail/Update-GSGmailImapSettings.md diff --git a/docs/Function Help/Gmail/Update-GSGmailLabel.md b/docs/pages/function_help/Gmail/Update-GSGmailLabel.md similarity index 100% rename from docs/Function Help/Gmail/Update-GSGmailLabel.md rename to docs/pages/function_help/Gmail/Update-GSGmailLabel.md diff --git a/docs/Function Help/Gmail/Update-GSGmailLanguageSettings.md b/docs/pages/function_help/Gmail/Update-GSGmailLanguageSettings.md similarity index 100% rename from docs/Function Help/Gmail/Update-GSGmailLanguageSettings.md rename to docs/pages/function_help/Gmail/Update-GSGmailLanguageSettings.md diff --git a/docs/Function Help/Gmail/Update-GSGmailMessageLabels.md b/docs/pages/function_help/Gmail/Update-GSGmailMessageLabels.md similarity index 100% rename from docs/Function Help/Gmail/Update-GSGmailMessageLabels.md rename to docs/pages/function_help/Gmail/Update-GSGmailMessageLabels.md diff --git a/docs/Function Help/Gmail/Update-GSGmailPopSettings.md b/docs/pages/function_help/Gmail/Update-GSGmailPopSettings.md similarity index 100% rename from docs/Function Help/Gmail/Update-GSGmailPopSettings.md rename to docs/pages/function_help/Gmail/Update-GSGmailPopSettings.md diff --git a/docs/Function Help/Gmail/Update-GSGmailSendAsAlias.md b/docs/pages/function_help/Gmail/Update-GSGmailSendAsAlias.md similarity index 100% rename from docs/Function Help/Gmail/Update-GSGmailSendAsAlias.md rename to docs/pages/function_help/Gmail/Update-GSGmailSendAsAlias.md diff --git a/docs/Function Help/Gmail/Update-GSGmailSignature.md b/docs/pages/function_help/Gmail/Update-GSGmailSignature.md similarity index 100% rename from docs/Function Help/Gmail/Update-GSGmailSignature.md rename to docs/pages/function_help/Gmail/Update-GSGmailSignature.md diff --git a/docs/Function Help/Gmail/Update-GSGmailVacationSettings.md b/docs/pages/function_help/Gmail/Update-GSGmailVacationSettings.md similarity index 100% rename from docs/Function Help/Gmail/Update-GSGmailVacationSettings.md rename to docs/pages/function_help/Gmail/Update-GSGmailVacationSettings.md diff --git a/docs/Function Help/Groups/Add-GSGroupMember.md b/docs/pages/function_help/Groups/Add-GSGroupMember.md similarity index 100% rename from docs/Function Help/Groups/Add-GSGroupMember.md rename to docs/pages/function_help/Groups/Add-GSGroupMember.md diff --git a/docs/Function Help/Groups/Add-GSPrincipalGroupMembership.md b/docs/pages/function_help/Groups/Add-GSPrincipalGroupMembership.md similarity index 100% rename from docs/Function Help/Groups/Add-GSPrincipalGroupMembership.md rename to docs/pages/function_help/Groups/Add-GSPrincipalGroupMembership.md diff --git a/docs/Function Help/Groups/Get-GSGroup.md b/docs/pages/function_help/Groups/Get-GSGroup.md similarity index 100% rename from docs/Function Help/Groups/Get-GSGroup.md rename to docs/pages/function_help/Groups/Get-GSGroup.md diff --git a/docs/Function Help/Groups/Get-GSGroupAlias.md b/docs/pages/function_help/Groups/Get-GSGroupAlias.md similarity index 100% rename from docs/Function Help/Groups/Get-GSGroupAlias.md rename to docs/pages/function_help/Groups/Get-GSGroupAlias.md diff --git a/docs/Function Help/Groups/Get-GSGroupMember.md b/docs/pages/function_help/Groups/Get-GSGroupMember.md similarity index 100% rename from docs/Function Help/Groups/Get-GSGroupMember.md rename to docs/pages/function_help/Groups/Get-GSGroupMember.md diff --git a/docs/Function Help/Groups/Get-GSGroupSettings.md b/docs/pages/function_help/Groups/Get-GSGroupSettings.md similarity index 100% rename from docs/Function Help/Groups/Get-GSGroupSettings.md rename to docs/pages/function_help/Groups/Get-GSGroupSettings.md diff --git a/docs/Function Help/Groups/New-GSGroup.md b/docs/pages/function_help/Groups/New-GSGroup.md similarity index 100% rename from docs/Function Help/Groups/New-GSGroup.md rename to docs/pages/function_help/Groups/New-GSGroup.md diff --git a/docs/Function Help/Groups/New-GSGroupAlias.md b/docs/pages/function_help/Groups/New-GSGroupAlias.md similarity index 100% rename from docs/Function Help/Groups/New-GSGroupAlias.md rename to docs/pages/function_help/Groups/New-GSGroupAlias.md diff --git a/docs/Function Help/Groups/Remove-GSGroup.md b/docs/pages/function_help/Groups/Remove-GSGroup.md similarity index 100% rename from docs/Function Help/Groups/Remove-GSGroup.md rename to docs/pages/function_help/Groups/Remove-GSGroup.md diff --git a/docs/Function Help/Groups/Remove-GSGroupAlias.md b/docs/pages/function_help/Groups/Remove-GSGroupAlias.md similarity index 100% rename from docs/Function Help/Groups/Remove-GSGroupAlias.md rename to docs/pages/function_help/Groups/Remove-GSGroupAlias.md diff --git a/docs/Function Help/Groups/Remove-GSGroupMember.md b/docs/pages/function_help/Groups/Remove-GSGroupMember.md similarity index 100% rename from docs/Function Help/Groups/Remove-GSGroupMember.md rename to docs/pages/function_help/Groups/Remove-GSGroupMember.md diff --git a/docs/Function Help/Groups/Remove-GSPrincipalGroupMembership.md b/docs/pages/function_help/Groups/Remove-GSPrincipalGroupMembership.md similarity index 100% rename from docs/Function Help/Groups/Remove-GSPrincipalGroupMembership.md rename to docs/pages/function_help/Groups/Remove-GSPrincipalGroupMembership.md diff --git a/docs/Function Help/Groups/Set-GSGroupSettings.md b/docs/pages/function_help/Groups/Set-GSGroupSettings.md similarity index 100% rename from docs/Function Help/Groups/Set-GSGroupSettings.md rename to docs/pages/function_help/Groups/Set-GSGroupSettings.md diff --git a/docs/Function Help/Groups/Test-GSGroupMembership.md b/docs/pages/function_help/Groups/Test-GSGroupMembership.md similarity index 100% rename from docs/Function Help/Groups/Test-GSGroupMembership.md rename to docs/pages/function_help/Groups/Test-GSGroupMembership.md diff --git a/docs/Function Help/Groups/Update-GSGroupMember.md b/docs/pages/function_help/Groups/Update-GSGroupMember.md similarity index 100% rename from docs/Function Help/Groups/Update-GSGroupMember.md rename to docs/pages/function_help/Groups/Update-GSGroupMember.md diff --git a/docs/Function Help/Groups/Update-GSGroupSettings.md b/docs/pages/function_help/Groups/Update-GSGroupSettings.md similarity index 100% rename from docs/Function Help/Groups/Update-GSGroupSettings.md rename to docs/pages/function_help/Groups/Update-GSGroupSettings.md diff --git a/docs/Function Help/Helpers/Add-GSCalendarEventReminder.md b/docs/pages/function_help/Helpers/Add-GSCalendarEventReminder.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSCalendarEventReminder.md rename to docs/pages/function_help/Helpers/Add-GSCalendarEventReminder.md diff --git a/docs/Function Help/Helpers/Add-GSCalendarNotification.md b/docs/pages/function_help/Helpers/Add-GSCalendarNotification.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSCalendarNotification.md rename to docs/pages/function_help/Helpers/Add-GSCalendarNotification.md diff --git a/docs/Function Help/Helpers/Add-GSChatButton.md b/docs/pages/function_help/Helpers/Add-GSChatButton.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSChatButton.md rename to docs/pages/function_help/Helpers/Add-GSChatButton.md diff --git a/docs/Function Help/Helpers/Add-GSChatCard.md b/docs/pages/function_help/Helpers/Add-GSChatCard.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSChatCard.md rename to docs/pages/function_help/Helpers/Add-GSChatCard.md diff --git a/docs/Function Help/Helpers/Add-GSChatCardAction.md b/docs/pages/function_help/Helpers/Add-GSChatCardAction.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSChatCardAction.md rename to docs/pages/function_help/Helpers/Add-GSChatCardAction.md diff --git a/docs/Function Help/Helpers/Add-GSChatCardSection.md b/docs/pages/function_help/Helpers/Add-GSChatCardSection.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSChatCardSection.md rename to docs/pages/function_help/Helpers/Add-GSChatCardSection.md diff --git a/docs/Function Help/Helpers/Add-GSChatImage.md b/docs/pages/function_help/Helpers/Add-GSChatImage.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSChatImage.md rename to docs/pages/function_help/Helpers/Add-GSChatImage.md diff --git a/docs/Function Help/Helpers/Add-GSChatKeyValue.md b/docs/pages/function_help/Helpers/Add-GSChatKeyValue.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSChatKeyValue.md rename to docs/pages/function_help/Helpers/Add-GSChatKeyValue.md diff --git a/docs/Function Help/Helpers/Add-GSChatOnClick.md b/docs/pages/function_help/Helpers/Add-GSChatOnClick.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSChatOnClick.md rename to docs/pages/function_help/Helpers/Add-GSChatOnClick.md diff --git a/docs/Function Help/Helpers/Add-GSChatTextParagraph.md b/docs/pages/function_help/Helpers/Add-GSChatTextParagraph.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSChatTextParagraph.md rename to docs/pages/function_help/Helpers/Add-GSChatTextParagraph.md diff --git a/docs/Function Help/Helpers/Add-GSCustomerPostalAddress.md b/docs/pages/function_help/Helpers/Add-GSCustomerPostalAddress.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSCustomerPostalAddress.md rename to docs/pages/function_help/Helpers/Add-GSCustomerPostalAddress.md diff --git a/docs/Function Help/Helpers/Add-GSEventAttendee.md b/docs/pages/function_help/Helpers/Add-GSEventAttendee.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSEventAttendee.md rename to docs/pages/function_help/Helpers/Add-GSEventAttendee.md diff --git a/docs/Function Help/Helpers/Add-GSGmailSmtpMsa.md b/docs/pages/function_help/Helpers/Add-GSGmailSmtpMsa.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSGmailSmtpMsa.md rename to docs/pages/function_help/Helpers/Add-GSGmailSmtpMsa.md diff --git a/docs/Function Help/Helpers/Add-GSUserAddress.md b/docs/pages/function_help/Helpers/Add-GSUserAddress.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSUserAddress.md rename to docs/pages/function_help/Helpers/Add-GSUserAddress.md diff --git a/docs/Function Help/Helpers/Add-GSUserEmail.md b/docs/pages/function_help/Helpers/Add-GSUserEmail.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSUserEmail.md rename to docs/pages/function_help/Helpers/Add-GSUserEmail.md diff --git a/docs/Function Help/Helpers/Add-GSUserExternalId.md b/docs/pages/function_help/Helpers/Add-GSUserExternalId.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSUserExternalId.md rename to docs/pages/function_help/Helpers/Add-GSUserExternalId.md diff --git a/docs/Function Help/Helpers/Add-GSUserIm.md b/docs/pages/function_help/Helpers/Add-GSUserIm.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSUserIm.md rename to docs/pages/function_help/Helpers/Add-GSUserIm.md diff --git a/docs/Function Help/Helpers/Add-GSUserLocation.md b/docs/pages/function_help/Helpers/Add-GSUserLocation.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSUserLocation.md rename to docs/pages/function_help/Helpers/Add-GSUserLocation.md diff --git a/docs/Function Help/Helpers/Add-GSUserOrganization.md b/docs/pages/function_help/Helpers/Add-GSUserOrganization.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSUserOrganization.md rename to docs/pages/function_help/Helpers/Add-GSUserOrganization.md diff --git a/docs/Function Help/Helpers/Add-GSUserPhone.md b/docs/pages/function_help/Helpers/Add-GSUserPhone.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSUserPhone.md rename to docs/pages/function_help/Helpers/Add-GSUserPhone.md diff --git a/docs/Function Help/Helpers/Add-GSUserRelation.md b/docs/pages/function_help/Helpers/Add-GSUserRelation.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSUserRelation.md rename to docs/pages/function_help/Helpers/Add-GSUserRelation.md diff --git a/docs/Function Help/Helpers/Add-GSUserSchemaField.md b/docs/pages/function_help/Helpers/Add-GSUserSchemaField.md similarity index 100% rename from docs/Function Help/Helpers/Add-GSUserSchemaField.md rename to docs/pages/function_help/Helpers/Add-GSUserSchemaField.md diff --git a/docs/Function Help/Helpers/Block-CoreCLREncryptionWarning.md b/docs/pages/function_help/Helpers/Block-CoreCLREncryptionWarning.md similarity index 100% rename from docs/Function Help/Helpers/Block-CoreCLREncryptionWarning.md rename to docs/pages/function_help/Helpers/Block-CoreCLREncryptionWarning.md diff --git a/docs/Function Help/Helpers/Compare-ModuleVersion.md b/docs/pages/function_help/Helpers/Compare-ModuleVersion.md similarity index 100% rename from docs/Function Help/Helpers/Compare-ModuleVersion.md rename to docs/pages/function_help/Helpers/Compare-ModuleVersion.md diff --git a/docs/Function Help/Helpers/Unblock-CoreCLREncryptionWarning.md b/docs/pages/function_help/Helpers/Unblock-CoreCLREncryptionWarning.md similarity index 100% rename from docs/Function Help/Helpers/Unblock-CoreCLREncryptionWarning.md rename to docs/pages/function_help/Helpers/Unblock-CoreCLREncryptionWarning.md diff --git a/docs/Function Help/Licensing/Get-GSUserLicense.md b/docs/pages/function_help/Licensing/Get-GSUserLicense.md similarity index 100% rename from docs/Function Help/Licensing/Get-GSUserLicense.md rename to docs/pages/function_help/Licensing/Get-GSUserLicense.md diff --git a/docs/Function Help/Licensing/Remove-GSUserLicense.md b/docs/pages/function_help/Licensing/Remove-GSUserLicense.md similarity index 100% rename from docs/Function Help/Licensing/Remove-GSUserLicense.md rename to docs/pages/function_help/Licensing/Remove-GSUserLicense.md diff --git a/docs/Function Help/Licensing/Set-GSUserLicense.md b/docs/pages/function_help/Licensing/Set-GSUserLicense.md similarity index 100% rename from docs/Function Help/Licensing/Set-GSUserLicense.md rename to docs/pages/function_help/Licensing/Set-GSUserLicense.md diff --git a/docs/Function Help/Licensing/Update-GSUserLicense.md b/docs/pages/function_help/Licensing/Update-GSUserLicense.md similarity index 100% rename from docs/Function Help/Licensing/Update-GSUserLicense.md rename to docs/pages/function_help/Licensing/Update-GSUserLicense.md diff --git a/docs/Function Help/Org Units/Get-GSOrganizationalUnit.md b/docs/pages/function_help/Org Units/Get-GSOrganizationalUnit.md similarity index 100% rename from docs/Function Help/Org Units/Get-GSOrganizationalUnit.md rename to docs/pages/function_help/Org Units/Get-GSOrganizationalUnit.md diff --git a/docs/Function Help/Org Units/New-GSOrganizationalUnit.md b/docs/pages/function_help/Org Units/New-GSOrganizationalUnit.md similarity index 100% rename from docs/Function Help/Org Units/New-GSOrganizationalUnit.md rename to docs/pages/function_help/Org Units/New-GSOrganizationalUnit.md diff --git a/docs/Function Help/Org Units/Remove-GSOrganizationalUnit.md b/docs/pages/function_help/Org Units/Remove-GSOrganizationalUnit.md similarity index 100% rename from docs/Function Help/Org Units/Remove-GSOrganizationalUnit.md rename to docs/pages/function_help/Org Units/Remove-GSOrganizationalUnit.md diff --git a/docs/Function Help/Org Units/Update-GSOrganizationalUnit.md b/docs/pages/function_help/Org Units/Update-GSOrganizationalUnit.md similarity index 100% rename from docs/Function Help/Org Units/Update-GSOrganizationalUnit.md rename to docs/pages/function_help/Org Units/Update-GSOrganizationalUnit.md diff --git a/docs/Function Help/Reports/Get-GSActivityReport.md b/docs/pages/function_help/Reports/Get-GSActivityReport.md similarity index 100% rename from docs/Function Help/Reports/Get-GSActivityReport.md rename to docs/pages/function_help/Reports/Get-GSActivityReport.md diff --git a/docs/Function Help/Reports/Get-GSUsageReport.md b/docs/pages/function_help/Reports/Get-GSUsageReport.md similarity index 100% rename from docs/Function Help/Reports/Get-GSUsageReport.md rename to docs/pages/function_help/Reports/Get-GSUsageReport.md diff --git a/docs/Function Help/Resources/Get-GSResource.md b/docs/pages/function_help/Resources/Get-GSResource.md similarity index 100% rename from docs/Function Help/Resources/Get-GSResource.md rename to docs/pages/function_help/Resources/Get-GSResource.md diff --git a/docs/Function Help/Resources/New-GSResource.md b/docs/pages/function_help/Resources/New-GSResource.md similarity index 100% rename from docs/Function Help/Resources/New-GSResource.md rename to docs/pages/function_help/Resources/New-GSResource.md diff --git a/docs/Function Help/Resources/Remove-GSResource.md b/docs/pages/function_help/Resources/Remove-GSResource.md similarity index 100% rename from docs/Function Help/Resources/Remove-GSResource.md rename to docs/pages/function_help/Resources/Remove-GSResource.md diff --git a/docs/Function Help/Resources/Update-GSResource.md b/docs/pages/function_help/Resources/Update-GSResource.md similarity index 100% rename from docs/Function Help/Resources/Update-GSResource.md rename to docs/pages/function_help/Resources/Update-GSResource.md diff --git a/docs/Function Help/Role Assignments/Get-GSAdminRoleAssignment.md b/docs/pages/function_help/Role Assignments/Get-GSAdminRoleAssignment.md similarity index 100% rename from docs/Function Help/Role Assignments/Get-GSAdminRoleAssignment.md rename to docs/pages/function_help/Role Assignments/Get-GSAdminRoleAssignment.md diff --git a/docs/Function Help/Role Assignments/New-GSAdminRoleAssignment.md b/docs/pages/function_help/Role Assignments/New-GSAdminRoleAssignment.md similarity index 100% rename from docs/Function Help/Role Assignments/New-GSAdminRoleAssignment.md rename to docs/pages/function_help/Role Assignments/New-GSAdminRoleAssignment.md diff --git a/docs/Function Help/Role Assignments/Remove-GSAdminRoleAssignment.md b/docs/pages/function_help/Role Assignments/Remove-GSAdminRoleAssignment.md similarity index 100% rename from docs/Function Help/Role Assignments/Remove-GSAdminRoleAssignment.md rename to docs/pages/function_help/Role Assignments/Remove-GSAdminRoleAssignment.md diff --git a/docs/Function Help/RoleAssignments/Get-GSAdminRoleAssignment.md b/docs/pages/function_help/RoleAssignments/Get-GSAdminRoleAssignment.md similarity index 100% rename from docs/Function Help/RoleAssignments/Get-GSAdminRoleAssignment.md rename to docs/pages/function_help/RoleAssignments/Get-GSAdminRoleAssignment.md diff --git a/docs/Function Help/RoleAssignments/New-GSAdminRoleAssignment.md b/docs/pages/function_help/RoleAssignments/New-GSAdminRoleAssignment.md similarity index 100% rename from docs/Function Help/RoleAssignments/New-GSAdminRoleAssignment.md rename to docs/pages/function_help/RoleAssignments/New-GSAdminRoleAssignment.md diff --git a/docs/Function Help/RoleAssignments/Remove-GSAdminRoleAssignment.md b/docs/pages/function_help/RoleAssignments/Remove-GSAdminRoleAssignment.md similarity index 100% rename from docs/Function Help/RoleAssignments/Remove-GSAdminRoleAssignment.md rename to docs/pages/function_help/RoleAssignments/Remove-GSAdminRoleAssignment.md diff --git a/docs/Function Help/Roles/Get-GSAdminRole.md b/docs/pages/function_help/Roles/Get-GSAdminRole.md similarity index 100% rename from docs/Function Help/Roles/Get-GSAdminRole.md rename to docs/pages/function_help/Roles/Get-GSAdminRole.md diff --git a/docs/Function Help/Roles/New-GSAdminRole.md b/docs/pages/function_help/Roles/New-GSAdminRole.md similarity index 100% rename from docs/Function Help/Roles/New-GSAdminRole.md rename to docs/pages/function_help/Roles/New-GSAdminRole.md diff --git a/docs/Function Help/Roles/Remove-GSAdminRole.md b/docs/pages/function_help/Roles/Remove-GSAdminRole.md similarity index 100% rename from docs/Function Help/Roles/Remove-GSAdminRole.md rename to docs/pages/function_help/Roles/Remove-GSAdminRole.md diff --git a/docs/Function Help/Roles/Update-GSAdminRole.md b/docs/pages/function_help/Roles/Update-GSAdminRole.md similarity index 100% rename from docs/Function Help/Roles/Update-GSAdminRole.md rename to docs/pages/function_help/Roles/Update-GSAdminRole.md diff --git a/docs/Function Help/Schemas/Get-GSUserSchema.md b/docs/pages/function_help/Schemas/Get-GSUserSchema.md similarity index 100% rename from docs/Function Help/Schemas/Get-GSUserSchema.md rename to docs/pages/function_help/Schemas/Get-GSUserSchema.md diff --git a/docs/Function Help/Schemas/New-GSUserSchema.md b/docs/pages/function_help/Schemas/New-GSUserSchema.md similarity index 100% rename from docs/Function Help/Schemas/New-GSUserSchema.md rename to docs/pages/function_help/Schemas/New-GSUserSchema.md diff --git a/docs/Function Help/Schemas/Remove-GSUserSchema.md b/docs/pages/function_help/Schemas/Remove-GSUserSchema.md similarity index 100% rename from docs/Function Help/Schemas/Remove-GSUserSchema.md rename to docs/pages/function_help/Schemas/Remove-GSUserSchema.md diff --git a/docs/Function Help/Schemas/Set-GSUserSchema.md b/docs/pages/function_help/Schemas/Set-GSUserSchema.md similarity index 100% rename from docs/Function Help/Schemas/Set-GSUserSchema.md rename to docs/pages/function_help/Schemas/Set-GSUserSchema.md diff --git a/docs/Function Help/Schemas/Update-GSUserSchema.md b/docs/pages/function_help/Schemas/Update-GSUserSchema.md similarity index 100% rename from docs/Function Help/Schemas/Update-GSUserSchema.md rename to docs/pages/function_help/Schemas/Update-GSUserSchema.md diff --git a/docs/Function Help/Security/Get-GSChromeOSDevice.md b/docs/pages/function_help/Security/Get-GSChromeOSDevice.md similarity index 100% rename from docs/Function Help/Security/Get-GSChromeOSDevice.md rename to docs/pages/function_help/Security/Get-GSChromeOSDevice.md diff --git a/docs/Function Help/Security/Get-GSMobileDevice.md b/docs/pages/function_help/Security/Get-GSMobileDevice.md similarity index 100% rename from docs/Function Help/Security/Get-GSMobileDevice.md rename to docs/pages/function_help/Security/Get-GSMobileDevice.md diff --git a/docs/Function Help/Security/Get-GSUserASP.md b/docs/pages/function_help/Security/Get-GSUserASP.md similarity index 100% rename from docs/Function Help/Security/Get-GSUserASP.md rename to docs/pages/function_help/Security/Get-GSUserASP.md diff --git a/docs/Function Help/Security/Get-GSUserToken.md b/docs/pages/function_help/Security/Get-GSUserToken.md similarity index 100% rename from docs/Function Help/Security/Get-GSUserToken.md rename to docs/pages/function_help/Security/Get-GSUserToken.md diff --git a/docs/Function Help/Security/Get-GSUserVerificationCodes.md b/docs/pages/function_help/Security/Get-GSUserVerificationCodes.md similarity index 100% rename from docs/Function Help/Security/Get-GSUserVerificationCodes.md rename to docs/pages/function_help/Security/Get-GSUserVerificationCodes.md diff --git a/docs/Function Help/Security/New-GSUserVerificationCodes.md b/docs/pages/function_help/Security/New-GSUserVerificationCodes.md similarity index 100% rename from docs/Function Help/Security/New-GSUserVerificationCodes.md rename to docs/pages/function_help/Security/New-GSUserVerificationCodes.md diff --git a/docs/Function Help/Security/Remove-GSMobileDevice.md b/docs/pages/function_help/Security/Remove-GSMobileDevice.md similarity index 100% rename from docs/Function Help/Security/Remove-GSMobileDevice.md rename to docs/pages/function_help/Security/Remove-GSMobileDevice.md diff --git a/docs/Function Help/Security/Remove-GSUserASP.md b/docs/pages/function_help/Security/Remove-GSUserASP.md similarity index 100% rename from docs/Function Help/Security/Remove-GSUserASP.md rename to docs/pages/function_help/Security/Remove-GSUserASP.md diff --git a/docs/Function Help/Security/Remove-GSUserToken.md b/docs/pages/function_help/Security/Remove-GSUserToken.md similarity index 100% rename from docs/Function Help/Security/Remove-GSUserToken.md rename to docs/pages/function_help/Security/Remove-GSUserToken.md diff --git a/docs/Function Help/Security/Revoke-GSUserVerificationCodes.md b/docs/pages/function_help/Security/Revoke-GSUserVerificationCodes.md similarity index 100% rename from docs/Function Help/Security/Revoke-GSUserVerificationCodes.md rename to docs/pages/function_help/Security/Revoke-GSUserVerificationCodes.md diff --git a/docs/Function Help/Security/Update-GSChromeOSDevice.md b/docs/pages/function_help/Security/Update-GSChromeOSDevice.md similarity index 100% rename from docs/Function Help/Security/Update-GSChromeOSDevice.md rename to docs/pages/function_help/Security/Update-GSChromeOSDevice.md diff --git a/docs/Function Help/Security/Update-GSMobileDevice.md b/docs/pages/function_help/Security/Update-GSMobileDevice.md similarity index 100% rename from docs/Function Help/Security/Update-GSMobileDevice.md rename to docs/pages/function_help/Security/Update-GSMobileDevice.md diff --git a/docs/Function Help/Sheets/Clear-GSSheet.md b/docs/pages/function_help/Sheets/Clear-GSSheet.md similarity index 100% rename from docs/Function Help/Sheets/Clear-GSSheet.md rename to docs/pages/function_help/Sheets/Clear-GSSheet.md diff --git a/docs/Function Help/Sheets/Copy-GSSheet.md b/docs/pages/function_help/Sheets/Copy-GSSheet.md similarity index 100% rename from docs/Function Help/Sheets/Copy-GSSheet.md rename to docs/pages/function_help/Sheets/Copy-GSSheet.md diff --git a/docs/Function Help/Sheets/Export-GSSheet.md b/docs/pages/function_help/Sheets/Export-GSSheet.md similarity index 100% rename from docs/Function Help/Sheets/Export-GSSheet.md rename to docs/pages/function_help/Sheets/Export-GSSheet.md diff --git a/docs/Function Help/Sheets/Get-GSSheetInfo.md b/docs/pages/function_help/Sheets/Get-GSSheetInfo.md similarity index 100% rename from docs/Function Help/Sheets/Get-GSSheetInfo.md rename to docs/pages/function_help/Sheets/Get-GSSheetInfo.md diff --git a/docs/Function Help/Sheets/Import-GSSheet.md b/docs/pages/function_help/Sheets/Import-GSSheet.md similarity index 100% rename from docs/Function Help/Sheets/Import-GSSheet.md rename to docs/pages/function_help/Sheets/Import-GSSheet.md diff --git a/docs/Function Help/Sheets/New-GSSheet.md b/docs/pages/function_help/Sheets/New-GSSheet.md similarity index 100% rename from docs/Function Help/Sheets/New-GSSheet.md rename to docs/pages/function_help/Sheets/New-GSSheet.md diff --git a/docs/Function Help/Tasks/Clear-GSTasklist.md b/docs/pages/function_help/Tasks/Clear-GSTasklist.md similarity index 100% rename from docs/Function Help/Tasks/Clear-GSTasklist.md rename to docs/pages/function_help/Tasks/Clear-GSTasklist.md diff --git a/docs/Function Help/Tasks/Get-GSTask.md b/docs/pages/function_help/Tasks/Get-GSTask.md similarity index 100% rename from docs/Function Help/Tasks/Get-GSTask.md rename to docs/pages/function_help/Tasks/Get-GSTask.md diff --git a/docs/Function Help/Tasks/Get-GSTasklist.md b/docs/pages/function_help/Tasks/Get-GSTasklist.md similarity index 100% rename from docs/Function Help/Tasks/Get-GSTasklist.md rename to docs/pages/function_help/Tasks/Get-GSTasklist.md diff --git a/docs/Function Help/Tasks/Move-GSTask.md b/docs/pages/function_help/Tasks/Move-GSTask.md similarity index 100% rename from docs/Function Help/Tasks/Move-GSTask.md rename to docs/pages/function_help/Tasks/Move-GSTask.md diff --git a/docs/Function Help/Tasks/New-GSTask.md b/docs/pages/function_help/Tasks/New-GSTask.md similarity index 100% rename from docs/Function Help/Tasks/New-GSTask.md rename to docs/pages/function_help/Tasks/New-GSTask.md diff --git a/docs/Function Help/Tasks/New-GSTasklist.md b/docs/pages/function_help/Tasks/New-GSTasklist.md similarity index 100% rename from docs/Function Help/Tasks/New-GSTasklist.md rename to docs/pages/function_help/Tasks/New-GSTasklist.md diff --git a/docs/Function Help/Tasks/Remove-GSTask.md b/docs/pages/function_help/Tasks/Remove-GSTask.md similarity index 100% rename from docs/Function Help/Tasks/Remove-GSTask.md rename to docs/pages/function_help/Tasks/Remove-GSTask.md diff --git a/docs/Function Help/Tasks/Remove-GSTasklist.md b/docs/pages/function_help/Tasks/Remove-GSTasklist.md similarity index 100% rename from docs/Function Help/Tasks/Remove-GSTasklist.md rename to docs/pages/function_help/Tasks/Remove-GSTasklist.md diff --git a/docs/Function Help/Tasks/Update-GSTask.md b/docs/pages/function_help/Tasks/Update-GSTask.md similarity index 100% rename from docs/Function Help/Tasks/Update-GSTask.md rename to docs/pages/function_help/Tasks/Update-GSTask.md diff --git a/docs/Function Help/Tasks/Update-GSTasklist.md b/docs/pages/function_help/Tasks/Update-GSTasklist.md similarity index 100% rename from docs/Function Help/Tasks/Update-GSTasklist.md rename to docs/pages/function_help/Tasks/Update-GSTasklist.md diff --git a/docs/Function Help/URL Shortener/Get-GSShortUrl.md b/docs/pages/function_help/URL Shortener/Get-GSShortUrl.md similarity index 100% rename from docs/Function Help/URL Shortener/Get-GSShortUrl.md rename to docs/pages/function_help/URL Shortener/Get-GSShortUrl.md diff --git a/docs/Function Help/URL Shortener/New-GSShortUrl.md b/docs/pages/function_help/URL Shortener/New-GSShortUrl.md similarity index 100% rename from docs/Function Help/URL Shortener/New-GSShortUrl.md rename to docs/pages/function_help/URL Shortener/New-GSShortUrl.md diff --git a/docs/Function Help/Users/Get-GSUser.md b/docs/pages/function_help/Users/Get-GSUser.md similarity index 100% rename from docs/Function Help/Users/Get-GSUser.md rename to docs/pages/function_help/Users/Get-GSUser.md diff --git a/docs/Function Help/Users/Get-GSUserAlias.md b/docs/pages/function_help/Users/Get-GSUserAlias.md similarity index 100% rename from docs/Function Help/Users/Get-GSUserAlias.md rename to docs/pages/function_help/Users/Get-GSUserAlias.md diff --git a/docs/Function Help/Users/Get-GSUserPhoto.md b/docs/pages/function_help/Users/Get-GSUserPhoto.md similarity index 100% rename from docs/Function Help/Users/Get-GSUserPhoto.md rename to docs/pages/function_help/Users/Get-GSUserPhoto.md diff --git a/docs/Function Help/Users/New-GSUser.md b/docs/pages/function_help/Users/New-GSUser.md similarity index 100% rename from docs/Function Help/Users/New-GSUser.md rename to docs/pages/function_help/Users/New-GSUser.md diff --git a/docs/Function Help/Users/New-GSUserAlias.md b/docs/pages/function_help/Users/New-GSUserAlias.md similarity index 100% rename from docs/Function Help/Users/New-GSUserAlias.md rename to docs/pages/function_help/Users/New-GSUserAlias.md diff --git a/docs/Function Help/Users/Remove-GSUser.md b/docs/pages/function_help/Users/Remove-GSUser.md similarity index 100% rename from docs/Function Help/Users/Remove-GSUser.md rename to docs/pages/function_help/Users/Remove-GSUser.md diff --git a/docs/Function Help/Users/Remove-GSUserAlias.md b/docs/pages/function_help/Users/Remove-GSUserAlias.md similarity index 100% rename from docs/Function Help/Users/Remove-GSUserAlias.md rename to docs/pages/function_help/Users/Remove-GSUserAlias.md diff --git a/docs/Function Help/Users/Remove-GSUserPhoto.md b/docs/pages/function_help/Users/Remove-GSUserPhoto.md similarity index 100% rename from docs/Function Help/Users/Remove-GSUserPhoto.md rename to docs/pages/function_help/Users/Remove-GSUserPhoto.md diff --git a/docs/Function Help/Users/Restore-GSUser.md b/docs/pages/function_help/Users/Restore-GSUser.md similarity index 100% rename from docs/Function Help/Users/Restore-GSUser.md rename to docs/pages/function_help/Users/Restore-GSUser.md diff --git a/docs/Function Help/Users/Sync-GSUserCache.md b/docs/pages/function_help/Users/Sync-GSUserCache.md similarity index 100% rename from docs/Function Help/Users/Sync-GSUserCache.md rename to docs/pages/function_help/Users/Sync-GSUserCache.md diff --git a/docs/Function Help/Users/Update-GSUser.md b/docs/pages/function_help/Users/Update-GSUser.md similarity index 100% rename from docs/Function Help/Users/Update-GSUser.md rename to docs/pages/function_help/Users/Update-GSUser.md diff --git a/docs/Function Help/Users/Update-GSUserPhoto.md b/docs/pages/function_help/Users/Update-GSUserPhoto.md similarity index 100% rename from docs/Function Help/Users/Update-GSUserPhoto.md rename to docs/pages/function_help/Users/Update-GSUserPhoto.md diff --git a/docs/pages/installation/building_from_source.md b/docs/pages/installation/building_from_source.md new file mode 100644 index 00000000..76328fad --- /dev/null +++ b/docs/pages/installation/building_from_source.md @@ -0,0 +1,37 @@ +# Building From Source + +???+ danger + This is intended for developers, contributors and bleeding edge fans. + +???+ warning + You **must** have the module 'Configuration' installed as a prerequisite. Installing the module from the repo source or the release page does not automatically install dependencies. + +1. Clone the repo locally: + +```{linenums="1"} +git clone https://github.com/scrthq/PSGSuite.git +``` + +1. Navigate to the cloned repo: + +```{linenums="1"} +cd \\path\to\PSGSuite +``` + +1. To build the module locally to test changes run `build.ps1` at the root of the repo: + +```powershell {linenums="1"} +.\build.ps1 +``` + +1. To run the Pester tests locally to test changes run `build.ps1` with the `-Task` parameter set to `Test` at the root of the repo: + +```powershell {linenums="1"} +.\build.ps1 -Task Test +``` + +1. Import the compiled module in a new session - from the root of the repo run the following: + +```powershell {linenums="1"} +Import-Module .\BuildOutput\PSGSuite -Force +``` diff --git a/docs/pages/installation/github_releases.md b/docs/pages/installation/github_releases.md new file mode 100644 index 00000000..1478a413 --- /dev/null +++ b/docs/pages/installation/github_releases.md @@ -0,0 +1,18 @@ +# GitHub Releases Page + +???+ info + The GitHub releases page will likely be the same as the PowerShell Gallery. However, if you are looking for a specific version or a pre-release version, you may find it here first. + +???+ warning + You **must** have the module 'Configuration' installed as a prerequisite. Installing the module from the repo source or the release page does not automatically install dependencies. + +1. Navigate to the [releases page](https://github.com/SCRT-HQ/PSGSuite/releases). +1. Expand `Assets` and download `PSGSuite.zip`. +1. Unblock the zip file before unzipping it - this is to prevent from having to unblock each file individually after unzipping. + + ```powershell {linenums="1"} + Unblock-File -Path C:\Path\To\PSGSuite.zip -Verbose + ``` + +1. Unzip the archive. +1. Place the module somewhere in `$env:PSModulePath`. diff --git a/docs/pages/installation/overview.md b/docs/pages/installation/overview.md new file mode 100644 index 00000000..4c549a49 --- /dev/null +++ b/docs/pages/installation/overview.md @@ -0,0 +1,14 @@ +# Overview + +In order to use this module, you will need the following: + +* Version 2.36.4 and earlier: + * Windows PowerShell 4.0+ + * PowerShell 6.0+ +* Version 3.0.0 and newer: + * PowerShell 7.4+ +* Full Module Functionality: + * Google Workspace SuperAdmin account +* Partial Module Functionality: + * Google Workspace Standard account + * Personal Google account diff --git a/docs/pages/installation/powershell_gallery.md b/docs/pages/installation/powershell_gallery.md new file mode 100644 index 00000000..30643d40 --- /dev/null +++ b/docs/pages/installation/powershell_gallery.md @@ -0,0 +1,18 @@ +# Powershell Gallery + +* [PowerShell Gallery](https://www.powershellgallery.com/packages/PSGSuite) + +## Powershell Gallery Requirements + +* [PowershellGet Module](https://learn.microsoft.com/en-us/powershell/module/powershellget/?view=powershellget-3.x) + * Available in Windows 10 and later + * Available in [Windows Management Framework 5.0](http://aka.ms/wmf5download) + * Available in the PowerShell 3 and 4 MSI-based installer + +???+ info + + Powershell Gallery versions might not include *all* pre-release versions. Please visit [GitHub Releases](../installation/github_releases.md) for versions that might not be available in the gallery. + +```powershell {linenums="1"} +Install-Module -Name PSGSuite -Scope CurrentUser +``` diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 35d0a905..74352b05 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -1,25 +1,32 @@ +/* General Styling for Superfences Tabs */ .superfences-tabs { display: flex; position: relative; flex-wrap: wrap; + margin-bottom: 1em; } .superfences-tabs .highlight { - background: #ddd; + background: var(--md-code-bg-color, #f5f5f5); /* Use theme variable or fallback */ } .superfences-tabs .superfences-content { display: none; order: 99; width: 100%; + background: var(--md-default-bg-color, #ffffff); /* Use theme variable or fallback */ + padding: 1em; + border-radius: 4px; } .superfences-tabs label { width: auto; margin: 0 0.5em; - padding: 0.25em; + padding: 0.25em 0.5em; font-size: 120%; cursor: pointer; + border-radius: 4px; + transition: background 0.3s, color 0.3s; } .superfences-tabs input { @@ -28,13 +35,65 @@ } .superfences-tabs input:nth-child(n+1) { - color: #333333; + color: var(--md-text-color, #333333); /* Use theme variable or fallback */ } .superfences-tabs input:nth-child(n+1):checked + label { - color: #2196F3; + color: var(--md-primary-fg-color, #2196F3); /* Use theme variable or fallback */ + font-weight: bold; } .superfences-tabs input:nth-child(n+1):checked + label + .superfences-content { display: block; } + +/* Light Mode Specific Styling */ +@media (prefers-color-scheme: light) { + .superfences-tabs .highlight { + background: #f5f5f5; + } + + .superfences-tabs label { + background: #e0e0e0; + color: #333333; + } + + .superfences-tabs input:nth-child(n+1):checked + label { + background: #ffffff; + color: #2196F3; + } +} + +/* Dark Mode Specific Styling */ +@media (prefers-color-scheme: dark) { + .superfences-tabs .highlight { + background: #333333; + } + + .superfences-tabs label { + background: #444444; + color: #cccccc; + } + + .superfences-tabs input:nth-child(n+1):checked + label { + background: #555555; + color: #90caf9; /* Lighter blue for better contrast in dark mode */ + } + + .superfences-tabs .superfences-content { + background: #222222; + color: #ffffff; + } +} + +/* Enable line wrapping for code blocks */ +pre code { + white-space: pre-wrap; /* Wrap lines */ + word-break: break-word; /* Break long words */ +} + +/* Optional: Wrap Markdown content */ +.md-typeset p { + white-space: pre-wrap; + word-break: break-word; +} \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 28bf9364..2e2747b0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,71 +1,109 @@ # Project information -site_name: 'PSGSuite' -site_description: 'PowerShell for G Suite' -site_author: 'Nate Ferrell' -site_url: 'https://psgsuite.io' +site_name: PSGSuite +site_description: PSGSuite is a Powershell module for Google/Google Workspace API calls wrapped in handy functions. Authentication can be established using a service account via a P12 key to negate the consent popup and allow for a greater hands off automation capabilities. +site_author: Nate Ferrell +site_url: https://psgsuite.io # Repository -repo_name: 'SCRT-HQ/PSGSuite' -repo_url: 'https://github.com/SCRT-HQ/PSGSuite' -edit_uri: 'edit/main/docs' +repo_name: SCRT-HQ/PSGSuite +repo_url: https://github.com/SCRT-HQ/PSGSuite +edit_uri: edit/main/docs # Copyright -copyright: 'Copyright © 2015 - 2024 Nate Ferrell' +copyright: 'Copyright © 2015 - 2025 Nate Ferrell' -# Configuration +# Theme configuration theme: - name: 'material' - language: 'en' - logo: - icon: 'keyboard' + name: material + logo: assets/icons/icons-512.png + favicon: assets/icons/icons-192.png + language: en + features: + - announce.dismiss + - content.code.annotate + - content.code.copy + - content.tabs.link + - content.tooltips + - header.autohide + - navigation.footer + - navigation.instant + - navigation.tabs + - navigation.tabs.sticky + - navigation.top + - navigation.tracking + - search.highlight + - search.share + - search.suggest + - toc.follow palette: - primary: 'blue' - accent: 'green' - font: - text: 'Roboto' - code: 'Roboto Mono' - feature: - tabs: true + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: custom + toggle: + icon: material/theme-light-dark + name: Light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: custom + toggle: + icon: material/theme-light-dark + name: Dark mode -# Customization -extra: - disqus: 'psgsuite' - manifest: 'manifest.webmanifest' - search: - tokenizer: '\s+' - social: - - type: 'github' - link: 'https://github.com/scrthq' - - type: 'twitter' - link: 'https://twitter.com/scrthq' - - type: 'linkedin' - link: 'https://linkedin.com/in/scrthq' - -extra_css: - - 'stylesheets/extra.css' - -# Google Analytics -google_analytics: - - 'UA-101420411-4' - - 'auto' +# Plugins +plugins: + - awesome-nav + - glightbox: + auto_caption: false + caption_position: bottom + draggable: true + effect: zoom + height: auto + loop: false + touchNavigation: true + width: 100% + zoomable: true + - open-in-new-tab + - search + - social -# Extensions +# Markdown extensions markdown_extensions: - admonition - - pymdownx.superfences + - attr_list + - md_in_html + - pymdownx.critic + - pymdownx.details - pymdownx.emoji - - pymdownx.tasklist - - pymdownx.mark + - pymdownx.highlight: + auto_title: true + auto_title_map: + Text Only: Plaintext - pymdownx.keys - - pymdownx.details - - pymdownx.critic - - codehilite: - guess_lang: true + - pymdownx.mark + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.tasklist + - tables - toc: permalink: true -# Plugins -plugins: - - search - - minify: - minify_html: true +# Extra configurations +extra_css: + - stylesheets/extra.css + +extra: + analytics: + provider: google + property: UA-101420411-4 + disqus: psgsuite + manifest: manifest.webmanifest + search: + tokenizer: '\s+' + social: + - icon: material/github + link: https://github.com/scrthq + - icon: material/twitter + link: https://twitter.com/scrthq + - icon: material/linkedin + link: https://linkedin.com/in/scrthq diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..91e03f7f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,12 @@ +cairocffi==1.7.1 +CairoSVG==2.7.1 +Jinja2==3.1.6 +mkdocs-awesome-nav==3.1.1 +mkdocs-glightbox==0.4.0 +mkdocs-material-extensions==1.3.1 +mkdocs-material==9.6.11 +mkdocs-open-in-new-tab==1.0.8 +mkdocs==1.6.1 +Pygments==2.19.1 +pymdown-extensions==10.14.3 +PyYAML==6.0.2