diff options
Diffstat (limited to 'deprecated/cwp/interpreter/app_engine_pull.py')
-rw-r--r-- | deprecated/cwp/interpreter/app_engine_pull.py | 253 |
1 files changed, 0 insertions, 253 deletions
diff --git a/deprecated/cwp/interpreter/app_engine_pull.py b/deprecated/cwp/interpreter/app_engine_pull.py deleted file mode 100644 index d092e2a3..00000000 --- a/deprecated/cwp/interpreter/app_engine_pull.py +++ /dev/null @@ -1,253 +0,0 @@ -# Copyright 2012 Google Inc. All Rights Reserved. -# Author: mrdmnd@ (Matt Redmond) -"""A client to pull data from Bartlett. - -Inspired by //depot/google3/experimental/mobile_gwp/database/app_engine_pull.py - -The server houses perf.data.gz, board, chrome version for each upload. -This script first authenticates with a proper @google.com account, then -downloads a sample (if it's not already cached) and unzips perf.data - - Authenticate(): Gets login info and returns an auth token - DownloadSamples(): Download and unzip samples. - _GetServePage(): Pulls /serve page from the app engine server - _DownloadSampleFromServer(): Downloads a local compressed copy of a sample - _UncompressSample(): Decompresses a sample, deleting the compressed version. -""" -import cookielib -import getpass -import gzip -import optparse -import os -import urllib -import urllib2 - -SERVER_NAME = 'http://chromeoswideprofiling.appspot.com' -APP_NAME = 'chromeoswideprofiling' -DELIMITER = '~' - - -def Authenticate(server_name): - """Gets credentials from user and attempts to retrieve auth token. - TODO: Accept OAuth2 instead of password. - Args: - server_name: (string) URL that the app engine code is living on. - Returns: - authtoken: (string) The authorization token that can be used - to grab other pages. - """ - - if server_name.endswith('/'): - server_name = server_name.rstrip('/') - # Grab username and password from user through stdin. - username = raw_input('Email (must be @google.com account): ') - password = getpass.getpass('Password: ') - # Use a cookie to authenticate with GAE. - cookiejar = cookielib.LWPCookieJar() - opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar)) - urllib2.install_opener(opener) - # Get an AuthToken from Google accounts service. - auth_uri = 'https://www.google.com/accounts/ClientLogin' - authreq_data = urllib.urlencode({'Email': username, - 'Passwd': password, - 'service': 'ah', - 'source': APP_NAME, - 'accountType': 'HOSTED_OR_GOOGLE'}) - auth_req = urllib2.Request(auth_uri, data=authreq_data) - try: - auth_resp = urllib2.urlopen(auth_req) - except urllib2.URLError: - print 'Error logging in to Google accounts service.' - return None - body = auth_resp.read() - # Auth response contains several fields. - # We care about the part after Auth= - auth_resp_dict = dict(x.split('=') for x in body.split('\n') if x) - authtoken = auth_resp_dict['Auth'] - return authtoken - - -def DownloadSamples(server_name, authtoken, output_dir, start, stop): - """Download every sample and write unzipped version - to output directory. - Args: - server_name: (string) URL that the app engine code is living on. - authtoken: (string) Authorization token. - output_dir (string) Filepath to write output to. - start: (int) Index to start downloading from, starting at top. - stop: (int) Index to stop downloading, non-inclusive. -1 for end. - Returns: - None - """ - - if server_name.endswith('/'): - server_name = server_name.rstrip('/') - - serve_page_string = _GetServePage(server_name, authtoken) - if serve_page_string is None: - print 'Error getting /serve page.' - return - - sample_list = serve_page_string.split('</br>') - print 'Will download:' - sample_list_subset = sample_list[start:stop] - for sample in sample_list_subset: - print sample - for sample in sample_list_subset: - assert sample, 'Sample should be valid.' - sample_info = [s.strip() for s in sample.split(DELIMITER)] - key = sample_info[0] - time = sample_info[1] - time = time.replace(' ', '_') # No space between date and time. - # sample_md5 = sample_info[2] - board = sample_info[3] - version = sample_info[4] - - # Put a compressed copy of the samples in output directory. - _DownloadSampleFromServer(server_name, authtoken, key, time, board, version, - output_dir) - _UncompressSample(key, time, board, version, output_dir) - - -def _BuildFilenameFromParams(key, time, board, version): - """Return the filename for our sample. - Args: - key: (string) Key indexing our sample in the datastore. - time: (string) Date that the sample was uploaded. - board: (string) Board that the sample was taken on. - version: (string) Version string from /etc/lsb-release - Returns: - filename (string) - """ - filename = DELIMITER.join([key, time, board, version]) - return filename - - -def _DownloadSampleFromServer(server_name, authtoken, key, time, board, version, - output_dir): - """Downloads sample_$(samplekey).gz to current dir. - Args: - server_name: (string) URL that the app engine code is living on. - authtoken: (string) Authorization token. - key: (string) Key indexing our sample in the datastore - time: (string) Date that the sample was uploaded. - board: (string) Board that the sample was taken on. - version: (string) Version string from /etc/lsb-release - output_dir: (string) Filepath to write to output to. - Returns: - None - """ - filename = _BuildFilenameFromParams(key, time, board, version) - compressed_filename = filename + '.gz' - - if os.path.exists(os.path.join(output_dir, filename)): - print 'Already downloaded %s, skipping.' % filename - return - - serv_uri = server_name + '/serve/' + key - serv_args = {'continue': serv_uri, 'auth': authtoken} - full_serv_uri = server_name + '/_ah/login?%s' % urllib.urlencode(serv_args) - serv_req = urllib2.Request(full_serv_uri) - serv_resp = urllib2.urlopen(serv_req) - f = open(os.path.join(output_dir, compressed_filename), 'w+') - f.write(serv_resp.read()) - f.close() - - -def _UncompressSample(key, time, board, version, output_dir): - """Uncompresses a given sample.gz file and deletes the compressed version. - Args: - key: (string) Sample key to uncompress. - time: (string) Date that the sample was uploaded. - board: (string) Board that the sample was taken on. - version: (string) Version string from /etc/lsb-release - output_dir: (string) Filepath to find sample key in. - Returns: - None - """ - filename = _BuildFilenameFromParams(key, time, board, version) - compressed_filename = filename + '.gz' - - if os.path.exists(os.path.join(output_dir, filename)): - print 'Already decompressed %s, skipping.' % filename - return - - out_file = open(os.path.join(output_dir, filename), 'wb') - in_file = gzip.open(os.path.join(output_dir, compressed_filename), 'rb') - out_file.write(in_file.read()) - in_file.close() - out_file.close() - os.remove(os.path.join(output_dir, compressed_filename)) - - -def _DeleteSampleFromServer(server_name, authtoken, key): - """Opens the /delete page with the specified key - to delete the sample off the datastore. - Args: - server_name: (string) URL that the app engine code is living on. - authtoken: (string) Authorization token. - key: (string) Key to delete. - Returns: - None - """ - - serv_uri = server_name + '/del/' + key - serv_args = {'continue': serv_uri, 'auth': authtoken} - full_serv_uri = server_name + '/_ah/login?%s' % urllib.urlencode(serv_args) - serv_req = urllib2.Request(full_serv_uri) - urllib2.urlopen(serv_req) - - -def _GetServePage(server_name, authtoken): - """Opens the /serve page and lists all keys. - Args: - server_name: (string) URL the app engine code is living on. - authtoken: (string) Authorization token. - Returns: - The text of the /serve page (including HTML tags) - """ - - serv_uri = server_name + '/serve' - serv_args = {'continue': serv_uri, 'auth': authtoken} - full_serv_uri = server_name + '/_ah/login?%s' % urllib.urlencode(serv_args) - serv_req = urllib2.Request(full_serv_uri) - serv_resp = urllib2.urlopen(serv_req) - return serv_resp.read() - - -def main(): - parser = optparse.OptionParser() - parser.add_option('--output_dir', - dest='output_dir', - action='store', - help='Path to output perf data files.') - parser.add_option('--start', - dest='start_ind', - action='store', - default=0, - help='Start index.') - parser.add_option('--stop', - dest='stop_ind', - action='store', - default=-1, - help='Stop index.') - options = parser.parse_args()[0] - if not options.output_dir: - print 'Must specify --output_dir.' - return 1 - if not os.path.exists(options.output_dir): - print 'Specified output_dir does not exist.' - return 1 - - authtoken = Authenticate(SERVER_NAME) - if not authtoken: - print 'Could not obtain authtoken, exiting.' - return 1 - DownloadSamples(SERVER_NAME, authtoken, options.output_dir, options.start_ind, - options.stop_ind) - print 'Downloaded samples.' - return 0 - - -if __name__ == '__main__': - exit(main()) |