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
defc6519
Commit
defc6519
authored
Feb 12, 2016
by
Alain Takoudjou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Monitor: define public and private data
parent
a3763e67
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
168 additions
and
72 deletions
+168
-72
stack/monitor2/buildout.cfg
stack/monitor2/buildout.cfg
+12
-6
stack/monitor2/instance-monitor.cfg.jinja2.in
stack/monitor2/instance-monitor.cfg.jinja2.in
+47
-12
stack/monitor2/scripts/globalstate.py
stack/monitor2/scripts/globalstate.py
+21
-5
stack/monitor2/scripts/monitor.py
stack/monitor2/scripts/monitor.py
+31
-23
stack/monitor2/scripts/run-promise.py
stack/monitor2/scripts/run-promise.py
+49
-26
stack/monitor2/templates/httpd-cors.cfg.in
stack/monitor2/templates/httpd-cors.cfg.in
+5
-0
stack/monitor2/templates/instance-info.conf.in
stack/monitor2/templates/instance-info.conf.in
+1
-0
stack/monitor2/templates/monitor-httpd.conf.in
stack/monitor2/templates/monitor-httpd.conf.in
+2
-0
No files found.
stack/monitor2/buildout.cfg
View file @
defc6519
...
@@ -92,7 +92,7 @@ md5sum = 04b664dfb47bfd3d01502768311aa239
...
@@ -92,7 +92,7 @@ md5sum = 04b664dfb47bfd3d01502768311aa239
# Monitor templates files
# Monitor templates files
[monitor-httpd-conf]
[monitor-httpd-conf]
<= monitor-template-base
<= monitor-template-base
md5sum =
68a7e4d3304fc78d173f30ad99534762
md5sum =
4db64f486ec7a6af9b5c0d9270ef52c9
filename = monitor-httpd.conf.in
filename = monitor-httpd.conf.in
[monitor-service-conf-template]
[monitor-service-conf-template]
...
@@ -113,7 +113,12 @@ md5sum = 2db5c08c7e8658981b4b1e3f27fd5967
...
@@ -113,7 +113,12 @@ md5sum = 2db5c08c7e8658981b4b1e3f27fd5967
[monitor-instance-info]
[monitor-instance-info]
<= monitor-template-base
<= monitor-template-base
filename = instance-info.conf.in
filename = instance-info.conf.in
md5sum = d506e335e366c1d873a3490333842398
md5sum = 1bdb4e05c6be04f4e5766c64467fbcec
[monitor-httpd-cors]
<= monitor-template-base
filename = httpd-cors.cfg.in
md5sum = 5afad2bb6e088e080e907f1d837effbb
# End templates files
# End templates files
...
@@ -122,13 +127,14 @@ recipe = slapos.recipe.template:jinja2
...
@@ -122,13 +127,14 @@ recipe = slapos.recipe.template:jinja2
filename = template-monitor.cfg
filename = template-monitor.cfg
template = ${:_profile_base_location_}/instance-monitor.cfg.jinja2.in
template = ${:_profile_base_location_}/instance-monitor.cfg.jinja2.in
rendered = ${buildout:directory}/template-monitor.cfg
rendered = ${buildout:directory}/template-monitor.cfg
md5sum =
8763a92c2c22103a9f6c9052ba322fc5
md5sum =
ee39ce85084d29172f50ae7375960371
context =
context =
key apache_location apache:location
key apache_location apache:location
key gzip_location gzip:location
key gzip_location gzip:location
raw monitor_bin ${monitor2-bin:location}/${monitor2-bin:filename}
raw monitor_bin ${monitor2-bin:location}/${monitor2-bin:filename}
raw monitor_collect ${monitor-collect:location}/${monitor-collect:filename}
raw monitor_collect ${monitor-collect:location}/${monitor-collect:filename}
raw monitor_conf_template ${monitor-conf:location}/${monitor-conf:filename}
raw monitor_conf_template ${monitor-conf:location}/${monitor-conf:filename}
raw monitor_https_cors ${monitor-httpd-cors:location}/${monitor-httpd-cors:filename}
raw monitor_instance_info ${monitor-instance-info:location}/${monitor-instance-info:filename}
raw monitor_instance_info ${monitor-instance-info:location}/${monitor-instance-info:filename}
raw monitor_globalstate ${monitor-globalstate:location}/${monitor-globalstate:filename}
raw monitor_globalstate ${monitor-globalstate:location}/${monitor-globalstate:filename}
raw monitor_password_promise_template ${monitor-password-promise:location}/${monitor-password-promise:filename}
raw monitor_password_promise_template ${monitor-password-promise:location}/${monitor-password-promise:filename}
...
@@ -158,13 +164,13 @@ context =
...
@@ -158,13 +164,13 @@ context =
[monitor2-bin]
[monitor2-bin]
<= monitor-template-script
<= monitor-template-script
filename = monitor.py
filename = monitor.py
md5sum =
3d2035d7c02b9d37c5c680e142dcb845
md5sum =
119827d7e7ed45c627f1ad21a94445b8
[run-promise-py]
[run-promise-py]
recipe = slapos.recipe.template:jinja2
recipe = slapos.recipe.template:jinja2
template = ${:_profile_base_location_}/scripts/run-promise.py
template = ${:_profile_base_location_}/scripts/run-promise.py
rendered = ${buildout:parts-directory}/monitor-scripts/run-promise.py
rendered = ${buildout:parts-directory}/monitor-scripts/run-promise.py
md5sum =
4f99c09125c201ee988e71662b8c9bf9
md5sum =
9a9dfa02742019cc86c78898822666bc
mode = 0755
mode = 0755
context =
context =
raw python ${buildout:directory}/bin/${extra-eggs:interpreter}
raw python ${buildout:directory}/bin/${extra-eggs:interpreter}
...
@@ -182,7 +188,7 @@ md5sum = 40dcda69f1ccb8639d7ef0ad65bceb5e
...
@@ -182,7 +188,7 @@ md5sum = 40dcda69f1ccb8639d7ef0ad65bceb5e
[monitor-globalstate]
[monitor-globalstate]
<= monitor-template-script
<= monitor-template-script
filename = globalstate.py
filename = globalstate.py
md5sum =
906776302bfe511b21a7eee3c9bcb6a5
md5sum =
13f0cb7b87eb2ce91b4b27e2303ec01c
[monitor-collect]
[monitor-collect]
<= monitor-template-script
<= monitor-template-script
...
...
stack/monitor2/instance-monitor.cfg.jinja2.in
View file @
defc6519
# Put here default Name for instance and Hosting Subscription
[slap-configuration]
root-title = UNKNOW
title = UNKNOW Instance
[slap-configuration]
[slap-configuration]
recipe = slapos.cookbook:slapconfiguration.serialised
recipe = slapos.cookbook:slapconfiguration.serialised
computer = ${slap-connection:computer-id}
computer = ${slap-connection:computer-id}
...
@@ -74,7 +79,6 @@ services-conf = ${directory:etc}/monitor.conf.d
...
@@ -74,7 +79,6 @@ services-conf = ${directory:etc}/monitor.conf.d
www = ${directory:monitor}/web
www = ${directory:monitor}/web
web-dir = ${directory:monitor}/web
web-dir = ${directory:monitor}/web
log = ${directory:log}/monitor
log = ${directory:log}/monitor
promise-wrapper = ${directory:var}/monitor-promise-wrapper
monitor-var = ${directory:var}/monitor
monitor-var = ${directory:var}/monitor
monitor-password-var = ${monitor-directory:monitor-var}/password
monitor-password-var = ${monitor-directory:monitor-var}/password
monitor-password-interface = ${monitor-directory:monitor-password-var}/password/interface
monitor-password-interface = ${monitor-directory:monitor-password-var}/password/interface
...
@@ -124,6 +128,7 @@ wrapper = ${directory:services}/monitor-httpd
...
@@ -124,6 +128,7 @@ wrapper = ${directory:services}/monitor-httpd
[monitor-conf-parameters]
[monitor-conf-parameters]
title = ${monitor-instance-parameter:monitor-title}
title = ${monitor-instance-parameter:monitor-title}
root-title = ${monitor-instance-parameter:root-instance-title}
public-folder = ${monitor-directory:public}
public-folder = ${monitor-directory:public}
private-folder = ${monitor-directory:private}
private-folder = ${monitor-directory:private}
webdav-folder = ${monitor-directory:webdav}
webdav-folder = ${monitor-directory:webdav}
...
@@ -133,7 +138,6 @@ monitor-hal-json = ${monitor-directory:public}/monitor.hal.json
...
@@ -133,7 +138,6 @@ monitor-hal-json = ${monitor-directory:public}/monitor.hal.json
service-pid-folder = ${monitor-directory:pids}
service-pid-folder = ${monitor-directory:pids}
crond-folder = ${logrotate-directory:cron-entries}
crond-folder = ${logrotate-directory:cron-entries}
logrotate-folder = ${logrotate:logrotate-entries}
logrotate-folder = ${logrotate:logrotate-entries}
wraper-folder = ${monitor-directory:promise-wrapper}
promise-runner = {{ promise_executor_py }}
promise-runner = {{ promise_executor_py }}
promise-folder-list =
promise-folder-list =
${directory:promises}
${directory:promises}
...
@@ -158,6 +162,7 @@ context = section parameter_dict monitor-conf-parameters
...
@@ -158,6 +162,7 @@ context = section parameter_dict monitor-conf-parameters
[instance-info-parameters]
[instance-info-parameters]
name = ${monitor-instance-parameter:monitor-title}
name = ${monitor-instance-parameter:monitor-title}
root-name = ${monitor-instance-parameter:root-instance-title}
computer-id = ${slap-connection:computer-id}
computer-id = ${slap-connection:computer-id}
ipv4 = ${slap-configuration:ipv4-random}
ipv4 = ${slap-configuration:ipv4-random}
ipv6 = ${slap-configuration:ipv6-random}
ipv6 = ${slap-configuration:ipv6-random}
...
@@ -185,13 +190,18 @@ wrapper-path = ${directory:scripts}/bootstrap-monitor
...
@@ -185,13 +190,18 @@ wrapper-path = ${directory:scripts}/bootstrap-monitor
environment =
environment =
PATH=${python-symlink:target}:/usr/local/bin:/usr/bin:/bin
PATH=${python-symlink:target}:/usr/local/bin:/usr/bin:/bin
[monitor-htpasswd]
recipe = slapos.cookbook:generate.password
storage-path = ${directory:etc}/.monitor_user
bytes = 8
[httpd-monitor-htpasswd]
[httpd-monitor-htpasswd]
recipe = plone.recipe.command
recipe = plone.recipe.command
stop-on-error = true
stop-on-error = true
htpasswd-path = ${monitor-directory:etc}/monitor-htpasswd
htpasswd-path = ${monitor-directory:etc}/monitor-htpasswd
command = {{ apache_location }}/bin/htpasswd -cb ${:htpasswd-path} ${:user} ${:password}
command = {{ apache_location }}/bin/htpasswd -cb ${:htpasswd-path} ${:user} ${:password}
user = admin
user = admin
password =
admin
password =
${monitor-htpasswd:passwd}
[monitor-httpd-conf-parameter]
[monitor-httpd-conf-parameter]
listening-ip = ${monitor-instance-parameter:monitor-httpd-ipv6}
listening-ip = ${monitor-instance-parameter:monitor-httpd-ipv6}
...
@@ -204,7 +214,7 @@ cert-file = ${ca-directory:certs}/httpd.crt
...
@@ -204,7 +214,7 @@ cert-file = ${ca-directory:certs}/httpd.crt
key-file = ${ca-directory:certs}/httpd.key
key-file = ${ca-directory:certs}/httpd.key
htpasswd-file = ${httpd-monitor-htpasswd:htpasswd-path}
htpasswd-file = ${httpd-monitor-htpasswd:htpasswd-path}
url = https://[${monitor-instance-parameter:monitor-httpd-ipv6}]:${:port}
url = https://[${monitor-instance-parameter:monitor-httpd-ipv6}]:${:port}
httpd-cors-config-file = ${monitor-httpd-cors:
location
}
httpd-cors-config-file = ${monitor-httpd-cors:
rendered
}
[monitor-httpd-conf]
[monitor-httpd-conf]
recipe = slapos.recipe.template:jinja2
recipe = slapos.recipe.template:jinja2
...
@@ -216,11 +226,12 @@ context =
...
@@ -216,11 +226,12 @@ context =
section parameter_dict monitor-httpd-conf-parameter
section parameter_dict monitor-httpd-conf-parameter
[monitor-httpd-cors]
[monitor-httpd-cors]
recipe = plone.recipe.command
recipe = slapos.recipe.template:jinja2
command = if [ ! -f ${:location} ]; then echo 'Header set Access-Control-Allow-Origin "*"' > ${:location}; fi
template = {{ monitor_https_cors }}
location = ${directory:etc}/${:filename}
rendered = ${directory:etc}/httpd-cors.cfg
filename = httpd-cors.cfg
mode = 0600
stop-on-error = true
context =
key domain monitor-instance-parameter:cors-domains
[httpd-wrapper]
[httpd-wrapper]
recipe = slapos.cookbook:wrapper
recipe = slapos.cookbook:wrapper
...
@@ -352,14 +363,38 @@ context =
...
@@ -352,14 +363,38 @@ context =
[publish]
[publish]
recipe = slapos.cookbook:publish
recipe = slapos.cookbook:publish
monitor-url = ${monitor-httpd-conf-parameter:url}
#monitor-base-url = ${monitor-httpd-conf-parameter:url}
monitor-config-url = ${monitor-httpd-conf-parameter:url}/share/jio_public
monitor-base-url = ${monitor-frontend-promise:url}
monitor-url = ${:monitor-base-url}/share/jio_public
monitor-user = ${httpd-monitor-htpasswd:user}
monitor-password = ${httpd-monitor-htpasswd:password}
[monitor-instance-parameter]
[monitor-instance-parameter]
monitor-title = Monitoring interface
monitor-title = ${slap-configuration:title}
root-instance-title = ${slap-configuration:root-title}
cors-domains =
# XXX Hard coded parameter
# XXX Hard coded parameter
collector-db = /srv/slapgrid/var/data-log/collector.db
collector-db = /srv/slapgrid/var/data-log/collector.db
[monitor-frontend]
<= slap-connection
recipe = slapos.cookbook:requestoptional
name = Monitor Frontend ${monitor-instance-parameter:monitor-title}
# XXX We have hardcoded SR URL here.
software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg
slave = true
config-url = ${monitor-httpd-conf-parameter:url}
software-type = custom-personal
return = site_url domain
[monitor-frontend-promise]
recipe = slapos.cookbook:check_url_available
path = ${directory:promises}/monitor-http-frontend
url = ${monitor-frontend:connection-site_url}
dash_path = {{ dash_executable_location }}
curl_path = {{ curl_executable_location }}
check-secure = 1
[monitor-base]
[monitor-base]
# create dependencies between required monitor parts
# create dependencies between required monitor parts
recipe = plone.recipe.command
recipe = plone.recipe.command
...
...
stack/monitor2/scripts/globalstate.py
View file @
defc6519
...
@@ -6,6 +6,7 @@ import glob
...
@@ -6,6 +6,7 @@ import glob
import
json
import
json
import
ConfigParser
import
ConfigParser
import
time
import
time
from
datetime
import
datetime
def
softConfigGet
(
config
,
*
args
,
**
kwargs
):
def
softConfigGet
(
config
,
*
args
,
**
kwargs
):
try
:
try
:
...
@@ -45,7 +46,8 @@ def main(args_list):
...
@@ -45,7 +46,8 @@ def main(args_list):
monitor_config
=
ConfigParser
.
ConfigParser
()
monitor_config
=
ConfigParser
.
ConfigParser
()
monitor_config
.
read
(
monitor_file
)
monitor_config
.
read
(
monitor_file
)
base_folder
=
monitor_config
.
get
(
'monitor'
,
'public-folder'
)
base_folder
=
monitor_config
.
get
(
'monitor'
,
'private-folder'
)
status_folder
=
monitor_config
.
get
(
'monitor'
,
'public-folder'
)
base_url
=
monitor_config
.
get
(
'monitor'
,
'base-url'
)
base_url
=
monitor_config
.
get
(
'monitor'
,
'base-url'
)
related_monitor_list
=
monitor_config
.
get
(
"monitor"
,
"monitor-url-list"
).
split
()
related_monitor_list
=
monitor_config
.
get
(
"monitor"
,
"monitor-url-list"
).
split
()
statistic_folder
=
os
.
path
.
join
(
base_folder
,
'data'
,
'.jio_documents'
)
statistic_folder
=
os
.
path
.
join
(
base_folder
,
'data'
,
'.jio_documents'
)
...
@@ -60,13 +62,14 @@ def main(args_list):
...
@@ -60,13 +62,14 @@ def main(args_list):
# search for all status files
# search for all status files
file_list
=
filter
(
os
.
path
.
isfile
,
file_list
=
filter
(
os
.
path
.
isfile
,
glob
.
glob
(
"%s/*.status.json"
%
base
_folder
)
glob
.
glob
(
"%s/*.status.json"
%
status
_folder
)
)
)
error
=
warning
=
success
=
0
error
=
warning
=
success
=
0
latest_date
=
''
latest_date
=
''
status
=
'OK'
status
=
'OK'
promise_list
=
[]
promise_list
=
[]
global_state_file
=
os
.
path
.
join
(
base_folder
,
'monitor.global.json'
)
global_state_file
=
os
.
path
.
join
(
base_folder
,
'monitor.global.json'
)
public_state_file
=
os
.
path
.
join
(
status_folder
,
'monitor.global.json'
)
for
file
in
file_list
:
for
file
in
file_list
:
try
:
try
:
with
open
(
file
,
'r'
)
as
temp_file
:
with
open
(
file
,
'r'
)
as
temp_file
:
...
@@ -100,9 +103,8 @@ def main(args_list):
...
@@ -100,9 +103,8 @@ def main(args_list):
},
},
date
=
latest_date
,
date
=
latest_date
,
_links
=
{
"rss_url"
:
{
"href"
:
"%s/public/feed"
%
base_url
},
_links
=
{
"rss_url"
:
{
"href"
:
"%s/public/feed"
%
base_url
},
"public_url"
:
{
"href"
:
"%s/share/jio_public"
%
base_url
},
"public_url"
:
{
"href"
:
"%s/share/jio_public/"
%
base_url
},
"private_url"
:
{
"href"
:
"%s/share/jio_private"
%
base_url
},
"private_url"
:
{
"href"
:
"%s/share/jio_private/"
%
base_url
}
"data_url"
:
{
"href"
:
'%s/public/data'
%
base_url
}
},
},
data
=
{
'state'
:
'monitor_state.data'
,
data
=
{
'state'
:
'monitor_state.data'
,
'process_state'
:
'monitor_process_resource.status'
,
'process_state'
:
'monitor_process_resource.status'
,
...
@@ -120,6 +122,7 @@ def main(args_list):
...
@@ -120,6 +122,7 @@ def main(args_list):
if
'instance'
in
config
.
sections
():
if
'instance'
in
config
.
sections
():
instance_dict
=
{}
instance_dict
=
{}
global_state_dict
[
'title'
]
=
config
.
get
(
'instance'
,
'name'
)
global_state_dict
[
'title'
]
=
config
.
get
(
'instance'
,
'name'
)
global_state_dict
[
'hosting-title'
]
=
config
.
get
(
'instance'
,
'root-name'
)
if
not
global_state_dict
[
'title'
]:
if
not
global_state_dict
[
'title'
]:
global_state_dict
[
'title'
]
=
'Instance Monitoring'
global_state_dict
[
'title'
]
=
'Instance Monitoring'
...
@@ -136,9 +139,22 @@ def main(args_list):
...
@@ -136,9 +139,22 @@ def main(args_list):
global_state_dict
[
'_links'
][
'related_monitor'
]
=
[{
'href'
:
"%s/share/jio_public"
%
url
}
global_state_dict
[
'_links'
][
'related_monitor'
]
=
[{
'href'
:
"%s/share/jio_public"
%
url
}
for
url
in
related_monitor_list
]
for
url
in
related_monitor_list
]
# Public information with the link to private folder
public_state_dict
=
dict
(
status
=
status
,
date
=
latest_date
,
_links
=
{
'monitor'
:
{
'href'
:
'%s/share/jio_private/'
%
base_url
}},
title
=
global_state_dict
.
get
(
'title'
,
''
)
)
public_state_dict
[
'hosting-title'
]
=
global_state_dict
.
get
(
'hosting-title'
,
''
)
public_state_dict
[
'_links'
][
'related_monitor'
]
=
global_state_dict
[
'_links'
].
get
(
'related_monitor'
,
[])
with
open
(
global_state_file
,
'w'
)
as
fglobal
:
with
open
(
global_state_file
,
'w'
)
as
fglobal
:
fglobal
.
write
(
json
.
dumps
(
global_state_dict
))
fglobal
.
write
(
json
.
dumps
(
global_state_dict
))
with
open
(
public_state_file
,
'w'
)
as
fpglobal
:
fpglobal
.
write
(
json
.
dumps
(
public_state_dict
))
generateStatisticsData
(
generateStatisticsData
(
os
.
path
.
join
(
statistic_folder
,
'monitor_state.data.json'
),
os
.
path
.
join
(
statistic_folder
,
'monitor_state.data.json'
),
global_state_dict
)
global_state_dict
)
...
...
stack/monitor2/scripts/monitor.py
View file @
defc6519
...
@@ -80,10 +80,10 @@ class Monitoring(object):
...
@@ -80,10 +80,10 @@ class Monitoring(object):
# Set Monitor variables
# Set Monitor variables
self
.
monitor_hal_json
=
config
.
get
(
"monitor"
,
"monitor-hal-json"
)
self
.
monitor_hal_json
=
config
.
get
(
"monitor"
,
"monitor-hal-json"
)
self
.
title
=
config
.
get
(
"monitor"
,
"title"
)
self
.
title
=
config
.
get
(
"monitor"
,
"title"
)
self
.
root_title
=
config
.
get
(
"monitor"
,
"root-title"
)
self
.
service_pid_folder
=
config
.
get
(
"monitor"
,
"service-pid-folder"
)
self
.
service_pid_folder
=
config
.
get
(
"monitor"
,
"service-pid-folder"
)
self
.
crond_folder
=
config
.
get
(
"monitor"
,
"crond-folder"
)
self
.
crond_folder
=
config
.
get
(
"monitor"
,
"crond-folder"
)
self
.
logrotate_d
=
config
.
get
(
"monitor"
,
"logrotate-folder"
)
self
.
logrotate_d
=
config
.
get
(
"monitor"
,
"logrotate-folder"
)
self
.
wraper_folder
=
config
.
get
(
"monitor"
,
"wraper-folder"
)
self
.
promise_runner
=
config
.
get
(
"monitor"
,
"promise-runner"
)
self
.
promise_runner
=
config
.
get
(
"monitor"
,
"promise-runner"
)
self
.
promise_folder_list
=
config
.
get
(
"monitor"
,
"promise-folder-list"
).
split
()
self
.
promise_folder_list
=
config
.
get
(
"monitor"
,
"promise-folder-list"
).
split
()
self
.
public_folder
=
config
.
get
(
"monitor"
,
"public-folder"
)
self
.
public_folder
=
config
.
get
(
"monitor"
,
"public-folder"
)
...
@@ -147,7 +147,7 @@ class Monitoring(object):
...
@@ -147,7 +147,7 @@ class Monitoring(object):
#configure jio_documents folder
#configure jio_documents folder
jio_public
=
os
.
path
.
join
(
self
.
webdav_folder
,
'jio_public'
)
jio_public
=
os
.
path
.
join
(
self
.
webdav_folder
,
'jio_public'
)
jio_private
=
os
.
path
.
join
(
self
.
webdav_folder
,
'jio_private'
,
'.jio_documents'
)
jio_private
=
os
.
path
.
join
(
self
.
webdav_folder
,
'jio_private'
)
mkdirAll
(
jio_public
)
mkdirAll
(
jio_public
)
mkdirAll
(
jio_private
)
mkdirAll
(
jio_private
)
mkdirAll
(
self
.
status_history_folder
)
mkdirAll
(
self
.
status_history_folder
)
...
@@ -162,6 +162,15 @@ class Monitoring(object):
...
@@ -162,6 +162,15 @@ class Monitoring(object):
if
e
.
errno
!=
os
.
errno
.
EEXIST
:
if
e
.
errno
!=
os
.
errno
.
EEXIST
:
raise
raise
self
.
data_folder
=
os
.
path
.
join
(
self
.
private_folder
,
'data'
,
'.jio_documents'
)
mkdirAll
(
self
.
data_folder
)
try
:
os
.
symlink
(
os
.
path
.
join
(
self
.
private_folder
,
'data'
),
os
.
path
.
join
(
jio_private
,
'data'
))
except
OSError
,
e
:
if
e
.
errno
!=
os
.
errno
.
EEXIST
:
raise
def
generateOpmlFile
(
self
,
feed_url_list
,
output_file
):
def
generateOpmlFile
(
self
,
feed_url_list
,
output_file
):
if
not
feed_url_list
:
if
not
feed_url_list
:
return
return
...
@@ -206,13 +215,13 @@ class Monitoring(object):
...
@@ -206,13 +215,13 @@ class Monitoring(object):
"public"
:
{
"href"
:
"%s/public"
%
self
.
webdav_url
},
"public"
:
{
"href"
:
"%s/public"
%
self
.
webdav_url
},
"private"
:
{
"href"
:
"%s/private"
%
self
.
webdav_url
},
"private"
:
{
"href"
:
"%s/private"
%
self
.
webdav_url
},
"rss"
:
{
"href"
:
"%s/feed"
%
self
.
public_url
},
"rss"
:
{
"href"
:
"%s/feed"
%
self
.
public_url
},
"jio_public"
:
{
"href"
:
"%s/jio_public"
%
self
.
webdav_url
},
"jio_public"
:
{
"href"
:
"%s/jio_public
/
"
%
self
.
webdav_url
},
"jio_private"
:
{
"href"
:
"%s/jio_private"
%
self
.
webdav_url
}
"jio_private"
:
{
"href"
:
"%s/jio_private
/
"
%
self
.
webdav_url
}
}
}
if
self
.
title
:
if
self
.
title
:
self
.
monitor_dict
[
"title"
]
=
self
.
title
self
.
monitor_dict
[
"title"
]
=
self
.
title
if
self
.
monitor_url_list
:
if
self
.
monitor_url_list
:
monitor_link_dict
[
"related_monitor"
]
=
[{
"href"
:
"%s/share/jio_public"
%
url
}
monitor_link_dict
[
"related_monitor"
]
=
[{
"href"
:
url
}
for
url
in
self
.
monitor_url_list
]
for
url
in
self
.
monitor_url_list
]
self
.
generateOpmlFile
(
self
.
monitor_url_list
,
self
.
generateOpmlFile
(
self
.
monitor_url_list
,
os
.
path
.
join
(
self
.
public_folder
,
'feeds'
))
os
.
path
.
join
(
self
.
public_folder
,
'feeds'
))
...
@@ -245,28 +254,29 @@ class Monitoring(object):
...
@@ -245,28 +254,29 @@ class Monitoring(object):
service_config
=
promise
[
"configuration"
]
service_config
=
promise
[
"configuration"
]
service_status_path
=
"%s/%s.status.json"
%
(
self
.
public_folder
,
service_name
)
# hardcoded
service_status_path
=
"%s/%s.status.json"
%
(
self
.
public_folder
,
service_name
)
# hardcoded
mkdirAll
(
os
.
path
.
dirname
(
service_status_path
))
mkdirAll
(
os
.
path
.
dirname
(
service_status_path
))
command
=
"%s %s %s %s %s %s %s"
%
(
self
.
promise_runner
,
promise_cmd_line
=
[
os
.
path
.
join
(
self
.
service_pid_folder
,
"%s.pid"
%
service_name
),
softConfigGet
(
service_config
,
"service"
,
"frequency"
)
or
"* * * * *"
,
service_status_path
,
self
.
promise_runner
,
promise
[
"path"
],
'--pid_path %s'
%
os
.
path
.
join
(
self
.
service_pid_folder
,
service_name
,
"%s.pid"
%
service_name
),
"%s/jio_public"
%
self
.
webdav_url
,
# XXX hardcoded
'--output %s'
%
service_status_path
,
self
.
status_history_folder
'--promise_script %s'
%
promise
[
"path"
],
)
'--promise_name "%s"'
%
service_name
,
'--monitor_url "%s/jio_private/"'
%
self
.
webdav_url
,
# XXX hardcoded,
cron_line_list
.
append
(
"%s %s"
%
(
'--history_folder %s'
%
self
.
status_history_folder
,
softConfigGet
(
service_config
,
"service"
,
"frequency"
)
or
"* * * * *"
,
'--instance_name "%s"'
%
self
.
title
,
command
.
replace
(
"%"
,
"
\
\
%"
),
'--hosting_name "%s"'
%
self
.
root_title
]
))
cron_line_list
.
append
(
' '
.
join
(
promise_cmd_line
))
if
service_name
in
service_name_list
:
if
service_name
in
service_name_list
:
service_name_list
.
pop
(
service_name_list
.
index
(
service_name
))
service_name_list
.
pop
(
service_name_list
.
index
(
service_name
))
wrapper_path
=
os
.
path
.
join
(
self
.
wraper_folder
,
service_name
)
"""
wrapper_path = os.path.join(self.wraper_folder, service_name)
with open(wrapper_path, "w") as fp:
with open(wrapper_path, "w") as fp:
fp.write("#!/bin/sh
\
n
%s" % command) # XXX hardcoded, use dash, sh or bash binary!
fp.write("#!/bin/sh
\
n
%s" % command) # XXX hardcoded, use dash, sh or bash binary!
os
.
chmod
(
wrapper_path
,
stat
.
S_IRUSR
|
stat
.
S_IWUSR
|
stat
.
S_IXUSR
|
stat
.
S_IRGRP
|
stat
.
S_IROTH
)
os.chmod(wrapper_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | stat.S_IRGRP | stat.S_IROTH )
"""
if
service_name_list
!=
[]:
if
service_name_list
!=
[]:
# XXX Some service was removed, delete his status file so monitor will not consider his status anymore
# XXX Some service was removed, delete his status file so monitor will not consider his status anymore
...
@@ -318,8 +328,6 @@ class Monitoring(object):
...
@@ -318,8 +328,6 @@ class Monitoring(object):
self
.
generateServiceCronEntries
()
self
.
generateServiceCronEntries
()
# Rotate monitor data files
# Rotate monitor data files
self
.
data_folder
=
os
.
path
.
join
(
self
.
public_folder
,
'data'
,
'.jio_documents'
)
mkdirAll
(
self
.
data_folder
)
option_list
=
[
option_list
=
[
'daily'
,
'nocreate'
,
'noolddir'
,
'rotate 30'
,
'daily'
,
'nocreate'
,
'noolddir'
,
'rotate 30'
,
'nocompress'
,
'extension .json'
,
'dateext'
,
'nocompress'
,
'extension .json'
,
'dateext'
,
...
...
stack/monitor2/scripts/run-promise.py
View file @
defc6519
...
@@ -9,22 +9,39 @@ import psutil
...
@@ -9,22 +9,39 @@ import psutil
import
time
import
time
from
shutil
import
copyfile
from
shutil
import
copyfile
import
glob
import
glob
import
argparse
def
parseArguments
():
"""
Parse arguments for monitor collector instance.
"""
parser
=
argparse
.
ArgumentParser
()
parser
.
add_argument
(
'--pid_path'
,
help
=
'Path where the pid of this process will be writen.'
)
parser
.
add_argument
(
'--output'
,
help
=
'The Path of file where Json result of this promise will be saved.'
)
parser
.
add_argument
(
'--promise_script'
,
help
=
'Promise script to execute.'
)
parser
.
add_argument
(
'--promise_name'
,
help
=
'Title to give to this promise.'
)
parser
.
add_argument
(
'--monitor_url'
,
help
=
'Monitor Instance website URL.'
)
parser
.
add_argument
(
'--history_folder'
,
help
=
'Path where old result file will be placed before generate a new json result file.'
)
parser
.
add_argument
(
'--instance_name'
,
default
=
'UNKNOW Software Instance'
,
help
=
'Software Instance name.'
)
parser
.
add_argument
(
'--hosting_name'
,
default
=
'UNKNOW Hosting Subscription'
,
help
=
'Hosting Subscription name.'
)
return
parser
.
parse_args
()
def
main
():
def
main
():
if
len
(
sys
.
argv
)
<
4
:
parser
=
parseArguments
()
print
(
"Usage: %s <pid_path> <output_path> <command> [<name>] [...]"
%
sys
.
argv
[
0
])
return
2
if
os
.
path
.
exists
(
parser
.
pid_path
):
pid_path
=
sys
.
argv
[
1
]
with
open
(
parser
.
pid_path
,
"r"
)
as
pidfile
:
output_path
=
sys
.
argv
[
2
]
promise_name
=
history_folder
=
related_url
=
""
if
len
(
sys
.
argv
)
>=
5
:
promise_name
=
sys
.
argv
[
4
]
if
len
(
sys
.
argv
)
>=
6
:
related_url
=
sys
.
argv
[
5
]
if
len
(
sys
.
argv
)
>=
7
:
history_folder
=
sys
.
argv
[
6
]
if
os
.
path
.
exists
(
pid_path
):
with
open
(
pid_path
,
"r"
)
as
pidfile
:
try
:
try
:
pid
=
int
(
pidfile
.
read
(
6
))
pid
=
int
(
pidfile
.
read
(
6
))
except
ValueError
:
except
ValueError
:
...
@@ -33,29 +50,35 @@ def main():
...
@@ -33,29 +50,35 @@ def main():
print
(
"A process is already running with pid "
+
str
(
pid
))
print
(
"A process is already running with pid "
+
str
(
pid
))
return
1
return
1
start_date
=
""
start_date
=
""
with
open
(
pid_path
,
"w"
)
as
pidfile
:
with
open
(
p
arser
.
p
id_path
,
"w"
)
as
pidfile
:
process
=
executeCommand
(
sys
.
argv
[
3
:]
)
process
=
executeCommand
(
parser
.
promise_script
)
ps_process
=
psutil
.
Process
(
process
.
pid
)
ps_process
=
psutil
.
Process
(
process
.
pid
)
start_date
=
time
.
strftime
(
"%Y-%m-%d %H:%M:%S"
,
time
.
localtime
(
ps_process
.
create_time
()))
start_date
=
time
.
strftime
(
"%Y-%m-%d %H:%M:%S"
,
time
.
localtime
(
ps_process
.
create_time
()))
pidfile
.
write
(
str
(
process
.
pid
))
pidfile
.
write
(
str
(
process
.
pid
))
status_json
=
generateStatusJsonFromProcess
(
process
,
start_date
=
start_date
,
title
=
promise_name
)
status_json
=
generateStatusJsonFromProcess
(
process
,
start_date
=
start_date
)
status_json
[
'_links'
]
=
{
"monitor"
:
{
"href"
:
parser
.
monitor_url
}}
status_json
[
'title'
]
=
parser
.
promise_name
status_json
[
'instance'
]
=
parser
.
instance_name
status_json
[
'hosting_subscription'
]
=
parser
.
hosting_name
# Save the lastest status change date (needed for rss)
# Save the lastest status change date (needed for rss)
if
related_url
:
status_json
[
'_links'
]
=
{
"monitor"
:
{
"href"
:
related_url
}}
status_json
[
'change-time'
]
=
ps_process
.
create_time
()
status_json
[
'change-time'
]
=
ps_process
.
create_time
()
if
os
.
path
.
exists
(
output_path
):
if
os
.
path
.
exists
(
parser
.
output
):
with
open
(
output_path
)
as
f
:
with
open
(
parser
.
output
)
as
f
:
last_result
=
json
.
loads
(
f
.
read
())
last_result
=
json
.
loads
(
f
.
read
())
if
status_json
[
'status'
]
==
last_result
[
'status'
]
and
last_result
.
has_key
(
'change-time'
):
if
status_json
[
'status'
]
==
last_result
[
'status'
]
and
last_result
.
has_key
(
'change-time'
):
status_json
[
'change-time'
]
=
last_result
[
'change-time'
]
status_json
[
'change-time'
]
=
last_result
[
'change-time'
]
if
history_folder
:
updateStatusHistoryFolder
(
updateStatusHistoryFolder
(
promise_name
,
output_path
,
history_folder
)
parser
.
promise_name
,
with
open
(
output_path
,
"w"
)
as
outputfile
:
parser
.
output
,
parser
.
history_folder
)
with
open
(
parser
.
output
,
"w"
)
as
outputfile
:
json
.
dump
(
status_json
,
outputfile
)
json
.
dump
(
status_json
,
outputfile
)
os
.
remove
(
pid_path
)
os
.
remove
(
p
arser
.
p
id_path
)
def
updateStatusHistoryFolder
(
name
,
status_file
,
history_folder
):
def
updateStatusHistoryFolder
(
name
,
status_file
,
history_folder
):
old_history_list
=
[]
old_history_list
=
[]
...
...
stack/monitor2/templates/httpd-cors.cfg.in
0 → 100644
View file @
defc6519
{% if domain -%}
{% set allow_domain = '|'.join(domain.replace('.', '\.').split()) -%}
SetEnvIf Origin "^http(s)?://(.+\.)?({{ allow_domain }})$" ORIGIN_DOMAIN=$0
Header always set Access-Control-Allow-Origin "%{ORIGIN_DOMAIN}e" env=ORIGIN_DOMAIN
{% endif -%}
\ No newline at end of file
stack/monitor2/templates/instance-info.conf.in
View file @
defc6519
[instance]
[instance]
name = {{ instance_dict['name'] }}
name = {{ instance_dict['name'] }}
root-name = {{ instance_dict['root-name'] }}
computer = {{ instance_dict['computer-id'] }}
computer = {{ instance_dict['computer-id'] }}
ipv4 = {{ instance_dict['ipv4'] }}
ipv4 = {{ instance_dict['ipv4'] }}
ipv6 = {{ instance_dict['ipv6'] }}
ipv6 = {{ instance_dict['ipv6'] }}
...
...
stack/monitor2/templates/monitor-httpd.conf.in
View file @
defc6519
...
@@ -33,6 +33,8 @@ LoadModule rewrite_module modules/mod_rewrite.so
...
@@ -33,6 +33,8 @@ LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
LoadModule headers_module modules/mod_headers.so
LoadModule dav_module modules/mod_dav.so
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule env_module modules/mod_env.so
LoadModule setenvif_module modules/mod_setenvif.so
# SSL Configuration
# SSL Configuration
<IfDefine !SSLConfigured>
<IfDefine !SSLConfigured>
...
...
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