view dash.py @ 47:190a81a60e7e tip

Update README G: changed README.txt
author Gernot Schulz <gernot@intevation.de>
date Sun, 07 Feb 2016 13:26:32 +0100
parents a957a56bb694
children
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():
    logger.info("No config-file found. create new config file")
    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=False
# rows=3
# --------------------
# 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: False
#   hint: the top-bar has got a height of 5%!
#
#   rows (integer-number) [recommended]
#     the number or rows for the tiles. Not every number makes sence since
#     you usually cannot scroll on the screen. This only works on the default
#     tile template - it is always possivle to write an own template!
#   example:
#     If there are 4 tiles in 2 rows the reult would be the following:
#       ▢▢
#       ▢▢
#
#     if there are 3 tiles in 3 rows the result would be the following
#       ▢
#       ▢
#       ▢
#
#     if there re 12 tiles in 3 rows the reult would be the following
#       ▢▢▢▢
#       ▢▢▢▢
#       ▢▢▢▢
#


[settings]
show_top_bar=False
rows=3

# Tiles:
# example:
# --------------------
# [tile1]
# type=mon
# source=192.168.0.2
# status=up
# --------------------
# options:
#   type (mon / web_view) [required]
#     tells the program what kind of tile you need.
#     a "mon" tile can be used for IT infrastructure monitoring purposes
#     a "web_view" 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
#     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=red2-Bottle-App
status=wait

[tile2]
type=mon
source=Intevation_Homepage
status=wait

[tile3]
type=mon
source=mpuls-jmd-demo
status=wait

[tile4]
type=mon
source=aise-icn
status=wait

[tile5]
type=mon
source=mpuls-s_bew_prev
status=wait

[tile6]
type=web_view
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 ":: " + str(service) + " is " + str(status) + " !"


@post('/ask-systemstate')
def get_systemstate():
    global tiles
    service = request.forms.get('service')

    # print("service: " + service)

    try:
        for tile in tiles:
            if tile["source"] == str(service):
                # return "service : " + str(service) + " is " + str(tile["status"])
                return tile["status"]
    except KeyError:
        return "cannot find the service: " + str(service)

    return "did not found anything in my list for : " + service


@route('/static/<filename>')
def server_static(filename):
    return static_file(filename, root=PATH + '/static/')

@error(404)
def error404(error):
    return 'Nothing here, sorry <br /> 404'

read_config()
# print(tiles)
run(host='localhost', port=8080, debug=False, quiet=True)
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)