Installing Google Apps Manager (GAM) on Google Cloud Shell

GAM

Google Apps Manager, known as GAM, is a command line tool created by jay0lee that makes it easier to manage G Suite domains.

Advanced GAM, known as GAMADV-X, is a re-write of GAM by taers232c. It adds several benefits over the original version including improved error handling, better performance and a number of new features.

GAMADV-XTD is an extended version of GAMADV-X which adds Team Drive support and uses the newer Google Drive Rest API v3.

Cloud Shell

Google Cloud Shell is an interactive shell environment used to manage Google Cloud Platform resources through your browser.

When you start Cloud Shell, it provisions a g1-small Google Compute Engine virtual machine running a Debian-based Linux operating system. Cloud Shell provisions 5 GB of free persistent disk storage mounted as your $HOME directory on the virtual machine instance. This storage is on a per-user basis and is available across projects.

GAM can be installed locally or on a Google Cloud Shell virtual machine.

Installing GAM in your local environment may be an issue if your organization uses a web proxy or SSL filtering. GAM does not officially support proxy servers, though setting your environment variables may allow you to get around this limitation. Additional configuration is also required if you need to set a custom Root CA.

As Google Cloud Shell runs in the cloud, it’s unaffected by any local web filtering policy that your organization may use, with the added benefit of being accessible on any device with a web browser.

One downside of running GAM in Google Cloud Shell is that you won’t be able to combine it with Windows scripting languages like PowerShell.

Installing GAMADV-X / GAMADV-XTD on Google Cloud Shell

Before beginning, ensure you are signed in with a super administrator account. Then launch Google Cloud Shell.

https://console.cloud.google.com/cloudshell/editor?shellonly=true

Once it connects, you’ll be presented with a bash shell.

Welcome to Cloud Shell! Type "help" to get started.
To set your Cloud Platform project in this session use “gcloud config set project [PROJECT_ID]”
basuta@cloudshell:~$

Download and install GAMADV-X or GAMADV-XTD. In this example, we will download GAMADV-XTD and install it to the default path. The default installation path is $HOME/bin but you can change this if required.

