~nilsschlupp/auto-ndiswrapper/rewrite

« back to all changes in this revision

Viewing changes to main/auto-ndis.py

  • Committer: Gabriel Joel
  • Date: 2008-06-12 20:54:16 UTC
  • Revision ID: gabrieljoel@gmail.com-20080612205416-adw3vsq4p0f9tuvt
Added some safeguards in case the decompression or the download failed, organized some stuff, overall improvements

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
 
25
25
__version__ = '0.0.1'
26
26
 
27
 
import os, platform, commands, sys, time, re
 
27
import os, platform, commands, sys, re, subprocess
28
28
from database import data
29
29
from ConfigParser import ConfigParser
30
30
from optparse import OptionParser
32
32
 
33
33
print 'Auto-NDISwrapper %s' % (__version__, )
34
34
 
35
 
## parse options
 
35
##Parse options
36
36
parser = OptionParser(version='version: '+__version__)
37
37
parser.add_option('--ndiswrapper-bin', default='/usr/sbin/ndiswrapper', help='default: %default', metavar='FILE')
38
38
parser.add_option('-t', '--tmp-dir', default='/tmp/auto-ndis', help='default: %default', metavar='DIR')
45
45
##If the user isn't root the program will quit
46
46
if os.geteuid() != 0:
47
47
        print '[ERROR] You must be root to run this script.'
48
 
        print 'Try, "su then python auto-ndis.py"'
 
48
        print 'Try, "su then python auto-ndis.py" or "sudo python auto-ndis.py"'
49
49
        sys.exit(1)
50
50
 
51
51
##If the user doesn't have ndiswrapper installed the program will quit
52
52
if not os.path.exists(opts.ndiswrapper_bin) and not opts.nocheck:
53
53
        print '[ERROR] NDISwrapper not found!!!'
54
 
        print 'Please look for "ndiswrapper" in your distribution\'s package manager and install it or go to www.ndiswrapper.com' 
 
54
        print 'Please look for "ndiswrapper" in your distribution\'s package manager and install it or go to www.ndiswrapper.com and download the latest sources' 
55
55
        sys.exit(1)
56
56
 
57
 
if (opts.debug): ## print the debug options enabled
 
57
if (opts.debug): ##Print the debug options enabled
58
58
        print '[DEBUG] Options:'
59
59
        print opts
60
60
        print '[DEBUG] Arguments:'
62
62
        print
63
63
 
64
64
def get_and_print_card_info():
65
 
        ## The function's name is self explanatory, but aniway this is thanks to mintwifi.py
 
65
        ##The function's name is self explanatory, but aniway this is thanks to mintwifi.py
66
66
        os.system('lspci | grep \"Network controller\" > /tmp/detected_wireless_devices')
67
67
        devices_file = open('/tmp/detected_wireless_devices')
68
68
        for device_item in devices_file.readlines():
69
 
                deviceArray = device_item.split()
70
 
                device = ' '.join(deviceArray[3:])
71
 
                pci_id_line = commands.getoutput('lspci -n | grep ' + deviceArray[0]) 
 
69
                devicearray = device_item.split()
 
70
                device = ' '.join(devicearray[3:])
 
71
                pci_id_line = commands.getoutput('lspci -n | grep ' + devicearray[0]) 
72
72
                pci_id_array = pci_id_line.split()
73
73
                pci_id = ' '.join(pci_id_array[2:])
74
74
        print '  -- ' + device 
75
75
        print '      ==> PCI ID = ' + pci_id
76
76
        
77
77
 
78
 
def check_for_internet(url, card):
 
78
def check_for_internet(url, card_id):
79
79
        ##Checks if the user has an internet connection available
80
80
        print '[*] Looking if an Internet connection is available, this may take a few seconds.'
81
81
        test = commands.getoutput('ping -c 1 google.com')
87
87
                        return 0
88
88
                
89
89
                elif choice == 'R' or choice == 'r':
90
 
                        return check_for_internet(url,card)
 
90
                        return check_for_internet(url,card_id)
91
91
                
92
92
                elif choice == 'O' or choice == 'o':
93
 
                        manualmode(url,card)
94
 
                        installdriver(card)
95
 
                        create_auto_ndis_folder()
 
93
                        manualmode(url,card_id)
 
94
                        installdriver(card_id)
