summaryrefslogtreecommitdiffstats
path: root/src/gns_wiki.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/gns_wiki.py')
-rw-r--r--src/gns_wiki.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/gns_wiki.py b/src/gns_wiki.py
new file mode 100644
index 0000000..749a89f
--- /dev/null
+++ b/src/gns_wiki.py
@@ -0,0 +1,134 @@
+# Copyright 2013 rsiddharth <rsiddharth@ninthfloor.org>
+#
+# This work is free. You can redistribute it and/or modify it under
+# the terms of the Do What The Fuck You Want To Public License,
+# Version 2, as published by Sam Hocevar. See the COPYING file or
+# <http://www.wtfpl.net/> for more details.
+
+import xmlrpclib as xmlrpc
+from xmlrpclib import Fault
+import filecmp
+import os.path as path
+
+def get_topsecret(src_dir):
+ """
+ Returns the username, password & wikiurl
+
+ They are stored in src/config/ directory in the topsecret.txt
+ file.
+ """
+
+ try:
+ secrets = open(path.join(src_dir,
+ "config",
+ "topsecret.txt"), "r").readlines()
+
+ username = secrets[0].strip()
+ password = secrets[1].strip()
+ wikiurl = secrets[2].strip()
+ except IOError:
+ print "ERROR: Specify your wikiusername, password & wikiurl at \
+`src/config/topsecret.txt`. Look at the README for the proper format."
+ exit(1)
+
+ return username, password, wikiurl
+
+def update(table, src_dir):
+ """
+ Generates wiki page using table and pushes it to the wiki using XML-RPC.
+ """
+
+ # Code below adapted from
+ # http://moinmo.in/MoinAPI/Examples#xmlrpc.putPage.28.29
+
+ name, password, wikiurl = get_topsecret(src_dir)
+ homewiki = xmlrpc.ServerProxy(wikiurl + "?action=xmlrpc2",
+ allow_none=True)
+ auth_token = homewiki.getAuthToken(name, password)
+ mc = xmlrpc.MultiCall(homewiki)
+ mc.applyAuthToken(auth_token)
+ pagename = "Documentation/3/DifferencesWithDebian"
+ wiki_page_content, update = generate_wiki_page(table, src_dir)
+
+ if(update):
+ # Send the updated wiki page to moin wiki:
+ mc.putPage(pagename, wiki_page_content)
+ result = mc()
+ success = None
+
+ try:
+ success = result[1]
+ except Fault, e:
+ print e
+
+ if success:
+ print "Updated %s" % (pagename)
+ update_wiki_page_locally(
+ wiki_page_content,
+ path.join(src_dir, "wiki-files",
+ "differences-with-debian.txt"))
+ else:
+ print ">> Script did not update wiki <<"
+ else:
+ print "Nothing new! %s/%s was not updated" % (wikiurl,
+ pagename)
+
+def generate_wiki_page(table, src_dir):
+ """
+ Generates the wiki page using the table.
+
+ `differences-with-debian-head.txt' file, used by this function,
+ contains text that precedes the table.
+ """
+
+ # generate wikipage
+ diff_with_deb_head = path.join(src_dir,
+ "wiki-files",
+ "differences-with-debian-head.txt")
+ wiki_page_content = open(diff_with_deb_head, "r").read() + "\n"
+
+ for row in table:
+ wiki_page_content += row + "\n"
+
+ update = wiki_page_updated(wiki_page_content, src_dir)
+
+ return wiki_page_content, update
+
+
+def wiki_page_updated(wiki_page_content, src_dir):
+ """
+ Returns True if the wiki page is updated
+ """
+
+ # write wikipage to temp file
+ temp_file = open("/tmp/diff-with-deb-tmp.txt", "w")
+ temp_file.write(wiki_page_content)
+ temp_file.close()
+
+ # this file contains the wiki page last generated by the script.
+ diff_with_deb = path.join(src_dir,
+ "wiki-files",
+ "differences-with-debian.txt")
+
+ # first check if the file exists
+ if(path.isfile(diff_with_deb)):
+ # filecmp.cmp returns True if both the file are same.
+ update = (filecmp.cmp(temp_file.name,
+ diff_with_deb, 1) == False)
+ else:
+ # we don't have a local copy of the wiki page. So, let's
+ # update the wiki.
+ update = True
+
+ return update
+
+
+def update_wiki_page_locally(wiki_page_content, filename):
+ """
+ Writes the wiki page locally to `filename'
+ """
+
+ wiki_file = open(filename, "w")
+ wiki_file.write(wiki_page_content)
+ wiki_file.close()
+