diff options
author | rsiddharth <rsiddharth@ninthfloor.org> | 2014-01-02 16:52:57 +0530 |
---|---|---|
committer | rsiddharth <rsiddharth@ninthfloor.org> | 2014-01-02 16:52:57 +0530 |
commit | 223844f13980c4758d7e61e19cf95b79a871cf1d (patch) | |
tree | 8aa64633dea5da4bd2c077af4b8140beeb30a450 /src/gns_wiki.py | |
parent | 2fe62a627cf20f103570b99f13820d785e67cbdf (diff) | |
parent | b6e406da07b5ac327c28deb7f1bfc7e5a7399adb (diff) |
merged branch `dev`.
Now the script uses XMLRPC to automatically update the wiki remotely.
Diffstat (limited to 'src/gns_wiki.py')
-rw-r--r-- | src/gns_wiki.py | 134 |
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() + |