#!/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.11.2" #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 # pastey.net obfuscates parent ids for replies. Rather than taking the # post ID given as the parent ID, we must handle this by going to that # post page and looking up what the invisible parent ID field will be # set to for children. def pasteyParentFixup(website, parentid): if parentid == "": return "" url_opener = pasteURLopener() page = url_opener.open(website + '/' + parentid, None) matches = re.split('") % website print _("\t-a ") % user print _("\t-f ") % format print _("\t-r ") # print _("Optional arguments supported only by 1t2.us:") # 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://paste.debian.net</pastebin> <author>A pastebinit user</author> <jabberid>nobody@nowhere.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.parseString(configtext) website = getFirstNodeText(configxml, "pastebin") user = getFirstNodeText(configxml, "author") format = getFirstNodeText(configxml, "format") jabberid = getFirstNodeText(configxml, "jabberid") except KeyboardInterrupt: sys.exit(_("KeyboardInterrupt caught.")) except: raise print _("Error parsing configuration file!") print _("Please ensure that your configuration file looks similar to the following:") print configexample sys.exit(1) # Get options try: optlist, list = getopt.getopt(sys.argv[1:], 'hi: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] == "-h": Usage() sys.exit(1) 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 len(list) >= 1: filename = list[0] #If - is specified as a filename read from stdin, otherwise load the specified file. if (filename == "" or filename == "-") and content == "": content = sys.stdin.read() 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) if not content: sys.exit(_("You are trying to send an empty document, exiting.")) 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 tmp_page="" 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 POST 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, "") 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."))