Cut new release

Published on:

Python script to check stuff out of git and cut a new release.

#!/usr/bin/env python3


# PRXY=$(grep 'Acquire::http::Proxy' /etc/apt/apt.conf.d/05proxy | cut -d ' ' -f 2 | cut -d ';' -f 1 | cut -d '"' -f 2)

# export http_proxy="${PRXY}"

# export https_proxy="${PRXY}"


import argparse
import fileinput
import json
import os
import shutil
import socket
import subprocess
import sys
import urllib.request
import traceback
import tempfile

class MyAP(argparse.ArgumentParser):
  """
  This just makes the parser print out the full help message on error
  instead of just telling you what you did wrong.
  """
  def error(self, message):
    sys.stderr.write('error: %s\n' % message)
    self.print_help()
    sys.exit(2)

def parse_args():
  parser = MyAP(description=
    """
    Cuts a new HIP release (includes EPC AKA Cortex AKA Receptor)
    """)
  parser.add_argument(
    '-r',
    '--release-name',
    required=True,
    type=str,
    help='The name of the release. For example: rc_1.13')
  args = parser.parse_args(sys.argv[1:])
  # try:

  #     socket.inet_aton(args.new_ip)

  # except socket.error:

  #   parser.error('invalid ip address {ip}\n'.format(ip=args.new_ip))

  return args

# reads specified json file into dict.

def read_json(file):
   return json.load(open(file, 'r'))

def get_package_json(release_name):
  pjname = './packages/' + release_name + '.json'
  try:
    pj = read_json(pjname)
    print(json.dumps(pj, indent=3, sort_keys=True))
    return pj
  except FileNotFoundError as e:
    print('package json file not found: ' + pjname)
    sys.exit(5)
  except:
    traceback.print_exc()
    sys.exit(5)

def set_git_base_dir():
  gitbase = tempfile.gettempdir() + '/cut-release'
  print('gitbase: ' + gitbase)
  try:
    shutil.rmtree(gitbase)
  except:
    pass
  mkdir_p(gitbase)
  os.chdir(gitbase)
  return gitbase

def mkdir_p(path):
  try:
    os.makedirs(path)
  except OSError as exc: # Python >2.5

    if exc.errno == errno.EEXIST and os.path.isdir(path):
      pass
    else: raise

def git(*args):
  return subprocess.check_call(['git'] + list(args))

def fix_package_json(app_name, release_name):
  if app_name in ['lens','nerve','report_service','pupil','retina']:
    print('fixing package.json: ' + app_name)
    with fileinput.FileInput('./package.json', inplace=True) as file:
      for line in file:
        print(line.replace('#develop', '#' + release_name), end='')

# "hip-cortex-api": "git+https://github.mandiant.com/HIP/hip-cortex-api#develop",

# "hip-db": "git+https://github.mandiant.com/HIP/hip-db#develop",

# "hip-kafka-node": "git+https://github.mandiant.com/HIP/hip-kafka-node#develop",

# "hip-utils": "git+https://github.mandiant.com/HIP/hip-utils#develop",


def is_branch_created(git_url, release_name):
  try:
    out = subprocess.check_output(
      ['git', 'ls-remote', '--heads', git_url, release_name],
      stderr=subprocess.STDOUT).decode('utf-8')
    return release_name in out
  except:
    traceback.print_exc()
    sys.exit(5)

def create_or_checkout_branch(git_url, release_name):
  if not is_branch_created(git_url, release_name):
    print('creating branch: ' + release_name)
    git('checkout', '-b', release_name)
  else:
    git('checkout', release_name)

def commit_and_push(release_name):
  try:
    git('commit', '-a', '-m', 'cut ' + release_name)
  except:
    pass
  git('push', 'origin', release_name)

def do_git_stuff(app_name, release_name):
  print('app_name: ' + app_name)
  git_url = 'https://github.mandiant.com/HIP/{app_name}.git'.format(app_name=app_name)
  if (app_name == 'epc_server'):
    app_name = 'receptor'
    git_url = 'https://github.mandiant.com/EndpointConnector/{app_name}.git'.format(app_name=app_name)
  print('git_url: ' + git_url)
  print('os.getcwd: ' + os.getcwd())
  git('clone', git_url)

  os.chdir(app_name)
  print('os.getcwd: ' + os.getcwd())

  create_or_checkout_branch(git_url, release_name)
  fix_package_json(app_name, release_name)
  commit_and_push(release_name)

  os.chdir('..')

if __name__ == "__main__":
  args = parse_args()
  pkg_json = get_package_json(args.release_name)
  set_git_base_dir()
  do_git_stuff('hip-cortex-api', args.release_name)
  do_git_stuff('hip-kafka-node', args.release_name)
  do_git_stuff('hip-utils', args.release_name)
  for svc in pkg_json:
    do_git_stuff(svc['app_name'], args.release_name)