96
95
 
97
96
                elif choice == 'E' or choice == 'e':
98
97
                        sys.exit(1)
99
98
                
100
99
                else:
101
 
                        return check_for_internet(url,card)
 
100
                        return check_for_internet(url,card_id)
102
101
        
103
102
        else:
104
103
                print '[*] Internet connection found, continuing installation'
106
105
 
107
106
def searchcard(card_id, database):
108
107
        ##Looks if card is in the list of supported cards
109
 
        card = -1       
 
108
        card_id = -1    
110
109
        for item in card_id:
111
110
                if item in database:
112
111
                        return item
113
 
        return card
 
112
        return card_id
114
113
 
115
114
def any(iterable):
116
115
        for element in iterable:
121
120
def remove_old_drivers():
122
121
        ##Removes existing wireless drivers
123
122
        print '[*] Removing Old Drivers:'
124
 
        baddrivers = yourcard['blacklist']
 
123
        baddrivers = yourcard_dic['blacklist']
125
124
        if baddrivers in commands.getoutput('lsmod| awk "{print $1}"'):
126
125
                print '   removing %s' % (baddrivers, )
127
126
                os.system('rmmod %s' % (baddrivers, ))
131
130
def blacklist_drivers():
132
131
        ##Blacklists existing wireless drivers
133
132
        print '[*] Blacklisting:'
134
 
        baddrivers = yourcard['blacklist']
 
133
        baddrivers = yourcard_dic['blacklist']
135
134
        if any(baddrivers in line.split('#')[0] for line in open('/etc/modprobe.d/blacklist')):
136
135
                print '   driver already blacklisted, skipping'
137
136
        else:
140
139
                blacklist.write('\n#%s' % (baddrivers, ))
141
140
                blacklist.close()
142
141
 
143
 
def driver_license():
 
142
def print_driver_license():
144
143
        ##Checks if the user agrees with the driver's EULA
145
144
        print 'Do you agree with this proprietary driver\'s End User License Agreement? You can find it in the website of your card\'s manufacturer.'
146
145
        choice = raw_input('(Y)es or (N)o, if you don\'t agree the program will quit: ')
155
154
def create_auto_ndis_folder():
156
155
        ##Creates a folder to place the drivers
157
156
        try:
158
 
                os.makedirs('%s/%s' % (opts.tmp_dir, card, ))
 
157
                os.makedirs('%s/%s' % (opts.tmp_dir, card_id, ))
159
158
                print 'Tmpdir created'
160
159
                os.chmod(opts.tmp_dir,0777) 
161
 
                os.chdir('%s/%s' % (opts.tmp_dir, card, ))
 
160
                os.chdir('%s/%s' % (opts.tmp_dir, card_id, ))
162
161
        except:
163
 
                if os.path.exists('%s/%s' % (opts.tmp_dir, card, )):
 
162
                if os.path.exists('%s/%s' % (opts.tmp_dir, card_id, )):
164
163
                        print 'Tmpdir exists and ok, continuing'
165
 
                        os.chdir('%s/%s' % (opts.tmp_dir, card, ))
 
164
                        os.chdir('%s/%s' % (opts.tmp_dir, card_id, ))
166
165
                else:
167
166
                        print '[ERROR] cant create tmpdir'
168
167
                        print '   Either specify an alternative or ensure that /tmp is writable and not full'
173
172
        decompression = 'manual'
174
173
        
175
174
        if '.exe' in driver_url or '.zip' in driver_url:
176
 
                decompression = 'unzip '
 
175
                decompression = 'unzip'
177
176
                
178
177
        elif '.tar' in driver_url:
179
 
                decompression = 'tar -vvf '
 
178
                decompression = 'tar -vvf'
180
179
        
181
180
        elif '.tar.gz' in driver_url:
182
 
                decompression = 'tar -xvvzf '
 
181
                decompression = 'tar -xvvzf'
183
182
        
184
183
        elif '.tar.bz2' in driver_url:
185
 
                decompression = 'tar -xvvjf '
 
184
                decompression = 'tar -xvvjf'
186
185
        
187
186
        elif '.cab' in driver_url:
188
 
                decompression = 'cabextract '
 
187
                decompression = 'cabextract'
189
188
        
190
189
        elif '.rar' in driver_url:
