#!/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 -p ")
# Set defaults
website = defaultPB
user = os.environ.get('USER')
jabberid = ""
title = ""
permatag = ""
format = "text"
username = ""
password = ""
filename = ""
content = ""
parentpid = ""
#Example configuration file string
configexample = """\
http://1t2.us
DanBUK
dan@f-box.org
text
"""
#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, '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."))