bash <(curl -s -S -L https://git.io/vAAj9)

If you want to install GAMADV-X instead, simply change the download URL.

GAMADV-XTD will download and the installation will begin. You’ll be asked if you have a full browser and whether you’re ready to set up a Google API project. Google Cloud Shell has no browser and we’ll set up the project later, so answer no to both of these questions.

Checking GitHub URL https://api.github.com/repos/taers232c/GAMADV-XTD/releases for latest GAM release...

Getting file and download URL...

Downloading file gamadv-xtd-4.60.18-linux-x86_64.tar.xz from https://github.com/taers232c/GAMADV-XTD/releases/download/v4.60.18/gamadv-xtd-4.60.18-linux-x86_64.tar.xz to /tmp/tmp.vzPoTEDmfz.

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   628    0   628    0     0   1498      0 --:--:-- --:--:-- --:--:--  1498
100 7630k  100 7630k    0     0   585k      0  0:00:13  0:00:13 --:--:-- 1210k
Extracting archive to /home/basuta/bin

Finished extracting GAM archive.

Adding gam alias to profile file /home/basuta/.bashrc.

Can you run a full browser on this machine? (usually Y for MacOS, N for Linux if you SSH into this machine) n

GAM is now installed. Are you ready to set up a Google API project for GAM? (yes or no) n

You can create an API project later by running:

gam create project

Here's information about your new GAM installation:


Created: /home/basuta/.gam
Created: /home/basuta/.gam/gamcache
Created: /home/basuta/Downloads
Config File: /home/basuta/.gam/gam.cfg, Initialized
WARNING: Config File: /home/basuta/.gam/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /home/basuta/.gam/oauth2.txt, Not Found
WARNING: Config File: /home/basuta/.gam/gam.cfg, Section: DEFAULT, Item: oauth2service_json, Value: /home/basuta/.gam/oauth2service.json, Not Found
WARNING: Config File: /home/basuta/.gam/gam.cfg, Section: DEFAULT, Item: client_secrets_json, Value: /home/basuta/.gam/client_secrets.json, Not Found
GAM 4.60.18 - https://github.com/taers232c/GAMADV-XTD
Ross Scroggs <ross.scroggs@gmail.com>
Python 2.7.14 64-bit final
google-api-python-client 1.7.3
oauth2client 4.1.2
Linux-4.14.33+-x86_64-with-debian-9.5 x86_64
Path: /home/basuta/bin/gamadv-xtd
GAM installation and setup complete!

Please restart your terminal shell or to get started right away run:

alias gam="/home/basuta/bin/gamadv-xtd/gam"

Use the above alias command to set the gam alias. If you’re copying the below command, update it with your own username.

alias gam="/home/username/bin/gamadv-xtd/gam"

You may notice the warnings about the client_secrets.json, oauth2service.json and oauth2.txt files being missing. These can be ignored as the GAM installation process will create all of these files once complete.


A note on existing GAM installations

This guide assumes that there is no existing installation of GAM already set up. If there is, a GAM project will already exist and you can copy the client_secrets.json, oauth2service.json and oauth2.txt files from where you have installed GAM to the Google Cloud Shell virtual machine.

Follow the below steps if you have an existing installation, or skip to the next section to set up GAM for the first time.

Upload your client_secrets.json, oauth2service.json and oauth2.txt files. By default, files uploaded to the Cloud Shell are placed in your home directory, so move them to the GAM directory.

mv client_secrets.json oauth2service.json oauth2.txt ~/.gam

Verify that the files have been moved.

ls ~/.gam

Check that GAM is working.

gam info domain

You should see some information about your domain, and GAM will be ready to use on Google Cloud Shell.


Setting up GAM for the first time

It’s a good idea to read the documentation for an overview of how GAM is configured. Use nano or another text editor to read it.

nano ~/bin/gamadv-xtd/GamConfig.txt

Once you’ve read the documentation, press Ctrl-X to exit nano.

As Google Cloud Shell has no browser, we need to edit the value of no_browser in the gam configuration file located in ~/.gam/gam.cfg. To check the current value, we can use grep.

grep -i 'no_browser' ~/.gam/gam.cfg

This shows the following output.

no_browser = false

If the value is false, use sed to change it to true.

sed -i 's/^\(no_browser\s*=\s*\).*$/\1true/' ~/.gam/gam.cfg

Use the same grep command again to confirm it’s changed.

grep -i 'no_browser' ~/.gam/gam.cfg

The value of no_browser should now be true.

no_browser = true

You can also edit the configuration file with a text editor like nano.

nano ~/.gam/gam.cfg

Any of the values here can be changed depending on your needs. We will keep the default values for everything else so press Ctrl-X to exit.

Next we will build the gam configuration file.

gam config verify

All the values in the file will be displayed.

Section: DEFAULT
  activity_max_results = 100
  auto_batch_min = 0
  batch_size = 50
  cacerts_pem = ''
  cache_dir = /home/basuta/.gam/gamcache
  cache_discovery_only = true
  charset = utf-8
  classroom_max_results = 0
  client_secrets_json = client_secrets.json ; /home/basuta/.gam/client_secrets.json
  config_dir = /home/basuta/.gam
  contact_max_results = 100
  csv_input_column_delimiter = ,
  csv_input_quote_char = '"'
  csv_output_column_delimiter = ,
  csv_output_convert_cr_nl = false
  csv_output_field_delimiter = ' '
  csv_output_line_terminator = lf
  csv_output_quote_char = '"'
  csv_output_users_audit = false
  customer_id = my_customer
  debug_level = 0
  device_max_results = 500
  domain = ''
  drive_dir = /home/basuta/Downloads
  drive_max_results = 1000
  drive_v3_native_names = true
  email_batch_size = 100
  event_max_results = 250
  extra_args = ''
  inter_batch_wait = 0
  member_max_results = 200
  message_batch_size = 1000
  message_max_results = 1000
  never_time = Never
  no_browser = true
  no_cache = false
  no_update_check = false
  no_verify_ssl = false
  num_tbatch_threads = 2
  num_threads = 5
  oauth2_txt = oauth2.txt ; /home/basuta/.gam/oauth2.txt
  oauth2service_json = oauth2service.json ; /home/basuta/.gam/oauth2service.json
  print_native_names = true
  section = ''
  show_convert_cr_nl = false
  show_counts_min = 1
  show_gettings = true
  show_multiprocess_info = false
  timezone = utc
  todrive_conversion = true
  todrive_localcopy = false
  todrive_parent = root
  todrive_timestamp = false
  todrive_user = ''
  user_max_results = 500

We can now build the GAM project by running the following command.

gam create project

Follow the instructions and authorize access. You should see something like the below.

WARNING: Config File: /home/basuta/.gam/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /home/basuta/.gam/oauth2.txt, Not Found
WARNING: Config File: /home/basuta/.gam/gam.cfg, Section: DEFAULT, Item: oauth2service_json, Value: /home/basuta/.gam/oauth2service.json, Not Found
WARNING: Config File: /home/basuta/.gam/gam.cfg, Section: DEFAULT, Item: client_secrets_json, Value: /home/basuta/.gam/client_secrets.json, Not Found

What is your G Suite admin email address? admin@example.com

Go to the following link in your browser:

https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&client_id=[removed].apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&login_hint=admin%40example.com&access_type=online

Enter verification code: 4/TgDCoUxQcYTCTGQeHBXFp3QwV9Cgyh6ApjJ1w2EMB72mZgHF8O_J6k4
Authentication successful.
Creating project "GAM Project"...
Checking project status...
Project still being created. Sleeping 1 seconds
Checking project status...
Enable 17 APIs
  API: admin.googleapis.com, Enabled (1/17)
  API: appsactivity.googleapis.com, Enabled (2/17)
  API: audit.googleapis.com, Enabled (3/17)
  API: calendar-json.googleapis.com, Enabled (4/17)
  API: classroom.googleapis.com, Enabled (5/17)
  API: contacts.googleapis.com, Enabled (6/17)
  API: drive.googleapis.com, Enabled (7/17)
  API: gmail.googleapis.com, Enabled (8/17)
  API: groupsmigration.googleapis.com, Enabled (9/17)
  API: groupssettings.googleapis.com, Enabled (10/17)
  API: licensing.googleapis.com, Enabled (11/17)
  API: plus.googleapis.com, Enabled (12/17)
  API: reseller.googleapis.com, Enabled (13/17)
  API: sheets.googleapis.com, Enabled (14/17)
  API: siteverification.googleapis.com, Enabled (15/17)
  API: storage-api.googleapis.com, Enabled (16/17)
  API: vault.googleapis.com, Enabled (17/17)
Creating Service Account
Please go to:

https://console.developers.google.com/apis/credentials?project=gam-project

1. Click the blue "Create credentials" button. Choose "OAuth client ID".
2. Click the blue "Configure consent screen" button. Enter "GAM" for "Product name to show to users".
3. Leave other fields blank. Click "Save" button.
3. Choose "Other" and click the blue "Create" button.
4. Copy your "client ID" value.

Enter your Client ID: [removed].apps.googleusercontent.com

Now go back to your browser and copy your client secret.
Enter your Client Secret: rxt50epwVcZ5ECsRzsVmnmOT
Almost there! Now please switch back to your browser and:

1. Click OK to close "OAuth client" popup if it's still open.
2. Click "Manage service accounts" on the right of the screen.
3. Click the 3 dots to the right of your service account.
4. Choose Edit.
5. Check the "Enable G Suite Domain-wide Delegation" box and click Save.

Press Enter when done...
That's it! Your GAM Project is created and ready to use.

Now we need to authorize the GAM client.

gam oauth create

Change the scope if needed or press c to continue, then follow the instructions.

Select the authorized scopes by entering a number.
Append an 'r' to grant read-only access or an 'a' to grant action-only access.

[*]  0)  Admin Settings API
[*]  1)  Calendar API (supports readonly)
[*]  2)  Classroom API - Courses (supports readonly)
[*]  3)  Classroom API - Course Announcements (supports readonly)
[*]  4)  Classroom API - Course Work/Submissions (supports readonly)
[*]  5)  Classroom API - Student Guardians (supports readonly)
[*]  6)  Classroom API - Profile Emails
[*]  7)  Classroom API - Profile Photos
[*]  8)  Classroom API - Rosters (supports readonly)
[*]  9)  Cloudprint API
[*] 10)  Cloud Storage (Vault Export - read only)
[*] 11)  Contacts API - Domain Shared and Users and GAL
[*] 12)  Data Transfer API (supports readonly)
[*] 13)  Directory API - Chrome OS Devices (supports readonly)
[*] 14)  Directory API - Customers (supports readonly)
[*] 15)  Directory API - Domains (supports readonly)
[*] 16)  Directory API - Groups (supports readonly)
[*] 17)  Directory API - Mobile Devices Directory (supports readonly and action)
[*] 18)  Directory API - Notifications
[*] 19)  Directory API - Organizational Units (supports readonly)
[*] 20)  Directory API - Resource Calendars (supports readonly)
[*] 21)  Directory API - Roles (supports readonly)
[*] 22)  Directory API - User Schemas (supports readonly)
[*] 23)  Directory API - User Security
[*] 24)  Directory API - Users (supports readonly)
[*] 25)  Email Audit API
[*] 26)  Email Settings API - Users
[*] 27)  Groups Migration API
[*] 28)  Groups Settings API
[*] 29)  License Manager API
[*] 30)  Reports API - Audit Reports
[*] 31)  Reports API - Usage Reports
[ ] 32)  Reseller API
[*] 33)  Site Verification API
[*] 34)  Sites API
[*] 35)  Vault API (supports readonly)

     s)  Select all scopes
     u)  Unselect all scopes
     e)  Exit without changes
     c)  Continue to authorization
