Skip to content

Instantly share code, notes, and snippets.

@amosshapira
Created February 13, 2015 03:38
Show Gist options
  • Save amosshapira/cff3838da2572f6e070c to your computer and use it in GitHub Desktop.
Save amosshapira/cff3838da2572f6e070c to your computer and use it in GitHub Desktop.
Python script to dig through TeamCity plans for certain plan parameters
#!/usr/bin/env python
# Example usage: ./tc-query-params.py --user username --teamcity https://teamcity.server.host.name/
from __future__ import print_function
import os
import getopt
import requests
import sys
import getpass
import json
PROJECTS_PATH = '/httpAuth/app/rest/projects'
session = requests.Session()
def parse_arguments(argv):
user = None
password = None
baseurl = None
try:
opts, args = getopt.getopt(argv, 'u:p:t:', [
'user=', 'password=', 'teamcity='
])
except getopt.GetoptError:
sys.exit('''
tc-backup.py:
Will trigger a TeamCity backup and download the result to local directory
-u|--user username
-p|--password password
-t|--teamcity TeamCity base url''')
for opt, arg in opts:
if opt in ('-u', '--user'):
user = arg
elif opt in ('-p', '--password'):
password = arg
elif opt in ('-t', '--teamcity'):
baseurl = arg
else:
print('unrecognised option: "%s"' % opt)
if user == None or baseurl == None:
sys.exit('missing required parameter: "user" or "teamcity"')
if password == None:
if os.environ['PASS'] != None:
password = os.environ['PASS']
else:
password = getpass.getpass(prompt='Teamcity password for user \'%s\':' % user)
return (user, password, baseurl)
def get(user, password, url, params = {}, headers = {'Accept': 'application/json'}):
request = requests.Request('GET', url, auth=(user, password), params = params, headers = headers)
prepared = request.prepare()
response = session.send(prepared)
if response.status_code != 200:
sys.exit('get: got status %d: "%s"' % (response.status_code, response.content))
return response
def list_projects(user, password, baseurl):
return get(user, password, baseurl + PROJECTS_PATH).json()['project']
def get_project(user, password, baseurl, href):
return get(user, password, baseurl + href)
def process_project_list(user, password, baseurl, project_list, prefix=''):
#print(json.dumps(project_list))
for project in project_list:
project_data = get_project(user, password, baseurl, project['href']).json()
#print(json.dumps(project_data, sort_keys=True, indent=4, separators=(',', ': ')))
if 'parameters' in project_data and 'property' in project_data['parameters']:
for property in project_data['parameters']['property']:
if 'cfntemplate' in property['name'].lower():
print('%s: \'%s\' = \'%s\'' % ('/'.join((prefix, project['name'])), property['name'], property['value']))
break
if 'projects' in project_data and 'project' in project_data['projects']:
process_project_list(user, password, baseurl, project_data['projects']['project'], '/'.join((prefix, project_data['name'])))
def main(argv):
user, password, baseurl = parse_arguments(argv)
project_list = list_projects(user, password, baseurl)
process_project_list(user, password, baseurl, project_list)
if __name__ == '__main__':
main(sys.argv[1:])
sys.exit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment