xref: /aosp_15_r20/external/autotest/site_utils/set_tree_status.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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