#!/bin/env python # import sys, os, traceback, stat, re, getopt, string, inspect sys.path.append("/hive/data/outside/ncbi/incidentDb/") import mwclient def usage(): sys.stderr.write('''gwUploadFile -- given a file, load into genomewiki as the specified image name usage: gwUploadFile [options] load file.bb into genome wiki under image name: Image:ImageName options: -s, --site=genomewiki.ucsc.edu -- use to specify a different site -d, --debug -- show full stack trace on error exits -h, --help -- displays this help message -V, --version -- displays version of this program Note: Using imageName will upper case the first letter to: ImageName in the wiki because the wiki does that for names. Note: requires a .gwLogin file for login name and password to genomewiki either in current directory ./.gwLogin or in your HOME/.gwLogin A single line file with two words: UserName passWd and it must be 600 permissions to keep it secret.\n''') def loginCredentials(): # return: loginName, passWd from either ./.gwLogin or HOME/.gwLogin # verify the .gwLogin file has correct restrictive permissions home = os.getenv('HOME') loginName = "None" passWd = "None" gwLogin = ".gwLogin" try: fh = open(gwLogin, 'r') except Exception: gwLogin = home + "/.gwLogin" try: fh = open(gwLogin, 'r') except Exception: raise "ERROR: can not read ./.gwLogin or HOME/.gwLogin password file" mode = stat.S_IMODE(os.lstat(gwLogin)[stat.ST_MODE]) for level in "GRP", "OTH": for perm in "R", "W", "X": testMode = "S_I"+perm+level if mode & getattr(stat,testMode): raise "ERROR: your .gwLogin file must be 600 permissions" for line in fh: if re.match("#", line): continue chomp = line.rstrip('\r\n') loginName, passWd = chomp.split() break fh.close() return loginName, passWd def parseOptions(): # return: file, pageName, site try: opts, args = getopt.getopt(sys.argv[1:], 'dhs:V', ['debug', 'help', 'version', 'site=']) except Exception: usage() raise "ERROR: unrecognized option" if len(args) != 2: usage() raise site = 'genomewiki.ucsc.edu' sys.tracebacklimit = 0 for o, a in opts: if o in ("-h", "--help"): usage() raise elif o in ("-d", "--debug"): sys.tracebacklimit = 10 sys.stderr.write('# setting tracebacklimit to 10\n') elif o in ("-V", "--version"): sys.stderr.write('# gwUploadFile version 1.0\n') elif o in ("-s", "--site"): site = a else: assert False, "unrecognized option" file = args[0] pageName = args[1] # force upper case on the first letter since this is what genomewiki # would be doing in any case PageName = pageName[0].capitalize() + pageName[1:] try: fh = open(file, 'r') except Exception: raise "ERROR: can not read file to upload: '%s'" % (file, ) fh.close() return file, PageName, site ###################################################################### # ###################################################################### try: file, pageName, siteUrl = parseOptions() loginName, passWd = loginCredentials() sys.stderr.write("# loading file: %s\n" % (file, )) sys.stderr.write("# into Image name: %s\n" % (pageName, )) sys.stderr.write("# login name: %s\n" % (loginName, )) sys.stderr.write("# siteUrl: %s\n" % (siteUrl, )) sys.stderr.write("# traceBackLimit: %d\n" % (sys.tracebacklimit, )) site = mwclient.Site(siteUrl,path='/') try: site.login(loginName, passWd) except Exception: sys.stderr.write("ERROR: can not login as user '%s'\n" % (loginName, )) raise try: fh = open(file, 'rb') except Exception: sys.stderr.write("ERROR: can not read file to upload: '%s'\n" % (file, )) raise try: site.upload(fh, pageName, 'gwUploadFile upload', ignore=True) except Exception: sys.stderr.write('ERROR: upload returned some kind of error') raise fh.close() # Printing imageusage information image = site.Images[pageName] sys.stderr.write("# traceBackLimit: %d past site.Images\n" % (sys.tracebacklimit, )) sys.stderr.write('Image info: %s\n' % (image.imageinfo, )) sys.stderr.write('Image %s usage:\n' % (image.name.encode('utf-8'), )) for page in image.imageusage(): sys.stderr.write('Used: %s; namespace %s\n' % (page.name.encode('utf-8'), page.namespace)) except Exception, ex: sys.stderr.write('ERROR: some kind of problem in main\n'); print ex sys.exit(255)