diff --git a/daemon.py b/daemon.py index f8377af..5c0325a 100644 --- a/daemon.py +++ b/daemon.py @@ -16,7 +16,6 @@ import ConfigParser, time #import the random functions library import misc - ############################### # GENERAL NOTES # @@ -241,6 +240,16 @@ class ConnectionWizard(dbus.service.Object): self.wifi.Disconnect() #end function DisconnectWireless + @dbus.service.method('org.wicd.daemon.wireless') + def SetBeforeScript(self,script): + self.wifi.before_script = script + #end function SetBeforeScript + + @dbus.service.method('org.wicd.daemon.wireless') + def SetAfterScript(self,script): + self.wifi.after_script = script + #end function SetAfterScript + @dbus.service.method('org.wicd.daemon.wireless') def GetNumberOfNetworks(self): '''returns number of networks''' @@ -254,6 +263,16 @@ class ConnectionWizard(dbus.service.Object): self.wifi.CreateAdHocNetwork(essid,channel,ip,enctype,key,encused,ics) #end function CreateAdHocNetwork + @dbus.service.method('org.wicd.daemon.wireless') + def GetHideDupeAPs(self): + return self.hide_dupe_aps + #end function GetHideDupeAPs + + @dbus.service.method('org.wicd.daemon.wireless') + def SetHideDupeAPs(self,value): + self.hide_dupe_aps = value + #end function SetHideDupeAPs + @dbus.service.method('org.wicd.daemon.wireless') def GetAutoReconnect(self): do = bool(int(self.auto_reconnect)) @@ -305,6 +324,18 @@ class ConnectionWizard(dbus.service.Object): #self.GetWiredIP() time.sleep(1) print "autoconnecting... done" + return + print "unable to find a network to autoconnect to, checking for a wired connection" + if self.CheckPluggedIn() == True: + if self.CheckIfWiredConnecting() == False: # Keeps us from going into an infinite connecting loop + defaultNetwork = self.GetDefaultWiredNetwork() + if defaultNetwork != None: + self.ReadWiredNetworkProfile(defaultNetwork) + self.ConnectWired() + else: + print "couldn't find a default wired connection, couldn't autoconnect" + else: + print "no wired connection present, couldn't autoconnect." else: print 'autoconnect failed because wireless interface == None' #end function AutoConnect @@ -369,7 +400,9 @@ class ConnectionWizard(dbus.service.Object): #CheckIfWirelessConnecting can be used to test if the connection #is done self.SetForcedDisconnect(False) - print 'connecting to wireless network',self.LastScan[id]["essid"] + self.wifi.before_script = self.GetWirelessProperty(id,'beforescript') + self.wifi.after_script = self.GetWirelessProperty(id,'afterscript') + print 'connecting to wireless network',self.LastScan[id]['essid'] return self.wifi.Connect(self.LastScan[id]) #end function Connect @@ -452,6 +485,18 @@ class ConnectionWizard(dbus.service.Object): print 'wired connecting',False return False #end function CheckIfWiredConnecting + + @dbus.service.method('org.wicd.daemon.wired') + def SetBeforeScript(self,script): + '''sets pre-connection script to run for a wired connection''' + self.wired.before_script = script + #end function SetBeforeScript + + @dbus.service.method('org.wicd.daemon.wired') + def SetAfterScript(self,script): + '''sets post-connection script to run for a wired connection''' + self.wired.after_script = script + #end function SetAfterScript @dbus.service.method('org.wicd.daemon.wired') def CheckWiredConnectingMessage(self): @@ -515,6 +560,8 @@ class ConnectionWizard(dbus.service.Object): def ConnectWired(self): '''connects to a wired network''' #simple enough. + self.wired.before_script = self.GetWiredProperty("beforescript") + self.wired.after_script = self.GetWiredProperty("afterscript") self.wired.Connect(self.WiredNetwork) ########## LOG FILE STUFF @@ -549,10 +596,38 @@ class ConnectionWizard(dbus.service.Object): config.set(profilename,"dns1",None) config.set(profilename,"dns2",None) config.set(profilename,"dns3",None) + config.set(profilename,"beforescript",None) + config.set(profilename,"afterscript",None) + config.set(profilename,"default",False) config.write( open(self.wired_conf,"w")) return True #end function CreateWiredNetworkProfile + @dbus.service.method('org.wicd.daemon.config') + def UnsetWiredDefault(self): + '''Unsets the default option in the current default wired profile''' + config = ConfigParser.ConfigParser() + config.read(self.wired_conf) + profileList = config.sections() + print "profileList = ",profileList + for profile in profileList: + print "profile = ", profile + if config.get(profile,"default") == "True": + print "removing existing default" + config.set(profile,"default", False) + self.SaveWiredNetworkProfile(profile) + #end function UnsetWiredDefault + + @dbus.service.method('org.wicd.daemon.config') + def GetDefaultWiredNetwork(self): + config = ConfigParser.ConfigParser() + config.read(self.wired_conf) + profileList = config.sections() + for profile in profileList: + if config.get(profile,"default") == "True": + return profile + return None + @dbus.service.method('org.wicd.daemon.config') def DeleteWiredNetworkProfile(self,profilename): print "deleting profile for " + str(profilename) @@ -640,6 +715,15 @@ class ConnectionWizard(dbus.service.Object): print self.LastScan[id]["bssid"] if config.has_section(self.LastScan[id]["bssid"]): self.LastScan[id]["has_profile"] = True + + if config.has_option(self.LastScan[id]["bssid"],"beforescript"): + self.LastScan[id]["beforescript"]= misc.Noneify(config.get(self.LastScan[id]["bssid"],"beforescript")) + else: + self.LastScan[id]["beforescript"]= None + if config.has_option(self.LastScan[id]["bssid"],"afterscript"): + self.LastScan[id]["afterscript"]=misc.Noneify(config.get(self.LastScan[id]["bssid"],"afterscript")) + else: + self.LastScan[id]["afterscript"] = None #read the essid because we be needing to name those hidden #wireless networks now - but only read it if it is hidden if self.LastScan[id]["hidden"] == True: diff --git a/edgy.py b/edgy.py index f70ba0a..315263e 100755 --- a/edgy.py +++ b/edgy.py @@ -140,7 +140,7 @@ def set_signal_image(): print wireless.AutoConnect(True) else: print "Scanning for an autoconnect network..." - print wireless.AutoConnect(True) + print wireless.AutoConnect(True) config.EnableLogging() return True diff --git a/gui.py b/gui.py index 71333e1..8dbe595 100644 --- a/gui.py +++ b/gui.py @@ -13,7 +13,6 @@ except: print 'Missing GTK and gtk.glade. Aborting.' sys.exit(1) - import time, os, misc, gettext, locale, gobject, dbus, dbus.service if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): @@ -125,7 +124,11 @@ language['auto_reconnect'] = _('Automatically reconnect on connection loss') language['create_adhoc_network'] = _('Create an Ad-Hoc Network') language['essid'] = _('ESSID') language['use_wep_encryption'] = _('Use Encryption (WEP only)') +language['before_script'] = _('Run script before connect') +language['after_script'] = _('Run script after connect') +language['script_settings'] = _('Scripts') language['use_ics'] = _('Activate Internet Connection Sharing') +language['default_wired'] = _('Use as default profile (overwrites any previous default)') language['0'] = _('0') language['1'] = _('1') @@ -348,11 +351,17 @@ class NetworkEntry(gtk.Expander): self.txtDNS1 = LabelEntry(language['dns'] + language['1']) self.txtDNS2 = LabelEntry(language['dns'] + language['2']) self.txtDNS3 = LabelEntry(language['dns'] + language['3']) + self.txtBeforeScript = LabelEntry(language['before_script']) + self.txtAfterScript = LabelEntry(language['after_script']) + self.txtBeforeScript.label.set_size_request(200,-1) + self.txtAfterScript.label.set_size_request(200,-1) self.checkboxStaticIP = gtk.CheckButton(language['use_static_ip']) self.checkboxStaticDNS = gtk.CheckButton(language['use_static_dns']) self.expanderAdvanced = gtk.Expander(language['advanced_settings']) + self.expanderScripts = gtk.Expander(language['script_settings']) self.vboxTop = gtk.VBox(False,0) self.vboxAdvanced = gtk.VBox(False,0) + self.vboxScripts = gtk.VBox(False,0) self.vboxAdvanced.pack_start(self.checkboxStaticIP,fill=False,expand=False) self.vboxAdvanced.pack_start(self.txtIP,fill=False,expand=False) self.vboxAdvanced.pack_start(self.txtNetmask,fill=False,expand=False) @@ -361,8 +370,12 @@ class NetworkEntry(gtk.Expander): self.vboxAdvanced.pack_start(self.txtDNS1,fill=False,expand=False) self.vboxAdvanced.pack_start(self.txtDNS2,fill=False,expand=False) self.vboxAdvanced.pack_start(self.txtDNS3,fill=False,expand=False) + self.vboxScripts.pack_start(self.txtBeforeScript,fill=False,expand=False) + self.vboxScripts.pack_start(self.txtAfterScript,fill=False,expand=False) + self.vboxTop.pack_end(self.expanderScripts,fill=False,expand=False) self.vboxTop.pack_end(self.expanderAdvanced,fill=False,expand=False) self.expanderAdvanced.add(self.vboxAdvanced) + self.expanderScripts.add(self.vboxScripts) #connect the events to the actions self.checkboxStaticIP.connect("toggled",self.toggleIPCheckbox) self.checkboxStaticDNS.connect("toggled",self.toggleDNSCheckbox) @@ -444,26 +457,41 @@ class WiredNetworkEntry(NetworkEntry): self.set_label(language['wired_network']) self.resetStaticCheckboxes() self.comboProfileNames = gtk.combo_box_entry_new_text() + profileList = config.GetWiredProfileList() if profileList: #make sure there is something in it... for x in config.GetWiredProfileList(): #add all the names to the combobox self.comboProfileNames.append_text(x) hboxTemp = gtk.HBox(False,0) + hboxDef = gtk.HBox(False,0) + buttonOK = gtk.Button(stock=gtk.STOCK_ADD) + self.buttonDelete = gtk.Button(stock=gtk.STOCK_DELETE) self.profileHelp = gtk.Label(language['wired_network_instructions']) + self.checkboxDefaultProfile = gtk.CheckButton(language['default_wired']) + self.profileHelp.set_width_chars(5) #the default is a tad too long self.profileHelp.set_padding(10,10) self.profileHelp.set_justify(gtk.JUSTIFY_LEFT) self.profileHelp.set_line_wrap(True) + self.vboxTop.pack_start(self.profileHelp,fill=False,expand=False) hboxTemp.pack_start(self.comboProfileNames,fill=True,expand=True) - buttonOK = gtk.Button(stock=gtk.STOCK_ADD) - self.buttonDelete = gtk.Button(stock=gtk.STOCK_DELETE) hboxTemp.pack_start(buttonOK,fill=False,expand=False) hboxTemp.pack_start(self.buttonDelete,fill=False,expand=False) + hboxDef.pack_start(self.checkboxDefaultProfile,fill=False,expand=False) + buttonOK.connect("clicked",self.addProfile) #hook up our buttons self.buttonDelete.connect("clicked",self.removeProfile) self.comboProfileNames.connect("changed",self.changeProfile) self.vboxTop.pack_start(hboxTemp) + self.vboxTop.pack_start(hboxDef) + + if stringToBoolean(wired.GetWiredProperty("default")) == True: + self.checkboxDefaultProfile.set_active(True) + else: + self.checkboxDefaultProfile.set_active(False) + self.checkboxDefaultProfile.connect("toggled",self.toggleDefaultProfile) + self.show_all() self.profileHelp.hide() if profileList != None: @@ -475,12 +503,14 @@ class WiredNetworkEntry(NetworkEntry): if not wired.GetAlwaysShowWiredInterface(): self.set_expanded(True) self.profileHelp.show() + def checkEnable(self): profileList = config.GetWiredProfileList() if profileList == None: self.buttonDelete.set_sensitive(False) self.higherLevel.connectButton.set_sensitive(False) self.vboxAdvanced.set_sensitive(False) + def addProfile(self,widget): print "adding profile" profileName = self.comboProfileNames.get_active_text() @@ -511,6 +541,13 @@ class WiredNetworkEntry(NetworkEntry): self.higherLevel.connectButton.set_sensitive(False) else: self.profileHelp.hide() + + def toggleDefaultProfile(self,widget): + if self.checkboxDefaultProfile.get_active() == True: + print 'unsetting previous default profile...' + config.UnsetWiredDefault() # Makes sure there is only one default profile at a time + wired.SetWiredProperty("default",self.checkboxDefaultProfile.get_active()) + config.SaveWiredNetworkProfile(self.comboProfileNames.get_active_text()) def changeProfile(self,widget): if self.comboProfileNames.get_active() > -1: #this way the name doesn't change @@ -527,6 +564,11 @@ class WiredNetworkEntry(NetworkEntry): self.txtDNS1.set_text(noneToBlankString(wired.GetWiredProperty("dns1"))) self.txtDNS2.set_text(noneToBlankString(wired.GetWiredProperty("dns2"))) self.txtDNS3.set_text(noneToBlankString(wired.GetWiredProperty("dns3"))) + + self.txtBeforeScript.set_text(noneToBlankString(wired.GetWiredProperty("beforescript"))) + self.txtAfterScript.set_text(noneToBlankString(wired.GetWiredProperty("afterscript"))) + + self.checkboxDefaultProfile.set_active(stringToBoolean(wired.GetWiredProperty("default"))) self.resetStaticCheckboxes() class WirelessNetworkEntry(NetworkEntry): @@ -575,6 +617,9 @@ class WirelessNetworkEntry(NetworkEntry): self.txtDNS2.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"dns2"))) self.txtDNS3.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"dns3"))) + self.txtBeforeScript.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"beforescript"))) + self.txtAfterScript.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"afterscript"))) + self.resetStaticCheckboxes() encryptionTypes = misc.LoadEncryptionMethods() @@ -965,6 +1010,15 @@ class appGui: print "no encryption specified..." wireless.SetWirelessProperty(networkid,"enctype",noneToString(None)) + # Script info + before_script = networkentry.expander.txtBeforeScript.get_text() + after_script = networkentry.expander.txtAfterScript.get_text() + wireless.SetWirelessProperty(networkid,"beforescript",noneToString(before_script)) + wireless.SetWirelessProperty(networkid,"afterscript",noneToString(after_script)) + wireless.SetBeforeScript(before_script) + wireless.SetAfterScript(after_script) + + # if it exists. maybe kept as a value in the network entry? Not sure... print "connecting to wireless network..." config.SaveWirelessNetworkProfile(networkid) wireless.ConnectWireless(networkid) @@ -988,7 +1042,15 @@ class appGui: wired.SetWiredProperty("dns1",'') wired.SetWiredProperty("dns2",'') wired.SetWiredProperty("dns3",'') - + + #Script Info + before_script = networkentry.expander.txtBeforeScript.get_text() + after_script = networkentry.expander.txtAfterScript.get_text() + wired.SetWiredProperty("beforescript",noneToString(before_script)) + wired.SetWiredProperty("afterscript",noneToString(after_script)) + wired.SetBeforeScript(before_script) + wired.SetAfterScript(after_script) + config.SaveWiredNetworkProfile(networkentry.expander.comboProfileNames.get_active_text()) wired.ConnectWired() diff --git a/networking.py b/networking.py index 58917d0..7d69224 100644 --- a/networking.py +++ b/networking.py @@ -26,6 +26,8 @@ class Wireless: wired_interface = None wpa_driver = None ConnectingThread = None + before_script = None + after_script = None #Create a function to scan for wireless networks def Scan(self,essid=None): @@ -189,7 +191,7 @@ class Wireless: def Connect(self,network): #call the thread, so we don't hang up the entire works - self.ConnectingThread = self.ConnectThread(network,self.wireless_interface,self.wired_interface,self.wpa_driver) + self.ConnectingThread = self.ConnectThread(network,self.wireless_interface,self.wired_interface,self.wpa_driver,self.before_script,self.after_script) self.ConnectingThread.start() return True @@ -199,13 +201,15 @@ class Wireless: ShouldDie = False lock = thread.allocate_lock() - def __init__(self,network,wireless,wired,wpa_driver): + def __init__(self,network,wireless,wired,wpa_driver,before_script,after_script): threading.Thread.__init__(self) self.network = network self.wireless_interface = wireless self.wired_interface = wired self.wpa_driver = wpa_driver self.IsConnecting = False + self.before_script = before_script + self.after_script = after_script self.lock.acquire() self.ConnectingMessage = 'interface_down' self.lock.release() @@ -228,7 +232,15 @@ class Wireless: self.IsConnecting = True network = self.network - + self.lock.acquire() + self.ConnectingMessage = 'executing_before_script' + self.lock.release() + + before_script = self.before_script + print 'before script is ', before_script + if before_script != '' and before_script != None: + print 'Executing pre-connection script' + misc.Run(before_script) #put it down print "interface down..." self.lock.acquire() @@ -357,8 +369,10 @@ class Wireless: print "done" self.IsConnecting = False - - + after_script = self.after_script + if after_script != '' and after_script != None: + print 'executing post connection script' + misc.Run(after_script) #end function Connect #end class Connect @@ -436,6 +450,8 @@ class Wired: wireless_interface = None wired_interface = None ConnectingThread = None + before_script = None + after_script = None def GetIP(self): output = misc.Run("ifconfig " + self.wired_interface) @@ -456,7 +472,7 @@ class Wired: def Connect(self,network): #call the thread, so we don't hang up the entire works - self.ConnectingThread = self.ConnectThread(network,self.wireless_interface,self.wired_interface) + self.ConnectingThread = self.ConnectThread(network,self.wireless_interface,self.wired_interface,self.before_script,self.after_script) self.ConnectingThread.start() return True #end function Connect @@ -467,12 +483,14 @@ class Wired: ConnectingMessage = None ShouldDie = False - def __init__(self,network,wireless,wired): + def __init__(self,network,wireless,wired,before_script,after_script): threading.Thread.__init__(self) self.network = network self.wireless_interface = wireless self.wired_interface = wired self.IsConnecting = False + self.before_script = before_script + self.after_script = after_script self.lock.acquire() self.ConnectingMessage = 'interface_down' self.lock.release() @@ -491,6 +509,12 @@ class Wired: #but we do remove all wifi entries from the #routing table + before_script = self.before_script + print 'before script is ', before_script + if before_script != '' and before_script != None: + print 'Executing pre-connection script' + misc.Run(before_script) + self.IsConnecting = True network = self.network @@ -549,7 +573,7 @@ class Wired: misc.WriteLine(resolv,"nameserver " + network["dns2"]) if not network.get("dns3") == None: print "setting the third dns server..." - misc.WriteLine(resolv,"nameserver " + network["dns3"])) + misc.WriteLine(resolv,"nameserver " + network["dns3"]) if not network.get("ip") == None: self.lock.acquire() @@ -573,5 +597,10 @@ class Wired: self.ConnectingMessage = 'done' self.lock.release() self.IsConnecting = False + + after_script = self.after_script + if after_script != '' and after_script != None: + print 'executing post connection script' + misc.Run(after_script) #end function run