Please enter 0-35[a|r] or s|u|e|c: c

What is your G Suite admin email address? admin@example.com

Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&client_id=[removed]&scope=email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.datatransfer+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.device.chromeos+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.customer+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.domain+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.group+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.device.mobile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.notifications+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.orgunit+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.resource.calendar+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.rolemanagement+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.userschema+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.user.security+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.user+https%3A%2F%2Fapps-apis.google.com%2Fa%2Ffeeds%2Femailsettings%2F2.0%2F+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.licensing&login_hint=admin%40example.com&access_type=offline

Enter verification code: 4/TgAHgxsJHrpxCHGktFSqmxdVN9GpzGqHsv-1tl3A-I36mDEfWCR1uVc
Authentication successful.

Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&client_id=[removed]&scope=email+profile+https%3A%2F%2Fapps-apis.google.com%2Fa%2Ffeeds%2Fdomain%2F+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.courses+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.announcements+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.coursework.students+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.guardianlinks.students+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.profile.emails+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.profile.photos+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.rosters+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloudprint+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdevstorage.read_only+https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds+https%3A%2F%2Fapps-apis.google.com%2Fa%2Ffeeds%2Fcompliance%2Faudit%2F+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.groups.migration+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.groups.settings+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.reports.audit.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.reports.usage.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fsiteverification+https%3A%2F%2Fsites.google.com%2Ffeeds+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fediscovery&login_hint=admin%40example.com&access_type=offline

