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.