tools/gsuite-exporter/gsuite_exporter/cli.py (115 lines of code) (raw):
# Copyright 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import importlib
import re
import sys
import logging
from datetime import timedelta
from dateutil import parser
from gsuite_exporter import exporters
from gsuite_exporter.collectors.reports import AdminReportsAPIFetcher
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger('googleapiclient').setLevel(logging.ERROR)
logger = logging.getLogger(__name__)
def get_exporter_cls(exporter_class):
try:
filename, name = exporter_class.split('.')
package = 'gsuite_exporter.exporters.%s' % filename
return getattr(importlib.import_module(package), name)
except Exception as e:
logger.exception(
'Exporter "%s" not found. Verify the exporter class name is'
'prefixed by the exporter file name.\n'
'Example: `stackdriver_exporter.StackdriverExporter`',
exporter_class)
sys.exit(1)
def sync_all(
admin_user,
api,
applications,
project_id,
exporter_cls,
credentials_path=None,
offset=None):
"""Query last data from Admin SDK API and export them to the destination.
Args:
credentials_path (str): Service account credentials file.
api (str): GSuite Admin API name to get data from.
token_path (str): GSuite Admin Token file.
applications (list): Gsuite Admin Applications to query.
project_id (str): Project id to export the data to.
exporter_cls (str): Exporter class to use.
offset (str): Minutes to look back before the last timestamp
"""
fetcher = AdminReportsAPIFetcher(admin_user, credentials_path)
exporter = get_exporter_cls(exporter_cls)(
project_id=project_id,
credentials_path=credentials_path)
for app in applications:
last_ts = exporter.get_last_timestamp(app)
if last_ts is None:
start_time = None
else:
start_time = (parser.parse(last_ts) - timedelta(minutes=offset)).isoformat()
exporter_dest = exporter.get_destination(app)
logger.info(
"%s.%s --> %s (%s) [starting new sync] from %s (offset => %s mn)",
api,
app,
exporter_cls,
exporter_dest,
start_time,
offset)
records_stream = fetcher.fetch(application=app, start_time=start_time)
for records in records_stream:
response = exporter.send(records, app, dry=False)
logger.debug(response)
logger.info(
"%s.%s --> %s (%s) [%s new records synced]",
api,
app,
exporter_cls,
exporter_dest,
len(records))
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
'--admin-user',
type=str,
required=True,
help='The GSuite Admin user email.')
parser.add_argument(
'--api',
type=str,
default='reports_v1',
required=False,
help='The GSuite Admin API.')
parser.add_argument(
'--applications',
type=str,
nargs='+',
required=True,
help='The GSuite Admin Applications.')
parser.add_argument(
'--project-id',
type=str,
required=True,
help='The project id to export GSuite data to.')
parser.add_argument(
'--exporter',
type=str,
default='stackdriver_exporter.StackdriverExporter',
required=False,
help='The exporter class to use.')
parser.add_argument(
'--credentials-path',
type=str,
default=None,
required=False,
help='The service account credentials file.')
parser.add_argument(
'--offset',
type=int,
default=0,
required=False,
help='The offset to fetch logs from before the last sync (in minutes).')
args = parser.parse_args()
sync_all(
args.admin_user,
args.api,
args.applications,
args.project_id,
args.exporter,
args.credentials_path,
args.offset)
if __name__ == '__main__':
main()