Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
slapos
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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Thomas Leymonerie
slapos
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
Hide 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