191
 
                decompression = 'unrar '
 
190
                decompression = 'unrar'
192
191
        
193
192
        if decompression != 'manual':   
194
193
                #Checks if the system has the necessary decompression program
199
198
                        sys.exit(1)
200
199
        return decompression
201
200
        
202
 
def fetchnextract(url, card):
203
 
        ## determine decompression method
204
 
        decompression = 'manual'        
205
 
        decompression = find_decompression(url)
206
 
        
207
 
        if ( decompression != 'manual'):
208
 
        
209
 
                print '[*] Downloading driver now from "%s"' % (url, )
210
 
                if (opts.quiet):
211
 
                        os.system('wget %s -qO %s/%s/driver' % (url, opts.tmp_dir, card))
 
201
def fetch(url, card_id):
 
202
        ##Determine decompression method
 
203
        print '[*] Downloading driver now from "%s"' % (url, )
 
204
        if (opts.quiet):
 
205
                retcode = subprocess.call(['wget', url, '-qO', opts.tmp_dir/card_id/driver])
 
206
                if retcode != 0:
 
207
                        print '[ERROR]   Download unsuccessfull, please check your Internet conecction'
 
208
                        sys.exit(1)
212
209
                else:
213
 
                        os.system('wget %s -O %s/%s/driver' % (url, opts.tmp_dir, card))
 
210
                        retcode = subprocess.call(['wget', url, '-O', opts.tmp_dir/card_id/driver])
 
211
                        if retcode != 0:
 
212
                                print '[ERROR]   Download unsuccessfull, please check your Internet conecction'
 
213
                                sys.exit(1)
214
214
                print '   Download successfull'
215
 
                print '[*] Extracting driver'
216
 
                if ( opts.debug ):
217
 
                        print '[DEBUG] Decompression method: %s' % (decompression, )
218
 
                
219
 
                os.system('%s %s/%s/driver' % (decompression, opts.tmp_dir, card))
220
 
                
 
215
                
 
216
def extract(decompression):
 
217
        print '[*] Extracting driver'
 
218
        
 
219
        if (opts.debug):
 
220
                print '[DEBUG] Decompression method: %s' % (decompression, )
 
221
                
 
222
        retcode = subprocess.call([decompression, opts.tmp_dir/card_id/driver])
 
223
        
 
224
        if recode != 0:
 
225
                print '[ERROR] Decompression failed'
 
226
                choice = raw_input('(C)ontinue, (R)etry, (S)pecify different decompression method or (E)xit: ')
 
227
                        
 
228
                if choice == 'C' or choice == 'c':
 
229
                        return 0
 
230
                        
 
231
                elif choice == 'R' or choice == 'r':
 
232
                        return extract(decompression)
 
233
                
 
234
                elif choice == 'S' or choice == 's':
 
235
                        divided_url = url.split('.')
 
236
                        file_type = divided_url[len(divided_url)-1]
 
237
                        decompression = raw_input('Enter command to decompress %s files: ' % (file_type, ))
 
238
                        return extract(decompression)           
 
239
 
 
240
                elif choice == 'E' or choice == 'e':
 
241
                        sys.exit(1)
 
242
                
 
243
                else:
 
244
                        return extract(decompression)
221
245
        else:
222
 
                manualmode(url, card)
 
246
                manualmode(url, card_id)
223
247
 
224
 
def manualmode(url, card):
 
248
def manualmode(url, card_id):
225
249
        ##Comes into play if the user doesn't have an internet connection or if the driver need to be fetched manually
226
 
        yourcard = data[card]
227
 
        driver = yourcard['driver']
 
250
        yourcard_dic = data[card_id]
 
251
        driver = yourcard_dic['driver']
228
252
        print 'The driver needs to be fetched manually from: %s' % (url, )
229
253
        print 'Please place the "%s" file, along with the .sys files into:' % (driver, )
230
 
        print '"%s/%s/"' % (opts.tmp_dir, card, )
231
 
        while not any(driver in line for line in os.listdir('%s/%s/' % (opts.tmp_dir, card, ))):
232
 
        #while ((commands.getoutput("ls %s/%s/|grep %s" % (opts.tmp_dir, card, driver, ))) == ""):
 
254
        print '"%s/%s/"' % (opts.tmp_dir, card_id, )
 
