#!/usr/bin/python
# Written by Stephane Graber
# Daniel Bartlett
# Last modification : Sun Feb 25 13:23:00 CET 2007
# 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
import urllib, os, sys, re, getopt, select
defaultPB = "http://paste.stgraber.org" #Default pastebin
version = "0.7" #Version number to show in the usage
# 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, version, format, 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))|(paste.stgraber.org))", website):
params['poster'] = user
params['code2'] = content
params['version'] = version
params['parent_pid'] = "" #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['regexp'] = "None"
# pastebin.com v0.60
elif re.search("http://([a-zA-Z0-9\-_\.]*)1t2\.us", website):
params['poster'] = user
params['code2'] = content
params['parent_pid'] = "" #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['title'] = title
params['username'] = username
params['password'] = password
params['regexp'] = "None"
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/(.*)
'
else:
sys.exit("Unknown website, please post a bugreport to request this pastebin to be added (" + website + ")")
return params
# 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 "
print "\t-a "
print "\t-f "
print "Optional arguments supported only by 1t2.us:"
print "\t-t "
print "\t-u -p "
sys.exit(0)
# Set defaults
user = os.environ.get('USER')
website = defaultPB
title = ""
format = "text"
username = ""
password = ""
filename = ""
content = ""
#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 == "":
Usage()
sys.exit(1)
# Get options
try:
optlist, list = getopt.getopt(sys.argv[1:], 'i:f:b:a:t:u:p:')
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] == "-t":
title = opt[1]
elif opt[0] == "-u":
username = opt[1]
elif opt[0] == "-p":
password = opt[1]
#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()
elif content == "":
try:
f = open(filename)
content = f.read()
f.close()
except:
sys.exit("Unable to read from: " + filename)
params = getParameters(website, content, user, version, format, title, username, password) #Get the parameters array
reLink = params['regexp'] #Extract the regexp
params['regexp'] = None #Remove the regexp from what will be sent
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 != "None": #Check if we have to apply a regexp
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 url
except:
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.")