Note: There is an improved version in the next post.
Following my earlier post about implementing a REST API, here is a simple listener for NetBox webhooks:
webhook-listener.py:
import logging from flask import Flask, request from flask_restplus import Api, Resource, fields app = Flask(__name__) api = Api(app, version="1.0", title="NetBox Webhook Listener", description="Tested with NetBox 2.6.6") ns = api.namespace("webhook") APP_NAME = "webhook-listener" logger = logging.getLogger(APP_NAME) logger.setLevel(logging.INFO) formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s: %(message)s") file_logging = logging.FileHandler("{}.log".format(APP_NAME)) file_logging.setFormatter(formatter) logger.addHandler(file_logging) webhook_request = api.model("Webhook request from NetBox", { 'username': fields.String, 'data': fields.Raw(description="The object data from NetBox"), 'event': fields.String, 'timestamp': fields.String, 'model': fields.String, 'request_id': fields.String, }) def do_something_with_the_event(data): pass @ns.route("/") class WebhookListener(Resource): @ns.expect(webhook_request) def post(self): try: input_data = request.json except: input_data = {} logger.info("{}".format(input_data)) if not input_data or "model" not in input_data: return {"result":"invalid input"}, 400 do_something_with_the_event(input_data) return {"result":"ok"}, 200 if __name__ == "__main__": app.run(host="0.0.0.0")
With the other configurations described in the earlier post (and after configured NetBox to send the webhook POST requests to http://my.server.local/webhook/
), these are the outputs:
webhook-listener.log:
2019-10-12 18:16:12,781 webhook-listener INFO: {'username': 'admin', 'data': {'id': 7, 'description': '', 'slug': 'my-testing-tenant', 'name': 'My Testing Tenant', 'group': None, 'comments': '', 'tags': ['Finland', 'Torilla tavataan'], 'last_updated': '2019-10-12T15:16:12.641722Z', 'created': '2019-10-12', 'custom_fields': {}}, 'event': 'created', 'timestamp': '2019-10-12 15:16:12.761427', 'model': 'tenant', 'request_id': '733486ff-987b-4cb1-bb2d-dd5c3c7d6b04'}
Automatically generated Swagger API documentation on http://my.server.local/
:
Excellent example!