summaryrefslogtreecommitdiffstats
path: root/roleproxy.py
blob: 17ffec3a2a799c471b5cbe4d014500c7bda6c645 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/python3
# This serves a custom "salt_roles" field in NetBox via a HTTP API consumable in Salt top files.
# Georg Pfuetzenreuter <georg@lysergic.dev>

import flask
import logging
import os
import pynetbox
from waitress import serve

if not 'NB_HOST' in os.environ or not 'NB_TOKEN' in os.environ:
    print('Pass NB_HOST and NB_TOKEN as environment variables.')
    import sys
    sys.exit(1)

host = os.environ['NB_HOST']
token = os.environ['NB_TOKEN']

app = flask.Flask(__name__)

def connect(host, token):
    netbox = pynetbox.api(host, token)
    return(netbox)

def get_roles(netbox, name):
    vm = netbox.virtualization.virtual_machines.filter(name=name)
    vmroles = {}
    if len(vm) > 0:
        vmroles = vm[0].custom_fields['salt_roles']
        if vmroles is None:
            vmroles = {}
        return(200, vmroles)
    if len(vm) == 0:
        return(404, None)

@app.route('/roles')
def query():
    name = flask.request.args.get('machine')
    query = get_roles(connect(host, token), name)
    response = query[0]
    logger.info(' %s requested roles for %s and received %i', flask.request.remote_addr, name, response)
    if response == 404:
        flask.abort(404)
    elif response == 200:
        roledict = {'roles': query[1]}
    return(flask.jsonify(roledict))

if __name__ == '__main__':
    #app.run(debug=False)
    logger = logging.getLogger('roleproxy')
    logger.setLevel(logging.INFO)
    logger.info('Booting ...')
    serve(app, host='*', port=4580)