255
        while not any(driver in line for line in os.listdir('%s/%s/' % (opts.tmp_dir, card_id, ))):
 
256
        #while ((commands.getoutput("ls %s/%s/|grep %s" % (opts.tmp_dir, card_id, driver, ))) == ""):
233
257
                try:
234
258
                        dummy = raw_input('When you have succesfully dowloaded the driver and extracted it press <Enter>: ')
235
259
                        
236
260
                except: 
237
 
                        ## executed when CTRL + C is pressed
 
261
                        ##Executed when CTRL + C is pressed
238
262
                        print '\n\nCanceled!\n'
239
263
                        sys.exit(1)
240
264
        print '  Driver file found! Continuing installation.'
241
265
 
242
 
def installdriver(card):
 
266
def installdriver(card_id):
243
267
        ##Installs the driver with NDISwrapper
244
 
        driver = yourcard['driver']
245
 
        Inf = commands.getoutput('find %s/%s/ -name %s' % (opts.tmp_dir, card, driver, ))
 
268
        driver = yourcard_dic['driver']
 
269
        Inf = commands.getoutput('find %s/%s/ -name %s' % (opts.tmp_dir, card_id, driver, ))
246
270
        if ( opts.debug ):
247
271
                print '[DEBUG] Driver found at %s' % (Inf, )
248
272
        os.system('%s -i %s' % (opts.ndiswrapper_bin, Inf, ))
249
273
        os.system('%s -l' % (opts.ndiswrapper_bin, ))
250
274
        os.system('%s -ma' % (opts.ndiswrapper_bin, ))
251
 
        os.system('modprobe -r ndiswrapper')
252
275
        os.system('modprobe ndiswrapper')               
253
276
        os.system('echo ndiswrapper >> /etc/modules')
254
277
        
274
297
        for item in ndis_version:
275
298
                log.write(item)
276
299
 
277
 
        log.write('\nID = %s \n' % (card, ))
 
300
        log.write('\nID = %s \n' % (card_id, ))
278
301
        log.write('URL = %s \n' % (url, ))
279
302
        log.write('DRIVER = %s \n' % (driver, ))
280
303
 
281
304
        log.close()
282
305
 
283
306
def get_card_id():
284
 
 
285
307
        ##Gets the id of all the pci devices
286
308
        outtext = commands.getoutput('lspci -n')
287
309
        ##Stores the pci ids with the revision number in a list
322
344
                get_and_print_card_info()
323
345
                sys.exit(1)
324
346
 
325
 
card = get_card_id()
 
347
card_id = get_card_id()
 
348
yourcard_dic = data[card_id]
 
349
url = yourcard_dic['url']
 
350
driver = yourcard_dic['driver']
 
351
decompression = find_decompression(url)
 
352
 
326
353
print '[*] Card Supported'
327
 
yourcard = data[card]
328
 
print '[*] Will attempt to fetch and install driver for this card'
329
 
get_and_print_card_info()
330
 
url = yourcard['url']
 
354
print '[*] Will attempt to fetch and install driver for the card with id: %s' % (card_id, )
331
355
print '[*] Will attempt to fetch driver from: %s' % (url, )
332
 
driver = yourcard['driver']
333
 
print '[*] Will attempt to install driver: %s\n' % (driver, )
 
356
print '[*] Will attempt to install driver: %s' % (driver, )
334
357
 
335
358
if (opts.ask):
336
359
        print '   Do you want to continue?'
341
364
                sys.exit(1)
342
365
        print
343
366
 
344
 
print '[*] Beginning installation:\n'
 
367
print '[*] Beginning Setup Procedure:\n'
345
368
 
346
 
driver_license()
 
369
print_driver_license()
347
370
create_auto_ndis_folder()
348
 
 
349
 
os.chdir('%s/%s' % (opts.tmp_dir, card, ))
350
 
 
351
371
create_log_file()
352
 
check_for_internet(url, card)
353
 
fetchnextract(url, card)
354
 
installdriver(card)
 
372
check_for_internet(url, card_id)
 
373
 
 
374
if decompression != 'manual':
 
375
        fetch(url, card_id)
 
376
        extract(decompression)
 
377
        installdriver(card_id)
 
378
else:
 
379
        manualmode(url,card_id)
 
380
        installdriver(card_id)