From 5ed0d5a6d1fdbc20d2c34b2965ec192d2724f608 Mon Sep 17 00:00:00 2001
From: Alain Takoudjou <alain.takoudjou@nexedi.com>
Date: Thu, 25 Feb 2016 17:28:05 +0100
Subject: [PATCH] Allow to configure multiple monitoring source

---
 stack/monitor2/buildout.cfg                   |  6 +--
 stack/monitor2/instance-monitor.cfg.jinja2.in | 10 +++--
 stack/monitor2/scripts/monitor.py             | 25 ++++++-----
 stack/monitor2/scripts/status2rss.py          | 42 +++++++++++++++----
 4 files changed, 57 insertions(+), 26 deletions(-)

diff --git a/stack/monitor2/buildout.cfg b/stack/monitor2/buildout.cfg
index 6a77b2ab0..3cfd3efb9 100644
--- a/stack/monitor2/buildout.cfg
+++ b/stack/monitor2/buildout.cfg
@@ -127,7 +127,7 @@ recipe = slapos.recipe.template:jinja2
 filename = template-monitor.cfg
 template = ${:_profile_base_location_}/instance-monitor.cfg.jinja2.in
 rendered = ${buildout:directory}/template-monitor.cfg
-md5sum = ee39ce85084d29172f50ae7375960371
+md5sum = b28523cd793788a1e1b11698c5a67b03
 context =
     key apache_location apache:location
     key gzip_location gzip:location
@@ -164,7 +164,7 @@ context =
 [monitor2-bin]
 <= monitor-template-script
 filename = monitor.py
-md5sum = 119827d7e7ed45c627f1ad21a94445b8
+md5sum = 51ada466716af0a763910c24f1bdf819
 
 [run-promise-py]
 recipe = slapos.recipe.template:jinja2
@@ -183,7 +183,7 @@ md5sum = f7e937d6619eb674f39f34718928d91d
 [status2rss-executable]
 <= monitor-template-script
 filename = status2rss.py
-md5sum = 40dcda69f1ccb8639d7ef0ad65bceb5e
+md5sum = f297779d0881f4bd48081506efb492a4
 
 [monitor-globalstate]
 <= monitor-template-script
diff --git a/stack/monitor2/instance-monitor.cfg.jinja2.in b/stack/monitor2/instance-monitor.cfg.jinja2.in
index f78e678a4..14f126025 100644
--- a/stack/monitor2/instance-monitor.cfg.jinja2.in
+++ b/stack/monitor2/instance-monitor.cfg.jinja2.in
@@ -133,6 +133,7 @@ public-folder = ${monitor-directory:public}
 private-folder = ${monitor-directory:private}
 webdav-folder = ${monitor-directory:webdav}
 web-folder = ${monitor-directory:web-dir}
+#base-url = ${monitor-frontend-promise:url}
 base-url = ${monitor-httpd-conf-parameter:url}
 monitor-hal-json = ${monitor-directory:public}/monitor.hal.json
 service-pid-folder = ${monitor-directory:pids}
@@ -253,7 +254,9 @@ command = kill -USR1 $(cat ${monitor-httpd-conf-parameter:pid-file})
 
 [monitor-status2rss-wrapper]
 recipe = slapos.cookbook:wrapper
-command-line = {{ python_with_eggs }} {{ status2rss_executable_path }} '${monitor-instance-parameter:monitor-title}' '${monitor-httpd-conf-parameter:url}' '${monitor-httpd-conf-parameter:url}/public' ${monitor-directory:public} ${monitor-directory:public}/feed
+# XXX - hard-coded Urls
+command-line = {{ python_with_eggs }} {{ status2rss_executable_path }} --output '${monitor-directory:public}/feed' --items_folder '${monitor-directory:public}' --public_url '${monitor-conf-parameters:base-url}/share/jio_public/' --private_url '${monitor-conf-parameters:base-url}/share/jio_private/' --instance_name '${monitor-conf-parameters:title}' --hosting_name '${monitor-conf-parameters:root-title}'
+
 wrapper-path = ${directory:bin}/monitor-status2rss.py
 
 [monitor-status2rss-cron-entry]
@@ -363,9 +366,8 @@ context =
 
 [publish]
 recipe = slapos.cookbook:publish
-#monitor-base-url = ${monitor-httpd-conf-parameter:url}
-monitor-base-url = ${monitor-frontend-promise:url}
-monitor-url = ${:monitor-base-url}/share/jio_public
+monitor-base-url = ${monitor-conf-parameters:base-url}
+monitor-url = ${:monitor-base-url}/public/feeds
 monitor-user = ${httpd-monitor-htpasswd:user}
 monitor-password = ${httpd-monitor-htpasswd:password}
 
