Skip to content

Instantly share code, notes, and snippets.

@tuxfight3r
Last active April 25, 2019 19:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tuxfight3r/b4ff14cb61c68b2f7b204b9f0d41d79c to your computer and use it in GitHub Desktop.
Save tuxfight3r/b4ff14cb61c68b2f7b204b9f0d41d79c to your computer and use it in GitHub Desktop.
Python script for returning environment facts in json format based on the requested network.
#!/usr/bin/python
# Author: Mohan Balasundaram
# Date: 25/04/2019
# Purpose: python api for node location facts in json format
from flask import Flask, request, Response
import netaddr
import json
# user data
vpc_data = {
"lab_vpc": "10.100.16.0/20",
"build_vpc": "10.100.32.0/20",
"prod_vpc": "10.100.48.0/20",
"prod_vpc2": "10.100.64.0/20",
}
proxy_data = {
"lab_vpc": "lab-proxy.aws.local",
"build_vpc": "build-proxy.aws.local",
"prod_vpc": "prod-proxy.aws.local",
"prod_vpc2": "prod2-proxy.aws.local",
}
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>It Works!</h1>'
def is_address_in_network(network, address):
"""
Determine whether the provided address is within a network range.
"""
try:
network = netaddr.IPNetwork(network)
except (netaddr.core.AddrFormatError, ValueError):
raise ValueError("Network (%s) is not in CIDR presentation format" %
network)
try:
address = netaddr.IPAddress(address)
except (netaddr.core.AddrFormatError, ValueError):
raise ValueError("Address (%s) is not in correct presentation format" %
address)
# print "DEBUG:", address, network
if address in network:
return True
else:
return False
def json_output(item):
"""
Create a custom json output for a given vpc item
"""
value = {
"vpc": item,
"proxy": proxy_data[item] if proxy_data[item] else "noproxy",
}
return json.dumps(value)
@app.route('/get_facts', methods=['GET'])
def get_facts():
data = request.args.to_dict()
for item in vpc_data.keys():
if is_address_in_network(vpc_data[item], data['ip']):
return Response(json_output(item), status=200,
mimetype='application/json')
return Response(json.dumps({"vpc": "unknown_vpc"}), status=200,
mimetype='application/json')
@app.errorhandler(500)
def internal_error(error):
return Response(json.dumps({"error": "500 server error"}), status=500,
mimetype='application/json')
@app.errorhandler(404)
def not_found(error):
return Response(json.dumps({"error": "404 page not found"}), status=404,
mimetype='application/json')
if __name__ == '__main__':
# app.run(host='0.0.0.0', port=8080, debug=True)
app.run(host='0.0.0.0', port=8080)

Execution of the script

[-0-(mohan@xpsbox) ~/cloud-init (master)]$ ./python_dcfacts.py 
 * Serving Flask app "python_dcfacts" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [25/Apr/2019 19:33:21] "GET /get_facts?ip=10.100.16.2 HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2019 19:33:31] "GET /get_facts?ip=10.100.34.2 HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2019 19:33:37] "GET /get_facts?ip=10.100.68.2 HTTP/1.1" 200

Output of the script

# known vpc outputs
[-0-(mohan@xpsbox) ~ ]$ curl localhost:5000/get_facts?ip=10.100.34.2
{"proxy": "build-proxy.aws.local", "vpc": "build_vpc"}
[-0-(mohan@xpsbox) ~ ]$ curl localhost:5000/get_facts?ip=10.100.34.22
{"proxy": "build-proxy.aws.local", "vpc": "build_vpc"}
[-0-(mohan@xpsbox) ~ ]$ curl localhost:5000/get_facts?ip=10.100.48.50
{"proxy": "prod-proxy.aws.local", "vpc": "prod_vpc"}

# uknown vpc output
[-0-(mohan@xpsbox) ~ ]$ curl localhost:5000/get_facts?ip=10.100.96.50
{"vpc": "unknown_vpc"}

# malformed inputs / data
[-0-(mohan@xpsbox) ~ ]$ curl localhost:5000/get_facts?ip=10.100.496.50
{"error": "500 server error"}
[-0-(mohan@xpsbox) ~ ]$ curl localhost:5000/get_facts?ip=10.100.496.50ree
{"error": "500 server error"}

# malformed request
[-0-(mohan@xpsbox) ~ ]$ curl localhost:5000/get_factsssks/sge
{"error": "404 page not found"}[-0-(mohan@xpsbox) ~ ]$ 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment