~grubng-dev/grubng/clients-python

« back to all changes in this revision

Viewing changes to grub.py

  • Committer: gh0st
  • Date: 2010-07-10 21:15:17 UTC
  • Revision ID: gh0st@vortex-20100710211517-koaw28ij0wtm72g3
* Changed dispatch server
* Added invalid .ARCs removal
* Added SHOWURL option

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/env python
 
2
#
2
3
## Python Grub Client
3
4
## http://www.grub.org
4
5
## 
5
6
## Copyright (c) 2008 Giorgos Logiotatidis (seadog@sealabs.net)
 
7
## Copyright (c) 2009-2010 Bohdan Turkynewych <tb0hdan@gmail.com>
6
8
##
7
9
## Grub.py is free software; you can redistribute it and/or modify
8
10
## it under the terms of the GNU General Public License as published by
35
37
import logging
36
38
import logging.handlers
37
39
 
 
40
# Default: Cli 5 / Up 1
38
41
NUM_CLIENTS = 5
39
42
NUM_UPLOADERS = 1
40
43
USERNAME = None
42
45
VERBOSE = True
43
46
DEBUG = False
44
47
LOG = False
45
 
DISPATCHER = 'http://soap.grub.org/cgi-bin/dispatch.cgi'
 
48
# Display crawled URLs. !!!WARNING!!! LOTS OF OUTPUT
 
49
SHOWURL = False
 
50
# Dispatcher host: used both for downloading workunits
 
51
# (HTTP basic auth) and uploading .ARCs
 
52
DISPATCHHOST = 'grub.silc.org.ua'
 
53
DISPATCHURL = 'http://' + DISPATCHHOST + '/'
 
54
# Authentication form name
 
55
AUTHFORM = 'GrubNG'
46
56
VERSION = '0.4.3'
47
57
WORKUNITS = 'workunits.dat'
 
58
# Where to store crawled data,
 
59
# defaults to ./data
48
60
DATAPRFX = None
49
61
 
50
62
# set socket timeout
156
168
            
157
169
    def cleanup(self, filename): 
158
170
        try:
159
 
            os.remove("%s" % filename)
160
 
            os.remove("%s.gz" % filename)
 
171
            # Call it poor programming practices,
 
172
            # but it has to check file *BEFORE*
 
173
            # attempting removal.
 
174
            if os.path.exists(filename):
 
175
                os.remove("%s" % filename)
 
176
            if os.path.exists(filename + '.gz'):
 
177
                os.remove("%s.gz" % filename)
161
178
            if DEBUG:
162
179
                # remove workunit
163
180
                os.remove("%s.wu" % filename)
170
187
         
171
188
 
172
189
    def uploadWorkUnit(self, host, url, filename):
 
190
        # Don't waste resources, if there's no .ARC
 
191
        if not os.path.exists(filename):
 
192
            return 0
 
193
        # Preserve original filename
 
194
        filename_orig = filename
173
195
        # upload data
174
196
        filename = "%s.gz" % filename 
175
197
        start_stamp = int(time.time())
204
226
            stop_stamp = int(time.time() - start_stamp)
205
227
            printer("Thread %s upload OK at %s Kb/s" % (self.getName(), str(int((fsize/1024)/stop_stamp)) ) )
206
228
            return 1
 
229
        elif errcode == 401:
 
230
            self.cleanup(filename_orig)
 
231
            printer ("Thread %s upload FAILED because: %s - will remove %s" % (self.getName(), errmsg, filename), error=1)
207
232
        else:
208
233
            printer("Thread %s upload FAILED, Code: %s Message: %s" % (self.getName(), errcode, errmsg), error=1)
209
 
        
210
234
            return -errcode
211
235
        return 0
212
236
 
234
258
 
235
259
 
236
260
        auth_handler = urllib2.HTTPBasicAuthHandler()
237
 
        auth_handler.add_password('test', 'soap.grub.org', USERNAME, PASSWORD)
 
261
        auth_handler.add_password(AUTHFORM, DISPATCHHOST, USERNAME, PASSWORD)
238
262
 
239
263
        opener = urllib2.build_opener(auth_handler)
240
264
 
241
265
        try:
242
 
            response = opener.open(DISPATCHER)
 
266
            response = opener.open(DISPATCHURL)
243
267
            self.wu = response.readlines()
244
268
            response.close()
245
269
            opener.close()
354
378
                        conn = httplib.HTTPConnection(host)
355
379
 
356
380
                        conn.request("GET", url, headers=headers)
 
381
 
 
382
                        if SHOWURL == True:
 
383
                            printer ("GET http://%s%s" % (host, url))
 
384
 
357
385
                        response = conn.getresponse()
358
386
                     
359
387
                        if response.version == "10":
532
560
         "\t -q             : Quiet mode. Print only error messages\n" \
533
561
         "\t -t, --threads  : Number of threads. Default 5\n" \
534
562
         "\t -u, --username : Grub.org username\n" \
 
563
         "\t --url          : Show URLs\n" \
535
564
         "\t -i, --info     : Advanced, prints client and OS imformation\n" \
536
565
         "\t -p, --password : Grub.org password\n" \
537
566
         "\t --debug        : Set debug mode. Failed arcs are not removed\n" \
538
567
         "\t --version      : Print version\n" \
 
568
         "\t -h  -- help    : Show this help message" \
539
569
         "\n"
540
570
 
541
571
def parseConfig():
575
605
    print "Python version: %s" % sys.version
576
606
 
577
607
def main():
578
 
    global USERNAME, PASSWORD, VERBOSE, NUM_CLIENTS, DEBUG, LOG, DATAPRFX
 
608
    global USERNAME, PASSWORD, VERBOSE, NUM_CLIENTS, DEBUG, LOG, DATAPRFX, SHOWURL
579
609
 
580
610
    try:
581
 
        opts, args = getopt.getopt(sys.argv[1:], 'ihvqt:u:p:', ["username=", "password=", "threads=", "version", "info", "debug", "log", "help"])
 
611
        opts, args = getopt.getopt(sys.argv[1:], 'ihvqt:u:p:', ["username=", "password=", "threads=", "version", "info", "debug", "log", "help", "url"])
582
612
    except getopt.GetoptError, err:
583
613
        print str(err)
584
614
        sys.exit(2)
609
639
            DEBUG = True      
610
640
        elif o in ("--log"):
611
641
            LOG = True      
 
642
        elif o in ("--url"):
 
643
            SHOWURL = True
612
644
        elif o in ("--version"):
613
645
            print "Grub Python Client, version %s" % VERSION
614
646
            sys.exit(0)