54 lines
1.5 KiB
Python
Executable File
54 lines
1.5 KiB
Python
Executable File
#!/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)
|