| #!/usr/bin/python |
| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Utility to package and upload the USB gadget framework. |
| """ |
| |
| import argparse |
| import hashlib |
| import os |
| import StringIO |
| import urllib2 |
| import zipfile |
| |
| |
| def MakeZip(directory=None, files=None): |
| """Construct a zip file. |
| |
| Args: |
| directory: Include Python source files from this directory |
| files: Include these files |
| |
| Returns: |
| A tuple of the buffer containing the zip file and its MD5 hash. |
| """ |
| buf = StringIO.StringIO() |
| archive = zipfile.PyZipFile(buf, 'w') |
| if directory is not None: |
| archive.writepy(directory) |
| if files is not None: |
| for f in files: |
| archive.write(f, os.path.basename(f)) |
| archive.close() |
| content = buf.getvalue() |
| buf.close() |
| md5 = hashlib.md5(content).hexdigest() |
| return content, md5 |
| |
| |
| def EncodeBody(filename, buf): |
| return '\r\n'.join([ |
| '--foo', |
| 'Content-Disposition: form-data; name="file"; filename="{}"' |
| .format(filename), |
| 'Content-Type: application/octet-stream', |
| '', |
| buf, |
| '--foo--', |
| '' |
| ]) |
| |
| |
| def UploadZip(content, md5, host): |
| filename = 'usb_gadget-{}.zip'.format(md5) |
| req = urllib2.Request(url='http://{}/update'.format(host), |
| data=EncodeBody(filename, content)) |
| req.add_header('Content-Type', 'multipart/form-data; boundary=foo') |
| urllib2.urlopen(req) |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser( |
| description='Package (and upload) the USB gadget framework.') |
| parser.add_argument( |
| '--dir', type=str, metavar='DIR', |
| help='package all Python files from DIR') |
| parser.add_argument( |
| '--zip-file', type=str, metavar='FILE', |
| help='save package as FILE') |
| parser.add_argument( |
| '--hash-file', type=str, metavar='FILE', |
| help='save package hash as FILE') |
| parser.add_argument( |
| '--upload', type=str, metavar='HOST[:PORT]', |
| help='upload package to target system') |
| parser.add_argument( |
| 'files', metavar='FILE', type=str, nargs='*', |
| help='source files') |
| |
| args = parser.parse_args() |
| |
| content, md5 = MakeZip(directory=args.dir, files=args.files) |
| if args.zip_file: |
| with open(args.zip_file, 'wb') as zip_file: |
| zip_file.write(content) |
| if args.hash_file: |
| with open(args.hash_file, 'wb') as hash_file: |
| hash_file.write(md5) |
| if args.upload: |
| UploadZip(content, md5, args.upload) |
| |
| |
| if __name__ == '__main__': |
| main() |