Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
slapos-caddy
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Guillaume Hervier
slapos-caddy
Commits
3422b8fa
Commit
3422b8fa
authored
Jun 17, 2014
by
Kazuhiko Shiozaki
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master' into erp5-component
parents
4aa021e0
e2f33e64
Changes
15
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
227 additions
and
40 deletions
+227
-40
software/apache-frontend/common.cfg
software/apache-frontend/common.cfg
+1
-1
software/apache-frontend/instance-apache-frontend.cfg
software/apache-frontend/instance-apache-frontend.cfg
+12
-0
stack/monitor/buildout.cfg
stack/monitor/buildout.cfg
+29
-12
stack/monitor/monitor.cfg.in
stack/monitor/monitor.cfg.in
+16
-7
stack/monitor/webfile-directory/index.cgi.in
stack/monitor/webfile-directory/index.cgi.in
+2
-2
stack/monitor/webfile-directory/index.html.jinja2
stack/monitor/webfile-directory/index.html.jinja2
+4
-4
stack/monitor/webfile-directory/monitor-password.cgi.in
stack/monitor/webfile-directory/monitor-password.cgi.in
+4
-4
stack/monitor/webfile-directory/settings.cgi.in
stack/monitor/webfile-directory/settings.cgi.in
+6
-6
stack/monitor/webfile-directory/static/monitor-register.js
stack/monitor/webfile-directory/static/monitor-register.js
+17
-0
stack/monitor/webfile-directory/static/pure-min.css
stack/monitor/webfile-directory/static/pure-min.css
+11
-0
stack/monitor/webfile-directory/static/script.js
stack/monitor/webfile-directory/static/script.js
+35
-0
stack/monitor/webfile-directory/static/style.css
stack/monitor/webfile-directory/static/style.css
+31
-0
stack/monitor/webfile-directory/static/welcome.html
stack/monitor/webfile-directory/static/welcome.html
+11
-0
stack/monitor/webfile-directory/status-history.cgi.in
stack/monitor/webfile-directory/status-history.cgi.in
+44
-0
stack/monitor/webfile-directory/status.cgi.in
stack/monitor/webfile-directory/status.cgi.in
+4
-4
No files found.
software/apache-frontend/common.cfg
View file @
3422b8fa
...
@@ -67,7 +67,7 @@ mode = 0644
...
@@ -67,7 +67,7 @@ mode = 0644
[template-apache-frontend]
[template-apache-frontend]
recipe = slapos.recipe.template
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance-apache-frontend.cfg
url = ${:_profile_base_location_}/instance-apache-frontend.cfg
md5sum =
b823cb31ff97700c009cf14725690323
md5sum =
070275aa2b2941702cc9ec637fe778e1
output = ${buildout:directory}/template-apache-frontend.cfg
output = ${buildout:directory}/template-apache-frontend.cfg
mode = 0644
mode = 0644
...
...
software/apache-frontend/instance-apache-frontend.cfg
View file @
3422b8fa
...
@@ -39,6 +39,7 @@ parts =
...
@@ -39,6 +39,7 @@ parts =
deploy-index
deploy-index
deploy-settings-cgi
deploy-settings-cgi
deploy-status-cgi
deploy-status-cgi
deploy-status-history-cgi
setup-static-files
setup-static-files
certificate-authority
certificate-authority
zero-parameters
zero-parameters
...
@@ -52,6 +53,7 @@ parts =
...
@@ -52,6 +53,7 @@ parts =
monitor-backup-log-access
monitor-backup-log-access
monitor-ats-cache-stats-wrapper
monitor-ats-cache-stats-wrapper
monitor-apache-configuration-verification
monitor-apache-configuration-verification
monitor-verify-re6st-connectivity
extends = ${monitor-template:output}
extends = ${monitor-template:output}
...
@@ -629,3 +631,13 @@ mode = 0700
...
@@ -629,3 +631,13 @@ mode = 0700
command = echo "<pre>$($${apache-configuration:frontend-configuration-verification})</pre>"
command = echo "<pre>$($${apache-configuration:frontend-configuration-verification})</pre>"
extra-context =
extra-context =
key content :command
key content :command
[monitor-verify-re6st-connectivity]
recipe = slapos.cookbook:check_url_available
path = $${monitor-directory:monitor-custom-scripts}/re6st-connectivity
url = $${public:re6st-verification-url}
dash_path = ${dash:location}/bin/dash
curl_path = ${curl:location}/bin/curl
[public]
re6st-verification-url = http://[2001:67c:1254:4::1]/index.html
stack/monitor/buildout.cfg
View file @
3422b8fa
...
@@ -10,7 +10,6 @@ extends =
...
@@ -10,7 +10,6 @@ extends =
parts =
parts =
slapos-cookbook
slapos-cookbook
dcron
dcron
download-static-files
monitor-eggs
monitor-eggs
extra-eggs
extra-eggs
monitor-bin
monitor-bin
...
@@ -42,7 +41,7 @@ recipe = slapos.recipe.template
...
@@ -42,7 +41,7 @@ recipe = slapos.recipe.template
url = ${:_profile_base_location_}/monitor.cfg.in
url = ${:_profile_base_location_}/monitor.cfg.in
output = ${buildout:directory}/monitor.cfg
output = ${buildout:directory}/monitor.cfg
filename = monitor.cfg
filename = monitor.cfg
md5sum =
499ba647f0c22f16bea3cc88bdfd98e8
md5sum =
0fe5b78cd16df190ec8838116954669e
mode = 0644
mode = 0644
[monitor-bin]
[monitor-bin]
...
@@ -58,7 +57,7 @@ mode = 0644
...
@@ -58,7 +57,7 @@ mode = 0644
recipe = hexagonit.recipe.download
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfile-directory/${:filename}
url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true
download-only = true
md5sum =
cd649264b331499241abfcdb4e81672a
md5sum =
af1adc107b73290afb98d011f7307de1
destination = ${buildout:directory}/parts/monitor-index
destination = ${buildout:directory}/parts/monitor-index
filename = index.cgi.in
filename = index.cgi.in
mode = 0644
mode = 0644
...
@@ -68,7 +67,7 @@ recipe = hexagonit.recipe.download
...
@@ -68,7 +67,7 @@ recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfile-directory/${:filename}
url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true
download-only = true
destination = ${buildout:directory}/parts/monitor-template-index
destination = ${buildout:directory}/parts/monitor-template-index
md5sum =
e0d2aaeffc046b2ac6d9d717e1ba321d
md5sum =
05051a2ff81ce7dc2eef3106d75b33f9
filename = index.html.jinja2
filename = index.html.jinja2
mode = 0644
mode = 0644
...
@@ -76,16 +75,25 @@ mode = 0644
...
@@ -76,16 +75,25 @@ mode = 0644
recipe = hexagonit.recipe.download
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfile-directory/${:filename}
url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true
download-only = true
md5sum =
4fb26753ee669b8ac90ffe33dbd12e8f
md5sum =
e43d79bec8824265e22df7960744113a
destination = ${buildout:directory}/parts/monitor-template-status-cgi
destination = ${buildout:directory}/parts/monitor-template-status-cgi
filename = status.cgi.in
filename = status.cgi.in
mode = 0644
mode = 0644
[status-history-cgi]
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true
md5sum = fa8ec5aa5395b1bc6b9c7e898d6c5ec5
destination = ${buildout:directory}/parts/monitor-template-status-history-cgi
filename = status-history.cgi.in
mode = 0644
[settings-cgi]
[settings-cgi]
recipe = hexagonit.recipe.download
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfile-directory/${:filename}
url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true
download-only = true
md5sum =
f19c8e4b94718d475520618ae57338c
8
md5sum =
b4cef123a3273e848e8fe496e22b20a
8
destination = ${buildout:directory}/parts/monitor-template-settings-cgi
destination = ${buildout:directory}/parts/monitor-template-settings-cgi
filename = settings.cgi.in
filename = settings.cgi.in
mode = 0644
mode = 0644
...
@@ -94,7 +102,7 @@ mode = 0644
...
@@ -94,7 +102,7 @@ mode = 0644
recipe = hexagonit.recipe.download
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfile-directory/${:filename}
url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true
download-only = true
md5sum =
1a6153908934bf77e3e033eeabdc1675
md5sum =
c7ba7ecb09d0d1d24e7cb73a212cc33f
destination = ${buildout:directory}/parts/monitor-template-monitor-password-cgi
destination = ${buildout:directory}/parts/monitor-template-monitor-password-cgi
filename = monitor-password.cgi.in
filename = monitor-password.cgi.in
mode = 0644
mode = 0644
...
@@ -115,11 +123,20 @@ output = $${directory:services}/crond
...
@@ -115,11 +123,20 @@ output = $${directory:services}/crond
mode = 0700
mode = 0700
logfile = $${directory:log}/crond.log
logfile = $${directory:log}/crond.log
[download-
static-files
]
[download-
monitor-static
]
recipe = hexagonit.recipe.download
recipe = hexagonit.recipe.download
url = https://github.com/SlapOS/staticForMonitoring/blob/8b7050faa2dd22592766e25b66b9efe0d0b216c9/static-files.tar.gz?raw=true
url = http://git.erp5.org/gitweb/slapos.git/snapshot/930be99041ea26b7b1186830e5eb56ef0acc1bdf.tar.gz
download-only = true
download-only = false
md5sum = 05030ff31dc75c2b96559dedc70945f5
filename = monitor-static.tar.gz
filename = static-files.tar.gz
destination = ${buildout:directory}/parts/monitor-static-files
destination = ${buildout:directory}/parts/monitor-static-files
ignore-existing = true
strip-top-level-dir = true
mode = 0644
[download-monitor-jquery]
recipe = hexagonit.recipe.download
url = http://code.jquery.com/jquery-1.10.2.min.js
download-only = true
destination = ${download-monitor-static:destination}
filename = jquery-1.10.2.min.js
mode = 0644
mode = 0644
stack/monitor/monitor.cfg.in
View file @
3422b8fa
...
@@ -87,12 +87,9 @@ frequency = */5 * * * *
...
@@ -87,12 +87,9 @@ frequency = */5 * * * *
command = $${make-rss:rendered}
command = $${make-rss:rendered}
[setup-static-files]
[setup-static-files]
recipe = hexagonit.recipe.download
recipe = plone.recipe.command
url = ${download-static-files:destination}/${download-static-files:filename}
command = ln -s ${download-monitor-jquery:destination} $${monitor-directory:www}/static
filename = static
update-command = $${:command}
destination = $${monitor-directory:www}
ignore-existing = true
mode = 0644
[deploy-index]
[deploy-index]
recipe = slapos.recipe.template:jinja2
recipe = slapos.recipe.template:jinja2
...
@@ -107,7 +104,7 @@ context =
...
@@ -107,7 +104,7 @@ context =
key monitor_password_script_path deploy-monitor-password-cgi:rendered
key monitor_password_script_path deploy-monitor-password-cgi:rendered
key apache_update_command :update-apache-access
key apache_update_command :update-apache-access
raw extra_eggs_interpreter ${buildout:directory}/bin/${extra-eggs:interpreter}
raw extra_eggs_interpreter ${buildout:directory}/bin/${extra-eggs:interpreter}
raw default_page /welcome.html
raw default_page /
static/
welcome.html
[deploy-index-template]
[deploy-index-template]
recipe = hexagonit.recipe.download
recipe = hexagonit.recipe.download
...
@@ -130,6 +127,17 @@ context =
...
@@ -130,6 +127,17 @@ context =
key this_file :filename
key this_file :filename
raw python_executable ${buildout:executable}
raw python_executable ${buildout:executable}
[deploy-status-history-cgi]
recipe = slapos.recipe.template:jinja2
template = ${status-history-cgi:location}/${status-history-cgi:filename}
rendered = $${monitor-directory:monitoring-cgi}/$${:filename}
filename = status-history.cgi
mode = 0744
context =
key monitor_db_path monitor-parameters:db-path
key status_history_length zero-parameters:status-history-length
raw python_executable ${buildout:executable}
[deploy-settings-cgi]
[deploy-settings-cgi]
recipe = slapos.recipe.template:jinja2
recipe = slapos.recipe.template:jinja2
template = ${settings-cgi:location}/${settings-cgi:filename}
template = ${settings-cgi:location}/${settings-cgi:filename}
...
@@ -220,6 +228,7 @@ name = example.com
...
@@ -220,6 +228,7 @@ name = example.com
[public]
[public]
recipe = slapos.cookbook:zero-knowledge.write
recipe = slapos.cookbook:zero-knowledge.write
filename = knowledge0.cfg
filename = knowledge0.cfg
status-history-length = 5
[zero-parameters]
[zero-parameters]
recipe = slapos.cookbook:zero-knowledge.read
recipe = slapos.cookbook:zero-knowledge.read
...
...
stack/monitor/webfile-directory/index.cgi.in
View file @
3422b8fa
...
@@ -161,8 +161,8 @@ if not is_password_set():
...
@@ -161,8 +161,8 @@ if not is_password_set():
elif not check_password(password):
elif not check_password(password):
print "
<html><head>
"
print "
<html><head>
"
print """
print """
<link
rel=
"stylesheet"
href=
"pure-min.css"
>
<link
rel=
"stylesheet"
href=
"
static/
pure-min.css"
>
<link
rel=
"stylesheet"
href=
"/style.css"
>
"""
<link
rel=
"stylesheet"
href=
"
static
/style.css"
>
"""
print "
</head><body>
"
print "
</head><body>
"
if password is None:
if password is None:
print "
<h1>
This is the monitoring interface
</h1>
"
print "
<h1>
This is the monitoring interface
</h1>
"
...
...
stack/monitor/webfile-directory/index.html.jinja2
View file @
3422b8fa
<html>
<html>
<head>
<head>
<title>
Monitoring Interface
</title>
<title>
Monitoring Interface
</title>
<link
rel=
"stylesheet"
href=
"pure-min.css"
>
<link
rel=
"stylesheet"
href=
"
static/
pure-min.css"
>
<link
rel=
"stylesheet"
href=
"/style.css"
>
<link
rel=
"stylesheet"
href=
"
static
/style.css"
>
<script
src=
"jquery-1.10.2.min.js"
></script>
<script
src=
"
static/
jquery-1.10.2.min.js"
></script>
<script
src=
"script.js"
></script>
<script
src=
"s
tatic/s
cript.js"
></script>
</head>
</head>
<body>
<body>
<div
id=
"div-menu"
>
<div
id=
"div-menu"
>
...
...
stack/monitor/webfile-directory/monitor-password.cgi.in
View file @
3422b8fa
...
@@ -6,9 +6,9 @@ cgitb.enable()
...
@@ -6,9 +6,9 @@ cgitb.enable()
print "
<html><head>
"
print "
<html><head>
"
print """
print """
<script
type=
"text/javascript"
src=
"/jquery-1.10.2.min.js"
></script>
<script
type=
"text/javascript"
src=
"
static
/jquery-1.10.2.min.js"
></script>
<link
rel=
"stylesheet"
href=
"pure-min.css"
>
<link
rel=
"stylesheet"
href=
"
static/
pure-min.css"
>
<link
rel=
"stylesheet"
href=
"/style.css"
>
"""
<link
rel=
"stylesheet"
href=
"
static
/style.css"
>
"""
print "
</head><body>
"
print "
</head><body>
"
print "
<h1>
This is the monitoring interface
</h1>
"
print "
<h1>
This is the monitoring interface
</h1>
"
print "
<h2>
Please set your password for later access
</h2>
"
print "
<h2>
Please set your password for later access
</h2>
"
...
@@ -24,6 +24,6 @@ print """
...
@@ -24,6 +24,6 @@ print """
<div
class=
"pure-controls"
>
<div
class=
"pure-controls"
>
<button
id=
"register-button"
type=
"submit"
class=
"pure-button pure-button-primary"
disabled
>
Access
</button></div>
<button
id=
"register-button"
type=
"submit"
class=
"pure-button pure-button-primary"
disabled
>
Access
</button></div>
</form>
</form>
<script
type=
"text/javascript"
src=
"monitor-register.js"
></script>
<script
type=
"text/javascript"
src=
"
static/
monitor-register.js"
></script>
</body></html>
</body></html>
"""
"""
stack/monitor/webfile-directory/settings.cgi.in
View file @
3422b8fa
...
@@ -9,8 +9,8 @@ cgitb.enable()
...
@@ -9,8 +9,8 @@ cgitb.enable()
form = cgi.FieldStorage()
form = cgi.FieldStorage()
print "
<html><head>
"
print "
<html><head>
"
print "
<link
rel=
\"stylesheet\"
href=
\"pure-min.css\"
>
"
print "
<link
rel=
\"stylesheet\"
href=
\"
static/
pure-min.css\"
>
"
print "
<link
rel=
\"stylesheet\"
href=
\"/style.css\"
>
"
print "
<link
rel=
\"stylesheet\"
href=
\"
static
/style.css\"
>
"
print "
</head><body>
"
print "
</head><body>
"
config_file = "{{ config_cfg }}"
config_file = "{{ config_cfg }}"
...
@@ -44,8 +44,8 @@ print "<form action=\"/index.cgi\" method=\"post\" class=\"pure-form-aligned\">"
...
@@ -44,8 +44,8 @@ print "<form action=\"/index.cgi\" method=\"post\" class=\"pure-form-aligned\">"
print "
<input
type=
\"hidden\"
name=
\"posting-script\"
value=
\"{{
pwd
}}/{{
this_file
}}\"
>
"
print "
<input
type=
\"hidden\"
name=
\"posting-script\"
value=
\"{{
pwd
}}/{{
this_file
}}\"
>
"
for option in parser.options("public"):
for option in parser.options("public"):
print "
<div
class=
\"pure-control-group\"
>
"
print "
<div
class=
\"pure-control-group\"
>
"
print "
<label
for=
\"%s\"
>
%s
</label>
"
%(option, option
)
print "
<label
for=
\"%s\"
>
%s
</label>
"
% (cgi.escape(option, quote=True), cgi.escape(option)
)
print "
<input
type=
\"text\"
name=
\"%s\"
value=
\"%s\"
>
"
%(option, parser.get('public', option
))
print "
<input
type=
\"text\"
name=
\"%s\"
value=
\"%s\"
>
"
% (cgi.escape(option, quote=True), cgi.escape(parser.get('public', option), quote=True
))
print "
</div>
"
print "
</div>
"
print "
<div
class=
\"pure-controls\"
><button
type=
\"submit\"
class=
\"pure-button
\
print "
<div
class=
\"pure-controls\"
><button
type=
\"submit\"
class=
\"pure-button
\
pure-button-primary
\"
>
Save
</button></div></form>
"
pure-button-primary
\"
>
Save
</button></div></form>
"
...
@@ -56,8 +56,8 @@ for section in parser.sections():
...
@@ -56,8 +56,8 @@ for section in parser.sections():
if section != 'public':
if section != 'public':
for option in parser.options(section):
for option in parser.options(section):
print "
<div
class=
\"pure-control-group\"
>
"
print "
<div
class=
\"pure-control-group\"
>
"
print "
<label
for=
\"%s\"
>
%s
</label>
"
%(option, option
)
print "
<label
for=
\"%s\"
>
%s
</label>
"
% (cgi.escape(option, quote=True), cgi.escape(option)
)
print "
<input
type=
\"text\"
name=
\"%s\"
value=
\"%s\"
readonly
>
"
%(option, parser.get(section, option
))
print "
<input
type=
\"text\"
name=
\"%s\"
value=
\"%s\"
readonly
>
"
%(cgi.escape(option, quote=True), cgi.escape(parser.get(section, option), quote=True
))
print "
</div>
"
print "
</div>
"
print "
</form>
"
print "
</form>
"
...
...
stack/monitor/webfile-directory/static/monitor-register.js
0 → 100644
View file @
3422b8fa
$
(
window
).
load
(
function
(){
$
(
document
).
ready
(
function
()
{
$
(
"
#password_2
"
).
keyup
(
validate
);
});
function
validate
()
{
var
password1
=
$
(
"
#password
"
).
val
();
var
password2
=
$
(
"
#password_2
"
).
val
();
if
(
password1
==
password2
)
{
$
(
"
#register-button
"
).
removeAttr
(
"
disabled
"
);
$
(
"
#validate-status
"
).
attr
(
"
style
"
,
"
display:none
"
);
}
else
{
$
(
"
#register-button
"
).
attr
(
"
disabled
"
,
"
disabled
"
);
$
(
"
#validate-status
"
).
attr
(
"
style
"
,
""
).
text
(
"
Passwords do not match
"
);
}
}
});
\ No newline at end of file
stack/monitor/webfile-directory/static/pure-min.css
0 → 100644
View file @
3422b8fa
/*!
Pure v0.3.0
Copyright 2013 Yahoo! Inc. All rights reserved.
Licensed under the BSD License.
https://github.com/yui/pure/blob/master/LICENSE.md
*/
/*!
normalize.css v1.1.2 | MIT License | git.io/normalize
Copyright (c) Nicolas Gallagher and Jonathan Neal
*/
/*! normalize.css v1.1.2 | MIT License | git.io/normalize */
article
,
aside
,
details
,
figcaption
,
figure
,
footer
,
header
,
hgroup
,
main
,
nav
,
section
,
summary
{
display
:
block
}
audio
,
canvas
,
video
{
display
:
inline-block
;
*
display
:
inline
;
*
zoom
:
1
}
audio
:not
([
controls
])
{
display
:
none
;
height
:
0
}
[
hidden
]
{
display
:
none
}
html
{
font-size
:
100%
;
-ms-text-size-adjust
:
100%
;
-webkit-text-size-adjust
:
100%
}
html
,
button
,
input
,
select
,
textarea
{
font-family
:
sans-serif
}
body
{
margin
:
0
}
a
:focus
{
outline
:
thin
dotted
}
a
:active
,
a
:hover
{
outline
:
0
}
h1
{
font-size
:
2em
;
margin
:
.67em
0
}
h2
{
font-size
:
1.5em
;
margin
:
.83em
0
}
h3
{
font-size
:
1.17em
;
margin
:
1em
0
}
h4
{
font-size
:
1em
;
margin
:
1.33em
0
}
h5
{
font-size
:
.83em
;
margin
:
1.67em
0
}
h6
{
font-size
:
.67em
;
margin
:
2.33em
0
}
abbr
[
title
]
{
border-bottom
:
1px
dotted
}
b
,
strong
{
font-weight
:
700
}
blockquote
{
margin
:
1em
40px
}
dfn
{
font-style
:
italic
}
hr
{
-moz-box-sizing
:
content-box
;
box-sizing
:
content-box
;
height
:
0
}
mark
{
background
:
#ff0
;
color
:
#000
}
p
,
pre
{
margin
:
1em
0
}
code
,
kbd
,
pre
,
samp
{
font-family
:
monospace
,
serif
;
_font-family
:
'courier new'
,
monospace
;
font-size
:
1em
}
pre
{
white-space
:
pre
;
white-space
:
pre-wrap
;
word-wrap
:
break-word
}
q
{
quotes
:
none
}
q
:before
,
q
:after
{
content
:
''
;
content
:
none
}
small
{
font-size
:
80%
}
sub
,
sup
{
font-size
:
75%
;
line-height
:
0
;
position
:
relative
;
vertical-align
:
baseline
}
sup
{
top
:
-.5em
}
sub
{
bottom
:
-.25em
}
dl
,
menu
,
ol
,
ul
{
margin
:
1em
0
}
dd
{
margin
:
0
0
0
40px
}
menu
,
ol
,
ul
{
padding
:
0
0
0
40px
}
nav
ul
,
nav
ol
{
list-style
:
none
;
list-style-image
:
none
}
img
{
border
:
0
;
-ms-interpolation-mode
:
bicubic
}
svg
:not
(
:root
)
{
overflow
:
hidden
}
figure
{
margin
:
0
}
form
{
margin
:
0
}
fieldset
{
border
:
1px
solid
silver
;
margin
:
0
2px
;
padding
:
.35em
.625em
.75em
}
legend
{
border
:
0
;
padding
:
0
;
white-space
:
normal
;
*
margin-left
:
-7px
}
button
,
input
,
select
,
textarea
{
font-size
:
100%
;
margin
:
0
;
vertical-align
:
baseline
;
*
vertical-align
:
middle
}
button
,
input
{
line-height
:
normal
}
button
,
select
{
text-transform
:
none
}
button
,
html
input
[
type
=
button
],
input
[
type
=
reset
],
input
[
type
=
submit
]
{
-webkit-appearance
:
button
;
cursor
:
pointer
;
*
overflow
:
visible
}
button
[
disabled
],
html
input
[
disabled
]
{
cursor
:
default
}
input
[
type
=
checkbox
],
input
[
type
=
radio
]
{
box-sizing
:
border-box
;
padding
:
0
;
*
height
:
13px
;
*
width
:
13px
}
input
[
type
=
search
]
{
-webkit-appearance
:
textfield
;
-moz-box-sizing
:
content-box
;
-webkit-box-sizing
:
content-box
;
box-sizing
:
content-box
}
input
[
type
=
search
]
::-webkit-search-cancel-button
,
input
[
type
=
search
]
::-webkit-search-decoration
{
-webkit-appearance
:
none
}
button
::-moz-focus-inner
,
input
::-moz-focus-inner
{
border
:
0
;
padding
:
0
}
textarea
{
overflow
:
auto
;
vertical-align
:
top
}
table
{
border-collapse
:
collapse
;
border-spacing
:
0
}
.pure-button
{
display
:
inline-block
;
*
display
:
inline
;
zoom
:
1
;
line-height
:
normal
;
white-space
:
nowrap
;
vertical-align
:
baseline
;
text-align
:
center
;
cursor
:
pointer
;
-webkit-user-drag
:
none
;
-webkit-user-select
:
none
;
-moz-user-select
:
none
;
-ms-user-select
:
none
;
user-select
:
none
}
.pure-button
::-moz-focus-inner
{
padding
:
0
;
border
:
0
}
.pure-button
{
font-size
:
100%
;
*
font-size
:
90%
;
*
overflow
:
visible
;
padding
:
.5em
1.5em
;
color
:
#444
;
color
:
rgba
(
0
,
0
,
0
,
.8
);
*
color
:
#444
;
border
:
1px
solid
#999
;
border
:
0
rgba
(
0
,
0
,
0
,
0
);
background-color
:
#E6E6E6
;
text-decoration
:
none
;
border-radius
:
2px
;
-webkit-transition
:
.1s
linear
-webkit-box-shadow
;
-moz-transition
:
.1s
linear
-moz-box-shadow
;
-ms-transition
:
.1s
linear
box-shadow
;
-o-transition
:
.1s
linear
box-shadow
;
transition
:
.1s
linear
box-shadow
}
.pure-button-hover
,
.pure-button
:hover
,
.pure-button
:focus
{
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#00000000'
,
endColorstr
=
'#1a000000'
,
GradientType
=
0
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
transparent
),
color-stop
(
40%
,
rgba
(
0
,
0
,
0
,
.05
)),
to
(
rgba
(
0
,
0
,
0
,
.1
)));
background-image
:
-webkit-linear-gradient
(
transparent
,
rgba
(
0
,
0
,
0
,
.05
)
40%
,
rgba
(
0
,
0
,
0
,
.1
));
background-image
:
-moz-linear-gradient
(
top
,
rgba
(
0
,
0
,
0
,
.05
)
0
,
rgba
(
0
,
0
,
0
,
.1
));
background-image
:
-ms-linear-gradient
(
transparent
,
rgba
(
0
,
0
,
0
,
.05
)
40%
,
rgba
(
0
,
0
,
0
,
.1
));
background-image
:
-o-linear-gradient
(
transparent
,
rgba
(
0
,
0
,
0
,
.05
)
40%
,
rgba
(
0
,
0
,
0
,
.1
));
background-image
:
linear-gradient
(
transparent
,
rgba
(
0
,
0
,
0
,
.05
)
40%
,
rgba
(
0
,
0
,
0
,
.1
))}
.pure-button
:focus
{
outline
:
0
}
.pure-button-active
,
.pure-button
:active
{
box-shadow
:
0
0
0
1px
rgba
(
0
,
0
,
0
,
.15
)
inset
,
0
0
6px
rgba
(
0
,
0
,
0
,
.2
)
inset
}
.pure-button
[
disabled
],
.pure-button-disabled
,
.pure-button-disabled
:hover
,
.pure-button-disabled
:focus
,
.pure-button-disabled
:active
{
border
:
0
;
background-image
:
none
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
filter
:
alpha
(
opacity
=
40
);
-khtml-opacity
:
.4
;
-moz-opacity
:
.4
;
opacity
:
.4
;
cursor
:
not-allowed
;
box-shadow
:
none
}
.pure-button-hidden
{
display
:
none
}
.pure-button
::-moz-focus-inner
{
padding
:
0
;
border
:
0
}
.pure-button-primary
,
.pure-button-selected
,
a
.pure-button-primary
,
a
.pure-button-selected
{
background-color
:
#0078e7
;
color
:
#fff
}
.pure-form
input
[
type
=
text
],
.pure-form
input
[
type
=
password
],
.pure-form
input
[
type
=
email
],
.pure-form
input
[
type
=
url
],
.pure-form
input
[
type
=
date
],
.pure-form
input
[
type
=
month
],
.pure-form
input
[
type
=
time
],
.pure-form
input
[
type
=
datetime
],
.pure-form
input
[
type
=
datetime-local
],
.pure-form
input
[
type
=
week
],
.pure-form
input
[
type
=
number
],
.pure-form
input
[
type
=
search
],
.pure-form
input
[
type
=
tel
],
.pure-form
input
[
type
=
color
],
.pure-form
select
,
.pure-form
textarea
{
padding
:
.5em
.6em
;
display
:
inline-block
;
border
:
1px
solid
#ccc
;
font-size
:
.8em
;
box-shadow
:
inset
0
1px
3px
#ddd
;
border-radius
:
4px
;
-webkit-transition
:
.3s
linear
border
;
-moz-transition
:
.3s
linear
border
;
-ms-transition
:
.3s
linear
border
;
-o-transition
:
.3s
linear
border
;
transition
:
.3s
linear
border
;
-webkit-box-sizing
:
border-box
;
-moz-box-sizing
:
border-box
;
box-sizing
:
border-box
}
.pure-form
input
[
type
=
text
]
:focus
,
.pure-form
input
[
type
=
password
]
:focus
,
.pure-form
input
[
type
=
email
]
:focus
,
.pure-form
input
[
type
=
url
]
:focus
,
.pure-form
input
[
type
=
date
]
:focus
,
.pure-form
input
[
type
=
month
]
:focus
,
.pure-form
input
[
type
=
time
]
:focus
,
.pure-form
input
[
type
=
datetime
]
:focus
,
.pure-form
input
[
type
=
datetime-local
]
:focus
,
.pure-form
input
[
type
=
week
]
:focus
,
.pure-form
input
[
type
=
number
]
:focus
,
.pure-form
input
[
type
=
search
]
:focus
,
.pure-form
input
[
type
=
tel
]
:focus
,
.pure-form
input
[
type
=
color
]
:focus
,
.pure-form
select
:focus
,
.pure-form
textarea
:focus
{
outline
:
0
;
outline
:
thin
dotted
\
9
;
border-color
:
#129FEA
}
.pure-form
input
[
type
=
file
]
:focus
,
.pure-form
input
[
type
=
radio
]
:focus
,
.pure-form
input
[
type
=
checkbox
]
:focus
{
outline
:
thin
dotted
#333
;
outline
:
1px
auto
#129FEA
}
.pure-form
.pure-checkbox
,
.pure-form
.pure-radio
{
margin
:
.5em
0
;
display
:
block
}
.pure-form
input
[
type
=
text
][
disabled
],
.pure-form
input
[
type
=
password
][
disabled
],
.pure-form
input
[
type
=
email
][
disabled
],
.pure-form
input
[
type
=
url
][
disabled
],
.pure-form
input
[
type
=
date
][
disabled
],
.pure-form
input
[
type
=
month
][
disabled
],
.pure-form
input
[
type
=
time
][
disabled
],
.pure-form
input
[
type
=
datetime
][
disabled
],
.pure-form
input
[
type
=
datetime-local
][
disabled
],
.pure-form
input
[
type
=
week
][
disabled
],
.pure-form
input
[
type
=
number
][
disabled
],
.pure-form
input
[
type
=
search
][
disabled
],
.pure-form
input
[
type
=
tel
][
disabled
],
.pure-form
input
[
type
=
color
][
disabled
],
.pure-form
select
[
disabled
],
.pure-form
textarea
[
disabled
]
{
cursor
:
not-allowed
;
background-color
:
#eaeded
;
color
:
#cad2d3
}
.pure-form
input
[
readonly
],
.pure-form
select
[
readonly
],
.pure-form
textarea
[
readonly
]
{
background
:
#eee
;
color
:
#777
;
border-color
:
#ccc
}
.pure-form
input
:focus:invalid
,
.pure-form
textarea
:focus:invalid
,
.pure-form
select
:focus:invalid
{
color
:
#b94a48
;
border
:
1px
solid
#ee5f5b
}
.pure-form
input
:focus:invalid:focus
,
.pure-form
textarea
:focus:invalid:focus
,
.pure-form
select
:focus:invalid:focus
{
border-color
:
#e9322d
}
.pure-form
input
[
type
=
file
]
:focus:invalid:focus
,
.pure-form
input
[
type
=
radio
]
:focus:invalid:focus
,
.pure-form
input
[
type
=
checkbox
]
:focus:invalid:focus
{
outline-color
:
#e9322d
}
.pure-form
select
{
border
:
1px
solid
#ccc
;
background-color
:
#fff
}
.pure-form
select
[
multiple
]
{
height
:
auto
}
.pure-form
label
{
margin
:
.5em
0
.2em
;
font-size
:
90%
}
.pure-form
fieldset
{
margin
:
0
;
padding
:
.35em
0
.75em
;
border
:
0
}
.pure-form
legend
{
display
:
block
;
width
:
100%
;
padding
:
.3em
0
;
margin-bottom
:
.3em
;
font-size
:
125%
;
color
:
#333
;
border-bottom
:
1px
solid
#e5e5e5
}
.pure-form-stacked
input
[
type
=
text
],
.pure-form-stacked
input
[
type
=
password
],
.pure-form-stacked
input
[
type
=
email
],
.pure-form-stacked
input
[
type
=
url
],
.pure-form-stacked
input
[
type
=
date
],
.pure-form-stacked
input
[
type
=
month
],
.pure-form-stacked
input
[
type
=
time
],
.pure-form-stacked
input
[
type
=
datetime
],
.pure-form-stacked
input
[
type
=
datetime-local
],
.pure-form-stacked
input
[
type
=
week
],
.pure-form-stacked
input
[
type
=
number
],
.pure-form-stacked
input
[
type
=
search
],
.pure-form-stacked
input
[
type
=
tel
],
.pure-form-stacked
input
[
type
=
color
],
.pure-form-stacked
select
,
.pure-form-stacked
label
,
.pure-form-stacked
textarea
{
display
:
block
;
margin
:
.25em
0
}
.pure-form-aligned
input
,
.pure-form-aligned
textarea
,
.pure-form-aligned
select
,
.pure-form-aligned
.pure-help-inline
,
.pure-form-message-inline
{
display
:
inline-block
;
*
display
:
inline
;
*
zoom
:
1
;
vertical-align
:
middle
}
.pure-form-aligned
.pure-control-group
{
margin-bottom
:
.5em
}
.pure-form-aligned
.pure-control-group
label
{
text-align
:
right
;
display
:
inline-block
;
vertical-align
:
middle
;
width
:
10em
;
margin
:
0
1em
0
0
}
.pure-form-aligned
.pure-controls
{
margin
:
1.5em
0
0
10em
}
.pure-form
input
.pure-input-rounded
,
.pure-form
.pure-input-rounded
{
border-radius
:
2em
;
padding
:
.5em
1em
}
.pure-form
.pure-group
fieldset
{
margin-bottom
:
10px
}
.pure-form
.pure-group
input
{
display
:
block
;
padding
:
10px
;
margin
:
0
;
border-radius
:
0
;
position
:
relative
;
top
:
-1px
}
.pure-form
.pure-group
input
:focus
{
z-index
:
2
}
.pure-form
.pure-group
input
:first-child
{
top
:
1px
;
border-radius
:
4px
4px
0
0
}
.pure-form
.pure-group
input
:last-child
{
top
:
-2px
;
border-radius
:
0
0
4px
4px
}
.pure-form
.pure-group
button
{
margin
:
.35em
0
}
.pure-form
.pure-input-1
{
width
:
100%
}
.pure-form
.pure-input-2-3
{
width
:
66%
}
.pure-form
.pure-input-1-2
{
width
:
50%
}
.pure-form
.pure-input-1-3
{
width
:
33%
}
.pure-form
.pure-input-1-4
{
width
:
25%
}
.pure-form
.pure-help-inline
,
.pure-form-message-inline
{
display
:
inline-block
;
padding-left
:
.3em
;
color
:
#666
;
vertical-align
:
middle
;
font-size
:
90%
}
.pure-form-message
{
display
:
block
;
color
:
#666
;
font-size
:
90%
}
@media
only
screen
and
(
max-width
:
480px
){
.pure-form
button
[
type
=
submit
]
{
margin
:
.7em
0
0
}
.pure-form
input
[
type
=
text
],
.pure-form
input
[
type
=
password
],
.pure-form
input
[
type
=
email
],
.pure-form
input
[
type
=
url
],
.pure-form
input
[
type
=
date
],
.pure-form
input
[
type
=
month
],
.pure-form
input
[
type
=
time
],
.pure-form
input
[
type
=
datetime
],
.pure-form
input
[
type
=
datetime-local
],
.pure-form
input
[
type
=
week
],
.pure-form
input
[
type
=
number
],
.pure-form
input
[
type
=
search
],
.pure-form
input
[
type
=
tel
],
.pure-form
input
[
type
=
color
],
.pure-form
label
{
margin-bottom
:
.3em
;
display
:
block
}
.pure-group
input
[
type
=
text
],
.pure-group
input
[
type
=
password
],
.pure-group
input
[
type
=
email
],
.pure-group
input
[
type
=
url
],
.pure-group
input
[
type
=
date
],
.pure-group
input
[
type
=
month
],
.pure-group
input
[
type
=
time
],
.pure-group
input
[
type
=
datetime
],
.pure-group
input
[
type
=
datetime-local
],
.pure-group
input
[
type
=
week
],
.pure-group
input
[
type
=
number
],
.pure-group
input
[
type
=
search
],
.pure-group
input
[
type
=
tel
],
.pure-group
input
[
type
=
color
]
{
margin-bottom
:
0
}
.pure-form-aligned
.pure-control-group
label
{
margin-bottom
:
.3em
;
text-align
:
left
;
display
:
block
;
width
:
100%
}
.pure-form-aligned
.pure-controls
{
margin
:
1.5em
0
0
}
.pure-form
.pure-help-inline
,
.pure-form-message-inline
,
.pure-form-message
{
display
:
block
;
font-size
:
80%
;
padding
:
.2em
0
.8em
}}
.pure-g
{
letter-spacing
:
-.31em
;
*
letter-spacing
:
normal
;
*
word-spacing
:
-.43em
;
text-rendering
:
optimizespeed
;
font-family
:
FreeSans
,
Arimo
,
"Droid Sans"
,
Helvetica
,
Arial
,
sans-serif
;
display
:
-webkit-flex
;
-webkit-flex-flow
:
row
wrap
;
display
:
-ms-flexbox
;
-ms-flex-flow
:
row
wrap
}
.opera-only
:-o-prefocus
,
.pure-g
{
word-spacing
:
-.43em
}
.pure-u
{
display
:
inline-block
;
*
display
:
inline
;
zoom
:
1
;
letter-spacing
:
normal
;
word-spacing
:
normal
;
vertical-align
:
top
;
text-rendering
:
auto
}
.pure-g
[
class
*=
"pure-u"
]
{
font-family
:
sans-serif
}
.pure-u-1
,
.pure-u-1-2
,
.pure-u-1-3
,
.pure-u-2-3
,
.pure-u-1-4
,
.pure-u-3-4
,
.pure-u-1-5
,
.pure-u-2-5
,
.pure-u-3-5
,
.pure-u-4-5
,
.pure-u-1-6
,
.pure-u-5-6
,
.pure-u-1-8
,
.pure-u-3-8
,
.pure-u-5-8
,
.pure-u-7-8
,
.pure-u-1-12
,
.pure-u-5-12
,
.pure-u-7-12
,
.pure-u-11-12
,
.pure-u-1-24
,
.pure-u-5-24
,
.pure-u-7-24
,
.pure-u-11-24
,
.pure-u-13-24
,
.pure-u-17-24
,
.pure-u-19-24
,
.pure-u-23-24
{
display
:
inline-block
;
*
display
:
inline
;
zoom
:
1
;
letter-spacing
:
normal
;
word-spacing
:
normal
;
vertical-align
:
top
;
text-rendering
:
auto
}
.pure-u-1
{
width
:
100%
}
.pure-u-1-2
{
width
:
50%
;
*
width
:
49.969%
}
.pure-u-1-3
{
width
:
33.3333%
;
*
width
:
33.3023%
}
.pure-u-2-3
{
width
:
66.6667%
;
*
width
:
66.6357%
}
.pure-u-1-4
{
width
:
25%
;
*
width
:
24.969%
}
.pure-u-3-4
{
width
:
75%
;
*
width
:
74.969%
}
.pure-u-1-5
{
width
:
20%
;
*
width
:
19.969%
}
.pure-u-2-5
{
width
:
40%
;
*
width
:
39.969%
}
.pure-u-3-5
{
width
:
60%
;
*
width
:
59.969%
}
.pure-u-4-5
{
width
:
80%
;
*
width
:
79.969%
}
.pure-u-1-6
{
width
:
16.6667%
;
*
width
:
16.6357%
}
.pure-u-5-6
{
width
:
83.3333%
;
*
width
:
83.3023%
}
.pure-u-1-8
{
width
:
12.5%
;
*
width
:
12.469%
}
.pure-u-3-8
{
width
:
37.5%
;
*
width
:
37.469%
}
.pure-u-5-8
{
width
:
62.5%
;
*
width
:
62.469%
}
.pure-u-7-8
{
width
:
87.5%
;
*
width
:
87.469%
}
.pure-u-1-12
{
width
:
8.3333%
;
*
width
:
8.3023%
}
.pure-u-5-12
{
width
:
41.6667%
;
*
width
:
41.6357%
}
.pure-u-7-12
{
width
:
58.3333%
;
*
width
:
58.3023%
}
.pure-u-11-12
{
width
:
91.6667%
;
*
width
:
91.6357%
}
.pure-u-1-24
{
width
:
4.1667%
;
*
width
:
4.1357%
}
.pure-u-5-24
{
width
:
20.8333%
;
*
width
:
20.8023%
}
.pure-u-7-24
{
width
:
29.1667%
;
*
width
:
29.1357%
}
.pure-u-11-24
{
width
:
45.8333%
;
*
width
:
45.8023%
}
.pure-u-13-24
{
width
:
54.1667%
;
*
width
:
54.1357%
}
.pure-u-17-24
{
width
:
70.8333%
;
*
width
:
70.8023%
}
.pure-u-19-24
{
width
:
79.1667%
;
*
width
:
79.1357%
}
.pure-u-23-24
{
width
:
95.8333%
;
*
width
:
95.8023%
}
.pure-g-r
{
letter-spacing
:
-.31em
;
*
letter-spacing
:
normal
;
*
word-spacing
:
-.43em
;
font-family
:
FreeSans
,
Arimo
,
"Droid Sans"
,
Helvetica
,
Arial
,
sans-serif
;
display
:
-webkit-flex
;
-webkit-flex-flow
:
row
wrap
;
display
:
-ms-flexbox
;
-ms-flex-flow
:
row
wrap
}
.opera-only
:-o-prefocus
,
.pure-g-r
{
word-spacing
:
-.43em
}
.pure-g-r
[
class
*=
"pure-u"
]
{
font-family
:
sans-serif
}
.pure-g-r
img
{
max-width
:
100%
;
height
:
auto
}
@media
(
min-width
:
980px
){
.pure-visible-phone
{
display
:
none
}
.pure-visible-tablet
{
display
:
none
}
.pure-hidden-desktop
{
display
:
none
}}
@media
(
max-width
:
480px
){
.pure-g-r
>
.pure-u
,
.pure-g-r
>[
class
*=
"pure-u-"
]
{
width
:
100%
}}
@media
(
max-width
:
767px
){
.pure-g-r
>
.pure-u
,
.pure-g-r
>[
class
*=
"pure-u-"
]
{
width
:
100%
}
.pure-hidden-phone
{
display
:
none
}
.pure-visible-desktop
{
display
:
none
}}
@media
(
min-width
:
768px
)
and
(
max-width
:
979px
){
.pure-hidden-tablet
{
display
:
none
}
.pure-visible-desktop
{
display
:
none
}}
.pure-menu
ul
{
position
:
absolute
;
visibility
:
hidden
}
.pure-menu.pure-menu-open
{
visibility
:
visible
;
z-index
:
2
;
width
:
100%
}
.pure-menu
ul
{
left
:
-10000px
;
list-style
:
none
;
margin
:
0
;
padding
:
0
;
top
:
-10000px
;
z-index
:
1
}
.pure-menu
>
ul
{
position
:
relative
}
.pure-menu-open
>
ul
{
left
:
0
;
top
:
0
;
visibility
:
visible
}
.pure-menu-open
>
ul
:focus
{
outline
:
0
}
.pure-menu
li
{
position
:
relative
}
.pure-menu
a
,
.pure-menu
.pure-menu-heading
{
display
:
block
;
color
:
inherit
;
line-height
:
1.5em
;
padding
:
5px
20px
;
text-decoration
:
none
;
white-space
:
nowrap
}
.pure-menu.pure-menu-horizontal
>
.pure-menu-heading
{
display
:
inline-block
;
*
display
:
inline
;
zoom
:
1
;
margin
:
0
;
vertical-align
:
middle
}
.pure-menu.pure-menu-horizontal
>
ul
{
display
:
inline-block
;
*
display
:
inline
;
zoom
:
1
;
vertical-align
:
middle
;
height
:
2.4em
}
.pure-menu
li
a
{
padding
:
5px
20px
}
.pure-menu-can-have-children
>
.pure-menu-label
:after
{
content
:
'\25B8'
;
float
:
right
;
font-family
:
'Lucida Grande'
,
'Lucida Sans Unicode'
,
'DejaVu Sans'
,
sans-serif
;
margin-right
:
-20px
;
margin-top
:
-1px
}
.pure-menu-can-have-children
>
.pure-menu-label
{
padding-right
:
30px
}
.pure-menu-separator
{
background-color
:
#dfdfdf
;
display
:
block
;
height
:
1px
;
font-size
:
0
;
margin
:
7px
2px
;
overflow
:
hidden
}
.pure-menu-hidden
{
display
:
none
}
.pure-menu-fixed
{
position
:
fixed
;
top
:
0
;
left
:
0
;
width
:
100%
}
.pure-menu-horizontal
li
{
display
:
inline-block
;
*
display
:
inline
;
zoom
:
1
;
vertical-align
:
middle
}
.pure-menu-horizontal
li
li
{
display
:
block
}
.pure-menu-horizontal
>
.pure-menu-children
>
.pure-menu-can-have-children
>
.pure-menu-label
:after
{
content
:
"\25BE"
}
.pure-menu-horizontal
>
.pure-menu-children
>
.pure-menu-can-have-children
>
.pure-menu-label
{
padding-right
:
30px
}
.pure-menu-horizontal
li
.pure-menu-separator
{
height
:
50%
;
width
:
1px
;
margin
:
0
7px
}
.pure-menu-horizontal
li
li
.pure-menu-separator
{
height
:
1px
;
width
:
auto
;
margin
:
7px
2px
}
.pure-menu.pure-menu-open
,
.pure-menu.pure-menu-horizontal
li
.pure-menu-children
{
background
:
#fff
;
border
:
1px
solid
#b7b7b7
}
.pure-menu.pure-menu-horizontal
,
.pure-menu.pure-menu-horizontal
.pure-menu-heading
{
border
:
0
}
.pure-menu
a
{
border
:
1px
solid
transparent
;
border-left
:
0
;
border-right
:
0
}
.pure-menu
a
,
.pure-menu
.pure-menu-can-have-children
>
li
:after
{
color
:
#777
}
.pure-menu
.pure-menu-can-have-children
>
li
:hover:after
{
color
:
#fff
}
.pure-menu
.pure-menu-open
{
background
:
#dedede
}
.pure-menu
li
a
:hover
,
.pure-menu
li
a
:focus
{
background
:
#eee
}
.pure-menu
li
.pure-menu-disabled
a
:hover
,
.pure-menu
li
.pure-menu-disabled
a
:focus
{
background
:
#fff
;
color
:
#bfbfbf
}
.pure-menu
.pure-menu-disabled
>
a
{
background-image
:
none
;
border-color
:
transparent
;
cursor
:
default
}
.pure-menu
.pure-menu-disabled
>
a
,
.pure-menu
.pure-menu-can-have-children.pure-menu-disabled
>
a
:after
{
color
:
#bfbfbf
}
.pure-menu
.pure-menu-heading
{
color
:
#565d64
;
text-transform
:
uppercase
;
font-size
:
90%
;
margin-top
:
.5em
;
border-bottom-width
:
1px
;
border-bottom-style
:
solid
;
border-bottom-color
:
#dfdfdf
}
.pure-menu
.pure-menu-selected
a
{
color
:
#000
}
.pure-menu.pure-menu-open.pure-menu-fixed
{
border
:
0
;
border-bottom
:
1px
solid
#b7b7b7
}
.pure-paginator
{
letter-spacing
:
-.31em
;
*
letter-spacing
:
normal
;
*
word-spacing
:
-.43em
;
text-rendering
:
optimizespeed
;
list-style
:
none
;
margin
:
0
;
padding
:
0
}
.opera-only
:-o-prefocus
,
.pure-paginator
{
word-spacing
:
-.43em
}
.pure-paginator
li
{
display
:
inline-block
;
*
display
:
inline
;
zoom
:
1
;
letter-spacing
:
normal
;
word-spacing
:
normal
;
vertical-align
:
top
;
text-rendering
:
auto
}
.pure-paginator
.pure-button
{
border-radius
:
0
;
padding
:
.8em
1.4em
;
vertical-align
:
top
;
height
:
1.1em
}
.pure-paginator
.pure-button
:focus
,
.pure-paginator
.pure-button
:active
{
outline-style
:
none
}
.pure-paginator
.prev
,
.pure-paginator
.next
{
color
:
#C0C1C3
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
.45
)}
.pure-paginator
.prev
{
border-radius
:
2px
0
0
2px
}
.pure-paginator
.next
{
border-radius
:
0
2px
2px
0
}
@media
(
max-width
:
480px
){
.pure-menu-horizontal
{
width
:
100%
}
.pure-menu-children
li
{
display
:
block
;
border-bottom
:
1px
solid
#000
}}
.pure-table
{
border-collapse
:
collapse
;
border-spacing
:
0
;
empty-cells
:
show
;
border
:
1px
solid
#cbcbcb
}
.pure-table
caption
{
color
:
#000
;
font
:
italic
85%
/
1
arial
,
sans-serif
;
padding
:
1em
0
;
text-align
:
center
}
.pure-table
td
,
.pure-table
th
{
border-left
:
1px
solid
#cbcbcb
;
border-width
:
0
0
0
1px
;
font-size
:
inherit
;
margin
:
0
;
overflow
:
visible
;
padding
:
6px
12px
}
.pure-table
td
:first-child
,
.pure-table
th
:first-child
{
border-left-width
:
0
}
.pure-table
thead
{
background
:
#e0e0e0
;
color
:
#000
;
text-align
:
left
;
vertical-align
:
bottom
}
.pure-table
td
{
background-color
:
transparent
}
.pure-table-odd
td
{
background-color
:
#f2f2f2
}
.pure-table-striped
tr
:nth-child
(
2n-1
)
td
{
background-color
:
#f2f2f2
}
.pure-table-bordered
td
{
border-bottom
:
1px
solid
#cbcbcb
}
.pure-table-bordered
tbody
>
tr
:last-child
td
,
.pure-table-horizontal
tbody
>
tr
:last-child
td
{
border-bottom-width
:
0
}
.pure-table-horizontal
td
,
.pure-table-horizontal
th
{
border-width
:
0
0
1px
;
border-bottom
:
1px
solid
#cbcbcb
}
.pure-table-horizontal
tbody
>
tr
:last-child
td
{
border-bottom-width
:
0
}
\ No newline at end of file
stack/monitor/webfile-directory/static/script.js
0 → 100644
View file @
3422b8fa
$
(
document
).
ready
(
function
()
{
function
doDataUrl
(
data
)
{
var
frame_content
=
document
.
getElementsByTagName
(
"
iframe
"
)[
0
].
contentWindow
;
var
b64
=
btoa
(
data
);
dataurl
=
'
data:text/html;base64,
'
+
b64
;
$
(
"
iframe
"
).
attr
(
'
src
'
,
dataurl
);
}
if
(
window
.
self
===
window
.
top
)
{
//not in an iframe
$
(
"
.script
"
).
click
(
function
(
e
)
{
e
.
preventDefault
();
var
message
=
$
(
this
).
attr
(
'
href
'
);
var
slash_pos
=
message
.
search
(
'
/
'
);
//let's differenciate kind of script called
if
(
slash_pos
===
-
1
||
slash_pos
===
0
)
{
url
=
message
;
}
else
{
url
=
'
/index.cgi
'
;
}
$
(
"
iframe
"
).
attr
(
'
src
'
,
url
+
'
?script=
'
+
encodeURIComponent
(
message
));
});
$
(
"
.link
"
).
click
(
function
(
e
)
{
e
.
preventDefault
();
var
url
=
$
(
this
).
attr
(
'
href
'
);
$
(
"
iframe
"
).
attr
(
'
src
'
,
url
);
});
}
else
{
//in an iframe
$
(
"
body
"
).
empty
();
}
});
stack/monitor/webfile-directory/static/style.css
0 → 100644
View file @
3422b8fa
body
{
padding
:
15px
;
}
.pure-menu
.pure-menu-heading
{
font-size
:
120%
;
}
#content
{
display
:
inline-block
;
min-width
:
72%
;
height
:
97%
;
margin-left
:
30px
;
}
#div-menu
{
display
:
inline-block
;
vertical-align
:
top
;
}
#div-menu
h1
{
text-align
:
center
;
}
iframe
{
width
:
100%
;
height
:
100%
;
margin
:
0px
;
padding
:
0px
;
border-style
:
none
;
}
stack/monitor/webfile-directory/static/welcome.html
0 → 100644
View file @
3422b8fa
<html>
<head>
<title>
Welcome to the Monitoring Interface
</title>
<link
rel=
"stylesheet"
href=
"pure-min.css"
>
<link
rel=
"stylesheet"
href=
"style.css"
>
</head>
<body>
<h1>
Welcome to your monitoring interface
</h1>
<p>
From this interface you can monitor, configure your instance
</p>
</body>
</html>
stack/monitor/webfile-directory/status-history.cgi.in
0 → 100644
View file @
3422b8fa
#!{{ python_executable }}
import cgi
import datetime
import os
import sqlite3
db_path = '{{ monitor_db_path }}'
status_history_length = '{{ status_history_length }}'
db = sqlite3.connect(db_path)
print """
<html><head>
<link
rel=
"stylesheet"
href=
"static/pure-min.css"
>
<link
rel=
"stylesheet"
href=
"static/style.css"
>
</head><body>
<h1>
Monitor Status History :
</h1>
"""
def get_date_from_timestamp(timestamp):
return datetime.datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
def print_individual_status(timestamp):
print "
<div><h3>
Failure on %s
</h3><ul>
" % get_date_from_timestamp(timestamp)
rows = db.execute("select status, element, output from individual_status where timestamp=?", (timestamp,))
for row in rows:
status, element, output = row
print "
<li>
%s , %s :
</br><pre>
%s
</pre></li>
" % (status, cgi.escape(element), cgi.escape(output))
print "
</ul></div>
"
if not os.path.exists(db_path):
print """No status history found
</p></body></html>
"""
exit(0)
failure_row_list = db.execute("select timestamp from status where status='FAILURE' order by timestamp desc limit ?", status_history_length )
for failure_row in failure_row_list:
timestamp, = failure_row
print_individual_status(timestamp)
print "
</body></html>
"
stack/monitor/webfile-directory/status.cgi.in
View file @
3422b8fa
...
@@ -20,8 +20,8 @@ if not os.path.exists(json_file) or "refresh" in form:
...
@@ -20,8 +20,8 @@ if not os.path.exists(json_file) or "refresh" in form:
if not os.path.exists(json_file):
if not os.path.exists(json_file):
print """
<html><head>
print """
<html><head>
<link
rel=
"stylesheet"
href=
"pure-min.css"
>
<link
rel=
"stylesheet"
href=
"
static/
pure-min.css"
>
<link
rel=
"stylesheet"
href=
"/style.css"
>
<link
rel=
"stylesheet"
href=
"
static
/style.css"
>
</head><body>
</head><body>
<h1>
Monitoring :
</h1>
<h1>
Monitoring :
</h1>
No status file found
</p></body></html>
"""
No status file found
</p></body></html>
"""
...
@@ -30,8 +30,8 @@ if not os.path.exists(json_file):
...
@@ -30,8 +30,8 @@ if not os.path.exists(json_file):
result = json.load(open(json_file))
result = json.load(open(json_file))
print "
<html><head>
"
print "
<html><head>
"
print "
<link
rel=
\"stylesheet\"
href=
\"pure-min.css\"
>
"
print "
<link
rel=
\"stylesheet\"
href=
\"
static/
pure-min.css\"
>
"
print "
<link
rel=
\"stylesheet\"
href=
\"/style.css\"
>
"
print "
<link
rel=
\"stylesheet\"
href=
\"
static
/style.css\"
>
"
print "
</head><body>
"
print "
</head><body>
"
print "
<h1>
Monitoring :
</h1>
"
print "
<h1>
Monitoring :
</h1>
"
print "
<form
action=
\"/index.cgi\"
method=
\"post\"
class=
\"pure-form-aligned\"
>
"
print "
<form
action=
\"/index.cgi\"
method=
\"post\"
class=
\"pure-form-aligned\"
>
"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment