From 66ef9d90a94833d30502006d1fcdafd5054086eb Mon Sep 17 00:00:00 2001 From: Stephen Soltesz Date: Tue, 25 Nov 2008 23:54:57 +0000 Subject: [PATCH] Entry point for rpc server, view templates, rss feeds of node down times, and other nice things. --- web/MonitorWeb/MonitorWeb.egg-info/PKG-INFO | 15 ++ .../MonitorWeb.egg-info/SOURCES.txt | 21 +++ .../MonitorWeb.egg-info/dependency_links.txt | 1 + .../MonitorWeb.egg-info/entry_points.txt | 3 + .../MonitorWeb.egg-info/not-zip-safe | 1 + .../MonitorWeb.egg-info/paster_plugins.txt | 1 + .../MonitorWeb.egg-info/requires.txt | 3 + .../MonitorWeb.egg-info/top_level.txt | 1 + web/MonitorWeb/README.txt | 4 + web/MonitorWeb/dev.cfg | 76 ++++++++++ web/MonitorWeb/monitorweb/__init__.py | 0 web/MonitorWeb/monitorweb/commands.py | 53 +++++++ web/MonitorWeb/monitorweb/config/__init__.py | 0 web/MonitorWeb/monitorweb/config/app.cfg | 71 ++++++++++ web/MonitorWeb/monitorweb/config/log.cfg | 29 ++++ web/MonitorWeb/monitorweb/controllers.py | 13 ++ web/MonitorWeb/monitorweb/json.py | 10 ++ web/MonitorWeb/monitorweb/model.py | 20 +++ web/MonitorWeb/monitorweb/release.py | 14 ++ .../monitorweb/static/css/style.css | 134 ++++++++++++++++++ .../monitorweb/static/images/favicon.ico | Bin 0 -> 1081 bytes .../monitorweb/static/images/header_inner.png | Bin 0 -> 37537 bytes .../monitorweb/static/images/info.png | Bin 0 -> 2889 bytes .../monitorweb/static/images/ok.png | Bin 0 -> 25753 bytes .../static/images/tg_under_the_hood.png | Bin 0 -> 4010 bytes .../static/images/under_the_hood_blue.png | Bin 0 -> 2667 bytes .../monitorweb/templates/.master.kid.swp | Bin 0 -> 12288 bytes .../monitorweb/templates/__init__.py | 0 web/MonitorWeb/monitorweb/templates/login.kid | 114 +++++++++++++++ .../monitorweb/templates/master.kid | 50 +++++++ .../monitorweb/templates/welcome.kid | 47 ++++++ web/MonitorWeb/monitorweb/tests/__init__.py | 0 .../monitorweb/tests/test_controllers.py | 32 +++++ web/MonitorWeb/monitorweb/tests/test_model.py | 22 +++ web/MonitorWeb/sample-prod.cfg | 77 ++++++++++ web/MonitorWeb/setup.py | 78 ++++++++++ web/MonitorWeb/start-monitorweb.py | 18 +++ web/MonitorWeb/test.cfg | 32 +++++ web/monitorweb-httpd.conf | 33 +++++ 39 files changed, 973 insertions(+) create mode 100644 web/MonitorWeb/MonitorWeb.egg-info/PKG-INFO create mode 100644 web/MonitorWeb/MonitorWeb.egg-info/SOURCES.txt create mode 100644 web/MonitorWeb/MonitorWeb.egg-info/dependency_links.txt create mode 100644 web/MonitorWeb/MonitorWeb.egg-info/entry_points.txt create mode 100644 web/MonitorWeb/MonitorWeb.egg-info/not-zip-safe create mode 100644 web/MonitorWeb/MonitorWeb.egg-info/paster_plugins.txt create mode 100644 web/MonitorWeb/MonitorWeb.egg-info/requires.txt create mode 100644 web/MonitorWeb/MonitorWeb.egg-info/top_level.txt create mode 100644 web/MonitorWeb/README.txt create mode 100644 web/MonitorWeb/dev.cfg create mode 100644 web/MonitorWeb/monitorweb/__init__.py create mode 100644 web/MonitorWeb/monitorweb/commands.py create mode 100644 web/MonitorWeb/monitorweb/config/__init__.py create mode 100644 web/MonitorWeb/monitorweb/config/app.cfg create mode 100644 web/MonitorWeb/monitorweb/config/log.cfg create mode 100644 web/MonitorWeb/monitorweb/controllers.py create mode 100644 web/MonitorWeb/monitorweb/json.py create mode 100644 web/MonitorWeb/monitorweb/model.py create mode 100644 web/MonitorWeb/monitorweb/release.py create mode 100644 web/MonitorWeb/monitorweb/static/css/style.css create mode 100644 web/MonitorWeb/monitorweb/static/images/favicon.ico create mode 100644 web/MonitorWeb/monitorweb/static/images/header_inner.png create mode 100644 web/MonitorWeb/monitorweb/static/images/info.png create mode 100644 web/MonitorWeb/monitorweb/static/images/ok.png create mode 100644 web/MonitorWeb/monitorweb/static/images/tg_under_the_hood.png create mode 100644 web/MonitorWeb/monitorweb/static/images/under_the_hood_blue.png create mode 100644 web/MonitorWeb/monitorweb/templates/.master.kid.swp create mode 100644 web/MonitorWeb/monitorweb/templates/__init__.py create mode 100644 web/MonitorWeb/monitorweb/templates/login.kid create mode 100644 web/MonitorWeb/monitorweb/templates/master.kid create mode 100644 web/MonitorWeb/monitorweb/templates/welcome.kid create mode 100644 web/MonitorWeb/monitorweb/tests/__init__.py create mode 100644 web/MonitorWeb/monitorweb/tests/test_controllers.py create mode 100644 web/MonitorWeb/monitorweb/tests/test_model.py create mode 100644 web/MonitorWeb/sample-prod.cfg create mode 100644 web/MonitorWeb/setup.py create mode 100755 web/MonitorWeb/start-monitorweb.py create mode 100644 web/MonitorWeb/test.cfg create mode 100644 web/monitorweb-httpd.conf diff --git a/web/MonitorWeb/MonitorWeb.egg-info/PKG-INFO b/web/MonitorWeb/MonitorWeb.egg-info/PKG-INFO new file mode 100644 index 0000000..594b5b8 --- /dev/null +++ b/web/MonitorWeb/MonitorWeb.egg-info/PKG-INFO @@ -0,0 +1,15 @@ +Metadata-Version: 1.0 +Name: MonitorWeb +Version: 1.0 +Summary: UNKNOWN +Home-page: UNKNOWN +Author: UNKNOWN +Author-email: UNKNOWN +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN +Classifier: Development Status :: 3 - Alpha +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Framework :: TurboGears diff --git a/web/MonitorWeb/MonitorWeb.egg-info/SOURCES.txt b/web/MonitorWeb/MonitorWeb.egg-info/SOURCES.txt new file mode 100644 index 0000000..23d914d --- /dev/null +++ b/web/MonitorWeb/MonitorWeb.egg-info/SOURCES.txt @@ -0,0 +1,21 @@ +README.txt +setup.py +MonitorWeb.egg-info/PKG-INFO +MonitorWeb.egg-info/SOURCES.txt +MonitorWeb.egg-info/dependency_links.txt +MonitorWeb.egg-info/entry_points.txt +MonitorWeb.egg-info/not-zip-safe +MonitorWeb.egg-info/paster_plugins.txt +MonitorWeb.egg-info/requires.txt +MonitorWeb.egg-info/top_level.txt +monitorweb/__init__.py +monitorweb/commands.py +monitorweb/controllers.py +monitorweb/json.py +monitorweb/model.py +monitorweb/release.py +monitorweb/config/__init__.py +monitorweb/templates/__init__.py +monitorweb/tests/__init__.py +monitorweb/tests/test_controllers.py +monitorweb/tests/test_model.py \ No newline at end of file diff --git a/web/MonitorWeb/MonitorWeb.egg-info/dependency_links.txt b/web/MonitorWeb/MonitorWeb.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/web/MonitorWeb/MonitorWeb.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/web/MonitorWeb/MonitorWeb.egg-info/entry_points.txt b/web/MonitorWeb/MonitorWeb.egg-info/entry_points.txt new file mode 100644 index 0000000..49e72a2 --- /dev/null +++ b/web/MonitorWeb/MonitorWeb.egg-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +start-monitorweb = monitorweb.commands:start + diff --git a/web/MonitorWeb/MonitorWeb.egg-info/not-zip-safe b/web/MonitorWeb/MonitorWeb.egg-info/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/web/MonitorWeb/MonitorWeb.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/web/MonitorWeb/MonitorWeb.egg-info/paster_plugins.txt b/web/MonitorWeb/MonitorWeb.egg-info/paster_plugins.txt new file mode 100644 index 0000000..89bd761 --- /dev/null +++ b/web/MonitorWeb/MonitorWeb.egg-info/paster_plugins.txt @@ -0,0 +1 @@ +TurboGears diff --git a/web/MonitorWeb/MonitorWeb.egg-info/requires.txt b/web/MonitorWeb/MonitorWeb.egg-info/requires.txt new file mode 100644 index 0000000..ca77963 --- /dev/null +++ b/web/MonitorWeb/MonitorWeb.egg-info/requires.txt @@ -0,0 +1,3 @@ +TurboGears >= 1.0.7 +SQLAlchemy>=0.3.10 +Elixir>=0.4.0 \ No newline at end of file diff --git a/web/MonitorWeb/MonitorWeb.egg-info/top_level.txt b/web/MonitorWeb/MonitorWeb.egg-info/top_level.txt new file mode 100644 index 0000000..90cbb55 --- /dev/null +++ b/web/MonitorWeb/MonitorWeb.egg-info/top_level.txt @@ -0,0 +1 @@ +monitorweb diff --git a/web/MonitorWeb/README.txt b/web/MonitorWeb/README.txt new file mode 100644 index 0000000..03cdb8d --- /dev/null +++ b/web/MonitorWeb/README.txt @@ -0,0 +1,4 @@ +MonitorWeb + +This is a TurboGears (http://www.turbogears.org) project. It can be +started by running the start-monitorweb.py script. \ No newline at end of file diff --git a/web/MonitorWeb/dev.cfg b/web/MonitorWeb/dev.cfg new file mode 100644 index 0000000..f1e675b --- /dev/null +++ b/web/MonitorWeb/dev.cfg @@ -0,0 +1,76 @@ +[global] +# This is where all of your settings go for your development environment +# Settings that are the same for both development and production +# (such as template engine, encodings, etc.) all go in +# monitorweb/config/app.cfg + +# DATABASE + +# driver://username:password@host:port/database + +# pick the form for your database +# sqlalchemy.dburi="postgres://username@hostname/databasename" +# sqlalchemy.dburi="mysql://username:password@hostname:port/databasename" +# sqlalchemy.dburi="sqlite://%(current_dir_uri)s/devdata.sqlite" + +# If you have sqlite, here's a simple default to get you started +# in development +sqlalchemy.dburi="sqlite:///devdata.sqlite" + + +# SERVER + +# Some server parameters that you may want to tweak +# server.socket_port=8080 + +# Enable the debug output at the end on pages. +# log_debug_info_filter.on = False + +server.environment="development" +autoreload.package="monitorweb" + + +server.socket_host="127.0.0.1" +server.socket_port=8080 +server.webpath="/monitor/" +base_url_filter.on = False +base_url_filter.base_url = "http://127.0.0.1:8080/monitor" +base_url_filter.use_x_forwarded_host = True + +# Auto-Reload after code modification +# autoreload.on = True + +# Set to True if you'd like to abort execution if a controller gets an +# unexpected parameter. False by default +tg.strict_parameters = True + +# LOGGING +# Logging configuration generally follows the style of the standard +# Python logging module configuration. Note that when specifying +# log format messages, you need to use *() for formatting variables. +# Deployment independent log configuration is in monitorweb/config/log.cfg +[logging] + +[[loggers]] +[[[monitorweb]]] +level='DEBUG' +qualname='monitorweb' +handlers=['debug_out'] + +[[[allinfo]]] +level='INFO' +handlers=['debug_out'] + +[[[access]]] +level='INFO' +qualname='turbogears.access' +handlers=['access_out'] +propagate=0 + + +[[[database]]] +# Set to INFO to make SQLAlchemy display SQL commands +level='ERROR' +qualname='sqlalchemy.engine' +handlers=['debug_out'] +propagate=0 diff --git a/web/MonitorWeb/monitorweb/__init__.py b/web/MonitorWeb/monitorweb/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/web/MonitorWeb/monitorweb/commands.py b/web/MonitorWeb/monitorweb/commands.py new file mode 100644 index 0000000..9e75f08 --- /dev/null +++ b/web/MonitorWeb/monitorweb/commands.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +"""This module contains functions called from console script entry points.""" + +import sys +from os import getcwd +from os.path import dirname, exists, join + +import pkg_resources +pkg_resources.require("TurboGears>=1.0.7") + +import cherrypy +import turbogears + +cherrypy.lowercase_api = True + + +class ConfigurationError(Exception): + pass + + +def start(): + """Start the CherryPy application server.""" + + setupdir = dirname(dirname(__file__)) + curdir = getcwd() + + # First look on the command line for a desired config file, + # if it's not on the command line, then look for 'setup.py' + # in the current directory. If there, load configuration + # from a file called 'dev.cfg'. If it's not there, the project + # is probably installed and we'll look first for a file called + # 'prod.cfg' in the current directory and then for a default + # config file called 'default.cfg' packaged in the egg. + if len(sys.argv) > 1: + configfile = sys.argv[1] + elif exists(join(setupdir, "setup.py")): + configfile = join(setupdir, "dev.cfg") + elif exists(join(curdir, "prod.cfg")): + configfile = join(curdir, "prod.cfg") + else: + try: + configfile = pkg_resources.resource_filename( + pkg_resources.Requirement.parse("MonitorWeb"), + "config/default.cfg") + except pkg_resources.DistributionNotFound: + raise ConfigurationError("Could not find default configuration.") + + turbogears.update_config(configfile=configfile, + modulename="monitorweb.config") + + from monitorweb.controllers import Root + + turbogears.start_server(Root()) diff --git a/web/MonitorWeb/monitorweb/config/__init__.py b/web/MonitorWeb/monitorweb/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/web/MonitorWeb/monitorweb/config/app.cfg b/web/MonitorWeb/monitorweb/config/app.cfg new file mode 100644 index 0000000..8667126 --- /dev/null +++ b/web/MonitorWeb/monitorweb/config/app.cfg @@ -0,0 +1,71 @@ +[global] +# The settings in this file should not vary depending on the deployment +# environment. dev.cfg and prod.cfg are the locations for +# the different deployment settings. Settings in this file will +# be overridden by settings in those other files. + +# The commented out values below are the defaults + +# APPLICATION PACKAGE + +package = "monitorweb" + +# VIEW + +# which view (template engine) to use if one is not specified in the +# template name +# tg.defaultview = "kid" + +# The following Kid settings determine the settings used by the Kid serializer. + +# Kid output method (e.g. html, html-strict, xhtml, xhtml-strict, xml, json) +# and formatting (e.g. default, straight, compact, newlines, wrap, nice) +# kid.outputformat="html default" + +# kid.encoding="utf-8" + +# The sitetemplate is used for overall styling of a site that +# includes multiple TurboGears applications +# tg.sitetemplate="" + +# Allow every exposed function to be called as json, +# tg.allow_json = False + +# Suppress the inclusion of the shipped MochiKit version, which is rather outdated. +# Attention: setting this to True and listing 'turbogears.mochikit' in 'tg.include_widgets' +# is a contradiction. This option will overrule the default-inclusion to prevent version +# mismatch bugs. +# tg.mochikit_suppress = True + +# List of Widgets to include on every page. +# for example ['turbogears.mochikit'] +# tg.include_widgets = [] + +# Set to True if the scheduler should be started +# tg.scheduler = False + +# Set to True to allow paginate decorator redirects when page number gets +# out of bound. Useful for getting the real page id in the url +# paginate.redirect_on_out_of_range = True + +# Set to True to allow paginate decorator redirects when last page is requested. +# This is useful for getting the real last page id in the url +# paginate.redirect_on_last_page = True + +# Set session or cookie +# session_filter.on = True + + +# compress the data sends to the web browser +# [/] +# gzip_filter.on = True +# gzip_filter.mime_types = ["application/json", "application/x-javascript", +# "text/javascript", "text/html", "text/css", "text/plain"] + +[/static] +static_filter.on = True +static_filter.dir = "%(top_level_dir)s/static" + +[/favicon.ico] +static_filter.on = True +static_filter.file = "%(top_level_dir)s/static/images/favicon.ico" diff --git a/web/MonitorWeb/monitorweb/config/log.cfg b/web/MonitorWeb/monitorweb/config/log.cfg new file mode 100644 index 0000000..ce776f8 --- /dev/null +++ b/web/MonitorWeb/monitorweb/config/log.cfg @@ -0,0 +1,29 @@ +# LOGGING +# Logging is often deployment specific, but some handlers and +# formatters can be defined here. + +[logging] +[[formatters]] +[[[message_only]]] +format='*(message)s' + +[[[full_content]]] +format='*(asctime)s *(name)s *(levelname)s *(message)s' + +[[handlers]] +[[[debug_out]]] +class='StreamHandler' +level='DEBUG' +args='(sys.stdout,)' +formatter='full_content' + +[[[access_out]]] +class='StreamHandler' +level='INFO' +args='(sys.stdout,)' +formatter='message_only' + +[[[error_out]]] +class='StreamHandler' +level='ERROR' +args='(sys.stdout,)' diff --git a/web/MonitorWeb/monitorweb/controllers.py b/web/MonitorWeb/monitorweb/controllers.py new file mode 100644 index 0000000..8d9ced5 --- /dev/null +++ b/web/MonitorWeb/monitorweb/controllers.py @@ -0,0 +1,13 @@ +import turbogears as tg +from turbogears import controllers, expose, flash +# from monitorweb import model +# import logging +# log = logging.getLogger("monitorweb.controllers") + +class Root(controllers.RootController): + @expose(template="monitorweb.templates.welcome") + def index(self): + import time + # log.debug("Happy TurboGears Controller Responding For Duty") + flash("Your application is now running") + return dict(now=time.ctime()) diff --git a/web/MonitorWeb/monitorweb/json.py b/web/MonitorWeb/monitorweb/json.py new file mode 100644 index 0000000..66d5cfb --- /dev/null +++ b/web/MonitorWeb/monitorweb/json.py @@ -0,0 +1,10 @@ +# A JSON-based API(view) for your app. +# Most rules would look like: +# @jsonify.when("isinstance(obj, YourClass)") +# def jsonify_yourclass(obj): +# return [obj.val1, obj.val2] +# @jsonify can convert your objects to following types: +# lists, dicts, numbers and strings + +from turbojson.jsonify import jsonify + diff --git a/web/MonitorWeb/monitorweb/model.py b/web/MonitorWeb/monitorweb/model.py new file mode 100644 index 0000000..b570416 --- /dev/null +++ b/web/MonitorWeb/monitorweb/model.py @@ -0,0 +1,20 @@ +import pkg_resources +pkg_resources.require("SQLAlchemy>=0.3.10") +pkg_resources.require("Elixir>=0.4.0") +# import the basic Elixir classes and functions for declaring the data model +# (see http://elixir.ematia.de/trac/wiki/TutorialDivingIn) +from elixir import Entity, Field, OneToMany, ManyToOne, ManyToMany +from elixir import options_defaults, using_options, setup_all +# import some datatypes for table columns from Elixir +# (see http://www.sqlalchemy.org/docs/04/types.html for more) +from elixir import String, Unicode, Integer, DateTime + +options_defaults['autosetup'] = False + + +# your data model + +# class YourDataClass(Entity): +# pass + + diff --git a/web/MonitorWeb/monitorweb/release.py b/web/MonitorWeb/monitorweb/release.py new file mode 100644 index 0000000..21d4758 --- /dev/null +++ b/web/MonitorWeb/monitorweb/release.py @@ -0,0 +1,14 @@ +# Release information about MonitorWeb + +version = "1.0" + +# description = "Your plan to rule the world" +# long_description = "More description about your plan" +# author = "Your Name Here" +# email = "YourEmail@YourDomain" +# copyright = "Vintage 2006 - a good year indeed" + +# if it's open source, you might want to specify these +# url = "http://yourcool.site/" +# download_url = "http://yourcool.site/download" +# license = "MIT" diff --git a/web/MonitorWeb/monitorweb/static/css/style.css b/web/MonitorWeb/monitorweb/static/css/style.css new file mode 100644 index 0000000..c98d40e --- /dev/null +++ b/web/MonitorWeb/monitorweb/static/css/style.css @@ -0,0 +1,134 @@ +/* + * Quick mash-up of CSS for the TG quick start page. + */ + +html, body { + color: black; + background-color: #ddd; + font: x-small "Lucida Grande", "Lucida Sans Unicode", geneva, verdana, sans-serif; + margin: 0; + padding: 0; +} + +td, th {padding:3px;border:none;} +tr th {text-align:left;background-color:#f0f0f0;color:#333;} +tr.odd td {background-color:#edf3fe;} +tr.even td {background-color:#fff;} + +#header { + height: 80px; + width: 777px; + background: blue URL('../images/header_inner.png') no-repeat; + border-left: 1px solid #aaa; + border-right: 1px solid #aaa; + margin: 0 auto 0 auto; +} + +a.link, a, a.active { + color: #369; +} + + +#main_content { + color: black; + font-size: 127%; + background-color: white; + width: 757px; + margin: 0 auto 0 auto; + border-left: 1px solid #aaa; + border-right: 1px solid #aaa; + padding: 10px; +} + +#sidebar { + border: 1px solid #aaa; + background-color: #eee; + margin: 0.5em; + padding: 1em; + float: right; + width: 200px; + font-size: 88%; +} + +#sidebar h2 { + margin-top: 0; +} + +#sidebar ul { + margin-left: 1.5em; + padding-left: 0; +} + +h1,h2,h3,h4,h5,h6,#getting_started_steps { + font-family: "Century Schoolbook L", Georgia, serif; + font-weight: bold; +} + +h2 { + font-size: 150%; +} + +#getting_started_steps a { + text-decoration: none; +} + +#getting_started_steps a:hover { + text-decoration: underline; +} + +#getting_started_steps li { + font-size: 80%; + margin-bottom: 0.5em; +} + +#getting_started_steps h2 { + font-size: 120%; +} + +#getting_started_steps p { + font: 100% "Lucida Grande", "Lucida Sans Unicode", geneva, verdana, sans-serif; +} + +#footer { + border: 1px solid #aaa; + border-top: 0px none; + color: #999; + background-color: white; + padding: 10px; + font-size: 80%; + text-align: center; + width: 757px; + margin: 0 auto 1em auto; +} + +.code { + font-family: monospace; +} + +span.code { + font-weight: bold; + background: #eee; +} + +#status_block { + margin: 0 auto 0.5em auto; + padding: 15px 10px 15px 55px; + background: #cec URL('../images/ok.png') left center no-repeat; + border: 1px solid #9c9; + width: 450px; + font-size: 120%; + font-weight: bolder; +} + +.notice { + margin: 0.5em auto 0.5em auto; + padding: 15px 10px 15px 55px; + width: 450px; + background: #eef URL('../images/info.png') left center no-repeat; + border: 1px solid #cce; +} + +.fielderror { + color: red; + font-weight: bold; +} \ No newline at end of file diff --git a/web/MonitorWeb/monitorweb/static/images/favicon.ico b/web/MonitorWeb/monitorweb/static/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..332557bc307647601389c14939be0671c62efcd7 GIT binary patch literal 1081 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 literal 0 HcmV?d00001 diff --git a/web/MonitorWeb/monitorweb/static/images/ok.png b/web/MonitorWeb/monitorweb/static/images/ok.png new file mode 100644 index 0000000000000000000000000000000000000000..fee6751c3dd915e55da53ed6a1e7b5809cc76b63 GIT binary patch literal 25753 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 literal 0 HcmV?d00001 diff --git a/web/MonitorWeb/monitorweb/static/images/tg_under_the_hood.png b/web/MonitorWeb/monitorweb/static/images/tg_under_the_hood.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9c79cc6141a67a21edaffc9a068ebd0899eb46 GIT binary patch literal 4010 zcmV;b4^{AqP)*YDvbIYV`E zcS*)_N8;Vt-{0T4i*l)rclP%7^78WR?CkR9;P$YDnnM-rm~X_Hf?6gCgI!D3*xIvn zQ{CO&=H}+Sp@`Jf)V8Uj(#^}_=IZF^=*z;rmu*C&dQ{-x;HiUM_4)eK$-?jO@apR7 z4`B0d{{=xteoB8;=Pe*n1FP(i(`00 zCd0L>(Y~|l?(u6oA$UtP`27CBuA8AxB)zPixrJ$+S~$(6kGzasu$G0tl6vUv@2XQK zfQ>0ljtdM-Vqm#KFMX+T796(dp~%*3;2vD+#Qelyox?%EiL-_V~t;T(y5=&(hTV{{OkB zo72X-v!k2Uw4&C#tI^Wbv{xzOdCvVzK(S3?e5yiz@JVdkvR$b{r=6)&)weN*q>+N;^X!7@z~DD_xk&9Kqikt z9OvrnwqG-EM=`>±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 literal 0 HcmV?d00001 diff --git a/web/MonitorWeb/monitorweb/templates/__init__.py b/web/MonitorWeb/monitorweb/templates/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/web/MonitorWeb/monitorweb/templates/login.kid b/web/MonitorWeb/monitorweb/templates/login.kid new file mode 100644 index 0000000..eb55735 --- /dev/null +++ b/web/MonitorWeb/monitorweb/templates/login.kid @@ -0,0 +1,114 @@ + + + + + + Login + + + + +
+

Login

+

${message}

+
+ + + + + + + + + + + + +
+ + + +
+ + + +
+ +
+ + + +
+ +
+
+
+ + diff --git a/web/MonitorWeb/monitorweb/templates/master.kid b/web/MonitorWeb/monitorweb/templates/master.kid new file mode 100644 index 0000000..ba39836 --- /dev/null +++ b/web/MonitorWeb/monitorweb/templates/master.kid @@ -0,0 +1,50 @@ + + + + + + + Your title goes here + + + + + + +
+ + Login + + + Welcome ${tg.identity.user.display_name or tg.identity.user.user_name}. + Logout + +
+ + + +
+
+
page content
+
+ + + + + diff --git a/web/MonitorWeb/monitorweb/templates/welcome.kid b/web/MonitorWeb/monitorweb/templates/welcome.kid new file mode 100644 index 0000000..9095267 --- /dev/null +++ b/web/MonitorWeb/monitorweb/templates/welcome.kid @@ -0,0 +1,47 @@ + + + + +Welcome to TurboGears + + + + +
+
    +
  1. +

    Model

    +

    Design models in the model.py.
    + Edit dev.cfg to use a different backend, or start with a pre-configured SQLite database.
    + Use script tg-admin sql create to create the database tables.

    +
  2. +
  3. +

    View

    +

    Edit html-like templates in the /templates folder;
    + Put all static contents in the /static folder.

    +
  4. +
  5. +

    Controller

    +

    Edit controllers.py and build your + website structure with the simplicity of Python objects.
    + TurboGears will automatically reload itself when you modify your project.

    +
  6. +
+
If you create something cool, please let people know, and consider contributing something back to the community.
+
+ + + diff --git a/web/MonitorWeb/monitorweb/tests/__init__.py b/web/MonitorWeb/monitorweb/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/web/MonitorWeb/monitorweb/tests/test_controllers.py b/web/MonitorWeb/monitorweb/tests/test_controllers.py new file mode 100644 index 0000000..74070a2 --- /dev/null +++ b/web/MonitorWeb/monitorweb/tests/test_controllers.py @@ -0,0 +1,32 @@ +import unittest +import turbogears +from turbogears import testutil +from monitorweb.controllers import Root +import cherrypy + +cherrypy.root = Root() + +class TestPages(unittest.TestCase): + + def setUp(self): + turbogears.startup.startTurboGears() + + def tearDown(self): + """Tests for apps using identity need to stop CP/TG after each test to + stop the VisitManager thread. + See http://trac.turbogears.org/turbogears/ticket/1217 for details. + """ + turbogears.startup.stopTurboGears() + + def test_method(self): + "the index method should return a string called now" + import types + result = testutil.call(cherrypy.root.index) + assert type(result["now"]) == types.StringType + + def test_indextitle(self): + "The indexpage should have the right title" + testutil.create_request("/") + response = cherrypy.response.body[0].lower() + assert "welcome to turbogears" in response + diff --git a/web/MonitorWeb/monitorweb/tests/test_model.py b/web/MonitorWeb/monitorweb/tests/test_model.py new file mode 100644 index 0000000..02e4d43 --- /dev/null +++ b/web/MonitorWeb/monitorweb/tests/test_model.py @@ -0,0 +1,22 @@ +# If your project uses a database, you can set up database tests +# similar to what you see below. Be sure to set the db_uri to +# an appropriate uri for your testing database. sqlite is a good +# choice for testing, because you can use an in-memory database +# which is very fast. + +from turbogears import testutil, database +# from monitorweb.model import YourDataClass, User + +# database.set_db_uri("sqlite:///:memory:") + +# class TestUser(testutil.DBTest): +# def get_model(self): +# return User +# def test_creation(self): +# "Object creation should set the name" +# obj = User(user_name = "creosote", +# email_address = "spam@python.not", +# display_name = "Mr Creosote", +# password = "Wafer-thin Mint") +# assert obj.display_name == "Mr Creosote" + diff --git a/web/MonitorWeb/sample-prod.cfg b/web/MonitorWeb/sample-prod.cfg new file mode 100644 index 0000000..be2bdb2 --- /dev/null +++ b/web/MonitorWeb/sample-prod.cfg @@ -0,0 +1,77 @@ +[global] +# This is where all of your settings go for your production environment. +# You'll copy this file over to your production server and provide it +# as a command-line option to your start script. +# Settings that are the same for both development and production +# (such as template engine, encodings, etc.) all go in +# monitorweb/config/app.cfg + +# DATABASE + +# driver://username:password@host:port/database + +# pick the form for your database +# sqlalchemy.dburi="postgres://username@hostname/databasename" +# sqlalchemy.dburi="mysql://username:password@hostname:port/databasename" +# sqlalchemy.dburi="sqlite:///file_name_and_path" + +# If you have sqlite, here's a simple default to get you started +# in development +sqlalchemy.dburi="sqlite:///%(current_dir_uri)s/devdata.sqlite" + + +# SERVER + +server.environment="production" + +# Sets the number of threads the server uses +# server.thread_pool = 1 + +# if this is part of a larger site, you can set the path +# to the TurboGears instance here +# server.webpath="" + +# Set to True if you are deploying your App behind a proxy +# e.g. Apache using mod_proxy +# base_url_filter.on = False + +# Set to True if your proxy adds the x_forwarded_host header +# base_url_filter.use_x_forwarded_host = True + +# If your proxy does not add the x_forwarded_host header, set +# the following to the *public* host url. +# (Note: This will be overridden by the use_x_forwarded_host option +# if it is set to True and the proxy adds the header correctly. +# base_url_filter.base_url = "http://www.example.com" + +# Set to True if you'd like to abort execution if a controller gets an +# unexpected parameter. False by default +# tg.strict_parameters = False + +# LOGGING +# Logging configuration generally follows the style of the standard +# Python logging module configuration. Note that when specifying +# log format messages, you need to use *() for formatting variables. +# Deployment independent log configuration is in monitorweb/config/log.cfg +[logging] + +[[handlers]] + +[[[access_out]]] +# set the filename as the first argument below +args="('server.log',)" +class='FileHandler' +level='INFO' +formatter='message_only' + +[[loggers]] +[[[monitorweb]]] +level='ERROR' +qualname='monitorweb' +handlers=['error_out'] + +[[[access]]] +level='INFO' +qualname='turbogears.access' +handlers=['access_out'] +propagate=0 diff --git a/web/MonitorWeb/setup.py b/web/MonitorWeb/setup.py new file mode 100644 index 0000000..fb2ed15 --- /dev/null +++ b/web/MonitorWeb/setup.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- + +from setuptools import setup, find_packages +from turbogears.finddata import find_package_data + +import os +execfile(os.path.join("monitorweb", "release.py")) + +packages=find_packages() +package_data = find_package_data(where='monitorweb', + package='monitorweb') +if os.path.isdir('locales'): + packages.append('locales') + package_data.update(find_package_data(where='locales', + exclude=('*.po',), only_in_packages=False)) + +setup( + name="MonitorWeb", + version=version, + # uncomment the following lines if you fill them out in release.py + #description=description, + #author=author, + #author_email=email, + #url=url, + #download_url=download_url, + #license=license, + + install_requires=[ + "TurboGears >= 1.0.7", + "SQLAlchemy>=0.3.10", + "Elixir>=0.4.0", + ], + zip_safe=False, + packages=packages, + package_data=package_data, + keywords=[ + # Use keywords if you'll be adding your package to the + # Python Cheeseshop + + # if this has widgets, uncomment the next line + # 'turbogears.widgets', + + # if this has a tg-admin command, uncomment the next line + # 'turbogears.command', + + # if this has identity providers, uncomment the next line + # 'turbogears.identity.provider', + + # If this is a template plugin, uncomment the next line + # 'python.templating.engines', + + # If this is a full application, uncomment the next line + # 'turbogears.app', + ], + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Framework :: TurboGears', + # if this is an application that you'll distribute through + # the Cheeseshop, uncomment the next line + # 'Framework :: TurboGears :: Applications', + + # if this is a package that includes widgets that you'll distribute + # through the Cheeseshop, uncomment the next line + # 'Framework :: TurboGears :: Widgets', + ], + test_suite='nose.collector', + entry_points = { + 'console_scripts': [ + 'start-monitorweb = monitorweb.commands:start', + ], + }, + # Uncomment next line and create a default.cfg file in your project dir + # if you want to package a default configuration in your egg. + #data_files = [('config', ['default.cfg'])], + ) diff --git a/web/MonitorWeb/start-monitorweb.py b/web/MonitorWeb/start-monitorweb.py new file mode 100755 index 0000000..b68edbf --- /dev/null +++ b/web/MonitorWeb/start-monitorweb.py @@ -0,0 +1,18 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +"""Start script for the MonitorWeb TurboGears project. + +This script is only needed during development for running from the project +directory. When the project is installed, easy_install will create a +proper start script. +""" + +import sys +from monitorweb.commands import start, ConfigurationError + +if __name__ == "__main__": + try: + start() + except ConfigurationError, exc: + sys.stderr.write(str(exc)) + sys.exit(1) diff --git a/web/MonitorWeb/test.cfg b/web/MonitorWeb/test.cfg new file mode 100644 index 0000000..e99d1a9 --- /dev/null +++ b/web/MonitorWeb/test.cfg @@ -0,0 +1,32 @@ +[global] +# You can place test-specific configuration options here (like test db uri, etc) + +# DATABASE + +sqlalchemy.dburi = "sqlite:///:memory:" + +# LOGGING + +[logging] + +[[formatters]] +[[[full_content]]] +format='*(asctime)s *(name)s *(levelname)s *(message)s' + +[[handlers]] +[[[test_out]]] +class='StreamHandler' +level='DEBUG' +args='(sys.stdout,)' +formatter='full_content' + +[[loggers]] +[[[monitorweb]]] +level='DEBUG' +qualname='monitorweb' +handlers=['test_out'] + +[[[turbogears]]] +level='INFO' +qualname='turbogears' +handlers=['test_out'] diff --git a/web/monitorweb-httpd.conf b/web/monitorweb-httpd.conf new file mode 100644 index 0000000..ee84b73 --- /dev/null +++ b/web/monitorweb-httpd.conf @@ -0,0 +1,33 @@ +NameVirtualHost 128.112.139.116:80 + + + ServerName pl-virtual-06.cs.princeton.edu + ServerAdmin soltesz@cs.princeton.edu + UseCanonicalName Off + ServerSignature Off + + DocumentRoot /usr/share/monitor/tgweb/MonitorWeb/monitorweb + + + Options Indexes FollowSymLinks + AllowOverride None + Order allow,deny + Allow from all + + + Errorlog /var/log/httpd/monitorwebapp-error_log + Customlog /var/log/httpd/monitorwebapp-access_log common + + AddDefaultCharset utf-8 + + # Load everything out of the DocumentRoot that is static + ProxyPass /monitor/static ! + + ProxyPass /monitor http://127.0.0.1:8080/ + ProxyPassReverse /monitor http://127.0.0.1:8080/ + ProxyPass /monitor/ http://127.0.0.1:8080/ + ProxyPassReverse /monitor/ http://127.0.0.1:8080/ + ProxyPreserveHost On + ProxyRequests Off + + -- 2.47.0