Mercurial > bottledash
view dash.py @ 20:1a13a4ecf931
can not recive post-requests wich should deliver if a server is up or down. Updated after a refresh of the webpage, wich will automatically done after 5 seconds
author | sean |
---|---|
date | Wed, 12 Aug 2015 13:45:58 +0200 |
parents | be6a1aaec717 |
children | f730dd0bcf85 |
line wrap: on
line source
""" This software is part of "Bottledash" author: sean engelhardt > sean.engelhardt@intevation.de license: GNU >= V2. See LICENSE for details """ from bottle import get, post, request, view, response, route from bottle import template, run, static_file, error import os.path, sys, configparser, functools, bottle import logging CONFIG_FILE = "dash.conf" PATH = os.path.abspath(os.path.dirname(sys.argv[0])) CONFIG_PATH = PATH + "/" + CONFIG_FILE # Create a new list with absolute paths MY_TEMPLATE_PATH = [ os.path.abspath(os.path.join(os.path.dirname(__file__), './views')), ] # Patch @view() so it uses the customized path list instead of the global one view = functools.partial(bottle.view, template_lookup=MY_TEMPLATE_PATH) tiles = [] settings = {} default_settings = configparser.ConfigParser() default_settings['settings'] = {'show_top_bar': False, 'rows': 2} #logging: logger = logging.getLogger('myapp') hdlr = logging.FileHandler(PATH + '/bottledash.log') formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') hdlr.setFormatter(formatter) logger.addHandler(hdlr) logger.setLevel(logging.INFO) ### debug function: prints the current status of the "tiles" in ### the log-file def log_tile_status(): global tiles try: for tile in tiles: logger.info("found tile : " + str(tile)) for option in tiles[0]: logger.info(str(option) + ' : ' + str(tile[option])) except KeyError: pass ###read the config file. usually "dash.conf" def read_config(): global settings # print(PATH) if os.path.isfile(CONFIG_PATH) == False: write_default_config() # print("read existing config file...") config = configparser.ConfigParser() config.read(CONFIG_PATH) for section in config.items(): if "tile" in section[0]: tiles.append(section[1]) ###log read tiles logger.info("------- read tiles --------") log_tile_status() try: if config["settings"]: settings = config["settings"] else: settings = default_settings["settings"] except KeyError: settings = default_settings["settings"] ###write the default condfig file if there is none def write_default_config(): print("there is no Config file! Creating one...") file = open(CONFIG_PATH, "w") file.write(""" ### bottledash default configuration ### created by sean engelhardt >sean.engelhardt@intevation.de ### license: GNU GPL >= v2. See LICENSE for details ### ### Usage: ### define the tiles for the dashboard in sections # Settings: # example: # -------------------- # [settings] # show_top_bar=True # -------------------- # options: # show_top_bar (True / False) [optional] # If True, the dashboard will show the current date and the time on the top # if False, the dashboard will not show a top-bar # default: True # hint: the top-bar has got a height of 5%! [settings] show_top_bar=False # Tiles: # example: # -------------------- # [tile1] # type=mon # source=192.168.0.2 # status=up # -------------------- # options: # type (mon / d3js) [required] # tells the program what kind of tile you need. # a "mon" tile can be used for IT infrastructure monitoring purposes # a d3js tile can be used to display a chart # default: - # # source (<IP> or <FQDN>) [required for mon-types] # ONLY FOR MON-Type tiles! # tells the tile which resource to watch # default: none # # status: (up / down) [required] # ONLY FOR DEBUGGING PURPOSE - WILL BE REMOVED LATER # simulates up and down events for mon-type-tiles # # div_name: (identifier) [required for d3js-types] # # script: (name of a script without extension) [required for d3js-types0] # [tile1] type=mon source=192.168.0.2 status=down [tile2] type=mon source=192.168.2.3 status=up [tile3] type=mon source=192.168.4.3 status=up [tile4] type=d3js div_name=techintern script=display_issues_techintern """) file.close() ##Bottle @route('/') @view('bottledash_view') def call_dashboard(): return dict(tiles=tiles, settings=settings) #wait for post-request which shall inform the system about running services @post('/updown') def updown(): global tiles service = request.forms.get('service') status = request.forms.get('status') try: for tile in tiles: if tile["source"] == str(service): tile["status"] = str(status) except KeyError: logger.info("this tile got no source : " + str(tile)) logger.info('------- new alert --------') logger.info('Service : ' + str(service)) logger.info('Status : ' + str(status)) log_tile_status() return "thanks for informing bottledash! :: " + str(service) + " is " + str(status) + " !" @error(404) def error404(error): return 'Nothing here, sorry <br /> 404' read_config() # print(tiles) run(host='localhost', port=8080, debug=True)