diff --git a/stack/monitor2/scripts/monitor.py b/stack/monitor2/scripts/monitor.py
index be4a5a23d..ea4a73ffb 100644
--- a/stack/monitor2/scripts/monitor.py
+++ b/stack/monitor2/scripts/monitor.py
@@ -15,7 +15,7 @@ OPML_START = """<?xml version="1.0" encoding="UTF-8"?>
 <!-- OPML generated by SlapOS -->
 <opml version="1.1">
 	<head>
-		<title>SlapOS Monitoring Status Lists</title>
+		<title>%(root_title)s</title>
 		<dateCreated>%(creation_date)s</dateCreated>
 		<dateModified>%(modification_date)s</dateModified>
 	</head>
@@ -25,7 +25,7 @@ OPML_END = """	  </outline>
   </body>
 </opml>"""
 
-OPML_OUTLINE_FEED = '<outline text="%(title)s" title="%(title)s" type="rss" version="RSS" htmlUrl="%(html_url)s" xmlUrl="%(xml_url)s" />'
+OPML_OUTLINE_FEED = '<outline text="%(title)s" title="%(title)s" type="rss" version="RSS" htmlUrl="%(html_url)s" xmlUrl="%(xml_url)s" url="%(global_url)s" />'
 
 
 def parseArguments():
@@ -172,8 +172,6 @@ class Monitoring(object):
         raise
 
   def generateOpmlFile(self, feed_url_list, output_file):
-    if not feed_url_list:
-      return
 
     if os.path.exists(output_file):
       creation_date = datetime.fromtimestamp(os.path.getctime(output_file)).utcnow().strftime("%a, %d %b %Y %H:%M:%S +0000")
@@ -183,15 +181,18 @@ class Monitoring(object):
 
     opml_content = OPML_START % {'creation_date': creation_date,
                                   'modification_date': modification_date,
-                                  'outline_title': 'Monitoring RSS Feed list'}
+                                  'outline_title': 'Monitoring RSS Feed list',
+                                  'root_title': self.root_title}
 
-    opml_content += OPML_OUTLINE_FEED % {'title': 'Main Instance',
+    opml_content += OPML_OUTLINE_FEED % {'title': self.title,
         'html_url': self.public_url + '/feed',
-        'xml_url': self.public_url + '/feed'}
+        'xml_url': self.public_url + '/feed',
+        'global_url': "%s/jio_public/" % self.webdav_url}
     for feed_url in feed_url_list:
-      opml_content += OPML_OUTLINE_FEED % {'title': 'Monitoring Instance',
+      opml_content += OPML_OUTLINE_FEED % {'title': 'Related Monitoring Instance',
         'html_url': feed_url + '/public/feed',
-        'xml_url': feed_url + '/public/feed'}
+        'xml_url': feed_url + '/public/feed',
+        'global_url': "%s/share/jio_public/" % feed_url}
 
     opml_content += OPML_END
 
@@ -223,8 +224,6 @@ class Monitoring(object):
     if self.monitor_url_list:
       monitor_link_dict["related_monitor"] = [{"href": url}
                                   for url in self.monitor_url_list]
-      self.generateOpmlFile(self.monitor_url_list,
-        os.path.join(self.public_folder, 'feeds'))
     self.monitor_dict["_links"] = monitor_link_dict
     if self.promise_items:
       service_list = []
@@ -324,6 +323,10 @@ class Monitoring(object):
     self.monitor_dict = {}
     self.generateMonitorHalJson()
 
+    # Generate OPML file
+    self.generateOpmlFile(self.monitor_url_list,
+      os.path.join(self.public_folder, 'feeds'))
+
     # put promises to a cron file
     self.generateServiceCronEntries()
 
diff --git a/stack/monitor2/scripts/status2rss.py b/stack/monitor2/scripts/status2rss.py
index 3b624d071..5ee72d484 100644
--- a/stack/monitor2/scripts/status2rss.py
+++ b/stack/monitor2/scripts/status2rss.py
@@ -5,17 +5,40 @@ import datetime
 import base64
 import hashlib
 import PyRSS2Gen
+import argparse
+
+def parseArguments():
+  """
+  Parse arguments for monitor Rss Generator.
+  """
+  parser = argparse.ArgumentParser()
+  parser.add_argument('--items_folder',
+                      help='Path where to get *.status.json files which contain result of promises.')
+  parser.add_argument('--output',
+                      help='The Path of file where feed file will be saved.')
+  parser.add_argument('--public_url',
+                      help='Monitor Instance public URL.')
+  parser.add_argument('--private_url',
+                      help='Monitor Instance private URL.')
+  parser.add_argument('--instance_name',
+                      default='UNKNOW Software Instance',
+                      help='Software Instance name.')
+  parser.add_argument('--hosting_name',
+                      default='',
+                      help='Hosting Subscription name.')
+
+  return parser.parse_args()
 
 def getKey(item):
   return item.pubDate
 
 def main():
-  _, title, link, base_url, status_folder, output_path = sys.argv
+  parser = parseArguments()
 
   rss_item_list = []
-  for filename in os.listdir(status_folder):
+  for filename in os.listdir(parser.items_folder):
     if filename.endswith(".status.json"):
-      filepath = os.path.join(status_folder, filename)
+      filepath = os.path.join(parser.items_folder, filename)
       result_dict = None
       try:
         result_dict = json.load(open(filepath, "r"))
@@ -25,9 +48,12 @@ def main():
       description = result_dict.get('message', '')
       event_time = datetime.datetime.fromtimestamp(result_dict['change-time'])
       rss_item = PyRSS2Gen.RSSItem(
+        categories = [result_dict['status']],
+        source = PyRSS2Gen.Source(result_dict['title'], parser.public_url),
         title = '[%s] %s' % (result_dict['status'], result_dict['title']),
+        comments = description,
         description = "%s: %s\n%s" % (event_time, result_dict['status'], description),
-        link = '%s/%s' % (base_url, filename),
+        link = parser.private_url,
         pubDate = event_time,
         guid = PyRSS2Gen.Guid(base64.b64encode("%s, %s" % (event_time, result_dict['status'])))
       )
@@ -37,13 +63,13 @@ def main():
   ### Build the rss feed
   sorted(rss_item_list, key=getKey)
   rss_feed = PyRSS2Gen.RSS2 (
-    title = title,
-    link = link,
-    description = '',
+    title = parser.instance_name,
+    link = parser.public_url,
+    description = parser.hosting_name,
     lastBuildDate = datetime.datetime.utcnow(),
     items = rss_item_list
     )
-  with open(output_path, 'w') as frss:
+  with open(parser.output, 'w') as frss:
     frss.write(rss_feed.to_xml())
 
 if __name__ == "__main__":
-- 
2.30.9