Created
February 13, 2015 03:38
-
-
Save amosshapira/cff3838da2572f6e070c to your computer and use it in GitHub Desktop.
Python script to dig through TeamCity plans for certain plan parameters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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