Enter verification code: 4/TgBU6BhAYOahaGnAVfWOkMKNuzExX41KAk5SE6lFqbo4_7bnfMWbVPA
Authentication successful.
Client OAuth2 File: /home/basuta/.gam/oauth2.txt, Created

Authorize the GAM service account, replacing the email address below with that of a non-admin user in your domain.

gam user nonadminuser@example.com check serviceaccount

It’s expected that the checks will fail the first time the command is run.

User: nonadminuser@example.com, Check 14 Scopes
  Scope: https://mail.google.com/                                    , Checked: FAIL (1/14)
  Scope: https://sites.google.com/feeds                              , Checked: FAIL (2/14)
  Scope: https://www.google.com/m8/feeds                             , Checked: FAIL (3/14)
  Scope: https://www.googleapis.com/auth/activity                    , Checked: FAIL (4/14)
  Scope: https://www.googleapis.com/auth/calendar                    , Checked: FAIL (5/14)
  Scope: https://www.googleapis.com/auth/drive                       , Checked: FAIL (6/14)
  Scope: https://www.googleapis.com/auth/gmail.settings.basic        , Checked: FAIL (7/14)
  Scope: https://www.googleapis.com/auth/gmail.settings.sharing      , Checked: FAIL (8/14)
  Scope: https://www.googleapis.com/auth/plus.me                     , Checked: FAIL (9/14)
  Scope: https://www.googleapis.com/auth/plus.profile.agerange.read  , Checked: FAIL (10/14)
  Scope: https://www.googleapis.com/auth/plus.profile.language.read  , Checked: FAIL (11/14)
  Scope: https://www.googleapis.com/auth/spreadsheets                , Checked: FAIL (12/14)
  Scope: https://www.googleapis.com/auth/userinfo.email              , Checked: FAIL (13/14)
  Scope: https://www.googleapis.com/auth/userinfo.profile            , Checked: FAIL (14/14)
