#!/usr/bin/env python3 """ This tool is for updating API key field `zuliprc` files of dummy users in development environment, with the correct keys from the database. Ensure running this outside of vagrant environment. Usage: ./tools/update-zuliprc-api-field /path/to/zuliprc_dev """ import argparse import configparser import os import shlex import subprocess import sys ZULIP_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, ZULIP_PATH) from scripts.lib.zulip_tools import is_vagrant_env_host parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( "path", metavar="FILE", nargs="+", help="config file of dummy users in development server" ) args = parser.parse_args() zuliprc_paths_list = args.path for zuliprc_path in zuliprc_paths_list: zuliprc = configparser.ConfigParser() result = "" try: with open(zuliprc_path) as f: zuliprc.read_file(f, zuliprc_path) api_details = zuliprc["api"] email = api_details["email"] key = api_details["key"] site = api_details["site"] if "localhost" not in site: result = "ABORTED" reason = "Script to be used for development server config files only" except (KeyError, configparser.MissingSectionHeaderError): result = "FAILURE" reason = "Could not parse file due to missing required fields/sections" except FileNotFoundError: result = "ABORTED" reason = "No zuliprc file found at specified path" if result not in ("ABORTED", "FAILURE"): # Make sure the cwd is the root of Zulip checkout. os.chdir(ZULIP_PATH) if is_vagrant_env_host(ZULIP_PATH): arguments = [ "vagrant", "ssh", "--command", "./manage.py print_initial_password " + shlex.quote(email), ] else: # Support users who don't have vagrant based setup arguments = ["./manage.py", "print_initial_password", email] # We redirect 'stderr' to 'stdout' to avoid 'Connection to 127.0.0.1 closed' # appearing after this script finishes. output = subprocess.check_output(arguments, stderr=subprocess.STDOUT, text=True) new_key = output.split()[6] if new_key != key: try: zuliprc.set("api", "key", new_key) with open(zuliprc_path, "w+") as w: zuliprc.write(w) result = "SUCCESS" reason = f"API field updated for user {email}" except OSError: result = "FAILURE" reason = "Writing to file unsuccessful" else: result = "SUCCESS" reason = f"API key for user {email} is already consistent" print(f"{zuliprc_path}: {result}: {reason}")