You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.9 KiB

#!/usr/bin/env python
import requests
import json
import yaml
import sys
import argparse
import tempfile
import os
import hashlib
from subprocess import call
# Read configuration
with open("config.yml", 'r') as ymlfile:
cfg = yaml.load(ymlfile)
# Functions
def call_api(method, url, object_data=None):
headers = { 'Content-Type': 'application/json',
'Accept': 'application/json' }
response = requests.request(method, url, json=object_data, headers=headers,
if not response.text:
print "No response received (error %i)" % response.status_code
if "errormessages" in json_response:
for err in json_response['errormessages']['errormessage']:
if 'args' in err:
print err['text'].replace('\n', ' ').replace('\r', '') \
% tuple([d['value'] for d in err['args']])
print err['text']
return json_response
# Print formatted output from JSON
def print_output(json, object_file):
if "objects" in json:
for attr in json['objects']['object'][0]['attributes']['attribute']:
object_file.write("%-20s %s\n" % (attr['name']+':',
if object_file:
def read_input(object_file):
attr = []
for line in object_file.readlines():
if not line: continue
'value':line.split(':')[1].strip() })
object_data = {
"objects": {
"object": [
"attributes": {
"attribute": attr
return object_data
# Get record
def get(args):
print "Getting %s object %s" % (args.type, args.key)
url = '/'.join((cfg['base_url'],args.type,args.key))
json_response=call_api("GET", url)
print_output(json_response, args.file)
# Delete record
def delete(args):
print "Deleting %s object %s" % (args.type, args.key)
url = '/'.join((cfg['base_url'],args.type,args.key))
json_response=call_api("DELETE", url)
# Create record
def create(args):
print "Creating %s object" % (args.type)
url = '/'.join((cfg['base_url'],args.type))
object_data = read_input(args.file)
json_response=call_api("POST", url, object_data)
print_output(json_response, sys.stdout)
# Update record
def update(args):
print "Updating %s object %s" % (args.type, args.key)
url = '/'.join((cfg['base_url'],args.type,args.key))
object_data = read_input(args.file)
json_response=call_api("PUT", url, object_data)
print_output(json_response, sys.stdout)
# Edit record
def edit(args):
tmp_fd, tmp_name = tempfile.mkstemp()
get(parser.parse_args(["get", args.type, args.key, tmp_name]))
EDITOR = os.environ.get('EDITOR','vim')
# Memory inefficient, but who cares?
hash1 = hashlib.md5(open(tmp_name).read()).hexdigest()
call([EDITOR, tmp_name])
hash2 = hashlib.md5(open(tmp_name).read()).hexdigest()
if hash1 != hash2:
update(parser.parse_args(["update", args.type, args.key, tmp_name]))
print "Object unchanged, not updating"
# Arguments parsing
# USAGE : ./ delete <TYPE> <KEY>
# ./ create <TYPE> <FILE>
# ./ update <TYPE> <KEY> <FILE>
# ./ get <TYPE> <KEY> <FILE>
# ./ edit <TYPE> <KEY>
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='Action to perform',dest='action')
parser_get = subparsers.add_parser('get', help='Delete an object')
parser_get.add_argument('type', type=str, help='Object type')
parser_get.add_argument('key', type=str, help='Object identifier')
parser_get.add_argument('file', type=argparse.FileType('w'), help='Output file')
parser_delete = subparsers.add_parser('delete', help='Delete an object')
parser_delete.add_argument('type', type=str, help='Object type')
parser_delete.add_argument('key', type=str, help='Object identifier')
parser_post = subparsers.add_parser('create', help='Create an object')
parser_post.add_argument('type', type=str, help='Object type')
parser_post.add_argument('file', type=argparse.FileType('r'), help='Input file')
parser_put = subparsers.add_parser('update', help='Update an object')
parser_put.add_argument('type', type=str, help='Object type')
parser_put.add_argument('key', type=str, help='Object identifier')
parser_put.add_argument('file', type=argparse.FileType('r'), help='Input file')
parser_edit = subparsers.add_parser('edit', help='Edit an object')
parser_edit.add_argument('type', type=str, help='Object type')
parser_edit.add_argument('key', type=str, help='Object identifier')
args = parser.parse_args()