1*9c5db199SXin Li#!/usr/bin/env python3 2*9c5db199SXin Li# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 4*9c5db199SXin Li# found in the LICENSE file. 5*9c5db199SXin Li# 6*9c5db199SXin Li# This utility allows for easy update to chromium os tree status, with proper 7*9c5db199SXin Li# password protected authorization. 8*9c5db199SXin Li# 9*9c5db199SXin Li# Example usage: 10*9c5db199SXin Li# ./set_tree_status.py [options] "a quoted space separated message." 11*9c5db199SXin Li 12*9c5db199SXin Lifrom __future__ import absolute_import 13*9c5db199SXin Lifrom __future__ import division 14*9c5db199SXin Lifrom __future__ import print_function 15*9c5db199SXin Liimport getpass 16*9c5db199SXin Liimport optparse 17*9c5db199SXin Liimport os 18*9c5db199SXin Liimport sys 19*9c5db199SXin Lifrom six.moves import urllib 20*9c5db199SXin Li 21*9c5db199SXin LiCHROMEOS_STATUS_SERVER = 'https://chromiumos-status.appspot.com' 22*9c5db199SXin Li 23*9c5db199SXin Li 24*9c5db199SXin Lidef get_status(): 25*9c5db199SXin Li response = urllib.request.urlopen( 26*9c5db199SXin Li CHROMEOS_STATUS_SERVER + '/current?format=raw') 27*9c5db199SXin Li return response.read() 28*9c5db199SXin Li 29*9c5db199SXin Li 30*9c5db199SXin Lidef get_pwd(): 31*9c5db199SXin Li password_file = os.path.join('/home', getpass.getuser(), 32*9c5db199SXin Li '.status_password.txt') 33*9c5db199SXin Li if os.path.isfile(password_file): 34*9c5db199SXin Li return open(password_file, 'r').read().strip() 35*9c5db199SXin Li return getpass.getpass() 36*9c5db199SXin Li 37*9c5db199SXin Li 38*9c5db199SXin Lidef post_status(force, message): 39*9c5db199SXin Li if not force: 40*9c5db199SXin Li status = get_status() 41*9c5db199SXin Li if 'tree is closed' in status.lower(): 42*9c5db199SXin Li print('Tree is already closed for some other reason.', 43*9c5db199SXin Li file=sys.stderr) 44*9c5db199SXin Li print(status, file=sys.stderr) 45*9c5db199SXin Li return -1 46*9c5db199SXin Li data = { 47*9c5db199SXin Li 'message': message, 48*9c5db199SXin Li 'username': getpass.getuser(), 49*9c5db199SXin Li 'password': get_pwd(), 50*9c5db199SXin Li } 51*9c5db199SXin Li urllib.request.urlopen(CHROMEOS_STATUS_SERVER + '/status', 52*9c5db199SXin Li urllib.parse.urlencode(data)) 53*9c5db199SXin Li return 0 54*9c5db199SXin Li 55*9c5db199SXin Li 56*9c5db199SXin Liif __name__ == '__main__': 57*9c5db199SXin Li parser = optparse.OptionParser("%prog [options] quoted_message") 58*9c5db199SXin Li parser.add_option('--noforce', 59*9c5db199SXin Li dest='force', action='store_false', 60*9c5db199SXin Li default=True, 61*9c5db199SXin Li help='Dont force to close tree if it is already closed.') 62*9c5db199SXin Li options, args = parser.parse_args() 63*9c5db199SXin Li if not args: 64*9c5db199SXin Li print('missing tree close message.', file=sys.stderr) 65*9c5db199SXin Li sys.exit(post_status(options.force, args[0])) 66