ERROR: Some scopes failed! Please go to:

https://admin.google.com/example.com/AdminHome?#OGX:ManageOauthClients

and grant Service Account Client name: 123456789012345678901 access to scopes:

https://mail.google.com/,
https://sites.google.com/feeds,
https://www.google.com/m8/feeds,
https://www.googleapis.com/auth/activity,
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/plus.me,
https://www.googleapis.com/auth/plus.profile.agerange.read,
https://www.googleapis.com/auth/plus.profile.language.read,
https://www.googleapis.com/auth/spreadsheets,
https://www.googleapis.com/auth/userinfo.email,
https://www.googleapis.com/auth/userinfo.profile

This is because we need to grant the service account access to the scopes. Follow the instructions and re-run the command.

gam user nonadminuser@example.com check serviceaccount

This time, everything will pass.

User: nonadminuser@example.com, Check 14 Scopes
  Scope: https://mail.google.com/                                    , Checked: PASS (1/14)
  Scope: https://sites.google.com/feeds                              , Checked: PASS (2/14)
  Scope: https://www.google.com/m8/feeds                             , Checked: PASS (3/14)
  Scope: https://www.googleapis.com/auth/activity                    , Checked: PASS (4/14)
  Scope: https://www.googleapis.com/auth/calendar                    , Checked: PASS (5/14)
  Scope: https://www.googleapis.com/auth/drive                       , Checked: PASS (6/14)
  Scope: https://www.googleapis.com/auth/gmail.settings.basic        , Checked: PASS (7/14)
  Scope: https://www.googleapis.com/auth/gmail.settings.sharing      , Checked: PASS (8/14)
  Scope: https://www.googleapis.com/auth/plus.me                     , Checked: PASS (9/14)
  Scope: https://www.googleapis.com/auth/plus.profile.agerange.read  , Checked: PASS (10/14)
  Scope: https://www.googleapis.com/auth/plus.profile.language.read  , Checked: PASS (11/14)
  Scope: https://www.googleapis.com/auth/spreadsheets                , Checked: PASS (12/14)
  Scope: https://www.googleapis.com/auth/userinfo.email              , Checked: PASS (13/14)
  Scope: https://www.googleapis.com/auth/userinfo.profile            , Checked: PASS (14/14)
All scopes passed!
Service Account Client name: 123456789012345678901 is fully authorized.

GAM is now set up and ready to be used. We can verify it’s working correctly by running:

gam info domain

This will display information about your domain.

Customer ID: A00a0a0aa
Primary Domain: example.com
Customer Creation Time: 2018-07-21T21:40:15.041Z
Primary Domain Verified: True
Default Language: en
Address:
  contactName: Admin
  organizationName: example.com
  countryCode: GB
Admin Secondary Email: admin@example.com
User counts as of 2018-08-31:
  G Suite Business Licenses: 1000
  G Suite Business Users: 1000
  Total Users: 1000
Maximum Users: 5000
Current Users: 1000
Domain Edition: premier
Customer PIN: 12345678
SSO Enabled: false
SSO Signon Page:
SSO Logout Page:
SSO Password Page:
SSO Whitelist IPs:
SSO Use Domain Specific Issuer: false

We have successfully installed GAM!

To learn more about some of the things you can do with GAM, visit the Wiki or Google Group.