33
from dbus import DBusException
37
import wicd.wpath as wpath
38
import wicd.misc as misc
36
from wicd import wpath
37
from wicd import dbusmanager
38
from wicd import prefs
39
from wicd import netentry
40
from wicd.misc import noneToString
41
from wicd.netentry import WiredNetworkEntry, WirelessNetworkEntry
42
from wicd.prefs import PreferencesDialog
43
from wicd.guiutil import error, LabelEntry
44
from wicd.translations import language
40
46
if __name__ == '__main__':
41
47
wpath.chdir(__file__)
49
if getattr(dbus, 'version', (0, 0, 0)) < (0, 80, 0):
52
from dbus.mainloop.glib import DBusGMainLoop
53
DBusGMainLoop(set_as_default=True)
55
bus = dbus.SystemBus()
56
proxy_obj = daemon = wireless = wired = dbus_ifaces = config = None
58
_ = misc.get_gettext()
60
# Keep all the language strings in a dictionary
61
# by the english words.
62
# I'm not sure this is the best way to do it
63
# but it works and makes it easy for me :)
65
# translations are done at
66
# http://wicd.net/translator
67
# please translate if you can!
70
language['connect'] = _("Connect")
71
language['ip'] = _("IP")
72
language['netmask'] = _("Netmask")
73
language['gateway'] = _('Gateway')
74
language['dns'] = _('DNS')
75
language['use_static_ip'] = _('Use Static IPs')
76
language['use_static_dns'] = _('Use Static DNS')
77
language['use_encryption'] = _('Use Encryption')
78
language['advanced_settings'] = _('Advanced Settings')
79
language['wired_network'] = _('Wired Network')
80
language['wired_network_instructions'] = _('To connect to a wired network, you'
81
' must create a network profile. To create a network profile, type a name that'
82
' describes this network, and press Add.')
83
language['automatic_connect'] = _('Automatically connect to this network')
84
language['secured'] = _('Secured')
85
language['unsecured'] = _('Unsecured')
86
language['channel'] = _('Channel')
87
language['preferences'] = _('Preferences')
88
language['wpa_supplicant_driver'] = _('WPA Supplicant Driver')
89
language['wireless_interface'] = _('Wireless Interface')
90
language['wired_interface'] = _('Wired Interface')
91
language['hidden_network'] = _('Hidden Network')
92
language['hidden_network_essid'] = _('Hidden Network ESSID')
93
language['connected_to_wireless'] = _('Connected to $A at $B (IP: $C)')
94
language['connected_to_wired'] = _('Connected to wired network (IP: $A)')
95
language['not_connected'] = _('Not connected')
96
language['no_wireless_networks_found'] = _('No wireless networks found.')
97
language['killswitch_enabled'] = _('Wireless Kill Switch Enabled')
98
language['key'] = _('Key')
99
language['username'] = _('Username')
100
language['password'] = _('Password')
101
language['anonymous_identity'] = _('Anonymous Identity')
102
language['identity'] = _('Identity')
103
language['authentication'] = _('Authentication')
104
language['path_to_pac_file'] = _('Path to PAC File')
105
language['select_a_network'] = _('Choose from the networks below:')
106
language['connecting'] = _('Connecting...')
107
language['wired_always_on'] = _('Always show wired interface')
108
language['auto_reconnect'] = _('Automatically reconnect on connection loss')
109
language['create_adhoc_network'] = _('Create an Ad-Hoc Network')
110
language['essid'] = _('ESSID')
111
language['use_wep_encryption'] = _('Use Encryption (WEP only)')
112
language['before_script'] = _('Run script before connect')
113
language['after_script'] = _('Run script after connect')
114
language['disconnect_script'] = _('Run disconnect script')
115
language['script_settings'] = _('Scripts')
116
language['use_ics'] = _('Activate Internet Connection Sharing')
117
language['madwifi_for_adhoc'] = _('Check if using madwifi/atheros drivers')
118
language['default_wired'] = _('Use as default profile (overwrites any previous default)')
119
language['use_debug_mode'] = _('Enable debug mode')
120
language['use_global_dns'] = _('Use global DNS servers')
121
language['use_default_profile'] = _('Use default profile on wired autoconnect')
122
language['show_wired_list'] = _('Prompt for profile on wired autoconnect')
123
language['use_last_used_profile'] = _('Use last used profile on wired autoconnect')
124
language['choose_wired_profile'] = _('Select or create a wired profile to connect with')
125
language['wired_network_found'] = _('Wired connection detected')
126
language['stop_showing_chooser'] = _('Stop Showing Autoconnect pop-up temporarily')
127
language['display_type_dialog'] = _('Use dBm to measure signal strength')
128
language['scripts'] = _('Scripts')
129
language['invalid_address'] = _('Invalid address in $A entry.')
130
language['global_settings'] = _('Use these settings for all networks sharing this essid')
131
language['encrypt_info_missing'] = _('Required encryption information is missing.')
132
language['enable_encryption'] = _('This network requires encryption to be enabled.')
133
language['wicd_auto_config'] = _('Automatic (recommended)')
134
language["gen_settings"] = _("General Settings")
135
language["ext_programs"] = _("External Programs")
136
language["dhcp_client"] = _("DHCP Client")
137
language["wired_detect"] = _("Wired Link Detection")
138
language["route_flush"] = _("Route Table Flushing")
139
language["no_global_dns"] = _("Global DNS is not enabled in preferences, so it can't be used for this network")
140
language['scripts_need_root'] = _('You must enter your password to configure scripts')
141
language['scripts_need_pass'] = _('You must enter your password to configure scripts')
142
language['no_sudo_prog'] = _("Could not find a graphical sudo program. The script editor could not be launched." +
143
" You'll have to edit scripts directly your configuration file.")
145
language['0'] = _('0')
146
language['1'] = _('1')
147
language['2'] = _('2')
148
language['3'] = _('3')
149
language['4'] = _('4')
150
language['5'] = _('5')
151
language['6'] = _('6')
152
language['7'] = _('7')
153
language['8'] = _('8')
154
language['9'] = _('9')
156
language['interface_down'] = _('Putting interface down...')
157
language['resetting_ip_address'] = _('Resetting IP address...')
158
language['interface_up'] = _('Putting interface up...')
159
language['setting_encryption_info'] = _('Setting encryption info')
160
language['removing_old_connection'] = _('Removing old connection...')
161
language['generating_psk'] = _('Generating PSK...')
162
language['generating_wpa_config'] = _('Generating WPA configuration file...')
163
language['flushing_routing_table'] = _('Flushing the routing table...')
164
language['configuring_interface'] = _('Configuring wireless interface...')
165
language['validating_authentication'] = _('Validating authentication...')
166
language['setting_broadcast_address'] = _('Setting broadcast address...')
167
language['setting_static_dns'] = _('Setting static DNS servers...')
168
language['setting_static_ip'] = _('Setting static IP addresses...')
169
language['running_dhcp'] = _('Obtaining IP address...')
170
language['dhcp_failed'] = _('Connection Failed: Unable to Get IP Address')
171
language['aborted'] = _('Connection Cancelled')
172
language['bad_pass'] = _('Connection Failed: Bad password')
173
language['done'] = _('Done connecting...')
176
global proxy_obj, daemon, wireless, wired, config, dbus_ifaces
177
proxy_obj = bus.get_object("org.wicd.daemon", '/org/wicd/daemon')
178
daemon = dbus.Interface(proxy_obj, 'org.wicd.daemon')
179
wireless = dbus.Interface(proxy_obj, 'org.wicd.daemon.wireless')
180
wired = dbus.Interface(proxy_obj, 'org.wicd.daemon.wired')
181
config = dbus.Interface(proxy_obj, 'org.wicd.daemon.config')
182
dbus_ifaces = {"daemon" : daemon, "wireless" : wireless, "wired" : wired,
185
########################################
186
##### GTK EXTENSION CLASSES
187
########################################
189
class LinkButton(gtk.EventBox):
191
def __init__(self, txt):
192
gtk.EventBox.__init__(self)
193
self.connect("realize", self.__setHandCursor) #set the hand cursor when the box is initalized
195
label.set_markup("[ <span color=\"blue\">" + txt + "</span> ]")
196
label.set_alignment(0,.5)
201
def __setHandCursor(self, widget):
202
# We need this to set the cursor to a hand for the link labels.
203
# I'm not entirely sure what it does :P
204
hand = gtk.gdk.Cursor(gtk.gdk.HAND1)
205
widget.window.set_cursor(hand)
207
class SmallLabel(gtk.Label):
208
def __init__(self, text=''):
209
gtk.Label.__init__(self, text)
210
self.set_size_request(50, -1)
212
class LabelEntry(gtk.HBox):
213
""" A label on the left with a textbox on the right and an optional checkbox for hiding the contents. """
215
def __init__(self, text):
216
gtk.HBox.__init__(self)
217
self.show_contents_checkbox = gtk.CheckButton()
218
self.show_contents_checkbox.set_active(True)
219
self.show_contents_checkbox.set_no_show_all(True)
220
self.entry = gtk.Entry()
221
self.entry.set_size_request(200, -1)
222
self.label = SmallLabel()
223
self.label.set_text(text)
224
self.label.set_size_request(170, -1)
225
self.pack_start(self.label, fill=False, expand=False)
226
self.pack_start(self.entry, fill=False, expand=False)
227
self.pack_start(self.show_contents_checkbox,
228
fill=False, expand=False)
232
self.show_contents_checkbox.connect('toggled', self.toggle_visibility_checkbox)
235
self.set_auto_hidden(False)
237
def set_text(self, text):
238
# For compatibility...
239
self.entry.set_text(text)
242
return self.entry.get_text()
244
def set_auto_hidden(self, value):
245
self.auto_hide_text = value
247
self.hide_characters()
248
self.entry.set_visibility(False)
249
self.show_contents_checkbox.set_active(False)
250
self.show_contents_checkbox.show()
252
self.show_characters()
253
self.entry.set_visibility(True)
254
self.show_contents_checkbox.set_active(True)
255
self.show_contents_checkbox.hide()
257
def toggle_visibility_checkbox(self, widget=None, event=None):
258
if self.show_contents_checkbox.get_active():
259
self.show_characters()
261
self.hide_characters()
263
def show_characters(self, widget=None, event=None):
264
# Show the characters in self.entry
265
if self.auto_hide_text:
266
self.entry.set_visibility(True)
268
def hide_characters(self, widget=None, event=None):
269
# Hide characters in self.entry
270
if self.auto_hide_text:
271
self.entry.set_visibility(False)
273
def set_sensitive(self, value):
274
gtk.HBox.set_sensitive(self, value)
275
self.entry.set_sensitive(value)
276
self.label.set_sensitive(value)
280
class GreyLabel(gtk.Label):
281
""" Creates a grey gtk.Label. """
283
gtk.Label.__init__(self)
285
def set_label(self, text):
286
self.set_markup("<span color=\"#666666\"><i>" + text + "</i></span>")
287
self.set_alignment(0, 0)
289
########################################
290
##### OTHER RANDOM FUNCTIONS
291
########################################
293
def noneToString(text):
294
""" Converts a blank string to "None". """
300
def noneToBlankString(text):
301
""" Converts NoneType or "None" to a blank string. """
302
if text in (None, "None"):
307
def stringToNone(text):
308
""" Performs opposite function of noneToString. """
309
if text in ("", None, "None"):
314
def stringToBoolean(text):
315
""" Turns a string representation of a bool to a boolean if needed. """
316
if text in ("True", "1"):
318
if text in ("False", "0"):
322
def checkboxTextboxToggle(checkbox, textboxes):
323
# Really bad practice, but checkbox == self
324
for textbox in textboxes:
325
textbox.set_sensitive(checkbox.get_active())
328
def error(parent, message):
329
""" Shows an error dialog """
330
dialog = gtk.MessageDialog(parent, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR,
332
dialog.set_markup(message)
336
########################################
337
##### NETWORK LIST CLASSES
338
########################################
340
class AdvancedSettingsDialog(gtk.Dialog):
342
""" Build the base advanced settings dialog.
344
This class isn't used by itself, instead it is used as a parent for
345
the WiredSettingsDialog and WirelessSettingsDialog.
348
gtk.Dialog.__init__(self, title=language['advanced_settings'],
349
flags=gtk.DIALOG_MODAL, buttons=(gtk.STOCK_CANCEL,
352
gtk.RESPONSE_ACCEPT))
353
# Set up the Advanced Settings Dialog.
354
self.txt_ip = LabelEntry(language['ip'])
355
self.txt_ip.entry.connect('focus-out-event', self.set_defaults)
356
self.txt_netmask = LabelEntry(language['netmask'])
357
self.txt_gateway = LabelEntry(language['gateway'])
358
self.txt_dns_1 = LabelEntry(language['dns'] + ' ' + language['1'])
359
self.txt_dns_2 = LabelEntry(language['dns'] + ' ' + language['2'])
360
self.txt_dns_3 = LabelEntry(language['dns'] + ' ' + language['3'])
361
self.chkbox_static_ip = gtk.CheckButton(language['use_static_ip'])
362
self.chkbox_static_dns = gtk.CheckButton(language['use_static_dns'])
363
self.chkbox_global_dns = gtk.CheckButton(language['use_global_dns'])
364
self.hbox_dns = gtk.HBox(False, 0)
365
self.hbox_dns.pack_start(self.chkbox_static_dns)
366
self.hbox_dns.pack_start(self.chkbox_global_dns)
368
self.vbox.pack_start(self.chkbox_static_ip, fill=False, expand=False)
369
self.vbox.pack_start(self.txt_ip, fill=False, expand=False)
370
self.vbox.pack_start(self.txt_netmask, fill=False, expand=False)
371
self.vbox.pack_start(self.txt_gateway, fill=False, expand=False)
372
self.vbox.pack_start(self.hbox_dns, fill=False, expand=False)
373
self.vbox.pack_start(self.txt_dns_1, fill=False, expand=False)
374
self.vbox.pack_start(self.txt_dns_2, fill=False, expand=False)
375
self.vbox.pack_start(self.txt_dns_3, fill=False, expand=False)
377
# Connect the events to the actions
378
self.chkbox_static_ip.connect("toggled", self.toggle_ip_checkbox)
379
self.chkbox_static_dns.connect("toggled", self.toggle_dns_checkbox)
380
self.chkbox_global_dns.connect("toggled", self.toggle_global_dns_checkbox)
382
# Start with all disabled, then they will be enabled later.
383
self.chkbox_static_ip.set_active(False)
384
self.chkbox_static_dns.set_active(False)
386
def set_defaults(self, widget=None, event=None):
387
""" Put some default values into entries to help the user out. """
388
ipAddress = self.txt_ip.get_text() # For easy typing :)
389
netmask = self.txt_netmask
390
gateway = self.txt_gateway
391
ip_parts = misc.IsValidIP(ipAddress)
393
if stringToNone(gateway.get_text()) is None: # Make sure the gateway box is blank
394
# Fill it in with a .1 at the end
395
gateway.set_text('.'.join(ip_parts[0:3]) + '.1')
397
if stringToNone(netmask.get_text()) is None: # Make sure the netmask is blank
398
netmask.set_text('255.255.255.0') # Fill in the most common one
399
elif ipAddress != "":
400
error(None, "Invalid IP Address Entered.")
402
def reset_static_checkboxes(self):
403
# Enable the right stuff
404
if stringToNone(self.txt_ip.get_text()):
405
self.chkbox_static_ip.set_active(True)
406
self.chkbox_static_dns.set_active(True)
407
self.chkbox_static_dns.set_sensitive(False)
409
self.chkbox_static_ip.set_active(False)
410
self.chkbox_static_dns.set_sensitive(True)
412
if stringToNone(self.txt_dns_1.get_text()) or \
413
self.chkbox_global_dns.get_active():
414
self.chkbox_static_dns.set_active(True)
416
self.chkbox_static_dns.set_active(False)
418
# This will properly disable unused boxes.
419
self.toggle_ip_checkbox()
420
self.toggle_dns_checkbox()
421
self.toggle_global_dns_checkbox()
423
def toggle_ip_checkbox(self, widget=None):
424
"""Toggle entries/checkboxes based on the static IP checkbox. """
425
# Should disable the static IP text boxes, and also enable the DNS
426
# checkbox when disabled and disable when enabled.
427
if self.chkbox_static_ip.get_active():
428
self.chkbox_static_dns.set_active(True)
429
self.chkbox_static_dns.set_sensitive(False)
431
self.chkbox_static_dns.set_sensitive(True)
432
# When this is used and only static DNS
433
# is used, the static dns checkbox will be disabled
434
# self.chkbox_static_dns.set_active(False)
436
self.txt_ip.set_sensitive(self.chkbox_static_ip.get_active())
437
self.txt_netmask.set_sensitive(self.chkbox_static_ip.get_active())
438
self.txt_gateway.set_sensitive(self.chkbox_static_ip.get_active())
440
def toggle_dns_checkbox(self, widget=None):
441
""" Toggle entries and checkboxes based on the static dns checkbox. """
442
# Should disable the static DNS boxes
443
if self.chkbox_static_ip.get_active():
444
self.chkbox_static_dns.set_active(True)
445
self.chkbox_static_dns.set_sensitive(False)
447
self.chkbox_global_dns.set_sensitive(self.chkbox_static_dns.
449
if self.chkbox_static_dns.get_active():
450
# If global dns is on, don't use local dns
451
self.txt_dns_1.set_sensitive(not self.chkbox_global_dns.get_active())
452
self.txt_dns_2.set_sensitive(not self.chkbox_global_dns.get_active())
453
self.txt_dns_3.set_sensitive(not self.chkbox_global_dns.get_active())
455
self.txt_dns_1.set_sensitive(False)
456
self.txt_dns_2.set_sensitive(False)
457
self.txt_dns_3.set_sensitive(False)
458
self.chkbox_global_dns.set_active(False)
460
def toggle_global_dns_checkbox(self, widget=None):
461
""" Set the DNS entries' sensitivity based on the Global checkbox. """
462
if daemon.GetUseGlobalDNS() and self.chkbox_static_dns.get_active():
463
self.txt_dns_1.set_sensitive(not self.chkbox_global_dns.get_active())
464
self.txt_dns_2.set_sensitive(not self.chkbox_global_dns.get_active())
465
self.txt_dns_3.set_sensitive(not self.chkbox_global_dns.get_active())
466
elif self.chkbox_global_dns.get_active():
467
self.chkbox_global_dns.set_active(False)
468
error(None, language['no_global_dns'])
470
def destroy_called(self):
471
""" Clean up everything. """
472
super(AdvancedSettingsDialog, self).destroy()
477
class WiredSettingsDialog(AdvancedSettingsDialog):
478
def __init__(self, name):
479
""" Build the wired settings dialog. """
480
AdvancedSettingsDialog.__init__(self)
481
self.des = self.connect("destroy", self.destroy_called)
482
self.prof_name = name
484
def set_net_prop(self, option, value):
485
""" Sets the given option to the given value for this network. """
486
wired.SetWiredProperty(option, value)
488
def set_values(self):
489
""" Fill in the Gtk.Entry objects with the correct values. """
490
self.txt_ip.set_text(self.format_entry("ip"))
491
self.txt_netmask.set_text(self.format_entry("netmask"))
492
self.txt_gateway.set_text(self.format_entry("gateway"))
494
self.txt_dns_1.set_text(self.format_entry("dns1"))
495
self.txt_dns_2.set_text(self.format_entry("dns2"))
496
self.txt_dns_3.set_text(self.format_entry("dns3"))
497
self.chkbox_global_dns.set_active(bool(wired.GetWiredProperty("use_global_dns")))
498
self.reset_static_checkboxes()
500
if bool(wired.GetWiredProperty('use_global_dns')):
501
self.chkbox_global_dns.set_active(True)
502
self.chkbox_static_dns.set_active(True)
504
self.toggle_dns_checkbox()
505
self.toggle_ip_checkbox()
507
def format_entry(self, label):
508
""" Helper method to fetch and format wired properties. """
509
return noneToBlankString(wired.GetWiredProperty(label))
511
def destroy_called(self):
512
""" Clean up everything. """
513
self.disconnect(self.des)
514
super(WiredSettingsDialog, self).destroy_called()
519
class WirelessSettingsDialog(AdvancedSettingsDialog):
520
def __init__(self, networkID):
521
""" Build the wireless settings dialog. """
522
AdvancedSettingsDialog.__init__(self)
523
# Set up encryption stuff
524
self.networkID = networkID
525
self.combo_encryption = gtk.combo_box_new_text()
526
self.chkbox_encryption = gtk.CheckButton(language['use_encryption'])
527
self.chkbox_global_settings = gtk.CheckButton(language['global_settings'])
528
# Make the vbox to hold the encryption stuff.
529
self.vbox_encrypt_info = gtk.VBox(False, 0)
530
self.toggle_encryption()
531
self.chkbox_encryption.set_active(False)
532
self.combo_encryption.set_sensitive(False)
533
self.encrypt_types = misc.LoadEncryptionMethods()
535
# Build the encryption menu
536
activeID = -1 # Set the menu to this item when we are done
537
for x, enc_type in enumerate(self.encrypt_types):
538
self.combo_encryption.append_text(enc_type[0])
539
if enc_type[1] == wireless.GetWirelessProperty(networkID,
542
self.combo_encryption.set_active(activeID)
544
self.chkbox_encryption.set_active(True)
545
self.combo_encryption.set_sensitive(True)
546
self.vbox_encrypt_info.set_sensitive(True)
548
self.combo_encryption.set_active(0)
549
self.change_encrypt_method()
551
self.vbox.pack_start(self.chkbox_global_settings, False, False)
552
self.vbox.pack_start(self.chkbox_encryption, False, False)
553
self.vbox.pack_start(self.combo_encryption, False, False)
554
self.vbox.pack_start(self.vbox_encrypt_info, False, False)
557
self.chkbox_encryption.connect("toggled", self.toggle_encryption)
558
self.combo_encryption.connect("changed", self.change_encrypt_method)
559
self.des = self.connect("destroy", self.destroy_called)
561
def destroy_called(self):
562
""" Clean up everything. """
563
self.disconnect(self.des)
564
super(WirelessSettingsDialog, self).destroy_called()
568
def set_net_prop(self, option, value):
569
""" Sets the given option to the given value for this network. """
570
wireless.SetWirelessProperty(self.networkID, option, value)
572
def set_values(self):
573
""" Set the various network settings to the right values. """
574
networkID = self.networkID
575
self.txt_ip.set_text(self.format_entry(networkID,"ip"))
576
self.txt_netmask.set_text(self.format_entry(networkID,"netmask"))
577
self.txt_gateway.set_text(self.format_entry(networkID,"gateway"))
579
self.txt_dns_1.set_text(self.format_entry(networkID, "dns1"))
580
self.txt_dns_2.set_text(self.format_entry(networkID, "dns2"))
581
self.txt_dns_3.set_text(self.format_entry(networkID, "dns3"))
583
self.reset_static_checkboxes()
584
self.chkbox_encryption.set_active(bool(wireless.GetWirelessProperty(networkID,
586
self.chkbox_global_settings.set_active(bool(wireless.GetWirelessProperty(networkID,
587
'use_settings_globally')))
590
activeID = -1 # Set the menu to this item when we are done
591
user_enctype = wireless.GetWirelessProperty(networkID, "enctype")
592
for x, enc_type in enumerate(self.encrypt_types):
593
if enc_type[1] == user_enctype:
596
self.combo_encryption.set_active(activeID)
598
self.chkbox_encryption.set_active(True)
599
self.combo_encryption.set_sensitive(True)
600
self.vbox_encrypt_info.set_sensitive(True)
602
self.combo_encryption.set_active(0)
603
self.change_encrypt_method()
605
if bool(wireless.GetWirelessProperty(networkID, 'use_global_dns')):
606
self.chkbox_global_dns.set_active(True)
607
self.chkbox_static_dns.set_active(True)
609
self.toggle_encryption()
610
self.toggle_dns_checkbox()
611
self.toggle_ip_checkbox()
613
def format_entry(self, networkid, label):
614
""" Helper method for fetching/formatting wireless properties. """
615
return noneToBlankString(wireless.GetWirelessProperty(networkid, label))
617
def toggle_encryption(self, widget=None):
618
""" Toggle the encryption combobox based on the encryption checkbox. """
619
active = self.chkbox_encryption.get_active()
620
self.vbox_encrypt_info.set_sensitive(active)
621
self.combo_encryption.set_sensitive(active)
623
def change_encrypt_method(self, widget=None):
624
""" Load all the entries for a given encryption method. """
625
for z in self.vbox_encrypt_info:
626
z.destroy() # Remove stuff in there already
627
ID = self.combo_encryption.get_active()
628
methods = misc.LoadEncryptionMethods()
629
self.encryption_info = {}
631
# If nothing is selected, select the first entry.
633
self.combo_encryption.set_active(0)
636
opts = methods[ID][2]
639
if language.has_key(opts[x][0]):
640
box = LabelEntry(language[opts[x][0].lower().replace(' ','_')])
642
box = LabelEntry(opts[x][0].replace('_',' '))
643
box.set_auto_hidden(True)
644
self.vbox_encrypt_info.pack_start(box)
645
#add the data to any array, so that the information
646
#can be easily accessed by giving the name of the wanted
648
self.encryption_info[opts[x][1]] = box.entry
649
box.entry.set_text(noneToBlankString(
650
wireless.GetWirelessProperty(self.networkID, opts[x][1])))
651
self.vbox_encrypt_info.show_all()
654
class NetworkEntry(gtk.HBox):
656
""" Base network entry class.
658
Provides gtk objects used by both the WiredNetworkEntry and
659
WirelessNetworkEntry classes.
662
gtk.HBox.__init__(self, False, 2)
663
self.expander = gtk.Expander()
664
self.image = gtk.Image()
665
self.pack_start(self.image, False, False)
667
# Set up the Connect button
668
self.connect_button = gtk.Button(stock=gtk.STOCK_CONNECT)
669
self.connect_hbox = gtk.HBox(False, 2)
670
self.connect_hbox.pack_start(self.connect_button, False, False)
671
self.connect_hbox.show()
673
# Set up the Disconnect button
674
self.disconnect_button = gtk.Button(stock=gtk.STOCK_DISCONNECT)
675
self.connect_hbox.pack_start(self.disconnect_button, False, False)
677
# Set up the VBox that goes in the gtk.Expander
678
self.expander_vbox = gtk.VBox(False, 1)
679
self.expander_vbox.show()
680
self.expander_vbox.pack_start(self.expander)
681
self.expander_vbox.pack_start(self.connect_hbox, False, False)
682
self.pack_end(self.expander_vbox)
684
# Set up the advanced settings button
685
self.advanced_button = gtk.Button()
686
self.advanced_image = gtk.Image()
687
self.advanced_image.set_from_stock(gtk.STOCK_EDIT, 4)
688
self.advanced_image.set_padding(4, 0)
689
self.advanced_button.set_alignment(.5, .5)
690
self.advanced_button.set_label(language['advanced_settings'])
691
self.advanced_button.set_image(self.advanced_image)
693
# Set up the script settings button
694
self.script_button = gtk.Button()
695
self.script_image = gtk.Image()
696
self.script_image.set_from_stock(gtk.STOCK_EXECUTE, 4)
697
self.script_image.set_padding(4, 0)
698
self.script_button.set_alignment(.5, .5)
699
self.script_button.set_image(self.script_image)
700
self.script_button.set_label(language['scripts'])
702
self.settings_hbox = gtk.HBox(False, 3)
703
self.settings_hbox.set_border_width(5)
704
self.settings_hbox.pack_start(self.script_button, False, False)
705
self.settings_hbox.pack_start(self.advanced_button, False, False)
707
self.vbox_top = gtk.VBox(False, 0)
708
self.vbox_top.pack_end(self.settings_hbox, False, False)
710
aligner = gtk.Alignment(xscale=1.0)
711
aligner.add(self.vbox_top)
712
aligner.set_padding(0, 0, 15, 0)
713
self.expander.add(aligner)
715
def destroy_called(self, *args):
716
""" Clean up everything. """
717
super(NetworkEntry, self).destroy()
722
class WiredNetworkEntry(NetworkEntry):
724
""" Load the wired network entry. """
725
NetworkEntry.__init__(self)
726
# Center the picture and pad it a bit
727
self.image.set_alignment(.5, 0)
728
self.image.set_size_request(60, -1)
729
# Perhaps we can reconsider this later with themeable icons...
730
#self.image.set_from_icon_name("network-wired", 6)
731
self.image.set_from_file(wpath.images + 'wired.png')
734
self.connect_button.show()
736
self.expander.set_label(language['wired_network'])
737
#self.reset_static_checkboxes()
738
self.is_full_gui = True
740
self.button_add = gtk.Button(stock=gtk.STOCK_ADD)
741
self.button_delete = gtk.Button(stock=gtk.STOCK_DELETE)
742
self.profile_help = gtk.Label(language['wired_network_instructions'])
743
self.chkbox_default_profile = gtk.CheckButton(language['default_wired'])
745
# Build the profile list.
746
self.combo_profile_names = gtk.combo_box_entry_new_text()
747
self.profile_list = config.GetWiredProfileList()
748
if self.profile_list:
749
for x in self.profile_list:
750
self.combo_profile_names.append_text(x)
752
# Format the profile help label.
753
self.profile_help.set_justify(gtk.JUSTIFY_LEFT)
754
self.profile_help.set_line_wrap(True)
756
# Pack the various VBox objects.
757
self.hbox_temp = gtk.HBox(False, 0)
758
self.hbox_def = gtk.HBox(False, 0)
759
self.vbox_top.pack_start(self.profile_help, True, True)
760
self.vbox_top.pack_start(self.hbox_def)
761
self.vbox_top.pack_start(self.hbox_temp)
762
self.hbox_temp.pack_start(self.combo_profile_names, True, True)
763
self.hbox_temp.pack_start(self.button_add, False, False)
764
self.hbox_temp.pack_start(self.button_delete, False, False)
765
self.hbox_def.pack_start(self.chkbox_default_profile, False, False)
768
self.button_add.connect("clicked", self.add_profile)
769
self.button_delete.connect("clicked", self.remove_profile)
770
self.chkbox_default_profile.connect("toggled",
771
self.toggle_default_profile)
772
self.combo_profile_names.connect("changed", self.change_profile)
773
self.script_button.connect("button-press-event", self.edit_scripts)
775
# Toggle the default profile checkbox to the correct state.
776
if stringToBoolean(wired.GetWiredProperty("default")):
777
self.chkbox_default_profile.set_active(True)
779
self.chkbox_default_profile.set_active(False)
781
# Show everything, but hide the profile help label.
783
self.profile_help.hide()
784
self.advanced_dialog = WiredSettingsDialog(self.combo_profile_names.get_active_text())
786
# Display the default profile if it exists.
787
if self.profile_list is not None:
788
prof = config.GetDefaultWiredNetwork()
789
if prof != None: # Make sure the default profile gets displayed.
791
while self.combo_profile_names.get_active_text() != prof:
792
self.combo_profile_names.set_active(i)
795
self.combo_profile_names.set_active(0)
796
print "wired profiles found"
797
self.expander.set_expanded(False)
799
print "no wired profiles found"
800
if not wired.GetAlwaysShowWiredInterface():
801
self.expander.set_expanded(True)
802
self.profile_help.show()
804
self.wireddis = self.connect("destroy", self.destroy_called)
806
def destroy_called(self, *args):
807
""" Clean up everything. """
808
self.disconnect(self.wireddis)
809
self.advanced_dialog.destroy_called()
810
del self.advanced_dialog
811
super(WiredNetworkEntry, self).destroy_called()
815
def edit_scripts(self, widget=None, event=None):
816
""" Launch the script editting dialog. """
817
profile = self.combo_profile_names.get_active_text()
818
cmdend = [os.path.join(wpath.lib, "configscript.py"), profile, "wired"]
820
cmdbase = misc.get_sudo_cmd(language['scripts_need_pass'])
822
error(None, language["no_sudo_prog"])
824
cmdbase.extend(cmdend)
825
misc.LaunchAndWait(cmdbase)
827
misc.LaunchAndWait(cmdend)
830
def check_enable(self):
831
""" Disable objects if the profile list is empty. """
832
profile_list = config.GetWiredProfileList()
833
if profile_list == None:
834
self.button_delete.set_sensitive(False)
835
self.connect_button.set_sensitive(False)
836
self.advanced_button.set_sensitive(False)
837
self.script_button.set_sensitive(False)
839
def update_connect_button(self, state, apbssid=None):
840
""" Update the connection/disconnect button for this entry. """
841
if state == misc.WIRED:
842
self.disconnect_button.show()
843
self.connect_button.hide()
845
self.disconnect_button.hide()
846
self.connect_button.show()
848
def add_profile(self, widget):
849
""" Add a profile to the profile list. """
850
print "adding profile"
851
profile_name = self.combo_profile_names.get_active_text()
852
profile_list = config.GetWiredProfileList()
854
if profile_name in profile_list:
856
if profile_name != "":
857
self.profile_help.hide()
858
config.CreateWiredNetworkProfile(profile_name, False)
859
self.combo_profile_names.prepend_text(profile_name)
860
self.combo_profile_names.set_active(0)
861
self.advanced_dialog.prof_name = profile_name
863
self.button_delete.set_sensitive(True)
864
self.connect_button.set_sensitive(True)
865
self.advanced_button.set_sensitive(True)
866
self.script_button.set_sensitive(True)
868
def remove_profile(self, widget):
869
""" Remove a profile from the profile list. """
870
print "removing profile"
871
profile_name = self.combo_profile_names.get_active_text()
872
config.DeleteWiredNetworkProfile(profile_name)
873
self.combo_profile_names.remove_text(self.combo_profile_names.
875
self.combo_profile_names.set_active(0)
876
self.advanced_dialog.prof_name = self.combo_profile_names.get_active_text()
877
if not config.GetWiredProfileList():
878
self.profile_help.show()
879
entry = self.combo_profile_names.child
882
self.button_delete.set_sensitive(False)
883
self.advanced_button.set_sensitive(False)
884
self.script_button.set_sensitive(False)
885
self.connect_button.set_sensitive(False)
887
self.profile_help.hide()
889
def toggle_default_profile(self, widget):
890
""" Change the default profile. """
891
if self.chkbox_default_profile.get_active():
892
# Make sure there is only one default profile at a time
893
config.UnsetWiredDefault()
894
wired.SetWiredProperty("default",
895
self.chkbox_default_profile.get_active())
896
config.SaveWiredNetworkProfile(self.combo_profile_names.get_active_text())
898
def change_profile(self, widget):
899
""" Called when a new profile is chosen from the list. """
900
# Make sure the name doesn't change everytime someone types something
901
if self.combo_profile_names.get_active() > -1:
902
if not self.is_full_gui:
905
profile_name = self.combo_profile_names.get_active_text()
906
config.ReadWiredNetworkProfile(profile_name)
908
self.advanced_dialog.txt_ip.set_text(self.format_entry("ip"))
909
self.advanced_dialog.txt_netmask.set_text(self.format_entry("netmask"))
910
self.advanced_dialog.txt_gateway.set_text(self.format_entry("gateway"))
911
self.advanced_dialog.txt_dns_1.set_text(self.format_entry("dns1"))
912
self.advanced_dialog.txt_dns_2.set_text(self.format_entry("dns2"))
913
self.advanced_dialog.txt_dns_3.set_text(self.format_entry("dns3"))
914
self.advanced_dialog.prof_name = profile_name
916
is_default = wired.GetWiredProperty("default")
917
self.chkbox_default_profile.set_active(stringToBoolean(is_default))
919
def format_entry(self, label):
920
""" Help method for fetching/formatting wired properties. """
921
return noneToBlankString(wired.GetWiredProperty(label))
924
class WirelessNetworkEntry(NetworkEntry):
925
def __init__(self, networkID, iwconfig=""):
926
""" Build the wireless network entry. """
927
NetworkEntry.__init__(self)
929
self.networkID = networkID
930
self.image.set_padding(0, 0)
931
self.image.set_alignment(.5, 0)
932
self.image.set_size_request(60, -1)
933
# Perhaps we can reconsider this later with themeable icons...
934
self.image.set_from_icon_name("network-wired", 6)
935
#self.image.set_from_file(wpath.images + 'wired.png')
936
self.essid = noneToBlankString(wireless.GetWirelessProperty(networkID,
938
# Make the combo box.
939
self.lbl_strength = GreyLabel()
940
self.lbl_encryption = GreyLabel()
941
self.lbl_mac = GreyLabel()
942
self.lbl_channel = GreyLabel()
943
self.lbl_mode = GreyLabel()
944
self.hbox_status = gtk.HBox(False, 5)
945
self.chkbox_autoconnect = gtk.CheckButton(language['automatic_connect'])
947
# Set the values of the network info labels.
948
self.set_signal_strength(wireless.GetWirelessProperty(networkID,
950
wireless.GetWirelessProperty(networkID,
952
self.set_mac_address(wireless.GetWirelessProperty(networkID, 'bssid'))
953
self.set_mode(wireless.GetWirelessProperty(networkID, 'mode'))
954
self.set_channel(wireless.GetWirelessProperty(networkID, 'channel'))
955
self.set_encryption(wireless.GetWirelessProperty(networkID,
957
wireless.GetWirelessProperty(networkID,
958
'encryption_method'))
960
# The the expander label.
961
self.expander.set_use_markup(True)
963
self.expander.set_label(self._escape(self.essid) + " " +
964
self.lbl_strength.get_label() + " " +
965
self.lbl_encryption.get_label() + " " +
966
self.lbl_mac.get_label())
968
# Pack the network status HBox.
969
self.hbox_status.pack_start(self.lbl_strength, True, True)
970
self.hbox_status.pack_start(self.lbl_encryption, True, True)
971
self.hbox_status.pack_start(self.lbl_mac, True, True)
972
self.hbox_status.pack_start(self.lbl_mode, True, True)
973
self.hbox_status.pack_start(self.lbl_channel, True, True)
975
# Add the wireless network specific parts to the NetworkEntry
977
self.vbox_top.pack_start(self.chkbox_autoconnect, False, False)
978
self.vbox_top.pack_start(self.hbox_status, True, True)
980
if stringToBoolean(self.format_entry(networkID, "automatic")):
981
self.chkbox_autoconnect.set_active(True)
983
self.chkbox_autoconnect.set_active(False)
986
self.chkbox_autoconnect.connect("toggled", self.update_autoconnect)
987
self.script_button.connect("button-press-event", self.edit_scripts)
991
self.advanced_dialog = WirelessSettingsDialog(networkID)
992
self.wifides = self.connect("destroy", self.destroy_called)
994
def _escape(self, val):
995
return val.replace("&", "&").replace("<", "<").\
996
replace(">",">").replace("'", "'").replace('"', """)
998
def destroy_called(self, *args):
999
""" Clean up everything. """
1000
self.disconnect(self.wifides)
1001
self.advanced_dialog.destroy_called()
1002
del self.advanced_dialog
1003
super(WirelessNetworkEntry, self).destroy_called()
1007
def set_signal_strength(self, strength, dbm_strength):
1008
""" Set the signal strength displayed in the WirelessNetworkEntry. """
1009
if strength is not None:
1010
strength = int(strength)
1013
if dbm_strength is not None:
1014
dbm_strength = int(dbm_strength)
1017
display_type = daemon.GetSignalDisplayType()
1018
if daemon.GetWPADriver() == 'ralink legacy' or display_type == 1:
1019
# Use the -xx dBm signal strength to display a signal icon
1020
# I'm not sure how accurately the dBm strength is being
1021
# "converted" to strength bars, so suggestions from people
1022
# for a better way would be welcome.
1023
if dbm_strength >= -60:
1024
signal_img = 'signal-100.png'
1025
elif dbm_strength >= -70:
1026
signal_img = 'signal-75.png'
1027
elif dbm_strength >= -80:
1028
signal_img = 'signal-50.png'
1030
signal_img = 'signal-25.png'
1032
disp_strength = str(dbm_strength)
1034
# Uses normal link quality, should be fine in most cases
1036
signal_img = 'signal-100.png'
1038
signal_img = 'signal-75.png'
1040
signal_img = 'signal-50.png'
1042
signal_img = 'signal-25.png'
1044
disp_strength = str(strength)
1046
self.image.set_from_file(wpath.images + signal_img)
1047
self.lbl_strength.set_label(disp_strength + ending)
1049
def update_connect_button(self, state, apbssid):
1050
""" Update the connection/disconnect button for this entry. """
1052
apbssid = wireless.GetApBssid()
1053
if state == misc.WIRELESS and \
1054
apbssid == wireless.GetWirelessProperty(self.networkID, "bssid"):
1055
self.disconnect_button.show()
1056
self.connect_button.hide()
1058
self.disconnect_button.hide()
1059
self.connect_button.show()
1061
def set_mac_address(self, address):
1062
""" Set the MAC address for the WirelessNetworkEntry. """
1063
self.lbl_mac.set_label(str(address))
1065
def set_encryption(self, on, ttype):
1066
""" Set the encryption value for the WirelessNetworkEntry. """
1068
self.lbl_encryption.set_label(str(ttype))
1069
if on and not ttype:
1070
self.lbl_encryption.set_label(language['secured'])
1072
self.lbl_encryption.set_label(language['unsecured'])
1074
def set_channel(self, channel):
1075
""" Set the channel value for the WirelessNetworkEntry. """
1076
self.lbl_channel.set_label(language['channel'] + ' ' + str(channel))
1078
def set_mode(self, mode):
1079
""" Set the mode value for the WirelessNetworkEntry. """
1080
self.lbl_mode.set_label(str(mode))
1082
def format_entry(self, networkid, label):
1083
""" Helper method for fetching/formatting wireless properties. """
1084
return noneToBlankString(wireless.GetWirelessProperty(networkid, label))
1086
def edit_scripts(self, widget=None, event=None):
1087
""" Launch the script editting dialog. """
1088
cmdend = [os.path.join(wpath.lib, "configscript.py"),
1089
str(self.networkID), "wireless"]
1090
if os.getuid() != 0:
1091
cmdbase = misc.get_sudo_cmd(language['scripts_need_pass'])
1093
error(None, language["no_sudo_prog"])
1095
cmdbase.extend(cmdend)
1096
misc.LaunchAndWait(cmdbase)
1098
misc.LaunchAndWait(cmdend)
1100
def update_autoconnect(self, widget=None):
1101
""" Called when the autoconnect checkbox is toggled. """
1102
wireless.SetWirelessProperty(self.networkID, "automatic",
1103
noneToString(self.chkbox_autoconnect.
1105
config.SaveWirelessNetworkProperty(self.networkID, "automatic")
49
proxy_obj = daemon = wireless = wired = bus = None
52
def setup_dbus(force=True):
53
global bus, daemon, wireless, wired, DBUS_AVAIL
55
dbusmanager.connect_to_dbus()
58
print "Can't connect to the daemon, trying to start it automatically..."
59
if not misc.PromptToStartDaemon():
60
print "Failed to find a graphical sudo program, cannot continue."
63
dbusmanager.connect_to_dbus()
65
error(None, "Could not connect to wicd's D-Bus interface. " +
66
"Check the wicd log for error messages.")
72
bus = dbusmanager.get_bus()
73
dbus_ifaces = dbusmanager.get_dbus_ifaces()
74
daemon = dbus_ifaces['daemon']
75
wireless = dbus_ifaces['wireless']
76
wired = dbus_ifaces['wired']
81
def handle_no_dbus(from_tray=False):
84
if from_tray: return False
85
print "Wicd daemon is shutting down!"
86
error(None, language['lost_dbus'], block=False)
1108
90
class WiredProfileChooser:
1109
91
""" Class for displaying the wired profile chooser. """
1110
92
def __init__(self):
1281
301
dialog.set_website("http://wicd.sourceforge.net")
1283
303
dialog.destroy()
1285
305
def key_event (self, widget, event=None):
1286
306
""" Handle key-release-events. """
1287
307
if event.state & gtk.gdk.CONTROL_MASK and \
1288
308
gtk.gdk.keyval_name(event.keyval) in ["w", "q"]:
1291
311
def settings_dialog(self, widget, event=None):
1292
312
""" Displays a general settings dialog. """
1293
dialog = self.wTree.get_widget("pref_dialog")
1294
dialog.set_title(language['preferences'])
1295
size = config.ReadWindowSize("pref")
1298
if width > -1 and height > -1:
1299
dialog.resize(int(width), int(height))
1300
wiredcheckbox = self.wTree.get_widget("pref_always_check")
1301
wiredcheckbox.set_label(language['wired_always_on'])
1302
wiredcheckbox.set_active(wired.GetAlwaysShowWiredInterface())
1304
reconnectcheckbox = self.wTree.get_widget("pref_auto_check")
1305
reconnectcheckbox.set_label(language['auto_reconnect'])
1306
reconnectcheckbox.set_active(daemon.GetAutoReconnect())
1308
debugmodecheckbox = self.wTree.get_widget("pref_debug_check")
1309
debugmodecheckbox.set_label(language['use_debug_mode'])
1310
debugmodecheckbox.set_active(daemon.GetDebugMode())
1312
displaytypecheckbox = self.wTree.get_widget("pref_dbm_check")
1313
displaytypecheckbox.set_label(language['display_type_dialog'])
1314
displaytypecheckbox.set_active(daemon.GetSignalDisplayType())
1316
entryWiredAutoMethod = self.wTree.get_widget("pref_wired_auto_label")
1317
entryWiredAutoMethod.set_label('Wired Autoconnect Setting:')
1318
usedefaultradiobutton = self.wTree.get_widget("pref_use_def_radio")
1319
usedefaultradiobutton.set_label(language['use_default_profile'])
1320
showlistradiobutton = self.wTree.get_widget("pref_prompt_radio")
1321
showlistradiobutton.set_label(language['show_wired_list'])
1322
lastusedradiobutton = self.wTree.get_widget("pref_use_last_radio")
1323
lastusedradiobutton.set_label(language['use_last_used_profile'])
1325
## External Programs tab
1326
self.wTree.get_widget("gen_settings_label").set_label(language["gen_settings"])
1327
self.wTree.get_widget("ext_prog_label").set_label(language["ext_programs"])
1328
self.wTree.get_widget("dhcp_client_label").set_label(language["dhcp_client"])
1329
self.wTree.get_widget("wired_detect_label").set_label(language["wired_detect"])
1330
self.wTree.get_widget("route_flush_label").set_label(language["route_flush"])
1333
dhcpautoradio = self.wTree.get_widget("dhcp_auto_radio")
1334
dhcpautoradio.set_label(language["wicd_auto_config"])
1335
dhclientradio = self.wTree.get_widget("dhclient_radio")
1336
pumpradio = self.wTree.get_widget("pump_radio")
1337
dhcpcdradio = self.wTree.get_widget("dhcpcd_radio")
1338
dhcp_list = [dhcpautoradio, dhclientradio, dhcpcdradio, pumpradio]
1340
dhcp_method = daemon.GetDHCPClient()
1341
dhcp_list[dhcp_method].set_active(True)
1343
# Wired Link Detection Apps
1344
linkautoradio = self.wTree.get_widget("link_auto_radio")
1345
linkautoradio.set_label(language['wicd_auto_config'])
1346
linkautoradio = self.wTree.get_widget("link_auto_radio")
1347
ethtoolradio = self.wTree.get_widget("ethtool_radio")
1348
miitoolradio = self.wTree.get_widget("miitool_radio")
1349
wired_link_list = [linkautoradio, ethtoolradio, miitoolradio]
1350
wired_link_method = daemon.GetLinkDetectionTool()
1351
wired_link_list[wired_link_method].set_active(True)
1353
# Route Flushing Apps
1354
flushautoradio = self.wTree.get_widget("flush_auto_radio")
1355
flushautoradio.set_label(language['wicd_auto_config'])
1356
ipflushradio = self.wTree.get_widget("ip_flush_radio")
1357
routeflushradio = self.wTree.get_widget("route_flush_radio")
1358
flush_list = [flushautoradio, ipflushradio, routeflushradio]
1359
flush_method = daemon.GetFlushTool()
1360
flush_list[flush_method].set_active(True)
1362
if wired.GetWiredAutoConnectMethod() == 1:
1363
usedefaultradiobutton.set_active(True)
1364
elif wired.GetWiredAutoConnectMethod() == 2:
1365
showlistradiobutton.set_active(True)
1366
elif wired.GetWiredAutoConnectMethod() == 3:
1367
lastusedradiobutton.set_active(True)
1369
self.set_label("pref_driver_label", language['wpa_supplicant_driver'] +
1372
# Hack to get the combo box we need, which you can't do with glade.
1373
wpa_hbox = self.wTree.get_widget("hbox_wpa")
1374
if not self.first_dialog_load:
1375
wpa_hbox.remove(self.wpadrivercombo)
1377
self.first_dialog_load = False
1378
self.wpadrivercombo = gtk.combo_box_new_text()
1379
wpadrivercombo = self.wpadrivercombo # Just to make my life easier
1380
wpa_hbox.pack_end(wpadrivercombo)
1382
wpadrivers = ["wext", "hostap", "madwifi", "atmel", "ndiswrapper",
1383
"ipw", "ralink legacy"]
1385
def_driver = daemon.GetWPADriver()
1386
for i, x in enumerate(wpadrivers):
1387
if x == def_driver: #and not found:
1389
user_driver_index = i
1390
wpadrivercombo.append_text(x)
1392
# Set the active choice here. Doing it before all the items are
1393
# added the combobox causes the choice to be reset.
1395
wpadrivercombo.set_active(user_driver_index)
1397
# Use wext as default, since normally it is the correct driver.
1398
wpadrivercombo.set_active(0)
1400
self.set_label("pref_wifi_label", language['wireless_interface'] + ':')
1401
self.set_label("pref_wired_label", language['wired_interface'] + ':')
1403
entryWirelessInterface = self.wTree.get_widget("pref_wifi_entry")
1404
entryWirelessInterface.set_text(daemon.GetWirelessInterface())
1406
entryWiredInterface = self.wTree.get_widget("pref_wired_entry")
1407
entryWiredInterface.set_text(daemon.GetWiredInterface())
1409
# Set up global DNS stuff
1410
useGlobalDNSCheckbox = self.wTree.get_widget("pref_global_check")
1411
useGlobalDNSCheckbox.set_label(language['use_global_dns'])
1413
dns1Entry = self.wTree.get_widget("pref_dns1_entry")
1414
dns2Entry = self.wTree.get_widget("pref_dns2_entry")
1415
dns3Entry = self.wTree.get_widget("pref_dns3_entry")
1416
self.set_label("pref_dns1_label", language['dns'] + ' ' + language['1'])
1417
self.set_label("pref_dns2_label", language['dns'] + ' ' + language['2'])
1418
self.set_label("pref_dns3_label", language['dns'] + ' ' + language['3'])
1420
useGlobalDNSCheckbox.connect("toggled", checkboxTextboxToggle,
1421
(dns1Entry, dns2Entry, dns3Entry))
1423
dns_addresses = daemon.GetGlobalDNSAddresses()
1424
useGlobalDNSCheckbox.set_active(daemon.GetUseGlobalDNS())
1425
dns1Entry.set_text(noneToBlankString(dns_addresses[0]))
1426
dns2Entry.set_text(noneToBlankString(dns_addresses[1]))
1427
dns3Entry.set_text(noneToBlankString(dns_addresses[2]))
1429
if not daemon.GetUseGlobalDNS():
1430
dns1Entry.set_sensitive(False)
1431
dns2Entry.set_sensitive(False)
1432
dns3Entry.set_sensitive(False)
1434
# Bold/Align the Wired Autoconnect label.
1435
entryWiredAutoMethod.set_alignment(0, 0)
1436
atrlist = pango.AttrList()
1437
atrlist.insert(pango.AttrWeight(pango.WEIGHT_BOLD, 0, 50))
1438
entryWiredAutoMethod.set_attributes(atrlist)
1440
self.wTree.get_widget("notebook2").set_current_page(0)
1446
response = dialog.run()
1449
if useGlobalDNSCheckbox.get_active():
1450
if not misc.IsValidIP(dns1Entry.get_text()):
1452
if dns3Entry.get_text() and \
1453
not misc.IsValidIP(dns2Entry.get_text()):
1455
if dns3Entry.get_text() and \
1456
not misc.IsValidIP(dns3Entry.get_text()):
1459
for ent in [dns1Entry, dns2Entry, dns3Entry]:
1462
if invalid: error(dialog, "One or more of your global DNS servers are invalid.")
1465
daemon.SetUseGlobalDNS(useGlobalDNSCheckbox.get_active())
1466
daemon.SetGlobalDNS(dns1Entry.get_text(), dns2Entry.get_text(),
1467
dns3Entry.get_text())
1468
daemon.SetWirelessInterface(entryWirelessInterface.get_text())
1469
daemon.SetWiredInterface(entryWiredInterface.get_text())
1470
daemon.SetWPADriver(wpadrivers[wpadrivercombo.get_active()])
1471
wired.SetAlwaysShowWiredInterface(wiredcheckbox.get_active())
1472
daemon.SetAutoReconnect(reconnectcheckbox.get_active())
1473
daemon.SetDebugMode(debugmodecheckbox.get_active())
1474
daemon.SetSignalDisplayType(int(displaytypecheckbox.get_active()))
1475
if showlistradiobutton.get_active():
1476
wired.SetWiredAutoConnectMethod(2)
1477
elif lastusedradiobutton.get_active():
1478
wired.SetWiredAutoConnectMethod(3)
1480
wired.SetWiredAutoConnectMethod(1)
1482
# External Programs Tab
1483
if dhcpautoradio.get_active():
1484
dhcp_client = misc.AUTO
1485
elif dhclientradio.get_active():
1486
dhcp_client = misc.DHCLIENT
1487
elif dhcpcdradio.get_active():
1488
dhcp_client = misc.DHCPCD
1490
dhcp_client = misc.PUMP
1491
daemon.SetDHCPClient(dhcp_client)
1493
if linkautoradio.get_active():
1494
link_tool = misc.AUTO
1495
elif ethtoolradio.get_active():
1496
link_tool = misc.ETHTOOL
1498
link_tool = misc.MIITOOL
1499
daemon.SetLinkDetectionTool(link_tool)
1501
if flushautoradio.get_active():
1502
flush_tool = misc.AUTO
1503
elif ipflushradio.get_active():
1504
flush_tool = misc.IP
1506
flush_tool = misc.ROUTE
1507
daemon.SetFlushTool(flush_tool)
1510
[width, height] = dialog.get_size()
1511
config.WriteWindowSize(width, height, "pref")
1513
def set_label(self, glade_str, label):
1514
""" Sets the label for the given widget in wicd.glade. """
1515
self.wTree.get_widget(glade_str).set_label(label)
314
self.pref = PreferencesDialog(self, self.wTree)
316
self.pref.load_preferences_diag()
317
if self.pref.run() == 1:
318
self.pref.save_results()
1517
321
def connect_hidden(self, widget):
1518
322
""" Prompts the user for a hidden network, then scans for it. """
1519
323
dialog = gtk.Dialog(title=language['hidden_network'],
1520
324
flags=gtk.DIALOG_MODAL,
1521
buttons=(gtk.STOCK_ADD, 1, gtk.STOCK_CANCEL, 2))
325
buttons=(gtk.STOCK_CONNECT, 1, gtk.STOCK_CANCEL, 2))
1522
326
dialog.set_has_separator(False)
1523
327
lbl = gtk.Label(language['hidden_network_essid'])
1524
328
textbox = gtk.Entry()