#!/usr/bin/python # Written by Stephane Graber # Daniel Bartlett # Last modification : Mon Jan 28 22:33:23 CET 2008 # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA try: import urllib, os, sys, re, getopt, select, xml.dom.minidom, gettext from gettext import gettext as _ gettext.textdomain("pastebinit") defaultPB = "http://pastebin.com" #Default pastebin version = "0.10" #Version number to show in the usage configfile = os.environ.get('HOME') + "/.pastebinit.xml" # Custom urlopener to handle 401's class pasteURLopener(urllib.FancyURLopener): def http_error_401(self, url, fp, errcode, errmsg, headers, data=None): return None #Return the parameters depending of the pastebin used def getParameters(website, content, user, jabberid, version, format, parentpid, permatag, title, username, password): "Return the parameters array for the selected pastebin" params={} # pastebin.com v0.50 if re.search("http://((([a-zA-Z0-9\-_\.]*)(pastebin\.com)))", website) and not website == "http://www.pastebin.com" or website == "http://pastebin.mozilla.org": params['poster'] = user params['code2'] = content params['version'] = version params['parent_pid'] = parentpid #For reply, "" means homepage (new thread) params['format'] = format #The format, for syntax hilighting params['paste'] = "Send" params['remember'] = "0" #Do you want a cookie ? params['expiry'] = "f" #The expiration, f = forever elif website == "http://pastebin.ca": params['name'] = user params['content'] = content params['type'] = "1" #The expiration, 1 = raw params['save'] = "0" #Do you want a cookie ? params['s'] = "Submit Post" params['regexp'] = '">http://pastebin.ca/(.*)' elif re.search("http://((([a-zA-Z0-9\-_\.]*)(paste\.f\-box\.org|1t2\.us|paste\.stgraber\.org)))", website): params['poster'] = user params['jid'] = jabberid params['code2'] = content params['parent_pid'] = parentpid #For reply, "" means homepage (new thread) params['format'] = format #The format, for syntax hilighting params['paste'] = "Send" params['remember'] = "0" #Do you want a cookie ? params['expiry'] = "f" #The expiration, f = forever params['permatag'] = permatag params['title'] = title params['username'] = username params['password'] = password params['version'] = version elif website == "http://rafb.net" : params['page']="/paste/paste.php" params['nick']=user params['text']=content params['lang']="Plain Text" #The format, for syntax hilighting params['cvt_tabs']="No" elif website == "http://yourpaste.net": params['syntax'] = format params['name'] = user params['desc'] = title params['expire'] = "0" # Forever params['code'] = content params['private'] = "0" # It's not a private post params['remember'] = "0" # Cookies? ;) params['page'] = "/paste" params['regexp'] = '">http://yourpaste.net(.*)/' elif website == "http://paste.ubuntu.com": params['poster'] = user params['syntax'] = format #The format, for syntax hilighting params['content'] = content else: sys.exit(_("Unknown website, please post a bugreport to request this pastebin to be added (%s)") % website) return params #XML Handling methods def getText(nodelist): rc = "" for node in nodelist: if node.nodeType == node.TEXT_NODE: rc = rc + node.data return rc def getNodes(nodes, title): return nodes.getElementsByTagName(title) def getFirstNode(nodes, title): return getNodes(nodes, title)[0] def getFirstNodeText(nodes, title): return getText(getFirstNode(nodes, title).childNodes) # Display usage instructions def Usage (): print "pastebinit v" + version print _("Required arguments:") print _("\t-i (or pipe the text)") print _("Optional arguments:") print _("\t-b ") % website print _("\t-a ") % user print _("\t-f ") % format print _("\t-r ") print _("Optional arguments supported only by 1t2.us and paste.stgraber.org:") print _("\t-j ") % jabberid print _("\t-m ") print _("\t-t ") print _("\t-u <username> -p <password>") # Set defaults website = defaultPB user = os.environ.get('USER') jabberid = "" title = "" permatag = "" format = "text" username = "" password = "" filename = "" content = "" parentpid = "" #Example configuration file string configexample = """\ <pastebinit> <pastebin>http://1t2.us</pastebin> <author>DanBUK</author> <jabberid>dan@f-box.org</jabberid> <format>text</format> </pastebinit> """ #Open configuration file if it exists try: f = open(configfile) configtext = f.read() f.close() gotconfigxml = 1 except KeyboardInterrupt: sys.exit(_("KeyboardInterrupt caught.")) except: gotconfigxml = 0 #Parse configuration file if gotconfigxml == 1: try: configxml = xml.dom.minidom.parse(configfile) website = getFirstNodeText(configxml, "pastebin") user = getFirstNodeText(configxml, "author") format = getFirstNodeText(configxml, "format") jabberid = getFirstNodeText(configxml, "jabberid") except KeyboardInterrupt: sys.exit(_("KeyboardInterrupt caught.")) except: print _("Error parsing configuration file!") print _("Please ensure that your configuration file looks similar to the following:") print configexample sys.exit(1) #Check if some datas were passed by pipe, if yes directly assign content l_r = select.select([sys.stdin],[],[],0) try: content=l_r[0][0].read() filename="-" except: filename="" # Check number of arguments if len(sys.argv) == 1 and filename == "": print _("Error no arguments specified!\n") Usage() sys.exit(1) # Get options try: optlist, list = getopt.getopt(sys.argv[1:], 'i:f:b:a:r:j:t:m:u:p:') except KeyboardInterrupt: sys.exit(_("KeyboardInterrupt caught.")) except getopt.GetoptError: print _("Invalid arguments!\n") Usage() sys.exit(1) # Iterate through options for opt in optlist: if opt[0] == "-i": filename = opt[1] elif opt[0] == "-f": format = opt[1] elif opt[0] == "-b": website = opt[1] elif opt[0] == "-a": user = opt[1] elif opt[0] == "-r": parentpid = opt[1] elif opt[0] == "-j": jabberid = opt[1] elif opt[0] == "-t": title = opt[1] elif opt[0] == "-m": permatag = opt[1] elif opt[0] == "-u": username = opt[1] elif opt[0] == "-p": password = opt[1] if filename == "" and list[0]: filename = list[0] #If - is specified as a filename read from stdin, otherwise load the specified file. if filename == "": print _("Error no filename specified!\n") Usage() sys.exit(1) elif filename == "-" and content == "": content = sys.stdin.read() sys.exit(_("KeyboardInterrupt caught.")) elif content == "": try: f = open(filename) content = f.read() f.close() except KeyboardInterrupt: sys.exit(_("KeyboardInterrupt caught.")) except: sys.exit(_("Unable to read from: %s") % filename) params = getParameters(website, content, user, jabberid, version, format, parentpid, permatag, title, username, password) #Get the parameters array if not re.search(".*/", website): website += "/" reLink=None if params.__contains__("page"): website+=params['page'] tmp_page=params['page'] params.__delitem__("page") if params.__contains__("regexp"): reLink=params['regexp'] params.__delitem__("regexp") params = urllib.urlencode(params) #Convert to a format usable with the HTML POS url_opener = pasteURLopener() page = url_opener.open(website, params) #Send the informations and be redirected to the final page try: if reLink: #Check if we have to apply a regexp website = website.replace(tmp_page, 'index.php') print website + re.split(reLink, page.read())[1] #Print the result of the Regexp else: print page.url #Get the final page and show the ur except KeyboardInterrupt: sys.exit(_("KeyboardInterrupt caught.")) except: raise sys.exit(_("Unable to read or parse the result page, it could be a server timeout or a change server side, try with another pastebin.")) except KeyboardInterrupt: sys.exit(_("KeyboardInterrupt caught."))