Remember that post I did a while back where I used node-red with statping to make Homer look a little nice? Nah? Don't blame ya. Anyway, turns out I had no other use for node-red, so I decided to get rid of that and write a little python script to do the same thing. Here it be:
from flask import Flask
from flask import jsonify
import requests
from flask_cors import CORS, cross_origin
def get_result():
services_up = 0
failure_list = []
returnResponse = {"style":"", "title":"", "content":""}
statping_endpoint = "https://statping.hostname.com/api/services/"
try:
response = requests.get(statping_endpoint, verify=False)
# If we get a response
if response.status_code == 200:
# Get the total number of services returned
total_services = len(response.json())
# Iterate through the response
for key in response.json():
# If the service is online, incrememnt the up count
if key["online"] == True:
services_up += 1
# Otherwise append the name to the naughty list
else:
failure_list.append(key["name"])
# Check the number of up services is equal to the total number of services
if total_services == services_up:
# if so, return a success object
returnResponse["style"] = "is-success"
returnResponse["title"] = "All good in the hood boss"
returnResponse["content"] = "<b>%s / %s Services showing as online. Check <a href=https://statping.hostname.com target=_blank>here</a> for more info. </br> <p>"%(services_up, total_services)
return(returnResponse)
else:
# return a numpty message
returnResponse["style"] = "is-danger"
returnResponse["title"] = "Halp"
# need to build the return message to include the failures as a formatted list
numptyList = "<ul>"
for i in failure_list:
numptyList += "<li>" + i + "</li>"
numptyList += "</ul>"
returnResponse["content"] = "<b>%s / %s Services showing as online. Check <a href=https://statping.hostname.com target=_blank>here</a> for more info. </br> <p> <br>Here are the numpties that are letting the side down:</br> %s"%(services_up, total_services, numptyList)
return(returnResponse)
except:
returnResponse["style"] = "is-danger"
returnResponse["title"] = "I have the sads"
returnResponse["content"] = "Like, man cannot even holla at Statping."
return(returnResponse)
app = Flask(__name__)
app.config["JSON_SORT_KEYS"] = False
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'
@app.route("/endpoint/", methods=["GET"])
@cross_origin()
def welcome():
return jsonify(get_result())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=80)
Does it work? Ya. Is it "good" code? Let's not get ahead of ourselves. Then, I dumped this into a teeny little docker container. Here's the super complicated docker file:
FROM python:3-alpine
WORKDIR /usr/src/app
COPY ./main.py .
RUN python -m pip install --upgrade pip
RUN pip3 install flask requests flask_cors
CMD ["main.py"]
ENTRYPOINT ["python3"]
With that made and running on my docker host, I can go to dockerhosturl/endpoint/ and it'll return the nicely formatted json that Homer needs to be able to display the update.
Sweetness.