From 709efd2ac4fc9454162d87ac9adac6f3c369c49d Mon Sep 17 00:00:00 2001 From: compwiz18 <> Date: Wed, 4 Jul 2007 14:51:57 +0000 Subject: [PATCH] trying to fix --- autoconnect.py | 24 + daemon.py | 794 ++++++++++++++++++++ dapper.py | 73 ++ data/wicd.glade | 220 ++++++ data/wicd.png | 1 + edgy.py | 214 ++++++ encryption/templates/active | 6 + encryption/templates/eap | 18 + encryption/templates/leap | 13 + encryption/templates/peap | 14 + encryption/templates/ttls | 14 + encryption/templates/wep | 13 + encryption/templates/wpa | 14 + gui.py | 994 +++++++++++++++++++++++++ images/bad-signal-lock.png | Bin 0 -> 1083 bytes images/bad-signal.png | Bin 0 -> 1060 bytes images/good-signal-lock.png | Bin 0 -> 1117 bytes images/good-signal.png | Bin 0 -> 1104 bytes images/high-signal-lock.png | Bin 0 -> 1122 bytes images/high-signal.png | Bin 0 -> 1106 bytes images/low-signal-lock.png | Bin 0 -> 1111 bytes images/low-signal.png | Bin 0 -> 1098 bytes images/no-signal.png | Bin 0 -> 1101 bytes images/signal-100.png | Bin 0 -> 894 bytes images/signal-25.png | Bin 0 -> 863 bytes images/signal-50.png | Bin 0 -> 890 bytes images/signal-75.png | Bin 0 -> 850 bytes images/wicd-blue.png | Bin 0 -> 4000 bytes images/wicd-green.png | Bin 0 -> 4108 bytes images/wicd-orange.png | Bin 0 -> 4158 bytes images/wicd-purple.png | Bin 0 -> 4135 bytes images/wicd-red.png | Bin 0 -> 4106 bytes images/wicd.png | 1 + images/wired.png | Bin 0 -> 1245 bytes misc.py | 124 +++ networking.py | 548 ++++++++++++++ translations/en_US.po | 252 +++++++ translations/en_US/LC_MESSAGES/wicd.mo | Bin 0 -> 4053 bytes translations/es_ES.po | 191 +++++ translations/es_ES/LC_MESSAGES/wicd.mo | Bin 0 -> 3853 bytes translations/fi_FI.po | 186 +++++ translations/fi_FI/LC_MESSAGES/wicd.mo | Bin 0 -> 3702 bytes translations/it_IT.po | 191 +++++ translations/it_IT/LC_MESSAGES/wicd.mo | Bin 0 -> 3931 bytes translations/nl_NL.po | 186 +++++ translations/nl_NL/LC_MESSAGES/wicd.mo | Bin 0 -> 3732 bytes translations/pl_PL.po | 189 +++++ translations/pl_PL/LC_MESSAGES/wicd.mo | Bin 0 -> 3913 bytes translations/sv_SE.po | 186 +++++ translations/sv_SE/LC_MESSAGES/wicd.mo | Bin 0 -> 3723 bytes translations/wicd.pot | 247 ++++++ tray-dapper.py | 1 + tray-edgy.py | 1 + tray.py | 9 + 54 files changed, 4724 insertions(+) create mode 100644 autoconnect.py create mode 100644 daemon.py create mode 100644 dapper.py create mode 100644 data/wicd.glade create mode 100644 data/wicd.png create mode 100644 edgy.py create mode 100644 encryption/templates/active create mode 100644 encryption/templates/eap create mode 100644 encryption/templates/leap create mode 100644 encryption/templates/peap create mode 100644 encryption/templates/ttls create mode 100644 encryption/templates/wep create mode 100644 encryption/templates/wpa create mode 100644 gui.py create mode 100644 images/bad-signal-lock.png create mode 100644 images/bad-signal.png create mode 100644 images/good-signal-lock.png create mode 100644 images/good-signal.png create mode 100644 images/high-signal-lock.png create mode 100644 images/high-signal.png create mode 100644 images/low-signal-lock.png create mode 100644 images/low-signal.png create mode 100644 images/no-signal.png create mode 100644 images/signal-100.png create mode 100644 images/signal-25.png create mode 100644 images/signal-50.png create mode 100644 images/signal-75.png create mode 100644 images/wicd-blue.png create mode 100644 images/wicd-green.png create mode 100644 images/wicd-orange.png create mode 100644 images/wicd-purple.png create mode 100644 images/wicd-red.png create mode 100644 images/wicd.png create mode 100644 images/wired.png create mode 100644 misc.py create mode 100644 networking.py create mode 100644 translations/en_US.po create mode 100644 translations/en_US/LC_MESSAGES/wicd.mo create mode 100644 translations/es_ES.po create mode 100644 translations/es_ES/LC_MESSAGES/wicd.mo create mode 100644 translations/fi_FI.po create mode 100644 translations/fi_FI/LC_MESSAGES/wicd.mo create mode 100644 translations/it_IT.po create mode 100644 translations/it_IT/LC_MESSAGES/wicd.mo create mode 100644 translations/nl_NL.po create mode 100644 translations/nl_NL/LC_MESSAGES/wicd.mo create mode 100644 translations/pl_PL.po create mode 100644 translations/pl_PL/LC_MESSAGES/wicd.mo create mode 100644 translations/sv_SE.po create mode 100644 translations/sv_SE/LC_MESSAGES/wicd.mo create mode 100644 translations/wicd.pot create mode 100644 tray-dapper.py create mode 100644 tray-edgy.py create mode 100644 tray.py diff --git a/autoconnect.py b/autoconnect.py new file mode 100644 index 0000000..58529a2 --- /dev/null +++ b/autoconnect.py @@ -0,0 +1,24 @@ +#!/usr/bin/python + +import gobject +import dbus +import dbus.service +if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): + import dbus.glib + +############# +#declare our connections to our daemon. +#without them nothing useful will happen +#the daemon should be running as root +bus = dbus.SystemBus() +proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') +##we don't need some of these, so I just comment them out +daemon = dbus.Interface(proxy_obj, 'org.wicd.daemon') +wireless = dbus.Interface(proxy_obj, 'org.wicd.daemon.wireless') +wired = dbus.Interface(proxy_obj, 'org.wicd.daemon.wired') +#config = dbus.Interface(proxy_obj, 'org.wicd.daemon.config') +############# + +print daemon.Hello() +if wireless.CheckIfWirelessConnecting() == False and wired.CheckIfWiredConnecting() == False: + print wireless.AutoConnect(True) diff --git a/daemon.py b/daemon.py new file mode 100644 index 0000000..7edb3ce --- /dev/null +++ b/daemon.py @@ -0,0 +1,794 @@ +#!/usr/bin/python +#change to the directory that the file lives in +import os,sys +if __name__ == '__main__': + os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) +#import the dbus stuff +import gobject +import dbus +import dbus.service +if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): + import dbus.glib +#import the networking library +import networking +#import random other libraries +import ConfigParser, time +#import the random functions library +import misc + + +############################### +# GENERAL NOTES +# +# wicd Daemon +# Version 1.0.0 +# Suppliments wicd +# Written December/January 2006 +# +# Uses libraries also written by me +# for this program +# called networking.py and misc.py +# Will not function without them. +# +# CODE NOTES +# +# If a function has the "pass" statement in it +# this is usually because it is not complete. +# +# Runs on behalf of the wicd GUI +# to perform actions that require root. +# The GUI should be running as the current user +# +# This is released under the +# GNU General Public License +# The terms can be found at +# http://www.gnu.org/copyleft/gpl.html +# +# Copyright (C) 2007 Adam Blackburn +############################### + +logging_enabled = True + +class FlushWriter: + def __init__(self): + print os.getcwd() + self.file = open('data/wicd.log','w') + self.file.write(self.__getPrettyTime() + ' :: ') + + def write(self,data): + '''prepends a timestamp, writes the data, and then flushes the buffer''' + global logging_enabled + + if logging_enabled: + + #it appears that only one character at a time is written, but I don't trust it + #so if it isn't always one letter, make it so + #this code should never run + if len(data) > 1: + for letter in data: + self.write(letter) + return + + if data == '\n': + self.file.write('\n' + self.__getPrettyTime() + ' :: ') + else: + self.file.write(str(data)) + + self.file.flush() + + def __getPrettyTime(self): + '''generate a string with the time, and space numbers with 0s''' + x = time.localtime() + #year/month/day hours:minutes:seconds + pretty_time = str(x[0]).rjust(4,'0') + '/' + str(x[1]).rjust(2,'0') + '/'+str(x[2]).rjust(2,'0') + ' '+str(x[3]).rjust(2,'0') + ':' + str(x[4]).rjust(2,'0') + ':' + str(x[5]).rjust(2,'0') + #probably don't need to pad the year, but it makes it consistent + return pretty_time + + + def flush(self): + '''flushes the buffer''' + self.file.flush() + +class ConnectionWizard(dbus.service.Object): + + ########## VARIABLES AND STUFF + ################################# + + def __init__(self, bus_name, object_path='/org/wicd/daemon'): + dbus.service.Object.__init__(self, bus_name, object_path) + + #set variables needed to run - these probably won't be changed too often + self.app_conf = "data/manager-settings.conf" + self.wireless_conf = "data/wireless-settings.conf" + self.wired_conf = "data/wired-settings.conf" + self.hidden_essid = None + self.wifi = networking.Wireless() + self.wired = networking.Wired() + self.forced_disconnect = False + + #load the config file - it should have most of the stuff we need to run... + self.ReadConfig() + + #set some other stuff needed to run - these probably will be changed often + + #this will speed up the scanning process - if a client doesn't need a fresh scan, just + #feed them the old one. a fresh scan can be done by calling FreshScan(self,interface) + self.LastScan = None + + #make a variable that will hold the wired network profile + self.WiredNetwork = {} + + #scan since we just got started + + DoAutoConnect = True + + if len(sys.argv) > 1: + if sys.argv[1] == "--do-not-scan": + print "--do-not-scan detected, not autoconnecting..." + DoAutoConnect = False + + if DoAutoConnect: + print "autoconnecting...",str(self.GetWirelessInterface()[5:]) + print self.AutoConnect(True) + + #log file! all std:out is redirected to this log file, so we'll flush it from time to time + #see POI:500 for details (use the search feature to search for POI:500 in this file) + + ########## DAEMON FUNCTIONS + ################################# + + @dbus.service.method('org.wicd.daemon') + def Hello(self): + '''returns the version number''' + #returns a version number. + #this number is major-minor-micro + #major is only incremented if minor + #reaches > 9 + #minor is incremented if changes + #that break core stucture are implemented + #micro is for everything else. + #and micro may be anything >= 0 + #this number is effective starting wicd v1.2.0 + version = '1.3.0' + print 'returned version number',version + return version + + @dbus.service.method('org.wicd.daemon') + def SetWiredInterface(self,interface): + '''sets the wired interface for the daemon to use''' + print "setting wired interface" , str(interface) + self.wired.wired_interface = interface + self.wifi.wired_interface = interface + config = ConfigParser.ConfigParser() + config.read(self.app_conf) + config.set("Settings","wired_interface",interface) + config.write(open(self.app_conf,"w")) + + @dbus.service.method('org.wicd.daemon') + def SetWirelessInterface(self,interface): + '''sets the wireless interface the daemon will use''' + print "setting wireless interface" , str(interface) + self.wifi.wireless_interface = interface + self.wired.wireless_interface = interface + config = ConfigParser.ConfigParser() + config.read(self.app_conf) + config.set("Settings","wireless_interface",interface) + configfile = open(self.app_conf,"w") + config.write(configfile) + + @dbus.service.method('org.wicd.daemon') + def SetWPADriver(self,driver): + '''sets the wpa driver the wpa_supplicant will use''' + print "setting wpa driver" , str(driver) + self.wifi.wpa_driver = driver + config = ConfigParser.ConfigParser() + config.read(self.app_conf) + config.set("Settings","wpa_driver",driver) + configfile = open(self.app_conf,"w") + config.write(configfile) + + @dbus.service.method('org.wicd.daemon') + def GetWPADriver(self): + '''returns the wpa driver the daemon is using''' + print 'returned wpa driver' + return str(self.wifi.wpa_driver) + + @dbus.service.method('org.wicd.daemon') + def GetWiredInterface(self): + '''returns the wired interface''' + print 'returning wired interface' + return str(self.wired.wired_interface) + + @dbus.service.method('org.wicd.daemon') + def GetWirelessInterface(self): + '''returns the wireless interface the daemon is using''' + print 'returning wireless interface to client' + return str(self.wifi.wireless_interface) + + ########## WIRELESS FUNCTIONS + ################################# + + @dbus.service.method('org.wicd.daemon.wireless') + def SetHiddenNetworkESSID(self,essid): + '''sets the ESSID of a hidden network for use with ConnectionWizard.Scan''' + print 'setting hidden essid: ' + str(essid) + self.hidden_essid = str(misc.Noneify(essid)) + + @dbus.service.method('org.wicd.daemon.wireless') + def Scan(self): + '''scans for wireless networks, optionally using a (hidden) essid set with SetHiddenNetworkESSID''' + print 'scanning start' + scan = self.wifi.Scan(str(self.hidden_essid)) #_should_ already be a string but you never know... + self.LastScan = scan + print 'scanning done' + print 'found',str(len(scan)),'networks:', + for i in scan: + print i, + self.ReadWirelessNetworkProfile(i) + print + #end function FreshScan + + @dbus.service.method('org.wicd.daemon.wireless') + def DisconnectWireless(self): + self.SetForcedDisconnect(True) + self.wifi.Disconnect() + #end function DisconnectWireless + + @dbus.service.method('org.wicd.daemon.wireless') + def GetNumberOfNetworks(self): + '''returns number of networks''' + print 'returned number of networks...',len(self.LastScan) + return len(self.LastScan) + #end function GetNumberOfNetworks + + @dbus.service.method('org.wicd.daemon.wireless') + def CreateAdHocNetwork(self,essid,channel,ip,enctype,key,encused): + print 'attempting to create ad-hoc network...' + self.wifi.CreateAdHocNetwork(essid,channel,ip,enctype,key,encused) + #end function CreateAdHocNetwork + + @dbus.service.method('org.wicd.daemon.wireless') + def GetAutoReconnect(self): + do = bool(int(self.auto_reconnect)) + return self.__printReturn('returning automatically reconnect when connection drops',do) + #end function GetAutoReconnect + + @dbus.service.method('org.wicd.daemon.wireless') + def SetAutoReconnect(self,value): + print 'setting automatically reconnect when connection drops' + config = ConfigParser.ConfigParser() + config.read(self.app_conf) + config.set("Settings","auto_reconnect",value) + config.write(open(self.app_conf,"w")) + self.auto_reconnect = value + #end function SetAutoReconnect + + @dbus.service.method('org.wicd.daemon.wireless') + def AutoConnect(self,fresh): + '''autoconnects to a wireless network''' + print 'attempting to autoconnect to wireless network' + if fresh: + self.Scan() + if self.GetWirelessInterface() != None: + for x in self.LastScan: + if bool(self.LastScan[x]["has_profile"]): + print str(self.LastScan[x]["essid"]) + ' has profile' + if bool(self.LastScan[x].get('automatic')): + print 'automatically connecting to...',str(self.LastScan[x]["essid"]) + self.ConnectWireless(x) + time.sleep(1) + while self.CheckIfWirelessConnecting(): + print "autoconnecting... hold" + #not sure why I need to get IPs, but + #it solves the autoconnect problem + #i think it has something to do with + #making IO calls while threads are working...? + #if anyone knows why...email me at compwiz18@gmail.com + #only some people need these statements for autoconnect + #to function properly + self.GetWirelessIP() + ### + # removed line below for 1.3.0 - if there is trouble with + # connecting at boot, + # add back to file -- adam + ### + # as far as I can tell, it seems fine - what does everyone else + # think? -- adam + ### + #self.GetWiredIP() + time.sleep(1) + print "autoconnecting... done" + else: + print 'autoconnect failed because wireless interface == None' + #end function AutoConnect + + @dbus.service.method('org.wicd.daemon.wireless') + def GetWirelessProperty(self,networkid,property): + '''retrieves wireless property from the network specified''' + value = self.LastScan[networkid].get(property) + print 'returned wireless network',networkid,'property',property,'of value',value + return value + #end function GetWirelessProperty + + @dbus.service.method('org.wicd.daemon.wireless') + def SetWirelessProperty(self,networkid,property,value): + '''sets property to value in network specified''' + #simple - set the value of the item in our current data + #to the value the client asked for + print 'setting wireless network',networkid,'property',property,'to value',value + self.LastScan[networkid][property] = misc.Noneify(value) + #end function SetProperty + + @dbus.service.method('org.wicd.daemon.wireless') + def DetectWirelessInterface(self): + '''returns an automatically detected wireless interface''' + iface = self.wifi.DetectWirelessInterface() + print 'automatically detected wireless interface',iface + return str(iface) + #end function DetectWirelessInterface + + @dbus.service.method('org.wicd.daemon.wireless') + def GetCurrentSignalStrength(self): + '''returns the current signal strength''' + strength = int(self.wifi.GetSignalStrength()) + print 'returning current signal strength',strength + return strength + #end function GetCurrentSignalStrength + + @dbus.service.method('org.wicd.daemon.wireless') + def GetCurrentNetwork(self): + '''returns the current network''' + current_network = str(self.wifi.GetCurrentNetwork()) + print current_network + return current_network + #end function GetCurrentNetwork + + @dbus.service.method('org.wicd.daemon.wireless') + def GetCurrentNetworkID(self): + '''returns the id of the current network, or -1 if network is not found''' + currentESSID = self.GetCurrentNetwork() + for x in self.LastScan: + if self.LastScan[x]['essid'] == currentESSID: + print 'current network found, id is ',x + return x + print 'returning -1, current network not found' + return -1 + #end function GetCurrentNetwork + + @dbus.service.method('org.wicd.daemon.wireless') + def ConnectWireless(self,id): + '''connects the the wireless network specified by id''' + #will returned instantly, that way we don't hold up dbus + #CheckIfWirelessConnecting can be used to test if the connection + #is done + self.SetForcedDisconnect(False) + print 'connecting to wireless network',self.LastScan[id]["essid"] + return self.wifi.Connect(self.LastScan[id]) + #end function Connect + + @dbus.service.method('org.wicd.daemon.wireless') + def GetForcedDisconnect(self): + '''returns whether wireless was dropped by user, or for some other reason''' + return self.forced_disconnect + #end function GetForcedDisconnect + + @dbus.service.method('org.wicd.daemon.wireless') + def SetForcedDisconnect(self,value): + '''sets whether wireless has been disconnected by user since last connection''' + self.forced_disconnect = value + #end function SetForcedDisconnect + + @dbus.service.method('org.wicd.daemon.wireless') + def CheckIfWirelessConnecting(self): + '''reutrns True if wireless interface is connecting, otherwise False''' + if not self.wifi.ConnectingThread == None: + #if ConnectingThread exists, then check for it's + #status, if it doesn't, we aren't connecting + status = self.wifi.ConnectingThread.IsConnecting + print 'wireless connecting',status + return status + else: + print 'wireless connecting',False + return False + #end function CheckIfWirelessConnecting + + @dbus.service.method('org.wicd.daemon.wireless') + def GetWirelessIP(self): + '''returns the IP that the wireless interface has''' + ip = self.wifi.GetIP() + print 'returning wireless ip',ip + return ip + #end function GetWirelessIP + + @dbus.service.method('org.wicd.daemon.wireless') + def CheckWirelessConnectingMessage(self): + '''returns the wireless interface's status message''' + if not self.wifi.ConnectingThread == None: + stat = self.wifi.ConnectingThread.GetStatus() + print 'wireless connect status',stat + return stat + else: + print 'wireless connect status',False + return False + #end function CheckWirelessConnectingMessage + + @dbus.service.method('org.wicd.daemon.wireless') + def CancelConnect(self): + '''cancels the wireless connection attempt''' + print 'canceling connection attempt' + if not self.wifi.ConnectingThread == None: + self.wifi.ConnectingThread.ShouldDie = True + misc.Run("killall dhclient dhclient3 wpa_supplicant") + #end function CancelConnect + + ########## WIRED FUNCTIONS + ################################# + + @dbus.service.method('org.wicd.daemon.wired') + def GetWiredIP(self): + '''returns the wired interface's ip address''' + ip = self.wired.GetIP() + print 'returing wired ip',ip + return ip + + @dbus.service.method('org.wicd.daemon.wired') + def CheckIfWiredConnecting(self): + '''reutrns True if wired interface is connecting, otherwise False''' + if not self.wired.ConnectingThread == None: + #if ConnectingThread exists, then check for it's + #status, if it doesn't exist, we aren't connecting + status = self.wired.ConnectingThread.IsConnecting + print 'wired connecting',status + return status + else: + print 'wired connecting',False + return False + + + @dbus.service.method('org.wicd.daemon.wired') + def CheckWiredConnectingMessage(self): + '''returns the wired interface's status message''' + if not self.wired.ConnectingThread == None: + status = self.wired.ConnectingThread.GetStatus() + print 'wired connect status',status + return status + else: + print 'wired connect status',False + return False + + @dbus.service.method('org.wicd.daemon.wired') + def SetWiredProperty(self,property,value): + if self.WiredNetwork: + self.WiredNetwork[property] = misc.Noneify(value) + print 'set',property,'to',misc.Noneify(value) + return True + else: + print 'WiredNetwork does not exist' + return False + + @dbus.service.method('org.wicd.daemon.wired') + def GetWiredProperty(self,property): + if self.WiredNetwork: + value = self.WiredNetwork.get(property) + print 'returned',property,'with value of',value,'to client...' + return value + else: + print 'WiredNetwork does not exist' + return False + + @dbus.service.method('org.wicd.daemon.wired') + def SetAlwaysShowWiredInterface(self,value): + print 'setting always show wired interface' + config = ConfigParser.ConfigParser() + config.read(self.app_conf) + config.set("Settings","always_show_wired_interface",value) + config.write(open(self.app_conf,"w")) + self.always_show_wired_interface = value + + @dbus.service.method('org.wicd.daemon.wired') + def GetAlwaysShowWiredInterface(self): + do = bool(int(self.always_show_wired_interface)) + return self.__printReturn('returning always show wired interface',do) + + @dbus.service.method('org.wicd.daemon.wired') + def CheckPluggedIn(self): + if not self.wired.wired_interface == None: + return self.__printReturn('returing plugged in',self.wired.CheckPluggedIn()) + else: + return self.__printReturn("returning plugged in",None) + + @dbus.service.method('org.wicd.daemon.wired') + def ConnectWired(self): + '''connects to a wired network''' + #simple enough. + self.wired.Connect(self.WiredNetwork) + + ########## LOG FILE STUFF + ################################# + + @dbus.service.method('org.wicd.daemon.config') + def DisableLogging(self): + global logging_enabled + logging_enabled = False + + @dbus.service.method('org.wicd.daemon.config') + def EnableLogging(self): + global logging_enabled + logging_enabled = True + + ########## CONFIGURATION FILE FUNCTIONS + ################################# + + @dbus.service.method('org.wicd.daemon.config') + def CreateWiredNetworkProfile(self,profilename): + #should include: profilename,ip,netmask,gateway,dns1,dns2 + print "creating profile for " + str(profilename) + config = ConfigParser.ConfigParser() + config.read(self.wired_conf) + if config.has_section(profilename): + return False + config.add_section(profilename) + config.set(profilename,"ip",None) + config.set(profilename,"broadcast",None) + config.set(profilename,"netmask",None) + config.set(profilename,"gateway",None) + config.set(profilename,"dns1",None) + config.set(profilename,"dns2",None) + config.set(profilename,"dns3",None) + config.write( open(self.wired_conf,"w")) + return True + + @dbus.service.method('org.wicd.daemon.config') + def DeleteWiredNetworkProfile(self,profilename): + print "deleting profile for " + str(profilename) + config = ConfigParser.ConfigParser() + config.read(self.wired_conf) + if config.has_section(profilename): + config.remove_section(profilename) + else: + return "500: Profile does not exist" + config.write( open(self.wired_conf,"w")) + return "100: Profile Deleted" + + @dbus.service.method('org.wicd.daemon.config') + def SaveWiredNetworkProfile(self,profilename): + #should include: profilename,ip,netmask,gateway,dns1,dns2 + print "setting profile for " + str(profilename) + config = ConfigParser.ConfigParser() + config.read(self.wired_conf) + if config.has_section(profilename): + config.remove_section(profilename) + config.add_section(profilename) + for x in self.WiredNetwork: + config.set(profilename,x,self.WiredNetwork[x]) + config.write( open(self.wired_conf,"w")) + return "100: Profile Written" + + @dbus.service.method('org.wicd.daemon.config') + def ReadWiredNetworkProfile(self,profilename): + profile = {} + config = ConfigParser.ConfigParser() + config.read(self.wired_conf) + if config.has_section(profilename) == True: + for x in config.options(profilename): + profile[x] = misc.Noneify(config.get(profilename,x)) + self.WiredNetwork = profile + return "100: Loaded Profile" + else: + self.WiredNetwork = None + return "500: Profile Not Found" + + @dbus.service.method('org.wicd.daemon.config') + def GetWiredProfileList(self): + config = ConfigParser.ConfigParser() + config.read(self.wired_conf) + print config.sections() + if config.sections(): + return config.sections() + else: + return None + + @dbus.service.method('org.wicd.daemon.config') + def SaveWirelessNetworkProfile(self,id): + print "setting network profile" + config = ConfigParser.ConfigParser() + config.read(self.wireless_conf) + if config.has_section(self.LastScan[id]["bssid"]): + config.remove_section(self.LastScan[id]["bssid"]) + config.add_section(self.LastScan[id]["bssid"]) + #add the essid so that people reading the config can figure + #out which network is which. it will not be read + for x in self.LastScan[id]: + config.set(self.LastScan[id]["bssid"],x,self.LastScan[id][x]) + config.write( open(self.wireless_conf,"w")) + print "100: Profile Written" + + @dbus.service.method('org.wicd.daemon.config') + def SaveWirelessNetworkProperty(self,id,option): + print "setting network option " + str(option) + " to " + str(self.LastScan[id][option]) + config = ConfigParser.ConfigParser() + config.read(self.wireless_conf) + if config.has_section(self.LastScan[id]["bssid"]): + config.set(self.LastScan[id]["bssid"],option,str(self.LastScan[id][option])) + config.write(open(self.wireless_conf,"w")) + + @dbus.service.method('org.wicd.daemon.config') + def ReadWirelessNetworkProfile(self,id): + config = ConfigParser.ConfigParser() + config.read(self.wireless_conf) + print self.LastScan[id]["bssid"] + if config.has_section(self.LastScan[id]["bssid"]): + self.LastScan[id]["has_profile"] = True + #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: + self.LastScan[id]["essid"] = misc.Noneify(config.get(self.LastScan[id]["bssid"],"essid")) + + for x in config.options(self.LastScan[id]["bssid"]): + if self.LastScan[id].has_key(x) == False: + self.LastScan[id][x] = misc.Noneify(config.get(self.LastScan[id]["bssid"],x)) + return "100: Loaded Profile" + else: + self.LastScan[id]["has_profile"] = False + return "500: Profile Not Found" + + + + + ############################################# + ########## INTERNAL FUNCTIONS ############### + ############################################# + # so don't touch the stuff below # + # it read/writes the configuration files # + # and shouldn't need to be changed # + # unless you add a new property... # + # then be SURE YOU CHANGE IT # + ############################################# + + def __printReturn(self,text,value): + print text,value + return value + + def ReadConfig(self): + if os.path.isfile( self.app_conf ): + config = ConfigParser.ConfigParser() + config.read(self.app_conf) + if config.has_section("Settings"): + if config.has_option("Settings","wireless_interface"): + print "found wireless interface in configuration...", + self.SetWirelessInterface(config.get("Settings","wireless_interface")) + if config.has_option("Settings","wired_interface"): + print "found wired interface in configuration...", + self.SetWiredInterface(config.get("Settings","wired_interface")) + if config.has_option("Settings","wpa_driver"): + print "found wpa driver in configuration...", + self.SetWPADriver(config.get("Settings","wpa_driver")) + if config.has_option("Settings","always_show_wired_interface"): + self.always_show_wired_interface = config.get("Settings","always_show_wired_interface") + else: + config.set("Settings","always_show_wired_interface","False") + self.always_show_wired_interface = False + if config.has_option("Settings","auto_reconnect"): + self.auto_reconnect = config.get("Settings","auto_reconnect") + else: + config.set("Settings","auto_reconnect","False") + self.auto_reconnect = False + else: + print "configuration file exists, no settings found, adding defaults..." + configfile = open(self.app_conf,"w") + config.add_section("Settings") + config.set("Settings","wireless_interface","wlan0") + config.set("Settings","wired_interface","eth0") + config.set("Settings","wpa_driver","wext") + config.set("Settings","always_show_wired_interface","False") + config.set("Settings","auto_reconnect","False") + self.SetWirelessInterface(config.get("Settings","wireless_interface")) + self.SetWiredInterface(config.get("Settings","wired_interface")) + self.SetWPADriver(config.get("Settings","wpa_driver")) + config.write(configfile) + + else: + #write some defaults maybe? + print "configuration file not found, creating, adding defaults..." + config = ConfigParser.ConfigParser() + config.read(self.app_conf) + config.add_section("Settings") + config.set("Settings","wireless_interface","wlan0") + config.set("Settings","wired_interface","eth0") + config.set("Settings","always_show_wired_interface","False") + config.set("Settings","auto_reconnect","False") + iface = self.DetectWirelessInterface() + if iface: + config.set("Settings","wireless_interface",iface) + else: + print "couldn't detect a wireless interface..." + config.set("Settings","wireless_interface","wlan0") + config.set("Settings","wpa_driver","wext") + config.write(open(self.app_conf,"w")) + self.SetWirelessInterface(config.get("Settings","wireless_interface")) + self.SetWiredInterface(config.get("Settings","wired_interface")) + self.SetWPADriver(config.get("Settings","wpa_driver")) + self.SetAlwaysShowWiredInterface(False) + self.SetAutoReconnect(True) + #end If + + if os.path.isfile( self.wireless_conf ): + print "wireless configuration file found..." + #don't do anything since it is there + pass + else: + #we don't need to put anything in it, so just make it + print "wireless configuration file not found, creating..." + open( self.wireless_conf,"w" ).close() + #end If + + if os.path.isfile( self.wired_conf ): + print "wired configuration file found..." + #don't do anything since it is there + pass + else: + print "wired confguration file not found, creating..." + #we don't need to put anything in it, so just make it + open( self.wired_conf,"w" ).close() + #end If + + #hide the files, so the keys aren't exposed + print "chmoding configuration files 0600..." + os.chmod(self.app_conf,0600) + os.chmod(self.wireless_conf,0600) + os.chmod(self.wired_conf,0600) + + #make root own them + print "chowning configuration files root:root..." + os.chown(self.app_conf, 0, 0) + os.chown(self.wireless_conf, 0, 0) + os.chown(self.wired_conf, 0, 0) + + print "autodetected wireless interface...",self.DetectWirelessInterface() + print "using wireless interface...",self.GetWirelessInterface()[5:] + #end function ReadConfig + +## fork from the parent terminal + +if not True: #for easy disabling + try: + pid = os.fork() + if pid > 0: + # exit first parent + sys.exit(0) + except OSError, e: + print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) + sys.exit(1) + + # decouple from parent environment + os.setsid() + os.umask(0) + + # do second fork + try: + pid = os.fork() + if pid > 0: + print "wicd daemon: pid " + str(pid) + sys.exit(0) + except OSError, e: + print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) + sys.exit(1) + +#kill output +#POI:500 stdout redirection +output = FlushWriter() +#sys.stdout = output #open("data/wicd.log","w") +#sys.stderr = output + +print "---------------------------" +print "wicd initalizing..." +print "---------------------------" + +#open our dbus session +session_bus = dbus.SystemBus() +bus_name = dbus.service.BusName('org.wicd.daemon', bus=session_bus) +object = ConnectionWizard(bus_name) + +#enter the main loop +mainloop = gobject.MainLoop() +mainloop.run() diff --git a/dapper.py b/dapper.py new file mode 100644 index 0000000..ec25ddc --- /dev/null +++ b/dapper.py @@ -0,0 +1,73 @@ +######## +## DO NOT RUN THIS FILE DIRECTLY +## USE TRAY.PY INSTEAD +## nothing bad will happen if you do +## but that is not the preferred method +import os,sys +if __name__ == '__main__': + os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) +import gtk +import egg.trayicon +import gobject, dbus, dbus.service +if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): + import dbus.glib +############# +#declare the connections to our daemon. +#without them nothing useful will happen +#the daemon should be running as root +bus = dbus.SystemBus() +try: + print 'attempting to connect daemon...' + proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') + print 'success' +except: + print 'daemon not running, running gksudo ./daemon.py...' + import misc,time + misc.PromptToStartDaemon() + time.sleep(1) + try: + proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') + except: + print 'daemon still not running, aborting.' +#daemon = dbus.Interface(proxy_obj, 'org.wicd.daemon') +wireless = dbus.Interface(proxy_obj, 'org.wicd.daemon.wireless') +wired = dbus.Interface(proxy_obj, 'org.wicd.daemon.wired') +config = dbus.Interface(proxy_obj, 'org.wicd.daemon.config') +############# + +tooltip = gtk.Tooltips() +eb = gtk.EventBox() +t = egg.trayicon.TrayIcon("WicdTrayIcon") +pic = gtk.Image() + +def set_signal_image(): + config.DisableLogging() + signal = int(wireless.GetCurrentSignalStrength()) + if wired.CheckPluggedIn() == True: + pic.set_from_file("images/wired.png") + tooltip.set_tip(eb, "Wicd - Wired Connection") + elif signal > 75: + pic.set_from_file("images/high-signal.png") + tooltip.set_tip(eb, "Wicd - Wireless Connection - " + wireless.GetCurrentNetwork() + " - " + str(signal) + "%") + elif signal > 50: + pic.set_from_file("images/good-signal.png") + tooltip.set_tip(eb, "Wicd - Wireless Connection - " + wireless.GetCurrentNetwork() + " - " + str(signal) + "%") + elif signal > 25: + pic.set_from_file("images/low-signal.png") + tooltip.set_tip(eb, "Wicd - Wireless Connection - " + wireless.GetCurrentNetwork() + " - " + str(signal) + "%") + elif signal > 0: + pic.set_from_file("images/bad-signal.png") + tooltip.set_tip(eb, "Wicd - Wireless Connection - " + wireless.GetCurrentNetwork() + " - " + str(signal) + "%") + elif signal == 0: + pic.set_from_file("images/no-signal.png") + tooltip.set_tip(eb, "Wicd - No Connection") + config.EnableLogging() + return True + +gobject.timeout_add(1000,set_signal_image) +tooltip.set_tip(eb, "Wicd Systray") + +eb.add(pic) +t.add(eb) +t.show_all() +gtk.main() diff --git a/data/wicd.glade b/data/wicd.glade new file mode 100644 index 0000000..e9fe4b5 --- /dev/null +++ b/data/wicd.glade @@ -0,0 +1,220 @@ + + + + + + 580 + 600 + True + Wicd Manager + GTK_WIN_POS_CENTER_ALWAYS + wicd.png + GDK_GRAVITY_CENTER + + + + True + + + True + GTK_TOOLBAR_BOTH_HORIZ + GTK_ICON_SIZE_MENU + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + gtk-network + menu1 + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + gtk-disconnect + + + + False + + + + + True + True + gtk-refresh + + + + False + + + + + True + True + gtk-preferences + + + + False + + + + + True + True + gtk-about + + + + False + + + + + True + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_PROXIMITY_IN_MASK | GDK_PROXIMITY_OUT_MASK | GDK_SUBSTRUCTURE_MASK | GDK_SCROLL_MASK + True + gtk-quit + + + + False + + + + + False + + + + + True + 0 + 10 + 10 + Choose from the networks below: + True + + + False + 1 + + + + + True + False + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + + + True + GTK_SHADOW_NONE + + + True + 3 + + + + + + + + + + 2 + + + + + 4 + + + True + Connecting... + True + Connecting... + + + 3 + + + + + True + Cancel the current connection attempt + gtk-cancel + True + 0 + + + + False + 3 + 1 + + + + + False + 3 + + + + + True + + + False + 4 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Hidden Network + True + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + network-wireless + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Create Ad-Hoc Network + True + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-add + + + + + + diff --git a/data/wicd.png b/data/wicd.png new file mode 100644 index 0000000..f81ee30 --- /dev/null +++ b/data/wicd.png @@ -0,0 +1 @@ +link /opt/wicd/images/wicd.png \ No newline at end of file diff --git a/edgy.py b/edgy.py new file mode 100644 index 0000000..ee7f8e5 --- /dev/null +++ b/edgy.py @@ -0,0 +1,214 @@ +######## +## DO NOT RUN THIS FILE DIRECTLY +## USE TRAY.PY INSTEAD +## nothing bad will happen if you do +## but that is not the preferred method +## tray.py automatically picks the correct version +## of the tray icon to use +######## + +######## +##thanks to Arne Brix for programming most of this +##released under the GNU Public License +##see http://www.gnu.org/copyleft/gpl.html for details +##this will only work in Edgy and above because of gtk requirements +##to run the tray icon +######## +import os,sys +if __name__ == '__main__': + os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) +import gtk, gobject, dbus, dbus.service, os, sys, locale, gettext, signal, time +if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): + import dbus.glib + +############# +#declare the connections to our daemon. +#without them nothing useful will happen +#the daemon should be running as root +#some connections aren't used so they are commented +bus = dbus.SystemBus() +try: + print 'attempting to connect daemon...' + proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') + print 'success' +except: + print 'daemon not running, running gksudo ./daemon.py...' + import misc + misc.PromptToStartDaemon() + time.sleep(1) + try: + proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') + except: + print 'daemon still not running, aborting.' +#daemon = dbus.Interface(proxy_obj, 'org.wicd.daemon') +wireless = dbus.Interface(proxy_obj, 'org.wicd.daemon.wireless') +wired = dbus.Interface(proxy_obj, 'org.wicd.daemon.wired') +config = dbus.Interface(proxy_obj, 'org.wicd.daemon.config') +############# + +local_path = os.path.realpath(os.path.dirname(sys.argv[0])) + '/translations' +langs = [] +lc, encoding = locale.getdefaultlocale() +if (lc): + langs = [lc] +osLanguage = os.environ.get('LANGUAGE', None) +if (osLanguage): + langs += osLanguage.split(":") +langs += ["en_US"] +lang = gettext.translation('wicd', local_path, languages=langs, fallback = True) +_ = lang.gettext +language = {} +language['connected_to_wireless'] = _('Connected to $A at $B% (IP: $C)') +language['connected_to_wired'] = _('Connected to wired network (IP: $A)') +language['not_connected'] = _('Not connected') + +tr=None +tooltip = gtk.Tooltips() +pic=None +lastWinId = 0 + +def open_wicd_gui(): + global lastWinId + ret = 0 + if lastWinId != 0: + os.kill(lastWinId,signal.SIGQUIT) + ret = os.waitpid(lastWinId,0)[1] + lastWinId = 0 + if ret == 0: + lastWinId = os.spawnlpe(os.P_NOWAIT, './gui.py', os.environ) + +def set_signal_image(): + global LastStrength + global stillWired #keeps us from resetting the wired info over and over (I think?) + global network #declared as global so it is initialized once before it gets used in the if statement below + + config.DisableLogging() + + wired_ip = wired.GetWiredIP() + if wired.CheckPluggedIn() == True and wired_ip: + if stillWired == False: + tr.set_from_file("images/wired.png") + tr.set_tooltip(language['connected_to_wired'].replace('$A',wired_ip)) + stillWired = True + lock = '' + else: + stillWired = False + wireless_ip = wireless.GetWirelessIP() + #If ip returns as None, we are probably returning from hibernation and need to force signal to 0 to avoid crashing + if wireless_ip != None: + signal = int(wireless.GetCurrentSignalStrength()) + else: + signal = 0 + + #only update if the signal strength has changed because doing I/O calls is expensive, + #and the icon flickers + if (signal != LastStrength or network != wireless.GetCurrentNetwork()) and wireless_ip != None: + LastStrength = signal + lock = '' #set the string to '' so that when it is put in "high-signal" + lock + ".png", there will be nothing + curNetID = wireless.GetCurrentNetworkID() #the network ID needs to be checked because a negative value here will break the tray + if signal > 0 and curNetID > -1 and wireless.GetWirelessProperty(curNetID,"encryption"): + lock = '-lock' #set the string to '-lock' so that it will display the lock picture + + network = str(wireless.GetCurrentNetwork()) + tr.set_tooltip(language['connected_to_wireless'].replace('$A',network).replace('$B',str(signal)).replace('$C',str(wireless_ip))) + if signal > 75: + tr.set_from_file("images/high-signal" + lock + ".png") + elif signal > 50: + tr.set_from_file("images/good-signal" + lock + ".png") + elif signal > 25: + tr.set_from_file("images/low-signal" + lock + ".png") + elif signal > 0: + tr.set_from_file("images/bad-signal" + lock + ".png") + elif signal == 0: + tr.set_from_file("images/no-signal.png") + elif wireless_ip == None: + tr.set_from_file("images/no-signal.png") + tr.set_tooltip(language['not_connected']) + #Auto-reconnect code - not sure how well this works. I know that without the ForcedDisconnect check it reconnects you when + #a disconnect is forced. People who have disconnection problems need to test it to determine if it actually works. + #First it will attempt to reconnect to the last known wireless network, and if that fails it should run a scan and try to + #connect to any network set to autoconnect. + if wireless.GetAutoReconnect() == True and wireless.CheckIfWirelessConnecting() == False and wireless.GetForcedDisconnect() == False: + curNetID = wireless.GetCurrentNetworkID() + if curNetID > -1: + wireless.ConnectWireless(wireless.GetCurrentNetworkID()) + if wireless.GetCurrentSignalStrength() != 0: + print "Successfully autoreconnected." + else: + print "Couldn't reconnect to last used network, scanning for an autoconnect network..." + print wireless.AutoConnect(True) + else: + print "networkID returned -1, waiting..." #This is usually only caused by hibernation + time.sleep(30) + config.EnableLogging() + return True + + +class TrackerStatusIcon(gtk.StatusIcon): + def __init__(self): + gtk.StatusIcon.__init__(self) + menu = ''' + + + + + + + + + + + ''' + actions = [ + ('Menu', None, 'Menu'), + ('Connect', gtk.STOCK_CONNECT, '_Connect...', None, 'Connect to network', self.on_preferences), + ('About', gtk.STOCK_ABOUT, '_About...', None, 'About wicd-tray-icon', self.on_about), + ('Quit',gtk.STOCK_QUIT,'_Quit',None,'Quit wicd-tray-icon', self.on_quit), + + ] + ag = gtk.ActionGroup('Actions') + ag.add_actions(actions) + self.manager = gtk.UIManager() + self.manager.insert_action_group(ag, 0) + self.manager.add_ui_from_string(menu) + self.menu = self.manager.get_widget('/Menubar/Menu/About').props.parent + self.current_icon_path = '' + self.set_from_file("images/no-signal.png") + self.set_visible(True) + self.connect('activate', self.on_activate) + self.connect('popup-menu', self.on_popup_menu) + + def on_activate(self, data): + open_wicd_gui() + + def on_quit(self,widget): + sys.exit() + + def on_popup_menu(self, status, button, time): + self.menu.popup(None, None, None, button, time) + + def on_preferences(self, data): + open_wicd_gui() + + def on_about(self, data): + dialog = gtk.AboutDialog() + dialog.set_name('wicd tray icon') + dialog.set_version('0.2') + dialog.set_comments('an icon that shows your network connectivity') + dialog.set_website('http://wicd.sourceforge.net') + dialog.run() + dialog.destroy() + + def set_from_file(self,path): + if path != self.current_icon_path: + self.current_icon_path = path + gtk.StatusIcon.set_from_file(self,path) + +LastStrength = -2 +stillWired = False +network = '' +tr=None + +tr=TrackerStatusIcon() +gobject.timeout_add(3000,set_signal_image) +gtk.main() diff --git a/encryption/templates/active b/encryption/templates/active new file mode 100644 index 0000000..87da577 --- /dev/null +++ b/encryption/templates/active @@ -0,0 +1,6 @@ +wpa +wep +leap +ttls +eap +peap diff --git a/encryption/templates/eap b/encryption/templates/eap new file mode 100644 index 0000000..243b104 --- /dev/null +++ b/encryption/templates/eap @@ -0,0 +1,18 @@ +name = EAP-FAST +author = Adam Blackburn +version = 2 +require username *Username password *Password pac_file *Path_To_PAC_File +----- +network={ + ssid="$_ESSID" + scan_ssid=$_SCAN + proto=RSN WPA + pairwise=CCMP TKIP + group=CCMP TKIP + key-mgmt=WPA-EAP + eap=FAST + identity=$_USERNAME + password=$_PASSWORD + phase1="fast_provisioning=1" + pac-file="$_PAC_FILE" +} diff --git a/encryption/templates/leap b/encryption/templates/leap new file mode 100644 index 0000000..a893f1d --- /dev/null +++ b/encryption/templates/leap @@ -0,0 +1,13 @@ +name = LEAP with WEP +author = Adam Blackburn +version = 1 +require username *Username password *Password +----- +network={ + ssid="$_ESSID" + scan_ssid=$_SCAN + eap=LEAP + key-mgmt=IEEE8021X + identity="$_USERNAME" + password="$_PASSWORD" +} diff --git a/encryption/templates/peap b/encryption/templates/peap new file mode 100644 index 0000000..fd5a763 --- /dev/null +++ b/encryption/templates/peap @@ -0,0 +1,14 @@ +name = PEAP with GTC +author = Adam Blackburn +version = 2 +require identity *Identity password *Password +----- +network={ + ssid="$_ESSID" + proto=RSN + key_mgmt=WPA-EAP + pairwise=CCMP + eap=PEAP + identity="$_IDENTITY" + password="$_PASSWORD" +} diff --git a/encryption/templates/ttls b/encryption/templates/ttls new file mode 100644 index 0000000..ad396ac --- /dev/null +++ b/encryption/templates/ttls @@ -0,0 +1,14 @@ +name = TTLS with WEP +author = Adam Blackburn +version = 1 +require anonymous_identity *Anonymous_Identity identity *Identity password *Password auth *Authentication +----- +network={ + ssid="$_ESSID" + scan_ssid=$_SCAN + eap=TTLS + key-mgmt=IEEE8021X + identity="$_USERNAME" + password="$_PASSWORD" + phase2="auth=$_AUTH" +} diff --git a/encryption/templates/wep b/encryption/templates/wep new file mode 100644 index 0000000..12c019a --- /dev/null +++ b/encryption/templates/wep @@ -0,0 +1,13 @@ +name = WEP +author = Adam Blackburn +version = 1 +require key *Key +----- +network={ + ssid="$_ESSID" + scan_ssid=$_SCAN + key_mgmt=NONE + wep_key0=$_KEY + wep_tx_keyidx=0 + priority=5 +} diff --git a/encryption/templates/wpa b/encryption/templates/wpa new file mode 100644 index 0000000..97c3271 --- /dev/null +++ b/encryption/templates/wpa @@ -0,0 +1,14 @@ +name = WPA 1/2 +author = Adam Blackburn +version = 1 +require key *Key +----- +network={ + ssid="$_ESSID" + scan_ssid=$_SCAN + proto=WPA RSN + key_mgmt=WPA-PSK + pairwise=CCMP TKIP + group=CCMP TKIP + psk=$_PSK +} diff --git a/gui.py b/gui.py new file mode 100644 index 0000000..bea470c --- /dev/null +++ b/gui.py @@ -0,0 +1,994 @@ +#!/usr/bin/python +import os,sys +if __name__ == '__main__': + os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) +try: + import pygtk + pygtk.require("2.0") +except: + pass +try: + import gtk, gtk.glade +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): + import dbus.glib + +#declare the connections to the daemon, so that they may be accessed +#in any class +bus = dbus.SystemBus() +try: + print 'attempting to connect daemon...' + proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') + print 'success' +except: + print 'daemon not running, running gksudo ./daemon.py...' + misc.PromptToStartDaemon() + time.sleep(1) + try: + proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon') + except: + print 'daemon still not running, aborting.' +daemon = dbus.Interface(proxy_obj, 'org.wicd.daemon') +wireless = dbus.Interface(proxy_obj, 'org.wicd.daemon.wireless') +wired = dbus.Interface(proxy_obj, 'org.wicd.daemon.wired') +config = dbus.Interface(proxy_obj, 'org.wicd.daemon.config') + +#Translation stuff +#borrowed from an excellent post on how to do this on +#http://www.learningpython.com/2006/12/03/translating-your-pythonpygtk-application/ +#which is also under GPLv2 + +#Get the local directory since we are not installing anything +local_path = os.path.realpath(os.path.dirname(sys.argv[0])) + '/translations' +# Init the list of languages to support +langs = list() +#Check the default locale +lc, encoding = locale.getdefaultlocale() +if (lc): + #If we have a default, it's the first in the list + langs = [lc] +# Now lets get all of the supported languages on the system +osLanguage = os.environ.get('LANGUAGE', None) +if (osLanguage): + #langage comes back something like en_CA:en_US:en_GB:en + #on linuxy systems, on Win32 it's nothing, so we need to + #split it up into a list + langs += osLanguage.split(":") + +#Now add on to the back of the list the translations that we +#know that we have, our defaults +langs += ["en_US"] # I add english because a lot of people can read it +#Now langs is a list of all of the languages that we are going +#to try to use. First we check the default, then what the system +#told us, and finally the 'known' list + +gettext.bindtextdomain('wicd', local_path) +gettext.textdomain('wicd') +# Get the language to use +lang = gettext.translation('wicd', local_path, languages=langs, fallback = True) + +#map _() to self.lang.gettext() which will translate them. +_ = lang.gettext + +#keep all the language strings in a dictionary +#by the english words +#I'm not sure this is the best way to do it +#but it works and makes it easy for me :) +########## +# translations are done at +# http://wicd.sourceforge.net/wiki/doku.php?id=translations +# please translate if you can! +########## +language = {} +language['connect'] = _("Connect") +language['ip'] = _("IP") +language['netmask'] = _("Netmask") +language['gateway'] = _('Gateway') +language['dns'] = _('DNS') +language['use_static_ip'] = _('Use Static IPs') +language['use_static_dns'] = _('Use Static DNS') +language['use_encryption'] = _('Use Encryption') +language['advanced_settings'] = _('Advanced Settings') +language['wired_network'] = _('Wired Network') +language['wired_network_instructions'] = _('To connect to a wired network, you must create a network profile. To create a network profile, type a name that describes this network, and press Add.') +language['automatic_connect'] = _('Automatically connect to this network') +language['secured'] = _('Secured') +language['unsecured'] = _('Unsecured') +language['channel'] = _('Channel') +language['preferences'] = _('Preferences') +language['wpa_supplicant_driver'] = _('WPA Supplicant Driver') +language['wireless_interface'] = _('Wireless Interface') +language['wired_interface'] = _('Wired Interface') +language['hidden_network'] = _('Hidden Network') +language['hidden_network_essid'] = _('Hidden Network ESSID') +language['connected_to_wireless'] = _('Connected to $A at $B% (IP: $C)') +language['connected_to_wired'] = _('Connected to wired network (IP: $A)') +language['not_connected'] = _('Not connected') +language['no_wireless_networks_found'] = _('No wireless networks found.') +language['key'] = _('Key') +language['username'] = _('Username') +language['password'] = _('Password') +language['anonymous_identity'] = _('Anonymous Identity') +language['identity'] = _('Identity') +language['authentication'] = _('Authentication') +language['path_to_pac_file'] = _('Path to PAC File') +language['select_a_network'] = _('Choose from the networks below:') +language['connecting'] = _('Connecting...') +language['wired_always_on'] = _('Always show wired interface') +language['auto_reconnect'] = _('Automatically reconnect on connection loss') + +language['0'] = _('0') +language['1'] = _('1') +language['2'] = _('2') +language['3'] = _('3') +language['4'] = _('4') +language['5'] = _('5') +language['6'] = _('6') +language['7'] = _('7') +language['8'] = _('8') +language['9'] = _('9') + +language['interface_down'] = _('Putting interface down...') +language['resetting_ip_address'] = _('Resetting IP address...') +language['interface_up'] = _('Putting interface up...') +language['removing_old_connection'] = _('Removing old connection...') +language['generating_psk'] = _('Generating PSK...') +language['generating_wpa_config'] = _('Generating WPA configuration file...') +language['flushing_routing_table'] = _('Flushing the routing table...') +language['configuring_interface'] = _('Configuring wireless interface...') +language['setting_broadcast_address'] = _('Setting broadcast address...') +language['setting_static_dns'] = _('Setting static DNS servers...') +language['setting_static_ip'] = _('Setting static IP addresses...') +language['running_dhcp'] = _('Obtaining IP address...') +language['create_adhoc_network'] = _('Create an Ad-Hoc Network') +language['essid'] = _('ESSID') + + +language['done'] = _('Done connecting...') + +######################################## +##### GTK EXTENSION CLASSES +######################################## + +class LinkButton(gtk.EventBox): + label = None + def __init__(self): + gtk.EventBox.__init__(self) + self.connect("realize",self.__setHandCursor) #set the hand cursor when the box is initalized + label = gtk.Label() + label.set_markup(" " + language['connect'] + "") + label.set_alignment(0,.5) + label.show() + self.add(label) + self.show_all() + + def __setHandCursor(self,widget): + #we need this to set the cursor to a hand for the link labels + #I'm not entirely sure what it does :P + hand = gtk.gdk.Cursor(gtk.gdk.HAND1) + widget.window.set_cursor(hand) + +class SmallLabel(gtk.Label): + def __init__(self,text=''): + gtk.Label.__init__(self,text) + self.set_size_request(50,-1) + +class LabelEntry(gtk.HBox): + '''a label on the left with a textbox on the right''' + def __init__(self,text): + gtk.HBox.__init__(self) + self.entry = gtk.Entry() + self.entry.set_size_request(200,-1) + self.label = SmallLabel() + self.label.set_text(text) + self.label.set_size_request(170,-1) + self.pack_start(self.label,fill=False,expand=False) + self.pack_start(self.entry,fill=False,expand=False) + self.label.show() + self.entry.show() + self.entry.connect('focus-out-event',self.hide_characters) + self.entry.connect('focus-in-event',self.show_characters) + self.auto_hide_text = False + self.show() + + def set_text(self,text): + #for compatibility... + self.entry.set_text(text) + + def get_text(self): + return self.entry.get_text() + + def set_auto_hidden(self,value): + self.entry.set_visibility(False) + self.auto_hide_text = value + + def show_characters(self,widget=None,event=None): + #when the box has focus, show the characters + if self.auto_hide_text and widget: + self.entry.set_visibility(True) + + def hide_characters(self,widget=None,event=None): + #when the box looses focus, hide them + if self.auto_hide_text and widget: + self.entry.set_visibility(False) +class GreyLabel(gtk.Label): + def __init__(self): + gtk.Label.__init__(self) + def set_label(self,text): + self.set_markup("" + text + "") + self.set_alignment(0,0) + +######################################## +##### OTHER RANDOM FUNCTIONS +######################################## + +def noneToString(text): + '''used for putting text in a text box if the value to put in is 'None' the box will be blank''' + if text == None or text == "None" or text == "": + return "None" + else: + return str(text) + +def noneToBlankString(text): + '''if text is None, 'None', or '' then return '', otherwise return str(text)''' + if text == None or text == "None" or text == "": + return "" + else: + return str(text) + +def stringToNone(text): + '''performs opposite function of noneToString''' + if text == "" or text == "None" or text == None: + return None + else: + return str(text) + +def stringToBoolean(text): + '''turns a "True" to True or a "False" to False otherwise returns the text''' + if text == "True": + return True + if text == "False": + return False + return text + +######################################## +##### NETWORK LIST CLASSES +######################################## + + +class PrettyNetworkEntry(gtk.HBox): + '''adds an image and a connect button to a NetworkEntry''' + def __init__(self,expander): + gtk.HBox.__init__(self) + #add the stuff to the hbox (self) + self.expander = expander + self.expander.show() + self.expander.higherLevel = self #do this so that the expander can access the stuff inside me + self.tempVBox = gtk.VBox(False,1) + self.tempVBox.show() + self.connectButton = LinkButton() + self.connectButton.show() + self.tempVBox.pack_start(self.expander,fill=False,expand=False) + self.tempVBox.pack_start(self.connectButton,fill=False,expand=False) + self.pack_end(self.tempVBox) + +class PrettyWiredNetworkEntry(PrettyNetworkEntry): + def __init__(self): + PrettyNetworkEntry.__init__(self,WiredNetworkEntry()) + #center the picture and pad it a bit + self.image = gtk.Image() + self.image.set_alignment(.5,0) + + self.image.set_size_request(60,-1) + self.image.set_from_icon_name("network-wired",6) + self.image.show() + self.pack_start(self.image,fill=False,expand=False) + self.show() + self.expander.checkEnable() + self.expander.show() + + +class PrettyWirelessNetworkEntry(PrettyNetworkEntry): + def __init__(self,networkID): + PrettyNetworkEntry.__init__(self,WirelessNetworkEntry(networkID)) + self.image = gtk.Image() + self.image.set_padding(0,0) + self.image.set_alignment(.5,0) + self.image.set_size_request(60,-1) + self.image.set_from_icon_name("network-wired",6) + self.pack_start(self.image,fill=False,expand=False) + self.setSignalStrength(wireless.GetWirelessProperty(networkID,'quality')) + self.setMACAddress(wireless.GetWirelessProperty(networkID,'bssid')) + self.setMode(wireless.GetWirelessProperty(networkID,'mode')) + self.setChannel(wireless.GetWirelessProperty(networkID,'channel')) + self.setEncryption(wireless.GetWirelessProperty(networkID,'encryption'),wireless.GetWirelessProperty(networkID,'encryption_method')) + #show everything + self.show_all() + + def setSignalStrength(self,strength): + strength = int(strength) + if strength > 75: + self.image.set_from_file("images/signal-100.png") + elif strength > 50: + self.image.set_from_file("images/signal-75.png") + elif strength > 25: + self.image.set_from_file("images/signal-50.png") + else: + self.image.set_from_file("images/signal-25.png") + self.expander.setSignalStrength(strength) + + def setMACAddress(self,address): + self.expander.setMACAddress(address) + + def setEncryption(self,on,type): + self.expander.setEncryption(on,type) + + def setChannel(self,channel): + self.expander.setChannel(channel) + + def setMode(self,mode): + self.expander.setMode(mode) + +class NetworkEntry(gtk.Expander): + '''the basis for the entries in the network list''' + def __init__(self): + #make stuff exist, this is pretty long and boring + gtk.Expander.__init__(self) + self.txtIP = LabelEntry(language['ip']) + self.txtIP.entry.connect('focus-out-event',self.setDefaults) + self.txtNetmask = LabelEntry(language['netmask']) + self.txtGateway = LabelEntry(language['gateway']) + self.txtDNS1 = LabelEntry(language['dns'] + language['1']) + self.txtDNS2 = LabelEntry(language['dns'] + language['2']) + self.txtDNS3 = LabelEntry(language['dns'] + language['3']) + self.checkboxStaticIP = gtk.CheckButton(language['use_static_ip']) + self.checkboxStaticDNS = gtk.CheckButton(language['use_static_dns']) + self.expanderAdvanced = gtk.Expander(language['advanced_settings']) + self.vboxTop = gtk.VBox(False,0) + self.vboxAdvanced = 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) + self.vboxAdvanced.pack_start(self.txtGateway,fill=False,expand=False) + self.vboxAdvanced.pack_start(self.checkboxStaticDNS,fill=False,expand=False) + 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.vboxTop.pack_end(self.expanderAdvanced,fill=False,expand=False) + self.expanderAdvanced.add(self.vboxAdvanced) + #connect the events to the actions + self.checkboxStaticIP.connect("toggled",self.toggleIPCheckbox) + self.checkboxStaticDNS.connect("toggled",self.toggleDNSCheckbox) + self.add(self.vboxTop) + #start with all disabled, then they will be enabled later + self.checkboxStaticIP.set_active(False) + self.checkboxStaticDNS.set_active(False) + + def setDefaults(self,widget=None,event=None): + #after the user types in the IP address, + #help them out a little + ipAddress = self.txtIP.get_text() #for easy typing :) + netmask = self.txtNetmask + gateway = self.txtGateway + + if ipAddress != None: #make sure the is an IP in the box + if ipAddress.count('.') == 3: #make sure the IP can be parsed + ipNumbers = ipAddress.split('.') #split it up + if not '' in ipNumbers: #make sure the IP isn't something like 127..0.1 + if stringToNone(gateway.get_text()) == None: #make sure the gateway box is blank + #fill it in with a .1 at the end + gateway.set_text('.'.join(ipNumbers[0:3]) + '.1') + + if stringToNone(netmask.get_text()) == None: #make sure the netmask is blank + netmask.set_text('255.255.255.0') #fill in the most common one + + + def resetStaticCheckboxes(self): + #enable the right stuff + if not stringToNone(self.txtIP.get_text()) == None: + self.checkboxStaticIP.set_active(True) + self.checkboxStaticDNS.set_active(True) + self.checkboxStaticDNS.set_sensitive(False) + print 'enabling ip' + else: + self.checkboxStaticIP.set_active(False) + self.checkboxStaticDNS.set_active(False) + self.checkboxStaticDNS.set_sensitive(True) + print 'disabling ip' + + if not stringToNone(self.txtDNS1.get_text()) == None: + self.checkboxStaticDNS.set_active(True) + print 'enabling dns' + else: + self.checkboxStaticDNS.set_active(False) + print 'disabling dns' + + #blankify stuff! + #this will properly disable + #unused boxes + self.toggleIPCheckbox() + self.toggleDNSCheckbox() + + def toggleIPCheckbox(self,widget=None): + #should disable the static IP text boxes + #and also enable the DNS checkbox when + #disabled and disable when enabled + + if self.checkboxStaticIP.get_active(): + self.checkboxStaticDNS.set_active(True) + self.checkboxStaticDNS.set_sensitive(False) + else: + self.checkboxStaticDNS.set_sensitive(True) + + self.txtIP.set_sensitive(self.checkboxStaticIP.get_active()) + self.txtNetmask.set_sensitive(self.checkboxStaticIP.get_active()) + self.txtGateway.set_sensitive(self.checkboxStaticIP.get_active()) + + def toggleDNSCheckbox(self,widget=None): + #should disable the static DNS boxes + if self.checkboxStaticIP.get_active() == True: + self.checkboxStaticDNS.set_active(self.checkboxStaticIP.get_active()) + self.checkboxStaticDNS.set_sensitive(False) + + self.txtDNS1.set_sensitive(self.checkboxStaticDNS.get_active()) + self.txtDNS2.set_sensitive(self.checkboxStaticDNS.get_active()) + self.txtDNS3.set_sensitive(self.checkboxStaticDNS.get_active()) +class WiredNetworkEntry(NetworkEntry): + #creates the wired network expander + def __init__(self): + NetworkEntry.__init__(self) + 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) + self.profileHelp = gtk.Label(language['wired_network_instructions']) + 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) + 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.show_all() + self.profileHelp.hide() + if profileList != None: + self.comboProfileNames.set_active(0) + print "wired profiles found" + self.set_expanded(False) + else: + print "no wired profiles found" + 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() + profileList = config.GetWiredProfileList() + if profileList: + if profileName in profileList: + return False + if profileName != "": + self.profileHelp.hide() + config.CreateWiredNetworkProfile(profileName) + self.comboProfileNames.prepend_text(profileName) + self.comboProfileNames.set_active(0) + self.buttonDelete.set_sensitive(True) + self.vboxAdvanced.set_sensitive(True) + self.higherLevel.connectButton.set_sensitive(True) + + def removeProfile(self,widget): + print "removing profile" + config.DeleteWiredNetworkProfile(self.comboProfileNames.get_active_text()) + self.comboProfileNames.remove_text(self.comboProfileNames.get_active()) + self.comboProfileNames.set_active(0) + if config.GetWiredProfileList() == None: + self.profileHelp.show() + entry = self.comboProfileNames.child + entry.set_text("") + self.buttonDelete.set_sensitive(False) + self.vboxAdvanced.set_sensitive(False) + self.higherLevel.connectButton.set_sensitive(False) + else: + self.profileHelp.hide() + + def changeProfile(self,widget): + if self.comboProfileNames.get_active() > -1: #this way the name doesn't change + # #everytime someone types something in + print "changing profile..." + profileName = self.comboProfileNames.get_active_text() + print profileName + config.ReadWiredNetworkProfile(profileName) + + self.txtIP.set_text(noneToBlankString(wired.GetWiredProperty("ip"))) + self.txtNetmask.set_text(noneToBlankString(wired.GetWiredProperty("netmask"))) + self.txtGateway.set_text(noneToBlankString(wired.GetWiredProperty("gateway"))) + + 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.resetStaticCheckboxes() +class WirelessNetworkEntry(NetworkEntry): + #this class is respsponsible for creating the expander + #in each wirelessnetwork entry + def __init__(self,networkID): + self.networkID = networkID + #create the data labels + NetworkEntry.__init__(self) + print "ESSID : " + wireless.GetWirelessProperty(networkID,"essid") + self.set_label(wireless.GetWirelessProperty(networkID,"essid")) + self.essid = wireless.GetWirelessProperty(networkID,"essid") + print "making a new network entry..." + + #make the vbox to hold the encryption stuff + self.vboxEncryptionInformation = gtk.VBox(False,0) + #make the combo box + self.comboEncryption = gtk.combo_box_new_text() + self.checkboxEncryption = gtk.CheckButton(language['use_encryption']) + self.lblStrength = GreyLabel() + self.lblEncryption = GreyLabel() + self.lblMAC = GreyLabel() + self.lblChannel = GreyLabel() + self.lblMode = GreyLabel() + self.hboxStatus = gtk.HBox(False,5) + self.checkboxAutoConnect = gtk.CheckButton(language['automatic_connect']) + self.checkboxAutoConnect.connect("toggled",self.updateAutoConnect) #so that the autoconnect box is + #toggled + + self.hboxStatus.pack_start(self.lblStrength,fill=False,expand=True) + self.hboxStatus.pack_start(self.lblEncryption,fill=False,expand=True) + self.hboxStatus.pack_start(self.lblMAC,fill=False,expand=True) + self.hboxStatus.pack_start(self.lblMode,fill=False,expand=True) + self.hboxStatus.pack_start(self.lblChannel,fill=False,expand=True) + + self.vboxTop.pack_start(self.checkboxAutoConnect,fill=False,expand=False) + self.vboxTop.pack_start(self.hboxStatus,fill=True,expand=False) + + self.vboxAdvanced.pack_start(self.checkboxEncryption,fill=False,expand=False) + + self.txtIP.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"ip"))) + self.txtNetmask.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"netmask"))) + self.txtGateway.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"gateway"))) + + self.txtDNS1.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"dns1"))) + self.txtDNS2.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"dns2"))) + self.txtDNS3.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"dns3"))) + + self.resetStaticCheckboxes() + encryptionTypes = misc.LoadEncryptionMethods() + + self.checkboxEncryption.set_active(False) + self.comboEncryption.set_sensitive(False) + + if stringToBoolean(wireless.GetWirelessProperty(networkID,"automatic")) == True: + self.checkboxAutoConnect.set_active(True) + else: + self.checkboxAutoConnect.set_active(False) + #set it up right, with disabled stuff + self.toggleEncryption() + + #add the names to the menu + activeID = -1 #set the menu to this item when we are done + for x in encryptionTypes: + self.comboEncryption.append_text(encryptionTypes[x][0]) + if encryptionTypes[x][1] == wireless.GetWirelessProperty(networkID,"enctype"): + activeID = x + + self.comboEncryption.set_active(activeID) + if activeID != -1: + self.checkboxEncryption.set_active(True) + self.comboEncryption.set_sensitive(True) + self.vboxEncryptionInformation.set_sensitive(True) + else: + self.comboEncryption.set_active(0) + + self.vboxAdvanced.pack_start(self.comboEncryption) + self.vboxAdvanced.pack_start(self.vboxEncryptionInformation) + self.changeEncryptionMethod() + self.checkboxEncryption.connect("toggled",self.toggleEncryption) + self.comboEncryption.connect("changed",self.changeEncryptionMethod) + self.show_all() + + def updateAutoConnect(self,widget): + wireless.SetWirelessProperty(self.networkID,"automatic",self.checkboxAutoConnect.get_active()) + config.SaveWirelessNetworkProperty(self.networkID,"automatic") + + def toggleEncryption(self,widget=None): + active = self.checkboxEncryption.get_active() + self.vboxEncryptionInformation.set_sensitive(active) + self.comboEncryption.set_sensitive(active) + + def changeEncryptionMethod(self,widget=None): + for z in self.vboxEncryptionInformation: + z.destroy() #remove stuff in there already + ID = self.comboEncryption.get_active() + methods = misc.LoadEncryptionMethods() + self.encryptionInfo = {} + if ID == -1: + #in case nothing is selected + self.comboEncryption.set_active(0) + ID == 0 + for x in methods[ID][2]: + print x + box = None + if language.has_key(methods[ID][2][x][0]): + box = LabelEntry(language[methods[ID][2][x][0].lower().replace(' ','_')]) + else: + box = LabelEntry(methods[ID][2][x][0].replace('_',' ')) + box.set_auto_hidden(True) + self.vboxEncryptionInformation.pack_start(box) + #add the data to any array, so that the information + #can be easily accessed by giving the name of the wanted + #data + self.encryptionInfo[methods[ID][2][x][1]] = box.entry + + box.entry.set_text(noneToBlankString(wireless.GetWirelessProperty(self.networkID,methods[ID][2][x][1]))) + self.vboxEncryptionInformation.show_all() + + def setSignalStrength(self,strength): + self.lblStrength.set_label(str(strength) + "%") + + def setMACAddress(self,address): + self.lblMAC.set_label(str(address)) + + def setEncryption(self,on,type): + if on and type: + self.lblEncryption.set_label(language['secured'] + " " + str(type)) + self.set_use_markup(True) + self.set_label(self.essid + ' ' + str(type) + '') + if on and not type: + self.lblEncryption.set_label(language['secured']) + self.set_label(self.essid + ' Secured') + if not on: + self.lblEncryption.set_label(language['unsecured']) + + def setChannel(self,channel): + self.lblChannel.set_label(language['channel'] + ' ' + str(channel)) + + def setMode(self,mode): + self.lblMode.set_label(str(mode)) + +class appGui: + + def __init__(self): + print "starting..." + gladefile = "data/wicd.glade" + self.windowname = "gtkbench" + self.wTree = gtk.glade.XML(gladefile) + + dic = { "refresh_clicked" : self.refresh_networks, "quit_clicked" : self.exit, 'disconnect_clicked' : self.disconnect_wireless, "main_exit" : self.exit, "cancel_clicked" : self.cancel_connect, "connect_clicked" : self.connect_hidden, "preferences_clicked" : self.settings_dialog, "about_clicked" : self.about_dialog, 'create_adhoc_network_button_button' : self.create_adhoc_network} + self.wTree.signal_autoconnect(dic) + + #set some strings in the GUI - they may be translated + + self.wTree.get_widget("label_instructions").set_label(language['select_a_network']) + #I don't know how to translate a menu entry + #more specifically, I don't know how to set a menu entry's text + #self.wTree.get_widget("connect_button").modify_text(language['hidden_network']) + self.wTree.get_widget("progressbar").set_text(language['connecting']) + + self.network_list = self.wTree.get_widget("network_list_vbox") + self.status_area = self.wTree.get_widget("connecting_hbox") + self.status_bar = self.wTree.get_widget("statusbar") + self.refresh_networks(fresh=False) + + self.statusID = None + + gobject.timeout_add(300,self.update_statusbar) + gobject.timeout_add(100,self.pulse_progress_bar) + + def create_adhoc_network(self,widget=None): + #create a new adhoc network here. + print 'create adhoc network' + dialog = gtk.Dialog(title=language['create_adhoc_network'], flags = gtk.DIALOG_MODAL, buttons=(gtk.STOCK_OK,1,gtk.STOCK_CANCEL,2)) + dialog.set_has_separator(False) + dialog.set_size_request(400,-1) + self.useEncryptionCheckbox = gtk.CheckButton(language['use_encryption']) + self.useEncryptionCheckbox.set_active(False) + self.useEncryptionCheckbox.show() + ipEntry = LabelEntry(language['ip'] + ':') + essidEntry = LabelEntry(language['essid'] + ':') + channelEntry = LabelEntry(language['channel'] + ':') + self.keyEntry = LabelEntry(language['key'] + ':') + self.keyEntry.set_sensitive(False) + self.keyEntry.entry.set_visibility(False) + + self.useEncryptionCheckbox.connect("toggled",self.toggleEncryptionCheck) + channelEntry.entry.set_text('3') + essidEntry.entry.set_text('My_Adhoc_Network') + + vboxA = gtk.VBox(False,0) + vboxA.pack_start(self.useEncryptionCheckbox,fill=False,expand=False) + vboxA.pack_start(self.keyEntry,fill=False,expand=False) + vboxA.show() + dialog.vbox.pack_start(essidEntry) + dialog.vbox.pack_start(ipEntry) + dialog.vbox.pack_start(channelEntry) + dialog.vbox.pack_start(vboxA) + dialog.vbox.set_spacing(5) + response = dialog.run() + if response == 1: + wireless.CreateAdHocNetwork(essidEntry.entry.get_text(),channelEntry.entry.get_text(),ipEntry.entry.get_text(),"WEP",self.keyEntry.entry.get_text(),self.useEncryptionCheckbox.get_active()) + dialog.destroy() + + def toggleEncryptionCheck(self,widget=None): + self.keyEntry.set_sensitive(self.useEncryptionCheckbox.get_active()) + + def disconnect_wireless(self,widget=None): + wireless.DisconnectWireless() + + def about_dialog(self,widget,event=None): + dialog = gtk.AboutDialog() + dialog.set_name("Wicd") + dialog.set_version(daemon.Hello()) + dialog.set_authors([ "Adam Blackburn" ]) + dialog.set_website("http://wicd.sourceforge.net") + dialog.run() + dialog.destroy() + + def settings_dialog(self,widget,event=None): + dialog = gtk.Dialog(title=language['preferences'], flags=gtk.DIALOG_MODAL, buttons=(gtk.STOCK_OK,1,gtk.STOCK_CANCEL,2)) + dialog.set_has_separator(False) + dialog.set_size_request(375,-1) + wiredcheckbox = gtk.CheckButton(language['wired_always_on']) + wiredcheckbox.set_active(wired.GetAlwaysShowWiredInterface()) + reconnectcheckbox = gtk.CheckButton(language['auto_reconnect']) + reconnectcheckbox.set_active(wireless.GetAutoReconnect()) + wpadriverlabel = SmallLabel(language['wpa_supplicant_driver'] + ':') + wpadrivercombo = gtk.combo_box_new_text() + wpadrivercombo.set_size_request(50,-1) + wpadrivers = [ "hostap","hermes","madwifi","atmel","wext","ndiswrapper","broadcom","ipw" ] + i = 0 + found = False + for x in wpadrivers: + if x == daemon.GetWPADriver() and found == False: + found = True + else: + if found == False: + i+=1 + wpadrivercombo.append_text(x) + #set active here. + #if we set active an item to active, then add more items + #it loses the activeness + wpadrivercombo.set_active(i) + #select wext as the default driver, because + #it works for most cards + wpabox = gtk.HBox(False,1) + wpabox.pack_start(wpadriverlabel) + wpabox.pack_start(wpadrivercombo) + + entryWirelessInterface = LabelEntry(language['wireless_interface'] + ':') + entryWiredInterface = LabelEntry(language['wired_interface'] + ':') + + entryWirelessInterface.entry.set_text(daemon.GetWirelessInterface()) + entryWiredInterface.entry.set_text(daemon.GetWiredInterface()) + + dialog.vbox.pack_start(wpabox) + dialog.vbox.pack_start(entryWirelessInterface) + dialog.vbox.pack_start(entryWiredInterface) + dialog.vbox.pack_start(wiredcheckbox) + dialog.vbox.pack_start(reconnectcheckbox) + dialog.vbox.set_spacing(5) + dialog.show_all() + response = dialog.run() + if response == 1: + daemon.SetWirelessInterface(entryWirelessInterface.entry.get_text()) + daemon.SetWiredInterface(entryWiredInterface.entry.get_text()) + print "setting: " + wpadrivers[wpadrivercombo.get_active()] + daemon.SetWPADriver(wpadrivers[wpadrivercombo.get_active()]) + wired.SetAlwaysShowWiredInterface(wiredcheckbox.get_active()) + wireless.SetAutoReconnect(reconnectcheckbox.get_active()) + print wiredcheckbox.get_active() + print reconnectcheckbox.get_active() + dialog.destroy() + else: + dialog.destroy() + + def connect_hidden(self,widget): + #should display a dialog asking + #for the ssid of a hidden network + #and displaying connect/cancel buttons + dialog = gtk.Dialog(title=language['hidden_network'], flags=gtk.DIALOG_MODAL, buttons=(gtk.STOCK_CONNECT,1,gtk.STOCK_CANCEL,2)) + dialog.set_has_separator(False) + dialog.lbl = gtk.Label(language['hidden_network_essid']) + dialog.textbox = gtk.Entry() + dialog.vbox.pack_start(dialog.lbl) + dialog.vbox.pack_start(dialog.textbox) + dialog.show_all() + button = dialog.run() + if button == 1: + answer = dialog.textbox.get_text() + dialog.destroy() + self.refresh_networks(None,True,answer) + else: + dialog.destroy() + + def cancel_connect(self,widget): + #should cancel a connection if there + #is one in progress + cancelButton = self.wTree.get_widget("cancel_button") + cancelButton.set_sensitive(False) + wireless.CancelConnect() + wireless.SetForcedDisconnect(True) #Prevents automatic reconnecting if that option is enabled + + def pulse_progress_bar(self): + self.wTree.get_widget("progressbar").pulse() + return True + + def update_statusbar(self): + #should update the status bar + #every couple hundred milliseconds + config.DisableLogging() #stop log file spam + wireless_ip = wireless.GetWirelessIP() #do this so that it doesn't lock up. don't know how or why this works + #but it does so we leave it alone :) + wiredConnecting = wired.CheckIfWiredConnecting() + wirelessConnecting = wireless.CheckIfWirelessConnecting() + if wirelessConnecting == True or wiredConnecting == True: + self.network_list.set_sensitive(False) + self.status_area.show_all() + if self.statusID: + self.status_bar.remove(1,self.statusID) + if wirelessConnecting: + self.statusID = self.status_bar.push(1,language[str(wireless.CheckWirelessConnectingMessage())]) + if wiredConnecting: + self.statusID = self.status_bar.push(1,language[str(wired.CheckWiredConnectingMessage())]) + else: + self.network_list.set_sensitive(True) + self.status_area.hide_all() + if self.statusID: + self.status_bar.remove(1,self.statusID) + #use the chain approach to save calls to external programs + #external programs are quite CPU intensive + if wireless_ip: + network = wireless.GetCurrentNetwork() + if network: + strength = wireless.GetCurrentSignalStrength() + if strength != None: #do this because if strength is 0, if strength: doesn't work + network = str(network) + strength = str(strength) + ip = str(wireless_ip) + self.statusID=self.status_bar.push(1,language['connected_to_wireless'].replace('$A',network).replace('$B',strength).replace('$C',wireless_ip)) + return True + wired_ip = wired.GetWiredIP() + if wired_ip: + if wired.GetAlwaysShowWiredInterface() or wired.CheckPluggedIn(): + self.statusID = self.status_bar.push(1,language['connected_to_wired'].replace('$A',wired_ip)) + return True + self.statusID = self.status_bar.push(1,language['not_connected']) + config.EnableLogging() #reenable logging + return True + + def refresh_networks(self,widget=None,fresh=True,hidden=None): + print "refreshing..." + + printLine = False #so that we don't print the first line... + #remove stuff already in there. + for z in self.network_list: + z.destroy() + + if wired.CheckPluggedIn() or wired.GetAlwaysShowWiredInterface(): + printLine = True #so that a horizontal line is printed if there are wireless networks + wiredNetwork = PrettyWiredNetworkEntry() + self.network_list.pack_start(wiredNetwork,fill=False,expand=False) + wiredNetwork.connectButton.connect("button-press-event",self.connect,"wired",0,wiredNetwork) + #scan! + if fresh: + #even if it is None, it can still be passed + wireless.SetHiddenNetworkESSID(noneToString(hidden)) + wireless.Scan() + + print wireless.GetNumberOfNetworks() + + instructLabel = self.wTree.get_widget("label_instructions") + if wireless.GetNumberOfNetworks() > 0: + instructLabel.show() + for x in range(0,wireless.GetNumberOfNetworks()): + if printLine: + sep = gtk.HSeparator() + self.network_list.pack_start(sep,padding=10,expand=False,fill=False) + sep.show() + else: + printLine = True + tempNetwork = PrettyWirelessNetworkEntry(x) + tempNetwork.show_all() + self.network_list.pack_start(tempNetwork,expand=False,fill=False) + tempNetwork.connectButton.connect("button-press-event",self.connect,"wireless",x,tempNetwork) + else: + instructLabel.hide() + label = gtk.Label(language['no_wireless_networks_found']) + self.network_list.pack_start(label) + label.show() + + def connect(self,widget,event,type,networkid,networkentry): + cancelButton = self.wTree.get_widget("cancel_button") + cancelButton.set_sensitive(True) + if type == "wireless": + wireless.SetWirelessProperty(networkid,"automatic",noneToString(networkentry.expander.checkboxAutoConnect.get_active())) + if networkentry.expander.checkboxStaticIP.get_active() == True: + wireless.SetWirelessProperty(networkid,"ip",noneToString(networkentry.expander.txtIP.get_text())) + wireless.SetWirelessProperty(networkid,"netmask",noneToString(networkentry.expander.txtNetmask.get_text())) + wireless.SetWirelessProperty(networkid,"gateway",noneToString(networkentry.expander.txtGateway.get_text())) + else: + #blank the values + wireless.SetWirelessProperty(networkid,"ip",'') + wireless.SetWirelessProperty(networkid,"netmask",'') + wireless.SetWirelessProperty(networkid,"gateway",'') + + if networkentry.expander.checkboxStaticDNS.get_active() == True: + wireless.SetWirelessProperty(networkid,"dns1",noneToString(networkentry.expander.txtDNS1.get_text())) + wireless.SetWirelessProperty(networkid,"dns2",noneToString(networkentry.expander.txtDNS2.get_text())) + wireless.SetWirelessProperty(networkid,"dns3",noneToString(networkentry.expander.txtDNS3.get_text())) + else: + #blank the values + wireless.SetWirelessProperty(networkid,"dns1",'') + wireless.SetWirelessProperty(networkid,"dns2",'') + wireless.SetWirelessProperty(networkid,"dns3",'') + + + if networkentry.expander.checkboxEncryption.get_active() == True: + print "setting encryption info..." + encryptionInfo = networkentry.expander.encryptionInfo + #set the encryption type. without the encryption type, nothing is gonna happen + wireless.SetWirelessProperty(networkid,"enctype",misc.LoadEncryptionMethods()[networkentry.expander.comboEncryption.get_active()][1]) + for x in encryptionInfo: + wireless.SetWirelessProperty(networkid,x,noneToString(encryptionInfo[x].get_text())) + else: + print "no encryption specified..." + wireless.SetWirelessProperty(networkid,"enctype",noneToString(None)) + + print "connecting to wireless network..." + config.SaveWirelessNetworkProfile(networkid) + wireless.ConnectWireless(networkid) + + if type == "wired": + print "wired" + if networkentry.expander.checkboxStaticIP.get_active() == True: + wired.SetWiredProperty("ip",noneToString(networkentry.expander.txtIP.get_text())) + wired.SetWiredProperty("netmask",noneToString(networkentry.expander.txtNetmask.get_text())) + wired.SetWiredProperty("gateway",noneToString(networkentry.expander.txtGateway.get_text())) + else: + wired.SetWiredProperty("ip",'') + wired.SetWiredProperty("netmask",'') + wired.SetWiredProperty("gateway",'') + + if networkentry.expander.checkboxStaticDNS.get_active() == True: + wired.SetWiredProperty("dns1",noneToString(networkentry.expander.txtDNS1.get_text())) + wired.SetWiredProperty("dns2",noneToString(networkentry.expander.txtDNS2.get_text())) + wired.SetWiredProperty("dns3",noneToString(networkentry.expander.txtDNS3.get_text())) + else: + wired.SetWiredProperty("dns1",'') + wired.SetWiredProperty("dns2",'') + wired.SetWiredProperty("dns3",'') + + config.SaveWiredNetworkProfile(networkentry.expander.comboProfileNames.get_active_text()) + wired.ConnectWired() + + def exit(self,widget,event=None): + sys.exit(0) + +#start the app +app = appGui() +gtk.main() diff --git a/images/bad-signal-lock.png b/images/bad-signal-lock.png new file mode 100644 index 0000000000000000000000000000000000000000..83999b10cfa354e8500a0e5625634adcdaf77674 GIT binary patch literal 1083 zcmV-B1jPG^P)%(++ejDnoa^#OTaC+fnoTIFF*UZ(P%tmjKLU#h+vEXz8GA~&^c=a zA?o!=l7tXKIDh`5PcB^e^vp)Um5Ud@Iyg1?^FC`Vik1ddC4|7i0|z;A`~)EjC`uGX zgb=9L>-PTb+aCqYM!;C>NaB=gRR|%JfFT63EF(=ls-P&|XJp=EtVKi+5ewi7KC7#6 zhvGOk-upFCt_BVv6e&QGBp`wyh)44@Dn3mKK@ovUrOMo`TRHG@=kI&YzH@f}jT<*XDHv5$0adinpo$hz zA3l79*Is=cpJnu-2t^Sw)M_;*u1w^>^`Saxno_L{lxdggYyYh4s7TV3IPTHyMxctd z7UvvNgys}o$Kz(2Wf`hD#~KtP0!9#H@^itnL)Y@STH`n_HBD2z_jvD#x)Flr6qvkl zChv%x!hXa-74JPsl5pqF9Xg#3Q5505FF9T<^X)cQCMU_VP})QUYYlUAMe&XwJ9e(w z+`Z}ij*pM?-n-|@??$7+p+kp=dp&|G0(tSa)M)+GQUKR%?tWtQ$k8&@EX#@^$%|2` zRMtf-0-5(DXFRP#yO-E5ZW z3j!!c@}06}ORZZ1_dObG*}G>S05dbwSZB*2IW_h?s<3eHH>AHjj4BurR6sN@oS2pA zbA8aorA0cOWoBn*K!oK^hsC8uMs|##z}2hQv^F?+JGuTCH?My;botV^gR1cwdW?f# zC$3dXU~3HBZkH&Eh@z;x-0j{)LBie2H!aHWc8$G9s08>7F-Rc zS|t6Yju?Y0w$n-kg0n8~&7kbswJRGN8=Ks=ZCmTUVQr&n3A&M#9Pixu0M5CRZ-5;m zBc-!OqcNnamqtfN|5#jZ?L(J0ZBf^6t*t{_86Mt)wH70WOf!7C(thoBdt!cm-o$bI zNF~%pX8-K@!Ajz-A-^Di8BFJI*Oy=c*KW`M`27!;j;=|n=*|A#{cE8;J~cIUy#F7V zo@W2&Uvr??<6-4tuM52?APE0YY*C+ozt_T1_77NIRiRCt1PA~C002ovPDHLkV1oFX B{B{5U literal 0 HcmV?d00001 diff --git a/images/bad-signal.png b/images/bad-signal.png new file mode 100644 index 0000000000000000000000000000000000000000..9896fb03d75724562de40b328b44bfa1579ea836 GIT binary patch literal 1060 zcmV+<1l#+GP)jc7<505fhIBh*A3)ncOl1&(|SV4zNAY$7uq z;QwHZk`9zI^-@}mFARyKQrq5?M*85Md(PQsF9+w`Ly?NaFIm|;S=rxS>st@uK^UOM z!!ZW5{>66(Sath2hQIvki%-YL#}64}FvcJv7-InN-pemP|N8i;lhaQ+XN@34{XR*O z5JCtSE`0LY#fzVx-H*6(>C)H7mll6GVvR-7(xIw^5IBD9IHzAeO~?X@5=9Xq1X`_@ z9UU7x44D0hvDT5qDb=bFLMRDC2xM7CntD`0QM}K{yvJCJh#(>sz!iE{_wWwIacsQz z_eHsvID}B707;U72!bFYC5e0E&DWRF*=a1gHwE{|^sGxOrg-o1-V^mA1kEKddErdn5xIne zh=VHLdy*t!cXyYaogJbm!h2t8ycg@;F4qa$E`s356f)POlMDxOlxi@`oYirwY-rl_BeI`g?eXUE9q|GRb4wlj8 zEZV5oH#Fg6@)!p{E&N^uaPyb1bmlK#nJxA(0L^CeRIAncIEtdd zGa8Nh-EO!0D&Wq(RX;cReD#cGI}B!3EVu?Nbw~zFXal$nFgrUdV`F2Lg@uK~)>`fn zL$le;rl+SD=jP@(I2?7+v?SdR4q#?x=82J!kymQ9+R19Q`dqs`IkCF>XYk$|?>!*| zDwWERs?JYMO)dYm-8q78KeTfkaNzp&>u(Pa55MG`6XzV(+La_pR)BKiM1=MAbrZ+& zGnLSI?8YB`U#}$I8Zrh=Wa{bqX6p`YFj$~9z&>IdTi_^gtk~mWkFN(T0pAP%54I@w eKi_NdQT8{gu3Y`o3un*(0000FJB-b^>FJB~3C)B}E7U5g~*?2m$XsAqZM2Lhu9;y4`gEtg+b0Q~_mkJxhJu zT9PE%Iag%40o?=#1P~xiGb9AGF`$6_YF|2iYT~W8-~1R6w9$AUY#gtRo;>*iO7*}S zFy|aelCa#oO&rGr?}_7>G)>XQ5ZMTq^%AnH?R$Hs&P+YAu<$1cxuSvykZUR;1Q8_9 zdhf#n_(Q)F#Iv|Qhm#bm47DiY^5Q}dyt}rWEXycG<)ZAOeA&3)s z^)f*`Wn&qr?jo({dJD2m$NMesJwY^15;|^$Ab#t~=O(hqRvr6Sk|f2-vJB@O&N&9- z2gpK7*WcUbs35YLaS*{dN1CQ|Ivv{WHr;L)=Ukz2e`ITlbg6<%_fU0XJ@adWDwioG zw}BS+#PQ>2M@Pr*+oLlxGrarG+2Yw6O{H3*7F8(8P!5jRW9yWoRROT0qhpUwJbkPv z)q9^eiNRV+6h+%IrkbMn-@#{#1nC`?=rU0$knUby?r98USw@m1%+JqZqo_AYvWz2# zA1PR`y!tXCf^(j1WPwZ)0)G2EsOY!=18A+$#&G2DH~@2V*D=-%njMMPkE=o_wG zRyg?^k?^nb*$rsxZi{w%mHGKOP>R)do7UYHBYQ^>;Kq%cQms_(q`w_vb@5Vd*H42L zO&y(sl(MYb0pzb+CAi%K8?A}sm~OXAx7#gtjpH>`K5X89@58lbv-vz=Prv@`8_zv< z{A3!E!njtIs71s4da#wk_1=a`YpgLSr3$E03TrG%DI^F74jk~4lap5l2M50!8X0Ix zlp!WTY)Y^x5~Y~3U`l;b0PNehA8T!)H^APJkz%t(qfrx)3lkF)f5a^}E(B1U<4mFG z%PW_{7zSzs)a!>a#-NqPi^pY~_G>nq-!CmK=_E-W(v1iA2SSlRuWCgQFCpvoxNSC< zE`2+F;n)_Z=DrP~cj~v6n=`YsvnMtjZ$}2 literal 0 HcmV?d00001 diff --git a/images/good-signal.png b/images/good-signal.png new file mode 100644 index 0000000000000000000000000000000000000000..3e09cdb79be6b00ac16cd42754d2c2e574a34c59 GIT binary patch literal 1104 zcmV-W1h4yvP)TbQXsuC7p|u7eguu<8f2j=*57&$_T14GS~%y>#t_*EpLGMW8=H-xvuDmey|8c_ghEk41Sm8W5rPO( zME%&I0rJDQ2$Hkd`3)})s|?jB;>zMe7d%)UB+D}5DCuvzzkTUF->Erbo{TG=Q%+%UQ(L=9zpW^Ghdja zPFI0-tcc*8V}5>~X0u72=l@%?)@VxQm}*oamU;n>7_v2zXhZr^xHP5FXgvIBPhG4Gcqy)3KVMF(?JToVWs{ZH?JtX+(jh(yIhUNhF@D3D{HbzWUx9Pri1-g|u&6t759rFmvPU4t~V~ zE5Iti^z^hE9UYCXUcGwA7{fLgDwRq;H8pkZ!i5Xe_YN#elp#I^)kTX2lL#j66$o(r z`0;)9dj0hzNnVcQ`07k)_Ct9 z31A-5#nBVb960^l)WMU=P*zIy%TfYcKhFIA<=pjKU#LfDmI|l?!#yeg(MazB>wg1s WNOU^Y3j(hI00000-J`Ml?1Mf*h zK~y-)ot4jPTvZguKljIbGn1KilIk=xv(e+ev3KKi+%y-s56sUK3Iadf>o&9NzbS&-Z-K zeTwa&fdc^u80reANi7wGt##Dy}^ zPwCT~;nVv8V~izDGU8YfLO?_aArL~qd(VhhC@nZi=!G^tzX5>Kg6L2HlpW|9Z^Er4 zNur%|Im;pF5IFb;iQLIK#9jvt$S>+Lr`K?H3y-Ur+1v?q@qeF3HV zz}|a82sr0Rl7tH@-{HF{SrB?@3Tced7E}r4JOH-Yy1VnlyC)LsGV*d3J}WLZWW74o+8_GS3IRbv_HQJlF$ zFKn>hTp)<2U@Ya*2x+y~XDrAz9Uqk5dxB`3By6}l1o2xZKQNI+w(7V!lO)MA%QBpE zIOiDcJVX{!y8iAqM+K34jDrZyInp#`V`GC>t3|il#W|O2yg9PAB3&)w(w&stRNwsC zpb7=z{EyGR=xLwB{5iQiK1v5V@fG{;x<0JL6H8iL>GwSK)PdXt*kmSa-Dy9x~83YYr_Dy^}`pp?o%l~Pz^QA!~}*t>VHpPQSzFgiMV zer&v4mncI_g4mQ`QzS|;1;NCdqyX5nX98<&t~bE$@$vkyTCG+Qk+ZY2vwwCPZbk?& zs3}09*u-lfg)x*XWvbO_j4^1X@#1mWJ^R(`^`BQ)S9OvkkLcRN6M>Ku=y$CM;w5DL z9k=!R>bdWKID2S|QwP2cp+EJTYxViX#l<5-NBMZ_wJ%QncuW~eN~!!)3A8Vsz4q&{ oi~kx57z1`~mU7dN^bXMY2dU|1n&>k!>i_@%07*qoM6N<$f`u6o8UO$Q literal 0 HcmV?d00001 diff --git a/images/high-signal.png b/images/high-signal.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb76f10c7349020ffe28d5bcbba6e87f2de99d0 GIT binary patch literal 1106 zcmV-Y1g-mtP)@4Xz{M^jU^bi?AD!{U5?T9F_0B|MtuA@$pHmHCk(wQfRFK2qEyxt*iT*<&}!kL5aYYt&piGa?WEXBZ z%QEep8${U$?E?oNBM5o0G~E_9v@yD$77D<;b?)rU2OqxwIU?vt<9#r#R`cMQGjF0) z7ub7G2m$9DS(b5q`7*w3$%D|b7HmSK4X7f@c>v7zPJQJ3$LF6}US0vA$EY9z^f(m} zf(X)!`l%yBOdLOfkt(j!Vn|9D6`|soxVa3}FvI0x@;oPr(?QyU^rip)Fvn8rP?)+; zCp6gFULc4kjSNG@61LLmMl8r49{6$!NIy1o017zSl$sd6>uDmSx$%@;t{m zhjWg7tx@t|Y5V$~jtU|VA`T)r=djk&Xf)W_*`eKTW}=kpm1^rk?`+y)$7}CV|`=UIj>NG z)w?yU%}eced;cI>5ztDCg~EpY^C;VQe=3)L-B-|5=qp(%L&ppux9=sej+wuFPgJYbSJO0oF-ekR)6*{;ymRMvaL#Gx93ceaI4+CG{LIYEQft#q34vafQQeaF zKL@}gi;IizR4SF1j4{d>Lli|T*4hrPM%{5@_C>|Kpp*8-IPJo?uxjpbG5oQ~8fYdLP*Q Y8wY4{8$-3aTL1t607*qoM6N<$f_1C|+5i9m literal 0 HcmV?d00001 diff --git a/images/low-signal-lock.png b/images/low-signal-lock.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8b0fd709eb0a5b174b563764e4503333e42e53 GIT binary patch literal 1111 zcmV-d1gQIoP)uKV1LR3W zK~y-)ot58f990y@KljIM60_;1!A)psQxKC>EfQY@Ltn)9O(bG1LDc`i7a!Eu7PTlM zJ`|$=gAXFwCn1=YJg78Qt!+rDNNt;KS~uO$`D(FVukY7dqqRmUh1MDX?>!fP`@J?cHdZsnXc57sDK5*1 z<8A->;ujw;FP}aAAaHQz%(t_v=P%3{Z4ji~5D`R#Lr)#z#EFw=r9dg#?T{o%7#JAj z{IeIHUtT`D_#iOGSduuUQc-yC5fQxic<;%w4DSW46y9fe5xU)N0IadtzzhM(7J63t zxYan0wR5hlvIo5f_6Q(AlB9_DXk$PD#nrxg{Mg*P@4fRGB50$@GH;`(GdVy1GD_v( z9?UsM9LH=nZWBcjKFf%rh$KnS#t_&5m*xf8R(N;U$rC4^zIN>|5DG;F5ungiMDQX= zQT5EsL1t&4fg-5@NPfV1_>h*e6M3&~}=KhSDZbtC=fGEb9LeW=OA%!sv zSBI(9rZC2!l_rx6m)^5qqtW z_c^ujZ9Ws=)@Ea6b#?V<&rwDbmXouBW%`|fe^-nwIOk}$+q7COdc7Xr`$FTLtJP|;vb;>cACrbOYgeUdZf((Nw{x%v&N&tr z7iqWKq-pxUJ=^dL%!hMq=~bNSWnHBsc1xX`{aaE<;o_KPv-$ATV925OZ;&Q;2$D62 z=rU0$;A(4Y0JhifGc`5E#KZwI-Bt14*~a8a_C6)qw?rZ_f%~J2D!L0`E9EjT9ewEJH(;PNUIy6R@Y>d-eS{o__753o(OUwW`E$G|Ixnrh{8pU=3IYn4O(f zV`F2{)vH&ZFvhSAhHAB%&dkhQyLj;;Bl~tWBuWq;gUZmN!ITA)k24E!;>3ylBO@cP zm&@gsOQq7Gsi_wZtgI{t@4fck6G9-0qG1u4o1UIt>~8u=A&_Som8E>}TYz^jEG)cR zuh(C()+%c)#+cjAx!XX|aY`vxS66i$#|QQJ*#1B$ZWREf6+u!7iKN>#mCa=HkX0NV ze(v#ij?ElAr3^z#siG|<(D`ZZw=Wm2|M7)-gv(L^Bf#iD%70v>e*v3+1F52T)|qG8 QNdN!<07*qoM6N<$f+BGaN&o-= literal 0 HcmV?d00001 diff --git a/images/no-signal.png b/images/no-signal.png new file mode 100644 index 0000000000000000000000000000000000000000..a410637eb81ff385f99b7bc7eccb2273ad1d911f GIT binary patch literal 1101 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 literal 0 HcmV?d00001 diff --git a/images/signal-50.png b/images/signal-50.png new file mode 100644 index 0000000000000000000000000000000000000000..10dde524af08d26ea04fdf0d39ae94299a23b5c1 GIT binary patch literal 890 zcmV-=1BLvFP)|Cq%`)9AD~ zK0ZD^Iy&0xtu#YbJMWgu<$ASR{SLekU;=z|c6$2l=ZnQj1q>hv;6q@u*;HXVhlud} z`L91eeE8@o@KXvTzz2)P;^gA;qH=5!5qw$l`pp|eU^1PuH{Ijjy{{htzW_-Z^WX1e zZ@a-Z%aDjD78i*D>;ullmC4RA@+07brznaFTWBJ4xW>orwiOH`e!-w9%8EdVjEGdx zw4!yLxa&|6)ReN`9ceys+E}{VA27q>ID|k@ZSsd*3erMo08Y<-BhPbcgb)HnQM3q! zbd-`NDWg%^2S}2H{n@PA-XN$lo6R~$<6MGs4)1**;HxjcV7uLd2&zh!Wtdt;Y_#!s z!gw?$NnIZRge)(R82)CxX-=gkNrQqJvvf89&^n!JXF3EnEJ{ldS0k_}GPR0*0ZbZN zns+h;P`#^;K-JZqU?5AKDd65&WK+T%Fz--qmJS84KTuk+aVzuO3x|en@muq!U_rLavtGB(} zBqYPc5V2v$ZYLY!K%2U)^KWxmSGvfq%G&_`pY!eN@UzJsGrd+c>IyFTm%q=qE2t!! z0tzgD`0nYm$=rPsf=+KN9w%9L5thIb(E1zzX>5KL*1`gn$&n Q*#H0l07*qoM6N<$g7yBBdjJ3c literal 0 HcmV?d00001 diff --git a/images/signal-75.png b/images/signal-75.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9cd3940439cab13cc0b9316cbd410a50937684 GIT binary patch literal 850 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 literal 0 HcmV?d00001 diff --git a/images/wicd-purple.png b/images/wicd-purple.png new file mode 100644 index 0000000000000000000000000000000000000000..bc781567d44d0f1c1a17ceda4c6477f04f1a3315 GIT binary patch literal 4135 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 literal 0 HcmV?d00001 diff --git a/images/wicd-red.png b/images/wicd-red.png new file mode 100644 index 0000000000000000000000000000000000000000..42eb9aa753750e5010375d88a6bfb4c3b5428c8d GIT binary patch literal 4106 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 IM6N<$f>Mu@cmMzZ literal 0 HcmV?d00001 diff --git a/images/wicd.png b/images/wicd.png new file mode 100644 index 0000000..bd65c73 --- /dev/null +++ b/images/wicd.png @@ -0,0 +1 @@ +link /opt/wicd/images/wicd-purple.png \ No newline at end of file diff --git a/images/wired.png b/images/wired.png new file mode 100644 index 0000000000000000000000000000000000000000..b7f593c87a61eb91b4e6d713bd81748ce8d19242 GIT binary patch literal 1245 zcmV<31S0#1P))8amfoukZi>1Zqh{ zK~y-)rIk-?R7D)eKl9$(x4X2v+bwo?+eo+29-1IntfXiZ3_=fxNDm%tOpKbqK@VQw zfM6o=fM_IYyh%Keh8Qs0=^xsy)`c3jyZiR-+j%n{x-GS=MB^`+ z%zMAgeDj;{_cz}W)DD~f7rs>^X?*z6i8s5uyB{+Q1H&*7hJg?QAp`(gYkXg#)WR&K zMEO3_m-xQV(YN0@R0~-Ak^TLl!$*$n4BFMg1)xQB)@Th{E40=qt}H*fBG_xQ0l z1Rx9p5F($?b?@81k5DL71+8xO71Ea|rSN?pDJ7SGxy;bem8G2T`v6!7o%rV4uV0#; znucWpEf;F}SgcBGjg*q`svvW7b9dXJ%D1&@Rai_Uy4s z<2X2uL#0yT@tzHwIQ$G&!v+S<4srVQX~xILky7$V_a=7qKTO1JqvX28qEX&I{s9(R zqqM?t9Omce$>nmmu8YLYa^#6rbh*<);MY^hZi!!%8H^zJ6~z5WqA|+S}V{ zZA}Mn+!*aXb?Vf$lb@bE!~*M%Wtt|hy!tYGp4)>k1R*RU;Kr9xcSS+How(IKZQox@}r)^u?*0E>r?iYi$O*9rInMx3kHxQ49y=#}@l}aPYEY+jcmS zNQits|HJ(J{0nE#emQFb5-0+N{rmTodU|>Sot>Rg&+}djhr=QojS`JSXlQ8AWw(5O zVshg1cs#x-8jVJ-U%!5BczF0|C={M+Zf4: + #blah blah replace stuff + x = x.replace("$_SCAN","0") + for t in network: + if Noneify(network[t]) != None: #don't bother if z's value is None cause it will cause errors + x = x.replace("$_" + str(t).upper(),str(network[t])) + z = z + "\n" + x + y+=1 + #write the data to the files + #then chmod them so they can't be read by evil little munchkins + fileness = open("encryption/configurations/" + network["bssid"].replace(":","").lower(),"w") + os.chmod("encryption/configurations/" + network["bssid"].replace(":","").lower(),0600) + os.chown("encryption/configurations/" + network["bssid"].replace(":","").lower(), 0, 0) + #we could do this above, but we'd like to permod (permission mod) them before we write, so that it can't be read + fileness.write(z) + fileness.close() + +def LoadEncryptionMethods(): + encryptionTypes = {} + types = open("encryption/templates/active","r") + enctypes = types.readlines() + for x in enctypes: + #skip some lines, we don't care who the author is/was, etc + #we don't care about version either + x = x.strip("\n") + current = open("encryption/templates/" + x,"r") + line = current.readlines() + typeID = len(encryptionTypes) #this is so we know where in the array to add data + encryptionTypes[typeID] = {} + encryptionTypes[typeID][0] = line[0][7:].strip("\n") + encryptionTypes[typeID][1] = x + encryptionTypes[typeID][2] = {} + requiredFields = line[3][8:] + requiredFields = requiredFields.strip("\n") + requiredFields = requiredFields.split(" ") + index = -1 + for current in requiredFields: + #the pretty names will start with an * so we can + #seperate them with that + if current[0] == "*": + #make underscores spaces + #and remove the * + encryptionTypes[typeID][2][index][0] = current.replace("_"," ").lstrip("*") + else: + #add to the list of things that are required + index = len(encryptionTypes[typeID][2]) + encryptionTypes[typeID][2][index] = {} + encryptionTypes[typeID][2][index][1] = current + return encryptionTypes diff --git a/networking.py b/networking.py new file mode 100644 index 0000000..156f68d --- /dev/null +++ b/networking.py @@ -0,0 +1,548 @@ +## THE NETWORKING CLASS +## WRITTEN DECEMBER 18TH, 2006 +## RELEASED UNDER THE GNU General Public License + +## WRITTEN IN PYTHON, CAN NOT BE USED ALONE +## MUST BE IMPORTED VIA import networking +## TO ANOTHER PROJECT IF YOU WISH TO USE IT + +import os,sys +if __name__ == '__main__': + os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) + +#import the library of random functions that we need here +#this is also written by me, for this purpose +import misc +#import some other random libraries that we're gonna need +import re,sys,threading,thread + +#much thanks to wieman01 for help and support with various types of encyption +#also thanks to foxy123, yopnono, and the many others who reported bugs helped +#and helped keep this project moving + +class Wireless: + + wireless_interface = None + wired_interface = None + wpa_driver = None + ConnectingThread = None + + #Create a function to scan for wireless networks + def Scan(self,essid=None): + + #we ask for an essid, because then we can see hidden networks + + ##### + ## DECLARE THE REGEX PATTERNS + ##### + + #init the regex patterns that will be used to search the output of iwlist scan for info + #these are well tested, should work on most cards + essid_pattern = re.compile('.*ESSID:"(.*?)"\n',re.DOTALL | re.I | re.M | re.S) + ap_mac_pattern = re.compile('.*Address: (.*?)\n',re.DOTALL | re.I | re.M | re.S) + channel_pattern = re.compile('.*Channel:? ?(\d\d?)',re.DOTALL | re.I | re.M | re.S) + strength_pattern = re.compile('.*Quality:?=? ?(\d\d*)',re.DOTALL | re.I | re.M | re.S) + mode_pattern = re.compile('.*Mode:(.*?)\n',re.DOTALL | re.I | re.M | re.S) + + wep_pattern = re.compile('.*Encryption key:(.*?)\n',re.DOTALL | re.I | re.M | re.S) + wpa1_pattern = re.compile('(WPA Version 1)',re.DOTALL | re.I | re.M | re.S) + wpa2_pattern = re.compile('(WPA2)',re.DOTALL | re.I | re.M | re.S) + + ##### + ## PREPARE THE INTERFACE + ##### + + #prepare the interface for scanning + #note that this must be run as root, otherwise we're gonna have trouble + misc.Run('ifconfig ' + self.wireless_interface + ' up') + + essid = misc.Noneify(essid) + if not essid == None: + #if there is a hidden essid, we need to tell the computer what it is + #then when it is scanned it will be recognized + print "setting hidden essid..." + essid + misc.Run('iwconfig ' + self.wireless_interface + ' essid "' + essid + '"') + + ##### + ## RUN THE SCAN + ##### + + #run iwlist scan and get the avaliable networks + #save them to scan_data - all in one big string + scandata = misc.Run('iwlist ' + self.wireless_interface + ' scan') + + ##### + ## PROCESS THE DATA + ##### + + #split the networks apart, using Cell as our split point + #this way we can look at only one network at a time + networks = scandata.split( ' Cell ' ) + + #declare + i=0 + #make an array for the aps + aps = {} + for cell in networks: + #search to see if there is an essid in this section + #if there isn't, that means that it is useless + #so we don't use it then + + #set essid to the value, this is just a temp variable + if cell.count("ESSID:") > 0: + #since an essid was found, + #we will extract the rest of the info + #make a dictionary for the data + CurrentNetwork = {} + + #use the RunRegex function to neaten up our code + #all it does for us is run the regex on the string + #and return the result + #but it makes this code look pretty + + CurrentNetwork["essid"] = misc.RunRegex(essid_pattern,cell) + + if CurrentNetwork["essid"] == "": + CurrentNetwork["hidden"] = True + #change the name so it doesn't screw stuff up + #because it looks like HTML - GTK no like + CurrentNetwork["essid"] = "Hidden" + else: + CurrentNetwork["hidden"] = False + + CurrentNetwork["channel"] = misc.RunRegex(channel_pattern,cell) + CurrentNetwork["bssid"] = misc.RunRegex(ap_mac_pattern,cell) + print " ##### " + CurrentNetwork["bssid"] + CurrentNetwork["mode"] = misc.RunRegex(mode_pattern,cell) + + #since encryption needs a True or False + #we have to do a simple if then to set it + if misc.RunRegex(wep_pattern,cell) == "on": + CurrentNetwork["encryption"] = True + #set this, because if it is something else this will be overwritten + CurrentNetwork["encryption_method"] = "WEP" + + if misc.RunRegex(wpa1_pattern,cell) == "WPA Version 1": + CurrentNetwork["encryption_method"] = "WPA" + + if misc.RunRegex(wpa2_pattern,cell) == "WPA2": + CurrentNetwork["encryption_method"] = "WPA2" + else: + CurrentNetwork["encryption"] = False + #end If + + #since stength needs a -1 if the quality isn't found + #we need a simple if then to set it + if misc.RunRegex(strength_pattern,cell): + CurrentNetwork["quality"] = misc.RunRegex(strength_pattern,cell) + else: + CurrentNetwork["quality"] = -1 + #end If + + #add this network to the list of networks + aps[ i ] = CurrentNetwork + #now increment the counter + i+=1 + #end For + + #run a bubble sort + #to list networks by signal strength + going = True + + while going: + sorted = False + for i in aps: + #set x to the current number + x = int(i) + #set y to the next number + y = int(i+1) + + #only run this if we actually have another element after the current one + if (len(aps) > i+1): + + #move around depending on qualities + #we want the lower qualities at the bottom of the list + #so we check to see if the quality below the current one + #is higher the current one + #if it is, we swap them + + if (int(aps[int(y)]["quality"]) > int(aps[int(x)]["quality"])): + #set sorted to true so we don't exit + sorted=True + #do the move + temp=aps[y] + aps[y]=aps[x] + aps[x]=temp + #end If + #end If + #end For + + if (sorted == False): + going = False + #end If + #end While + + #return the list of sorted access points + return aps + + #end Function Scan + + 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.start() + return True + + class ConnectThread(threading.Thread): + IsConnecting = None + ConnectingMessage = None + ShouldDie = False + lock = thread.allocate_lock() + + def __init__(self,network,wireless,wired,wpa_driver): + threading.Thread.__init__(self) + self.network = network + self.wireless_interface = wireless + self.wired_interface = wired + self.wpa_driver = wpa_driver + self.IsConnecting = False + self.lock.acquire() + self.ConnectingMessage = 'interface_down' + self.lock.release() + #lock = thread.allocate_lock() + + def GetStatus(self): + print "status request" + print "acqlock",self.lock.acquire() + print " ...lock acquired..." + message = self.ConnectingMessage + #return "bob" #self.ConnectingMessage + self.lock.release() + print " ...lock released..." + return message + + def run(self): + #note that we don't put the wired interface down + #but we do flush all wired entries from the routing table + #so it shouldn't be used at all. + + self.IsConnecting = True + network = self.network + + #put it down + print "interface down..." + self.lock.acquire() + self.ConnectingMessage = 'interface_down' + self.lock.release() + #misc.Run("ifconfig " + self.wireless_interface + " down") + + #set a false ip so that when we set the real one, the correct + #routing entry is created + print "Setting false ip..." + self.lock.acquire() + self.ConnectingMessage = 'resetting_ip_address' + self.lock.release() + + misc.Run("ifconfig " + self.wired_interface + " 0.0.0.0") + misc.Run("ifconfig " + self.wireless_interface + " 0.0.0.0") + + #bring it up + print "interface up..." + self.lock.acquire() + self.ConnectingMessage = 'interface_up' + self.lock.release() + + print misc.Run("ifconfig " + self.wireless_interface + " up") + + print "killing wpa_supplicant, dhclient, dhclient3" + self.lock.acquire() + self.ConnectingMessage = 'removing_old_connection' + self.lock.release() + + misc.Run("killall dhclient dhclient3 wpa_supplicant") + + #check to see if we need to generate a PSK + + if not network.get('key')== None: + self.lock.acquire() + self.ConnectingMessage = 'generating_psk' + self.lock.release() + + print "generating psk..." + key_pattern = re.compile('network={.*?\spsk=(.*?)\n}.*',re.DOTALL | re.I | re.M | re.S) + network["psk"] = misc.RunRegex(key_pattern,misc.Run('wpa_passphrase "' + network["essid"] + '" "' + network["key"] + '"')) + #generate the wpa_supplicant file... + if not network.get('enctype') == None: + self.lock.acquire() + self.ConnectingMessage = 'generating_wpa_config' + self.lock.release() + + print "generating wpa_supplicant configuration file..." + misc.ParseEncryption(network) + print "wpa_supplicant -B -i " + self.wireless_interface + " -c \"encryption/configurations/" + network["bssid"].replace(":","").lower() + "\" -D " + self.wpa_driver + misc.Run("wpa_supplicant -B -i " + self.wireless_interface + " -c \"encryption/configurations/" + network["bssid"].replace(":","").lower() + "\" -D " + self.wpa_driver) + + print "flushing the routing table..." + self.lock.acquire() + + self.ConnectingMessage = 'flushing_routing_table' + self.lock.release() + + misc.Run("ip route flush dev " + self.wireless_interface) + misc.Run("ip route flush dev " + self.wired_interface) + + print "configuring the wireless interface..." + self.lock.acquire() + + self.ConnectingMessage = 'configuring_interface' + self.lock.release() + + if network["mode"].lower() == "master": + misc.Run("iwconfig " + self.wireless_interface + " mode managed") + else: + misc.Run("iwconfig " + self.wireless_interface + " mode " + network["mode"]) + + misc.Run("iwconfig " + self.wireless_interface + " essid \"" + network["essid"] + "\" channel " + str(network["channel"])) + " ap " + network["bssid"] + + if not network.get('broadcast') == None: + self.lock.acquire() + + self.ConnectingMessage = 'setting_broadcast_address' + self.lock.release() + + print "setting the broadcast address..." + network["broadcast"] + misc.Run("ifconfig " + self.wireless_interface + " broadcast " + network["broadcast"]) + + + if not network.get('dns1') == None: + self.lock.acquire() + + self.ConnectingMessage = 'setting_static_dns' + self.lock.release() + # dns1) + print "setting the first and second dns servers..." + resolv = open("/etc/resolv.conf","w") + misc.WriteLine(resolv,"nameserver " + network["dns1"]) + misc.WriteLine(resolv,"nameserver " + network["dns2"]) + if not network["dns3"] == None: + print "setting the third dns server..." + misc.WriteLine(resolv,"nameserver " + network["dns3"]) + + if not network.get('ip') == None: + self.lock.acquire() + + self.ConnectingMessage = 'setting_static_ip' + self.lock.release() + + print "setting static ips..." + misc.Run("ifconfig " + self.wireless_interface + " " + network["ip"] ) + misc.Run("ifconfig " + self.wireless_interface + " netmask " + network["netmask"] ) + print "adding default gateway..." + network["gateway"] + misc.Run("route add default gw " + network["gateway"]) + else: + #run dhcp... + self.lock.acquire() + + self.ConnectingMessage = 'running_dhcp' + self.lock.release() + + print "running dhcp..." + if not self.ShouldDie: + misc.Run("dhclient " + self.wireless_interface) + + self.lock.acquire() + self.ConnectingMessage = 'done' + self.lock.release() + + print "done" + self.IsConnecting = False + + + + #end function Connect + #end class Connect + + def GetSignalStrength(self): + output = misc.Run("iwconfig " + self.wireless_interface) + strength_pattern = re.compile('.*Quality:?=? ?(\d+)',re.DOTALL | re.I | re.M | re.S) + return misc.RunRegex(strength_pattern,output) + #end function GetSignalStrength#end function GetSignalStrength + + def GetCurrentNetwork(self): + output = misc.Run("iwconfig " + self.wireless_interface) + essid_pattern = re.compile('.*ESSID:"(.*?)"',re.DOTALL | re.I | re.M | re.S) + return misc.RunRegex(essid_pattern,output) + #end function GetCurrentNetwork + + def GetIP(self): + output = misc.Run("ifconfig " + self.wireless_interface) + ip_pattern = re.compile(r'inet [Aa]d?dr[^.]*:([^.]*\.[^.]*\.[^.]*\.[0-9]*)',re.S) + return misc.RunRegex(ip_pattern,output) + + def CreateAdHocNetwork(self,essid,channel,ip,enctype,key,encused): + misc.Run("killall dhclient dhclient3 wpa_supplicant") #remove wpa_supplicant, as it can cause the connection to revert to + #previous networks... + misc.Run('ifconfig ' + self.wireless_interface + ' down') + misc.Run('iwconfig ' + self.wireless_interface + ' mode ad-hoc') + misc.Run('iwconfig ' + self.wireless_interface + ' channel ' + channel) + misc.Run('iwconfig ' + self.wireless_interface + ' essid ' + essid) + #Right now it just assumes you're using WEP + if encused == True: + misc.Run('iwconfig ' + self.wireless_interface + ' key ' + key) + misc.Run('ifconfig ' + self.wireless_interface + ' up') + misc.Run('ifconfig ' + self.wireless_interface + ' inet ' + ip) + #end function CreateAdHocNetwork + + def DetectWirelessInterface(self): + return misc.RunRegex(re.compile('(\w*)\s*\w*\s*[a-zA-Z0-9.-_]*\s*(?=ESSID)',re.DOTALL | re.I | re.M | re.S),misc.Run("iwconfig")) + + def Disconnect(self): + misc.Run('ifconfig ' + self.wired_interface + ' 0.0.0.0') + misc.Run('ifconfig ' + self.wired_interface + ' down') + misc.Run('ifconfig ' + self.wireless_interface + ' 0.0.0.0') + misc.Run('ifconfig ' + self.wireless_interface + ' down') + + +#end class Wireless + +class Wired: + + wireless_interface = None + wired_interface = None + ConnectingThread = None + + def GetIP(self): + output = misc.Run("ifconfig " + self.wired_interface) + ip_pattern = re.compile(r'inet [Aa]d?dr[^.]*:([^.]*\.[^.]*\.[^.]*\.[0-9]*)',re.S) + return misc.RunRegex(ip_pattern,output) + + def CheckPluggedIn(self): + mii_tool_data = misc.Run( 'mii-tool ' + self.wired_interface,True) + if not misc.RunRegex(re.compile('(Invalid argument)',re.DOTALL | re.I | re.M | re.S),mii_tool_data) == None: + print 'wired interface appears down, putting up for mii-tool check' + misc.Run( 'ifconfig ' + self.wired_interface + ' up' ) + mii_tool_data = misc.Run( 'mii-tool ' + self.wired_interface) + if not misc.RunRegex(re.compile('(link ok)',re.DOTALL | re.I | re.M | re.S),mii_tool_data) == None: + return True + else: + return False + #end function CheckPluggedIn + + 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.start() + return True + #end function Connect + + class ConnectThread(threading.Thread): + #wired interface connect thread + lock = thread.allocate_lock() + ConnectingMessage = None + ShouldDie = False + + def __init__(self,network,wireless,wired): + threading.Thread.__init__(self) + self.network = network + self.wireless_interface = wireless + self.wired_interface = wired + self.IsConnecting = False + self.lock.acquire() + self.ConnectingMessage = 'interface_down' + self.lock.release() + #end function __init__ + + def GetStatus(self): + self.lock.acquire() + print " ...lock acquired..." + message = self.ConnectingMessage + self.lock.release() + print " ...lock released..." + return message + + def run(self): + #we don't touch the wifi interface + #but we do remove all wifi entries from the + #routing table + + self.IsConnecting = True + network = self.network + + #put it down + self.lock.acquire() + self.ConnectingMessage = 'interface_down' + self.lock.release() + print "interface down...", self.wired_interface + misc.Run("ifconfig " + self.wired_interface + " down") + + #set a false ip so that when we set the real one, the correct + #routing entry is created + self.lock.acquire() + self.ConnectingMessage = 'resetting_ip_address' + self.lock.release() + print "setting false ip... 0.0.0.0 on", self.wired_interface + misc.Run("ifconfig " + self.wired_interface + " 0.0.0.0") + misc.Run("ifconfig " + self.wireless_interface + " 0.0.0.0") + + #bring it up + self.lock.acquire() + self.ConnectingMessage = 'interface_up' + self.lock.release() + print "interface up...", self.wired_interface + misc.Run("ifconfig " + self.wired_interface + " up") + + print "killing wpa_supplicant, dhclient, dhclient3" + self.lock.acquire() + self.ConnectingMessage = 'removing_old_connection' + self.lock.release() + misc.Run("killall dhclient dhclient3 wpa_supplicant") + + print "flushing the routing table..." + self.lock.acquire() + self.ConnectingMessage = 'flushing_routing_table' + self.lock.release() + misc.Run("ip route flush dev " + self.wireless_interface) + misc.Run("ip route flush dev " + self.wired_interface) + + if not network.get("broadcast") == None: + self.lock.acquire() + self.ConnectingMessage = 'setting_broadcast_address' + self.lock.release() + print "setting the broadcast address..." + network["broadcast"] + misc.Run("ifconfig " + self.wired_interface + " broadcast " + network["broadcast"]) + + if not network.get("dns1") == None: + self.lock.acquire() + self.ConnectingMessage = 'setting_static_dns' + self.lock.release() + print "setting the first and second dns servers...", network["dns2"], network["dns2"] + resolv = open("/etc/resolv.conf","w") + misc.WriteLine(resolv,"nameserver " + network["dns1"]) + misc.WriteLine(resolv,"nameserver " + network["dns2"]) + if not network.get("dns3") == None: + print "setting the third dns server..." + misc.WriteLine(resolv,"nameserver " + network["dns3"]) + + if not network.get("ip") == None: + self.lock.acquire() + self.ConnectingMessage = 'setting_static_ip' + self.lock.release() + print "setting static ips...", network["ip"] + misc.Run("ifconfig " + self.wired_interface + " " + network["ip"]) + misc.Run("ifconfig " + self.wired_interface + " netmask " + network["netmask"]) + print "adding default gateway..." + network["gateway"] + misc.Run("route add default gw " + network["gateway"]) + else: + #run dhcp... + self.lock.acquire() + self.ConnectingMessage = 'running_dhcp' + self.lock.release() + print "running dhcp..." + if not self.ShouldDie: + misc.Run("dhclient " + self.wired_interface) + + self.lock.acquire() + self.ConnectingMessage = 'done' + self.lock.release() + self.IsConnecting = False + #end function run diff --git a/translations/en_US.po b/translations/en_US.po new file mode 100644 index 0000000..b10e8e5 --- /dev/null +++ b/translations/en_US.po @@ -0,0 +1,252 @@ +# English translations for PACKAGE package. +# Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# root , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-04-13 20:40+0900\n" +"PO-Revision-Date: 2007-04-13 20:41+0900\n" +"Last-Translator: Adam Blackburn \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: gui.py:36 +msgid "Connect" +msgstr "Connect" + +#: gui.py:37 +msgid "IP" +msgstr "IP" + +#: gui.py:38 +msgid "Netmask" +msgstr "Netmask" + +#: gui.py:39 +msgid "Gateway" +msgstr "Gateway" + +#: gui.py:40 +msgid "DNS" +msgstr "DNS" + +#: gui.py:41 +msgid "Use Static IPs" +msgstr "Use Static IPs" + +#: gui.py:42 +msgid "Use Static DNS" +msgstr "Use Static DNS" + +#: gui.py:43 +msgid "Use Encryption" +msgstr "Use Encryption" + +#: gui.py:44 +msgid "Advanced Settings" +msgstr "Advanced Settings" + +#: gui.py:45 +msgid "Wired Network" +msgstr "Wired Network" + +#: gui.py:46 +msgid "" +"To connect to a wired network, you must create a network profile. To create " +"a network profile, type a name that describes this network, and press Add" +msgstr "" +"To connect to a wired network, you must create a network profile. To create " +"a network profile, type a name that describes this network, and press Add" + +#: gui.py:47 +msgid "Automatically connect to this network" +msgstr "Automatically connect to this network" + +#: gui.py:48 +msgid "Secured" +msgstr "Secured" + +#: gui.py:49 +msgid "Unsecured" +msgstr "Unsecured" + +#: gui.py:50 +msgid "Channel" +msgstr "Channel" + +#: gui.py:51 +msgid "Preferences" +msgstr "Preferences" + +#: gui.py:52 +msgid "WPA Supplicant Driver" +msgstr "WPA Supplicant Driver" + +#: gui.py:53 +msgid "Wireless Interface" +msgstr "Wireless Interface" + +#: gui.py:54 +msgid "Wired Interface" +msgstr "Wired Interface" + +#: gui.py:55 +msgid "Hidden Network" +msgstr "Hidden Network" + +#: gui.py:56 +msgid "Hidden Network ESSID" +msgstr "Hidden Network ESSID" + +#: gui.py:57 +msgid "Connected to $A at $B% (IP: $C)" +msgstr "Connected to $A at $B% (IP: $C)" + +#: gui.py:58 +msgid "Connected to wired network (IP: $A)" +msgstr "Connected to wired network (IP: $A)" + +#: gui.py:59 +msgid "Not connected" +msgstr "Not connected" + +#: gui.py:60 +msgid "No wireless networks found." +msgstr "No wireless networks found." + +#: gui.py:61 +msgid "Key" +msgstr "Key" + +#: gui.py:62 +msgid "Username" +msgstr "Username" + +#: gui.py:63 +msgid "Password" +msgstr "Password" + +#: gui.py:64 +msgid "Anonymous Identity" +msgstr "Anonymous Identity" + +#: gui.py:65 +msgid "Identity" +msgstr "Identity" + +#: gui.py:66 +msgid "Authentication" +msgstr "Authentication" + +#: gui.py:67 +msgid "Path to PAC File" +msgstr "Path to PAC File" + +#: gui.py:68 +msgid "Choose from the networks below:" +msgstr "Choose from the networks below:" + +#: gui.py:69 +msgid "Connecting..." +msgstr "Connecting..." + +#: gui.py:71 +msgid "0" +msgstr "0" + +#: gui.py:72 +msgid "1" +msgstr "1" + +#: gui.py:73 +msgid "2" +msgstr "2" + +#: gui.py:74 +msgid "3" +msgstr "3" + +#: gui.py:75 +msgid "4" +msgstr "4" + +#: gui.py:76 +msgid "5" +msgstr "5" + +#: gui.py:77 +msgid "6" +msgstr "6" + +#: gui.py:78 +msgid "7" +msgstr "7" + +#: gui.py:79 +msgid "8" +msgstr "8" + +#: gui.py:80 +msgid "9" +msgstr "9" + +#: gui.py:82 +msgid "Putting interface down..." +msgstr "Putting interface down..." + +#: gui.py:83 +msgid "Resetting IP address..." +msgstr "Resetting IP address..." + +#: gui.py:84 +msgid "Putting interface up..." +msgstr "Putting interface up..." + +#: gui.py:85 +msgid "Removing old connection..." +msgstr "Removing old connection..." + +#: gui.py:86 +msgid "Generating PSK..." +msgstr "Generating PSK..." + +#: gui.py:87 +msgid "Generating WPA configuration file..." +msgstr "Generating WPA configuration file..." + +#: gui.py:88 +msgid "Flushing the routing table..." +msgstr "Flushing the routing table..." + +#: gui.py:89 +msgid "Configuring wireless interface..." +msgstr "Configuring wireless interface..." + +#: gui.py:90 +msgid "Setting broadcast address..." +msgstr "Setting broadcast address..." + +#: gui.py:91 +msgid "Setting static DNS servers..." +msgstr "Setting static DNS servers..." + +#: gui.py:92 +msgid "Setting static IP addresses..." +msgstr "Setting static IP addresses..." + +#: gui.py:93 +msgid "Obtaining IP address..." +msgstr "Obtaining IP address..." + +#: gui.py:95 +msgid "Done connecting..." +msgstr "Done connecting..." + +msgid "To connect to a wired network, you must create a network profile. To create a network profile, type a name that describes this network, and press Add." +msgstr "To connect to a wired network, you must create a network profile. To create a network profile, type a name that describes this network, and press Add." diff --git a/translations/en_US/LC_MESSAGES/wicd.mo b/translations/en_US/LC_MESSAGES/wicd.mo new file mode 100644 index 0000000000000000000000000000000000000000..45525714cba2bb3bd40498f6fc7424b7d5af2b06 GIT binary patch literal 4053 zcmeH|&2tn*7{*&gg@u5CfPhG&L5O6Q%?A)Rgv#av+=3)acKJ9u+3DR3%ua9h%p|T= z6kfb|kn-TiLD2)=t&-wKS&AMk{R6C`%7bP3aj`t;#gor7+nWT`JBM`bJHP4ap10qA zpSO2@*s|swfi?_#7WU^OLd<~QJ%$U~+Q)^!BeBkMy=9l>CdZi{M`H8n_Sq$UgtVKK}-M0ndK}yTGm|gkZ?KLHgYb?g9Hj z`YVB4_Y&9*UIw}Db?|BM2KXrW8Mqd_4btD|Am6_W?gqaFx!y0}4)8CK^SdzVDR4Wu z9y|c<1P4IQn*w)%%JyFe@e}Xk!n}VBGTuAjbKpJjUGQ)4J@9QTvJULQg>es9j#-`q z8OJN&HqZw*f!9FBdmUt6J_N5q&`&|?nnkc=&a&Tf(DJC|kY(QTgyl)gQIPo^1G!EG zWSn(yKezy5E8+u?y50n->sR*q&-VH6Aa&iip&fTWNF7E&`keror;8x{B_P+m3R2hW zAlJPGQrEj6b^RV>e(r(v_Y=tXe+8-QA0YFz0T=4E3*`KMkh%_o2u+*?sp}<>^9)E` z-?aTtK>ED{QrE9R#`_~kT^Ss8-3wCJ+aRP6(-4bsU$U%QE`W^V4UoFN1>z@e;sTfA z7RbDO2~tPqn&ZqN$NOPyJuv3!7&~Z3VT}7Q>FNSj%|ck7TIg zMQyH#@p%^m0jPDPWX*W;LJV&yolhDgzEbeSWd17WRcKwjC6-(0f zJcFz<#F86DkjKMKJkLCq3ghw=LK7vUYRV`SLnKN`S`5oFNKY?@>HGg0Nt%22O7NLg7x`G7npQJC@a&eC1Q08_#Ztts36TQ9 znlC5KW`KW&FqRX>hfd;RdJv1918w`A^5tz9pwl;i+x%ee zQ0{mxhl$RtTJY)ozvuO}=bc44Iu+xFQQ*efxjWIgbsd3i#Gqp|g+vNfYr&G;(xqO3OclbNaF)a3Gx z`?9$V{`g}2?>ZIKSzgBK)%b8Tz_A{d)p^(8RE-qMn+eFZ#^@ literal 0 HcmV?d00001 diff --git a/translations/es_ES.po b/translations/es_ES.po new file mode 100644 index 0000000..0e7abbd --- /dev/null +++ b/translations/es_ES.po @@ -0,0 +1,191 @@ +# Spanish translations for PACKAGE package. +# Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Adam Blackburn , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-04-13 20:40+0900\n" +"PO-Revision-Date: 2007-04-26 20:58+0900\n" +"Last-Translator: Adam Blackburn \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgid "English" +msgstr "Español" + +msgid "Connect" +msgstr "Conectar" + +msgid "IP" +msgstr "IP" + +msgid "Netmask" +msgstr "Máscara de subred" + +msgid "Gateway" +msgstr "Puerta de enlace" + +msgid "DNS" +msgstr "DNS" + +msgid "Use Static IPs" +msgstr "Utilizar IP estática" + +msgid "Use Static DNS" +msgstr "Utilizar DNS estática" + +msgid "Use Encryption" +msgstr "Utilizar cifrado" + +msgid "Advanced Settings" +msgstr "Opciones Avanzadas" + +msgid "Wired Network" +msgstr "Red cableada" + +msgid "Automatically connect to this network" +msgstr "Conectarse automáticamente a esta red" + +msgid "Secured" +msgstr "Segura" + +msgid "Unsecured" +msgstr "No segura" + +msgid "Channel" +msgstr "Canal" + +msgid "Preferences" +msgstr "Preferencias" + +msgid "WPA Supplicant Driver" +msgstr "Driver WPA supplicant" + +msgid "Wireless Interface" +msgstr "Interfaz inalámbrica" + +msgid "Wired Interface" +msgstr "Interfaz cableada" + +msgid "Hidden Network" +msgstr "Red oculta" + +msgid "Hidden Network ESSID" +msgstr "ESSID de red oculta" + +msgid "Connected to $A at $B% (IP: $C)" +msgstr "Conectado a $A a $B% (IP: $C)" + +msgid "Connected to wired network (IP: $A)" +msgstr "Conectado a red cableada (IP: $A)" + +msgid "Not connected" +msgstr "No conectado" + +msgid "No wireless networks found." +msgstr "No se encontraron redes inalámbricas." + +msgid "Key" +msgstr "Clave" + +msgid "Username" +msgstr "Nombre de usuario" + +msgid "Password" +msgstr "Contraseña" + +msgid "Anonymous Identity" +msgstr "Identidad anónima" + +msgid "Identity" +msgstr "Identidad" + +msgid "Authentication" +msgstr "Autentificación" + +msgid "Path to PAC File" +msgstr "Ruta al archivo PAC" + +msgid "Choose from the networks below:" +msgstr "Seleccione una de las siguientes redes:" + +msgid "Connecting..." +msgstr "Conectando..." + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "2" +msgstr "2" + +msgid "3" +msgstr "3" + +msgid "4" +msgstr "4" + +msgid "5" +msgstr "5" + +msgid "6" +msgstr "6" + +msgid "7" +msgstr "7" + +msgid "8" +msgstr "8" + +msgid "9" +msgstr "9" + +msgid "Putting interface down..." +msgstr "Desconectando interfaz..." + +msgid "Resetting IP address..." +msgstr "Reseteando dirección IP..." + +msgid "Putting interface up..." +msgstr "Levantando interfaz..." + +msgid "Removing old connection..." +msgstr "Eliminando conexión antigua..." + +msgid "Generating PSK..." +msgstr "Generando PSK..." + +msgid "Generating WPA configuration file..." +msgstr "Generando archivo de configuración WPA..." + +msgid "Flushing the routing table..." +msgstr "Liberando tabla de rutas..." + +msgid "Configuring wireless interface..." +msgstr "Configurando red inalámbrica..." + +msgid "Setting broadcast address..." +msgstr "Especificando dirección broadcast..." + +msgid "Setting static DNS servers..." +msgstr "Especificando direcciones DNS estáticas..." + +msgid "Setting static IP addresses..." +msgstr "Especificando direcciones IP estáticas..." + +msgid "Obtaining IP address..." +msgstr "Obteniendo dirección IP..." + +msgid "Done connecting..." +msgstr "Conexión realizada..." + +msgid "To connect to a wired network, you must create a network profile. To create a network profile, type a name that describes this network, and press Add" +msgstr "Para conectarse a una red cableada, debe crear un perfil de red. Para hacerlo, escriba un nombre que describa la red y pulse añadir" + diff --git a/translations/es_ES/LC_MESSAGES/wicd.mo b/translations/es_ES/LC_MESSAGES/wicd.mo new file mode 100644 index 0000000000000000000000000000000000000000..e811e2c536375565d19c198da50b48e246e7182f GIT binary patch literal 3853 zcmZ{mTWnlM8OMiSpmiHcTS6(J?UW=XA>Pf}xzt@ZRX4U1R&nCRYqvZg!R$HX-P4?N zW|=w1?&gIDct8S#5K60ZQHd&Xd86e8sZyoZimIx8XoZB}g_np2c&UUc@l?V8KRdf? z$1w8j@0^)$zxn37t^ao4ZC3@xJmwcMKl+3aE8u&#;sfK3+l9cAxHIsszMO@F3Rz0qz6$ zeNqUTd;p~0M?mVC1s?+I;r;6%&;J&92(%#2e-ZpF_-pVM@OAJG@C}f9-v+7gUGM<- zCy?iU2tELQ3{rkSggyg44BiDE2Ok9ILCURzUjVc4{(TUC;#c^f|9=b8-s|AQ;0^Ev z@D?b)6MPAzy{`nm7WgKJKk+_3_Je-~?*TsqY3F}H`eh%KJcocvka7LN)Q~?4{Bht< z0)HBKHSop2mjZtt_)C!bUk-c?q#v$>kAZ&%5i0R9_+{``I7foVK$s?$LEd{EWV{_n zyRU-u|103i-=GmEt-`Js*Jh6Mx4CSxcPGOdbCQEG;r&LV8Xo8qj#b1HR4T`M>>{mT@*>)b)u1*e2|&a$!4tcA}I!< zQ5HQuMyg0m&R3J+F;ZzdkdeuA9Tl=LvgjpF=DOH2_Oe*$DQu*mF;2@3YcdGv(Y})% zotmw>STOlU(k(3xms^R|sdi2#d7uC zckfeGJUT4MG{!PGjG7lOwZ)>z_2?2|c`5IviR+1TY3X{ji*{R6(m}FNoz$CkUKM&v z4a9k!YYTT^uhqUlwL4axZ8fOe-_UzcZY0C6e>I8WUwJ9GYxk>MYPXw5t;@6yDUat>jN@lf>W&sJkW zo`Y$kW%Y)(8cE?qtMo}R35Sf$R_?#QXQ%9QeN|^>lgF7f9+`oh8E&~@j@@KRTSp~g zB|-+ujx{Qdlq+`HJKA&w6Hg*=(rLS?t-sApyOXPGzrAKgrtqf9`)-^Y({f-+nUy#% zvKldkK=7&TTjRqeB~|>N-Dz12`ucjmKC`siZmwLKTGf4Hi^@gUP2$Sgvg;~qrY@&i zD{GYnx&>dVEW&qnIa{keUa6g|%$&eu{bcP}?TK0qf|XUhnNaynaM4sJ*pM>_ zF%>oHM6#$BRIXB#R;nX^j4X47^pvS`(xL4p{DPyXc9UL=JT+WH;j47}TGp}9%^Dt^ zI(mSZ@~wDJC#G?Jmue#ROk8bOAEpG(p<4D~s(zkV!@(*|=m~BuxxU(d)udt>^@I>W zCp)mege?m->}I95xG?UebL5H+9hkzqS~3@uje5zZp>Q;6%-*FE^)&2Lu{2Sc7E1Uo zOi5lMtc`mz;v*JPwW-C$?Q1Sl)*Il;4usjE5gBw*WSLdg@K$i~E{8fcYZ@{16??VL z5fB&|qf8MndZXD2j)xwnw_jCa71x$39p41SI_cU8@@En4XQ-9B!f)vns#(@ZGVk_X z%S&mJA=H%S7l&bhAQHp}VO66ZwBO%jSzF`B8?JJF9r^sc$^LOW57FE!g%h3c=*Ze( z8vCIBPmNv{{e8D+i_Q;M_7&mNd}roOBZ?hF9Jyt&Df{^MB1uDNtI{jzA#-eMrlFkO zTTw1INPaE9U24dNWh5U}4`jbgS$>EKyfO^A_r-dVFoCUvLoBL5j2HO3H8y>+yz@fP n, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: Wicd 1.2.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-04-13 20:40+0900\n" +"PO-Revision-Date: 2007-04-22 00:09+0300\n" +"Last-Translator: Jari Rahkonen \n" +"Language-Team: Finnish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +msgid "Connect" +msgstr "Yhdistä" + +msgid "IP" +msgstr "IP" + +msgid "Netmask" +msgstr "Verkon peite" + +msgid "Gateway" +msgstr "Yhdyskäytävä" + +msgid "DNS" +msgstr "DNS" + +msgid "Use Static IPs" +msgstr "Kiinteä IP" + +msgid "Use Static DNS" +msgstr "Kiinteä DNS" + +msgid "Use Encryption" +msgstr "Käytä salausta" + +msgid "Advanced Settings" +msgstr "Lisäasetukset" + +msgid "Wired Network" +msgstr "Lähiverkko" + +msgid "Automatically connect to this network" +msgstr "Yhdistä tähän verkkoon automaattisesti" + +msgid "Secured" +msgstr "Salattu" + +msgid "Unsecured" +msgstr "Salaamaton" + +msgid "Channel" +msgstr "Kanava" + +msgid "Preferences" +msgstr "Asetukset" + +msgid "WPA Supplicant Driver" +msgstr "WPA Supplicant -ajuri" + +msgid "Wireless Interface" +msgstr "Langaton verkkolaite" + +msgid "Wired Interface" +msgstr "Lähiverkkolaite" + +msgid "Hidden Network" +msgstr "Piilotettu verkko" + +msgid "Hidden Network ESSID" +msgstr "Piilotetun verkon ESSID" + +msgid "Connected to $A at $B% (IP: $C)" +msgstr "Yhdistetty verkkoon $A vahvuudella $B% (IP: $C)" + +msgid "Connected to wired network (IP: $A)" +msgstr "Yhdistetty lähiverkkoon (IP: $A)" + +msgid "Not connected" +msgstr "Ei yhdistetty" + +msgid "No wireless networks found." +msgstr "Langattomia verkkoja ei löydy." + +msgid "Key" +msgstr "Avain" + +msgid "Username" +msgstr "Käyttäjä" + +msgid "Password" +msgstr "Salasana" + +msgid "Anonymous Identity" +msgstr "Anonyymi identiteetti" + +msgid "Identity" +msgstr "Identiteetti" + +msgid "Authentication" +msgstr "Autentikointi" + +msgid "Path to PAC File" +msgstr "PAC-tiedoston polku" + +msgid "Choose from the networks below:" +msgstr "Valitse verkko:" + +msgid "Connecting..." +msgstr "Yhdistetään..." + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "2" +msgstr "2" + +msgid "3" +msgstr "3" + +msgid "4" +msgstr "4" + +msgid "5" +msgstr "5" + +msgid "6" +msgstr "6" + +msgid "7" +msgstr "7" + +msgid "8" +msgstr "8" + +msgid "9" +msgstr "9" + +msgid "Putting interface down..." +msgstr "Suljetaan verkkolaite..." + +msgid "Resetting IP address..." +msgstr "Palautetaan IP-osoite..." + +msgid "Putting interface up..." +msgstr "Käynnistetään verkkolaite..." + +msgid "Removing old connection..." +msgstr "Poistetaan vanha yhteys..." + +msgid "Generating PSK..." +msgstr "Luodaan PSK..." + +msgid "Generating WPA configuration file..." +msgstr "Luodaan WPA-asetustiedosto..." + +msgid "Flushing the routing table..." +msgstr "Tyhjennetään reititystaulu..." + +msgid "Configuring wireless interface..." +msgstr "Asetetaan langaton verkkolaite..." + +msgid "Setting broadcast address..." +msgstr "Asetetaan lähetysosoite..." + +msgid "Setting static DNS servers..." +msgstr "Asetetaan kiinteä DNS-palvelin..." + +msgid "Setting static IP addresses..." +msgstr "Asetetaan kiinteä IP-osoite..." + +msgid "Obtaining IP address..." +msgstr "Haetaan IP-osoite..." + +msgid "Done connecting..." +msgstr "Yhdistetty..." + +msgid "To connect to a wired network, you must create a network profile. To create a network profile, type a name that describes this network, and press Add." +msgstr "Yhdistääksesi langalliseen lähiverkkoon sinun täytyy luoda verkkoprofiili. Tee se kirjoittamalla verkkoa kuvaava nimi ja napsauttamalla Lisää-painiketta." diff --git a/translations/fi_FI/LC_MESSAGES/wicd.mo b/translations/fi_FI/LC_MESSAGES/wicd.mo new file mode 100644 index 0000000000000000000000000000000000000000..31460504ef2e0842658b1fd6222ae77850dc1b83 GIT binary patch literal 3702 zcmZ{mO>7)V6~}A8iNg|DV3+SLvI*>x^knRWY%&noiR~nV<7DvI8vz%}(`8S4db&pa zF`-XL2qX>&5YlQ795`TcKmr5^q!paj;)J*%0T*t32rVBcvjy`E~1ZFWnp`E^yj zu6p%-`2k0sjES z{vLcYd>G^7@Co=%_!JboEAU-#!?(wfKlNpPME9>l@%MZ1eejp?MfewZ41R${#NV%Y ze$(^2kU#YjKW~RG!xQkgQ2hKe6rKMG&lAXFOeXQXGB@SNJ=>m(p39!sJv*K&o~xd> zq4@PlDC>U~%DNNy4E!QQ8ufiBe*FYWJbwXkN&N|)ga7dT8u3KOt5EdsL7DFklzgyI z=J^tobzgv@+b)#&z6?e0UqgxKEAWl*?~oKx|MBhn>6H0SK$-s>lsvcs#jiE^R`?kx z`aAdzSVDR48&Kl;Bj5ikNT}2wq2$Tm;7K^gfG$ z-=%1(te27|=CQ>c1?F&eA5w|a? z%c>ntOwzZZ?%6z#lI={j6PJ`DS7f>q+9Z$iQnibGAdh{MM=p`38}ZmTaa`)YOA_19 zb?$UNh%%kn{H{xfYH?r~h@o?t)my0>VPNa=OmEuQ-EFBwmuyAbMats(Zj{>CW|@wX z+@@QmZySwQJZQ&)&EIyakf<<51J+qH@-iK6>g8Uqv!ps*wJ-jPEfvNilMU4^HTGyxxWl)$PsP zM2Yy;>1q>(DXNN#U6W;mC*&a?h>qR%qP~V}s+-y^n_7|~Q{AFUhFKVN=W6y1 zvCz0Uw`RvK&4bl!I|_rV#da2~yOy5o-d+zDMH1|TC3I`)g=X{Fpm`yfKhI<9Li0@X za;Wt>)!3&GXpZB;>(*YLYBAxl3F66DE!Hni&i^nTh`B4$VgD zo6n8M^Nol&HMXLU@oKVNm~9)ZTQh2r$4L@pgSpkt>hf$$^Nr>lS4hqc7OWGomd@?x z@^j;u1M(5wADEQoObe?Uoo! z_IB0H!iBOMf0NctGCio2MG70bEO+v9H;Q7%_VdE;XuqeJ%77Y2FH#?c2|-t6JGrID zIAxXO5OTXwWc+M9M%zfodp|A1vZ0nET~^T&Mbr&5RlU;W_6v>#jS7D%7IPK8hm>zOH6l2%p-SgV0QRdMcteoj4Fx; LJA6hRK9TBwJzuH; literal 0 HcmV?d00001 diff --git a/translations/it_IT.po b/translations/it_IT.po new file mode 100644 index 0000000..0d918f5 --- /dev/null +++ b/translations/it_IT.po @@ -0,0 +1,191 @@ +# Italian translations for PACKAGE package. +# Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Adam Blackburn , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-04-13 20:40+0900\n" +"PO-Revision-Date: 2007-04-26 20:59+0900\n" +"Last-Translator: Adam Blackburn \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgid "English" +msgstr "Italiano" + +msgid "Connect" +msgstr "Connetti" + +msgid "IP" +msgstr "IP" + +msgid "Netmask" +msgstr "Netmask" + +msgid "Gateway" +msgstr "Gateway" + +msgid "DNS" +msgstr "DNS" + +msgid "Use Static IPs" +msgstr "Usa IP statici" + +msgid "Use Static DNS" +msgstr "Usa DNS statici" + +msgid "Use Encryption" +msgstr "Usa cifratura" + +msgid "Advanced Settings" +msgstr "Opzioni Avanzate" + +msgid "Wired Network" +msgstr "Rete cablata" + +msgid "Automatically connect to this network" +msgstr "Connetti automaticamente a questa rete" + +msgid "Secured" +msgstr "Sicura" + +msgid "Unsecured" +msgstr "Insicura" + +msgid "Channel" +msgstr "Canale" + +msgid "Preferences" +msgstr "Opzioni" + +msgid "WPA Supplicant Driver" +msgstr "Driver WPA Supplicant" + +msgid "Wireless Interface" +msgstr "Interfaccia Wireless" + +msgid "Wired Interface" +msgstr "Interfaccia Cablata" + +msgid "Hidden Network" +msgstr "Rete Nascosta" + +msgid "Hidden Network ESSID" +msgstr "ESSID Rete Nascosta" + +msgid "Connected to $A at $B% (IP: $C)" +msgstr "Connesso a $A a $B% (IP: $C)" + +msgid "Connected to wired network (IP: $A)" +msgstr "Connesso a rete cablata" + +msgid "Not connected" +msgstr "Non connesso" + +msgid "No wireless networks found." +msgstr "Nessuna rete wireless trovata" + +msgid "Key" +msgstr "Chiave" + +msgid "Username" +msgstr "Username" + +msgid "Password" +msgstr "Password" + +msgid "Anonymous Identity" +msgstr "Identità Anonima" + +msgid "Identity" +msgstr "Identità" + +msgid "Authentication" +msgstr "Autenticazione" + +msgid "Path to PAC File" +msgstr "Indirizzo del file PAC" + +msgid "Choose from the networks below:" +msgstr "Scegliere dalle seguenti reti:" + +msgid "Connecting..." +msgstr "Connessione in corso..." + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "2" +msgstr "2" + +msgid "3" +msgstr "3" + +msgid "4" +msgstr "4" + +msgid "5" +msgstr "5" + +msgid "6" +msgstr "6" + +msgid "7" +msgstr "7" + +msgid "8" +msgstr "8" + +msgid "9" +msgstr "9" + +msgid "Putting interface down..." +msgstr "Disabilitazione interfaccia in corso..." + +msgid "Resetting IP address..." +msgstr "Reimpostazione indirizzo IP in corso..." + +msgid "Putting interface up..." +msgstr "Abilitazione interfaccia in corso..." + +msgid "Removing old connection..." +msgstr "Eliminazione vecchia connessione in corso..." + +msgid "Generating PSK..." +msgstr "Creazione PSK in corso..." + +msgid "Generating WPA configuration file..." +msgstr "Creazione file di configurazione WPA in corso..." + +msgid "Flushing the routing table..." +msgstr "Pulizia tabelle di routing in corso..." + +msgid "Configuring wireless interface..." +msgstr "Configurazione interfaccia wireless in corso..." + +msgid "Setting broadcast address..." +msgstr "Impostazione indirizzo di broadcast in corso..." + +msgid "Setting static DNS servers..." +msgstr "Impostazione server DNS statici in corso..." + +msgid "Setting static IP addresses..." +msgstr "Impostazione indirizzi IP statici in corso..." + +msgid "Obtaining IP address..." +msgstr "Attesa indirizzo IP..." + +msgid "Done connecting..." +msgstr "Connessione completata..." + +msgid "To connect to a wired network, you must create a network profile. To create a network profile, type a name that describes this network, and press Add." +msgstr "Per connettersi ad una rete cablata è necessario creare un profilo di rete. Per creare un profilo di rete, inserire un nome descrittivo della rete e premere aggiungi" + diff --git a/translations/it_IT/LC_MESSAGES/wicd.mo b/translations/it_IT/LC_MESSAGES/wicd.mo new file mode 100644 index 0000000000000000000000000000000000000000..e10a618b6485a89461191dca6b95a12cd257bd04 GIT binary patch literal 3931 zcma);ON<;x8OJLR5@&x&UHC!U_bDOpO5Eppzvq6>1D+3g zKH_=M^HI;oJP&~nLEd5TVQ>n306YgC2VVs51$V&5!Eb>_!MFVTU;6jI1)sqCzk>V0 z{r3n#l@EcG`#4BBGvHyc>BnCKx&O=HF)#(W|Lfpqz^mY$;LpK*;4eVR{S8QYH^4*S zA3^T>ckog0KOom1#G(hmBjEku6!;i82Xfsy_<1n)bJ`D2Q%its6*FpNV57Lefq&}~L{Qlb@ z?fzX5f8xjZ`7HPj$o<~);}1Zt{~P!u_%D!gbOf7Cg7YBX_d&{k1LQg10-plk2W#Lb z;8pM>j70gr2k}aL2-0tV0r4mPjUUe6gO~K{0g&f84q|I@24vhWf%GSBg2zH9%9}xF z`!YKH@+=2vr_mY5wAC}{Y_$8+==9GibT;~gjXB7CtXkbaP?xGT@xVGlz1U8o&!W?g zY_u=WbR2yeoq51Uzn(#-f9UJG(UI1L{b*~RpFTqf6*&bIZ3@4%3FBI#pFpP%K8H>l zk2d;*?ThHN7i0Aabo!)d4X8AO?zlYB z?lk4G`IF=G6ctvR`8BP<8f-?%3(H-xU=v*(!oOZjdXaHkVkyeq7WJausm*C1nW>Ga zQ0u(P^p4sU=XIh}m;-a2?gfe+d2^}LqVVE`h4tj7DL?Y=@@u_I7g9=1Ew`Tvi=Nhhk+TQzoHq?T%Don8LbLv7?-Wn?gKf zTeN4VH7}Q-n&_l@Q>Pk1;Y24df@0_n8QPts`2LoeywCTmI=0)~&PHLS24be1a%GI& zq)Jx@IeaC21j>!nsxVM48`Za(bQuFr!g12+bX%vzX>OVw9#t39YqnB_Csl>*2C*?I zcWo}?9Qy^ShEK7;+f?>bTewR~iufP1lQP@w7hkDZBUBKUp>{!PHnbZ{iAkxF5HcCy ztq`tSPnJ}RMN{; zPuJG8ikq^XsmLfS&icPJYLIT>uJ6ft{teQl{WJ6uQYkRmlW%!Y{drkvd{*+eJGQx(;gY#O_!O!~#pot>GJ z<>T2Ci9C8%PM@5cz@2n!DPHOC!8%5^P?7gw$}07*Uy-cICRVJxWgX^9T^2lKs8oZB z9Alob_|04+Rb;9mXI>==iQNq}${JEzhA7+``P0iOjf>2%4y!`;Amsy7=8G@ONTk$R zrgKr1v3dF6921L0`8GAVoTM%?K=o9asy^Z|u+>m1D{>*(F;rNX<9?)(3W|Gr$66Go z$m~Hg6l2Y^ggAw-&!f_+63q}TkA(_7w%>4uiB36#YF&Q792*t6%2O;W7g*R=6lGeD zzZ(|q>sN658MUp4g&Vn_C#7G8B|J;*HjT1uX$f3*Fqmj%nRW_$hbA?9dlprbCKwd% z_Fy8^QE{sv0$9qFpc4Gsy1<-)~Nz% zcz`iWb`9#j67AbBh9`y>!KlJx>&rW!ybg+bX~wn~TU%Mu@cw~%xJSlUcXV1F3YJG1 z#PuTwzVdM^uV2IEfUD7|)Rb2O@+nXJO<{{bM1<63Aq-)6+v!PY3Dr@G`E6oxZ, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-04-18 20:40+0900\n" +"PO-Revision-Date: 2007-04-19 07:57+0900\n" +"Last-Translator: Ravan \n" +"Language-Team: Dutch\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +msgid "Connect" +msgstr "Verbinden" + +msgid "IP" +msgstr "IP" + +msgid "Netmask" +msgstr "Netmasker" + +msgid "Gateway" +msgstr "Gateway" + +msgid "DNS" +msgstr "DNS" + +msgid "Use Static IPs" +msgstr "Gebruik Statisch IP" + +msgid "Use Static DNS" +msgstr "Gebruik Statische DNS" + +msgid "Use Encryption" +msgstr "Gebruik Encryptie" + +msgid "Advanced Settings" +msgstr "Geavanceerde Instellingen" + +msgid "Wired Network" +msgstr "Locaal Netwerk" + +msgid "Automatically connect to this network" +msgstr "Automatisch verbinden met dit netwerk" + +msgid "Secured" +msgstr "Beveiligd" + +msgid "Unsecured" +msgstr "Onbeveiligd" + +msgid "Channel" +msgstr "Kanaal" + +msgid "Preferences" +msgstr "Voorkeuren" + +msgid "WPA Supplicant Driver" +msgstr "WPA Supplicant Stuurprogramma" + +msgid "Wireless Interface" +msgstr "Draadloze Aansluiting" + +msgid "Wired Interface" +msgstr "Draad Aansluiting" + +msgid "Hidden Network" +msgstr "Verborgen Netwerk" + +msgid "Hidden Network ESSID" +msgstr "Verborgen Netwerk ESSID" + +msgid "Connected to $A at $B% (IP: $C)" +msgstr "Verbonden met $A op $B% (IP: $C)" + +msgid "Connected to wired network (IP: $A)" +msgstr "Verbonden met LAN (IP: $A)" + +msgid "Not connected" +msgstr "Niet verbonden" + +msgid "No wireless networks found." +msgstr "Geen draadloze netwerken gevonden." + +msgid "Key" +msgstr "Sleutel" + +msgid "Username" +msgstr "Gebruikersnaam" + +msgid "Password" +msgstr "Wachtwoord" + +msgid "Anonymous Identity" +msgstr "Anonieme Identiteit" + +msgid "Identity" +msgstr "Identiteit" + +msgid "Authentication" +msgstr "Verificatie" + +msgid "Path to PAC File" +msgstr "Pad naar PAC bestand" + +msgid "Choose from the networks below:" +msgstr "Kies uit de volgende netwerken:" + +msgid "Connecting..." +msgstr "Verbinden..." + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "2" +msgstr "2" + +msgid "3" +msgstr "3" + +msgid "4" +msgstr "4" + +msgid "5" +msgstr "5" + +msgid "6" +msgstr "6" + +msgid "7" +msgstr "7" + +msgid "8" +msgstr "8" + +msgid "9" +msgstr "9" + +msgid "Putting interface down..." +msgstr "Aansluiting verbreken..." + +msgid "Resetting IP address..." +msgstr "Herstellen IP adress..." + +msgid "Putting interface up..." +msgstr "Aansluiting verbinden..." + +msgid "Removing old connection..." +msgstr "Verwijderen oude verbinding..." + +msgid "Generating PSK..." +msgstr "Genereren PSK..." + +msgid "Generating WPA configuration file..." +msgstr "Genereren WPA configuratiebestand..." + +msgid "Flushing the routing table..." +msgstr "Opschonen routing tabellen..." + +msgid "Configuring wireless interface..." +msgstr "Configureren draadloze aansluiting..." + +msgid "Setting broadcast address..." +msgstr "Instellen broadcast adres..." + +msgid "Setting static DNS servers..." +msgstr "Instellen statische DNS server..." + +msgid "Setting static IP addresses..." +msgstr "Instellen statisch IP adress..." + +msgid "Obtaining IP address..." +msgstr "Verkrijgen IP adres..." + +msgid "Done connecting..." +msgstr "Aansluiten gereed..." + +msgid "To connect to a wired network, you must create a network profile. To create a network profile, type a name that describes this network, and press Add." +msgstr "Om met een bedraad netwerk te verbinding moet een netwerkprofiel worden aangemaakt. Type hiervoor een naam om het netwerk te beschrijven en klik Toevoegen." diff --git a/translations/nl_NL/LC_MESSAGES/wicd.mo b/translations/nl_NL/LC_MESSAGES/wicd.mo new file mode 100644 index 0000000000000000000000000000000000000000..c699a155526702378c526598c9b47639b434c739 GIT binary patch literal 3732 zcmZ{mO>A689l)owO^HJ(l#lXJ$j~OxP_Mg5liJ=A+KufvD?9PZ>m*VoB*y#3yDxtG zX7xU7+(Qu@5C;TE2=&loC6EwMRh%k%;##R!;KBug3W8gNKoH>fpPje6wqfMi-+MFv zH~-K1C%=32fgdVHgZVh~FZU_60pGr#AI9GwP>Ln>kHCKh-V6Ls;C&B{IwL&%@{Ha`;g??bWoXYjM|9r!BzGdu~ui4w8*JAtnS z{si);-s0zD@K^8=_!}s8z6T}Fe}m^p1U!KIz+X44~o5aq2%oZMo9b~hhk5i zAMy7EC~{v3>kf+iD^T(%F_wJGUEnBno+;xTQ@(pnUKp2{65nT-7nw4|?h8!O^DI+_ z)VK`I6#uGG3lCyrH5Pf0zJaTLJjL%kQ{pH?;((bxKXoW|QjG;3BtMd4T8QHM`Z|#u zQK~+ck_U-ZHRgB_-+kYJUtm7Xl)TI`r^n~Ri{wD^D77N_{vy+lI-$CN+ZPGVbC|uL z7F9FaGildGx?_tXPJ6j(rY=1gxH8wR$fiYH9H?el^yRT@irA&{>IOV^O_Chwu1izf zEp*{@(T{VT+G5{jyK1R#*hrvrxz#(F8z5k-{akO`#O*iKl1q2uUYVg>@5h-{K6B-)eyY`O=rc>_4)4oRQKc-%G{-V1larTkbkwp- zZRJE*zM7PIU+fWkGgnGrbYZp=Z_cVI?7lfrt2VV6VPLP_S(D?YR&KYOa;W#rM@{d< zqtCC!5pmTwLYNM}>XlBXwX9lgH4groJx~Y_OunmbxJigYoO8Y7$~2l|uc+Lxk=ocU zOq_~st+qB%lo3@iv2F64^h7)qeTiecxumaRnrdfu$7Ysd$W^=a#V|>Oj@*9gzdyE9 z4rP7Q4&0uob4gU0L9L9o@=B{@=|^7MA*Ow=`bF>PV|Y+RYAz{$|N*XY8q(dTq6HdCgLE zDJiZ_IUFWj!L-oJSxi9GZC~-N>gI&^s?KEBU#*EiJ9BrqSG87DyG1}rS3}BSt+~3Q zZ>?;0S{pZJHto=5MeTati=*0=vX|GkTtm;aH@0d^5*I$IEfc(kzEH2v*XkE*=NEWv zT&zD`U#!;=tZmx8SPnlbx2Ws$jZ5<*xpneh+saIuC#G;&LvI=ylm1dB=$oERU+fJ` zoXmCI;L9`XChe6h*0!t}H1u*=bo(>cTh~`6j+~#X&(Jsu`c`d=JT-J-zg9dmOt==$ z>u%pb*;@Jt6OPa*d*Z-OMj$; z#+I50ci6^-BEa#EZ=iPEKl5&1leq0Tm4+~|)K6Ua8npD!HIo{XsI{1CDp^O%o=Z5N z2dPtJY&vP5a&>i-851S$WvWsl$!Az3cM$a>HU7zs71BlB@NgFu(TTu%^Twokj!%&z zrFS-i7F72zz(%sMF~l*NYC7FI364!=_fYrrMo%|Szi^~?TJBT94U(_DaT!7I{Zqnp zY~@%BmGE~GTauuvk#bvB?V)&$BZ?z?-hDc1OiK2uaEPYeEWRVkeWT$%i%GXlx6i+L zqn=84F(&g(HCU}~v9)XIbQH!UDgNBdl0rG-=!UO|;O~BXC-Px&rIf%Zks+rCvh)Qp)e7cZm+@g$)<0wq|HusSkZr6V(hzDv@!5?E3w?RzWS=#RQ`kWEIm*a_Ww@*g) zIDo(1B;KW8lRit1sKa!79EMf9ot11?z1EWd(TZ=kmFLG+@wQqc)Z}(>wE1?5vdr+N dmzlx9sAai, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-04-13 20:40+0900\n" +"PO-Revision-Date: 2007-05-27 16:52+0900\n" +"Last-Translator: \n" +"Language-Team: Polish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" +msgid "Connect" +msgstr "Połącz" + +msgid "IP" +msgstr "IP" + +msgid "Netmask" +msgstr "Maska podsieci" + +msgid "Gateway" +msgstr "Brama" + +msgid "DNS" +msgstr "DNS" + +msgid "Use Static IPs" +msgstr "Użyj Statycznych IP" + +msgid "Use Static DNS" +msgstr "Użyj Statycznych DNS" + +msgid "Use Encryption" +msgstr "Użyj Szyfrowania" + +msgid "Advanced Settings" +msgstr "Ustawienia Zaawansowane" + +msgid "Wired Network" +msgstr "Sieć Przewodowa" + +msgid "Automatically connect to this network" +msgstr "Automatycznie połącz z tą siecią" + +msgid "Secured" +msgstr "Zabezpieczona" + +msgid "Unsecured" +msgstr "Niezabezpieczona" + +msgid "Channel" +msgstr "Kanał" + +msgid "Preferences" +msgstr "Preferencje" + +msgid "WPA Supplicant Driver" +msgstr "Sterownik WPA Supplicant" + +msgid "Wireless Interface" +msgstr "Interfejs Bezprzewodowy" + +msgid "Wired Interface" +msgstr "Interfejs Przewodowy" + +msgid "Hidden Network" +msgstr "Ukryta Sieć" + +msgid "Hidden Network ESSID" +msgstr "ESSID Ukrytej Sieci" + +msgid "Connected to $A at $B% (IP: $C)" +msgstr "Połączony z $A sygnał $B% (IP: $C)" + +msgid "Connected to wired network (IP: $A)" +msgstr "Połączony z siecią przewodową (IP: $A)" + +msgid "Not connected" +msgstr "Brak połączenia" + +msgid "No wireless networks found." +msgstr "Nie znaleziono sieci bezprzewodowych." + +msgid "Key" +msgstr "Klucz" + +msgid "Username" +msgstr "Nazwa Użytkownika" + +msgid "Password" +msgstr "Hasło" + +msgid "Anonymous Identity" +msgstr "Anonimowa Tożsamość" + +msgid "Identity" +msgstr "Tożsamość" + +msgid "Authentication" +msgstr "Autentykacja" + +msgid "Path to PAC File" +msgstr "Ścieżka do pliku PAC" + +msgid "Choose from the networks below:" +msgstr "Wybierz sieci:" + +msgid "Connecting..." +msgstr "Łączenie..." + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "2" +msgstr "2" + +msgid "3" +msgstr "3" + +msgid "4" +msgstr "4" + +msgid "5" +msgstr "5" + +msgid "6" +msgstr "6" + +msgid "7" +msgstr "7" + +msgid "8" +msgstr "8" + +msgid "9" +msgstr "9" + +msgid "Putting interface down..." +msgstr "Wyłączanie interfejsu..." + +msgid "Resetting IP address..." +msgstr "Resetowanie adresu IP..." + +msgid "Putting interface up..." +msgstr "Włączanie interfejsu..." + +msgid "Removing old connection..." +msgstr "Usuwanie starego połączenia..." + +msgid "Generating PSK..." +msgstr "Generowanie PSK..." + +msgid "Generating WPA configuration file..." +msgstr "Generowanie pliku konfiguracyjnego WPA..." + +msgid "Flushing the routing table..." +msgstr "Czyszczenie tablicy tras..." + +msgid "Configuring wireless interface..." +msgstr "Konfigurowanie interfejsu bezprzewodowego..." + +msgid "Setting broadcast address..." +msgstr "Ustawianie adresu rozgłaszania..." + +msgid "Setting static DNS servers..." +msgstr "Ustawianie statycznych DNS..." + +msgid "Setting static IP addresses..." +msgstr "Ustawianie statycznych adresów IP..." + +msgid "Obtaining IP address..." +msgstr "Ustalanie adresu IP..." + +msgid "Done connecting..." +msgstr "Połączono..." + +msgid "To connect to a wired network, you must create a network profile. To create a network profile, type a name that describes this network, and press Add." +msgstr "Aby połączyć się z siecią przewodową musisz stworzyć profil sieciowy. Aby stworzyć profil sieciowy wpisz nazwę opisującą sieć i naciśnij Dodaj." + diff --git a/translations/pl_PL/LC_MESSAGES/wicd.mo b/translations/pl_PL/LC_MESSAGES/wicd.mo new file mode 100644 index 0000000000000000000000000000000000000000..e2a2a113c680707c6e43026e7c336f4432e9f6df GIT binary patch literal 3913 zcmZ{mO^h5z6~`-yli)RpLkNWLR1({<@%Ch9y|&k5ukm5BMI;_W<}X_!#&gI0fzpYvBE03w#XJ;N#$zT>bZ5{j1=UsQ*3q z0C*E5llRJIW-vmkjw?G>AN09V?8-%ObgII+2^$2(fdVu~ zM_E^=hSvibB`V2SEloD)(HDu*5xwdz9(@sp8TWM*Nk8F<=E;UKJd#OY#~n7eACF(&d3<+bg*1j4S z3Ey{iKR;M+RQbNSL*wlqrha;i}Jtso5ZV$lh3|Bn(f) zT4>EVFA~`o89Of{8AArNHJXbw-Hw{ejT%jAcV<=N>#7)jK?Ts2FFBdUU-?3_S)XV1 z2HO^YQDzLCyTWwXk{(IqbT)ilr%_NsTQb~+4A`Z$M5u^tt2ej^f*7iji49>4+!Np- z*&rPowK;wcrm;pW*JUgb42CsQ8w?{i@Idz?JN_LlX^-lcWmjLN<#ZSf%|NUaO{R#g zTTE$6KZTE&i#)y-YZ3UuBs=XLHkyP2j>BQx$oQ&^?QU*q9c@+G<`q3Og?1{ecH1#A z$uphuZi@B%Si-01;56mESX*~-PE*{Wb&@Ap&yEsZiBLf}2GaPkT9an%C`@t@1(=fp zyB5GztC4YgU&YB-i2OL~*^@=D&F!7C9k2C=cjz#?e$e&nK{$y3Kf>{etO~=5w%j$lHQ6GU6`vw zWj6S!#Eqn760~@|@C;fKQ!+Y@eYvjVmMp=&rzbAfFD{JsTPc+%kY5s{H*W>*tnx&D zCV9FS;`E&4{)UJVytAt-=e(IwKUxfD#e?T`fS|APnKhM6G{Q6%p?6NlT~p;z&%T=3 zBPV(BID0UfovrXs@G?j9{!01u>=Zw6z&@Uuouhj|(|X>+;i;u&!~xM4(B53X;$KnWcC%{szwi(xj;{5(>U z_w-zbeQoF`k?xKYwqTi4j4h{Rx%UC!2&jPs(p$`)OMqs1_`NZPV(Qsnl$7w59C zkvC*Z+sxr+W)1g%&kR;U9yeKwW*<-HU>4%d`$nvF!ghG5gA=T@W5`4EkVIN5~0iy#JZ4pOvlXMC^4AZ*>(~+ z99ba|q19hdmQRso$*2p$3^p|zeBD=aa03ek8evG=z!4uM`!=#kR=E5YAJQb3@7S_x z(!%LjJti%NfkQUY&}E5(+Y>jkL0^)&?F?ZOIQ1ZB`f|6+3LTYLp-;e, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-04-13 20:40+0900\n" +"PO-Revision-Date: 2007-04-14 07:57+0900\n" +"Last-Translator: Adam Blackburn \n" +"Language-Team: Northern Sami\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +msgid "Connect" +msgstr "Anslut" + +msgid "IP" +msgstr "IP" + +msgid "Netmask" +msgstr "Subnät" + +msgid "Gateway" +msgstr "Gateway" + +msgid "DNS" +msgstr "DNS" + +msgid "Use Static IPs" +msgstr "Använd Fast IP" + +msgid "Use Static DNS" +msgstr "Använd Statisk DNS" + +msgid "Use Encryption" +msgstr "Använd Kryptering" + +msgid "Advanced Settings" +msgstr "Avancerade Inställningar" + +msgid "Wired Network" +msgstr "Lokalt Nätverk" + +msgid "Automatically connect to this network" +msgstr "Anslut automatiskt till detta nätverk " + +msgid "Secured" +msgstr "Krypterat" + +msgid "Unsecured" +msgstr "Okrypterat" + +msgid "Channel" +msgstr "Kanal" + +msgid "Preferences" +msgstr "Egenskaper" + +msgid "WPA Supplicant Driver" +msgstr "WPA Supplicant Drivrutin" + +msgid "Wireless Interface" +msgstr "Trådlöst Nätverk" + +msgid "Wired Interface" +msgstr "Ethernet" + +msgid "Hidden Network" +msgstr "Dold Nätverk" + +msgid "Hidden Network ESSID" +msgstr "Dold Nätverks ESSID" + +msgid "Connected to $A at $B% (IP: $C)" +msgstr "Anslut till $A Signal $B% (IP: $C)" + +msgid "Connected to wired network (IP: $A)" +msgstr "Anslut till lokalt nätverk(IP: $A)" + +msgid "Not connected" +msgstr "Ej ansluten" + +msgid "No wireless networks found." +msgstr "Inga trådlösa nätverk funna." + +msgid "Key" +msgstr "Nyckel" + +msgid "Username" +msgstr "Användar namn" + +msgid "Password" +msgstr "Lösenord" + +msgid "Anonymous Identity" +msgstr "Anonym Identitet" + +msgid "Identity" +msgstr "Identitet" + +msgid "Authentication" +msgstr "Verifiering" + +msgid "Path to PAC File" +msgstr "Sökväg till PAC fil" + +msgid "Choose from the networks below:" +msgstr "Välj från nätverken nedan:" + +msgid "Connecting..." +msgstr "Ansluter..." + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "2" +msgstr "2" + +msgid "3" +msgstr "3" + +msgid "4" +msgstr "4" + +msgid "5" +msgstr "5" + +msgid "6" +msgstr "6" + +msgid "7" +msgstr "7" + +msgid "8" +msgstr "8" + +msgid "9" +msgstr "9" + +msgid "Putting interface down..." +msgstr "Kopplar ner ansluting..." + +msgid "Resetting IP address..." +msgstr "Återställer IP adress..." + +msgid "Putting interface up..." +msgstr "Kopplar upp anslutning..." + +msgid "Removing old connection..." +msgstr "Tar bort gamla anslutningen..." + +msgid "Generating PSK..." +msgstr "Genererar PSK..." + +msgid "Generating WPA configuration file..." +msgstr "Genererar WPA Konfigurations fil..." + +msgid "Flushing the routing table..." +msgstr "Tömmer routing tabellen..." + +msgid "Configuring wireless interface..." +msgstr "Konfigurerar trådlös anslutning..." + +msgid "Setting broadcast address..." +msgstr "Sätter broadcast adress..." + +msgid "Setting static DNS servers..." +msgstr "Sätter statisk DNS server..." + +msgid "Setting static IP addresses..." +msgstr "Sätter statisk IP adress..." + +msgid "Obtaining IP address..." +msgstr "Väntar på IP adress..." + +msgid "Done connecting..." +msgstr "Ansluting klar..." + +msgid "To connect to a wired network, you must create a network profile. To create a network profile, type a name that describes this network, and press Add." +msgstr "För att ansluta till ett lokalt nätverk, måste du skapa en profile. För att skapa en profile, ange ett namn / beskrivning för detta nätverk, sedan tryck på lägg till." diff --git a/translations/sv_SE/LC_MESSAGES/wicd.mo b/translations/sv_SE/LC_MESSAGES/wicd.mo new file mode 100644 index 0000000000000000000000000000000000000000..fc5e874f49d8155d2dcd200829c9ef8260aed111 GIT binary patch literal 3723 zcmZ{mO^h5z8HOt)vGJOaV1B}XDv6!gWM@3KH}-lUDC6B(XS9EVXVw--Ak|FQ%(kbe zdg!j+Ww;H6uauio#gulLWV9{8z1siJ-!^`G|%u?fC)KYmc&dq4}!H;3RhrmjRz2`yh`vQ0x{07KvzYcy5d=un; z?|_eje+4=JF8By|43kfSkAj~8p9DGYIq{oVz+-+Lh6zXvkDj(;TI z?`iPUXkP+3e+{IbH$j*vB0s(h^1LsD^wX;#{rWqQ@BIa&o$rD??;MPxf6s!y0_z~x z`xi*R+yg%jo`Q4fx2Hh*`7(ZJPaTBo#J50>_d(9z1?k5#sO+Z(SV~+#WjTjR-7d3% z@+>OtJde77%EGw3h)O#zp|a3+7KzI96{X}KxOY*m;(>VsM|I^aey^Z@DsQ@T!%XMz z3P|0GvWN%zhdxFMaWO*w&^J6UwWLmP)3lWFM4!040W!XxL8VUfsE5l_zVSH7cwnqB z&c1}|N(E9~#IYA3&1IOqD6WcHu%k>@2ePHD4NX54H4~fhFwRoh2(+=G9gA9KxB1vr zHjE9M@eq$)6-8s&jg8S=D{U<8c9=?|?QWb5#L~9HKm^8ds%0;UhnS#?@l~unXB*9`JiT;ocAQHE z#b$m^Z8`^=apmQWmROFBE)Le4^%ueby2=eN(`-}LTdl^jXf(xC{8c>`m^@VJKy1VZ5_z3d z*^4t1lrd(DW9UF^cB~2wZEG~83W5Zx(!{1pQ@AIn z%mu@N8)Ojg8u$MDMzRt6Z|GsX!|mcID9k{t23xe2_Jc~lf)|Ms?;8~ zw-`(<15UzWGS$hBPTXmZj2;|SyWw_Rn8K4Pr`+)v(Mys*8F?U0c;>4EL(|#C~u4VnS)Q+oiuDRJREm0S|R9c33 zRe7;exl*bulrCJtV|AhOOyz2&f{CRYdMD)KN9Qfb%9ZM~SMqsl@O!D9D3eCY#z_@I zsiC|UsqUbYB}RUw8xKdj;dd`AKHndzFe;<{)wwlg`kCtMQd_HGRc^r4ZD=H0Y8cL~ zH`eP12fI+N%ps9j;MFYM$ z5b2QAz04R@7WLa+IBh7qvCwohxsxZcBAu>5Uu~FATa*34&SVeY33`uN6=sThUz>EG zM!24O`>>W}J;6fj9RU6Ygh-ukZ!$=((%+;HGA0Np)(y*pWeuZ7D%qaXi z!LB`vr}$6mQl63L@$W)9K%#Tsv>tb#y&?1XF5nWtqj0lxR0MD2?kJ1R z!Bmi%ft!$zy+m*Vf;R7RsW;bQ+PA_F628ZN4jl-4J}3nz{69g|T?Rt9t>rgn8ldgs JKH7tz{U1Y?tH1yN literal 0 HcmV?d00001 diff --git a/translations/wicd.pot b/translations/wicd.pot new file mode 100644 index 0000000..82bb544 --- /dev/null +++ b/translations/wicd.pot @@ -0,0 +1,247 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-04-13 20:40+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: gui.py:36 +msgid "Connect" +msgstr "" + +#: gui.py:37 +msgid "IP" +msgstr "" + +#: gui.py:38 +msgid "Netmask" +msgstr "" + +#: gui.py:39 +msgid "Gateway" +msgstr "" + +#: gui.py:40 +msgid "DNS" +msgstr "" + +#: gui.py:41 +msgid "Use Static IPs" +msgstr "" + +#: gui.py:42 +msgid "Use Static DNS" +msgstr "" + +#: gui.py:43 +msgid "Use Encryption" +msgstr "" + +#: gui.py:44 +msgid "Advanced Settings" +msgstr "" + +#: gui.py:45 +msgid "Wired Network" +msgstr "" + +#: gui.py:46 +msgid "" +"To connect to a wired network, you must create a network profile. To create " +"a network profile, type a name that describes this network, and press Add" +msgstr "" + +#: gui.py:47 +msgid "Automatically connect to this network" +msgstr "" + +#: gui.py:48 +msgid "Secured" +msgstr "" + +#: gui.py:49 +msgid "Unsecured" +msgstr "" + +#: gui.py:50 +msgid "Channel" +msgstr "" + +#: gui.py:51 +msgid "Preferences" +msgstr "" + +#: gui.py:52 +msgid "WPA Supplicant Driver" +msgstr "" + +#: gui.py:53 +msgid "Wireless Interface" +msgstr "" + +#: gui.py:54 +msgid "Wired Interface" +msgstr "" + +#: gui.py:55 +msgid "Hidden Network" +msgstr "" + +#: gui.py:56 +msgid "Hidden Network ESSID" +msgstr "" + +#: gui.py:57 +msgid "Connected to $A at $B% (IP: $C)" +msgstr "" + +#: gui.py:58 +msgid "Connected to wired network (IP: $A)" +msgstr "" + +#: gui.py:59 +msgid "Not connected" +msgstr "" + +#: gui.py:60 +msgid "No wireless networks found." +msgstr "" + +#: gui.py:61 +msgid "Key" +msgstr "" + +#: gui.py:62 +msgid "Username" +msgstr "" + +#: gui.py:63 +msgid "Password" +msgstr "" + +#: gui.py:64 +msgid "Anonymous Identity" +msgstr "" + +#: gui.py:65 +msgid "Identity" +msgstr "" + +#: gui.py:66 +msgid "Authentication" +msgstr "" + +#: gui.py:67 +msgid "Path to PAC File" +msgstr "" + +#: gui.py:68 +msgid "Choose from the networks below:" +msgstr "" + +#: gui.py:69 +msgid "Connecting..." +msgstr "" + +#: gui.py:71 +msgid "0" +msgstr "" + +#: gui.py:72 +msgid "1" +msgstr "" + +#: gui.py:73 +msgid "2" +msgstr "" + +#: gui.py:74 +msgid "3" +msgstr "" + +#: gui.py:75 +msgid "4" +msgstr "" + +#: gui.py:76 +msgid "5" +msgstr "" + +#: gui.py:77 +msgid "6" +msgstr "" + +#: gui.py:78 +msgid "7" +msgstr "" + +#: gui.py:79 +msgid "8" +msgstr "" + +#: gui.py:80 +msgid "9" +msgstr "" + +#: gui.py:82 +msgid "Putting interface down..." +msgstr "" + +#: gui.py:83 +msgid "Resetting IP address..." +msgstr "" + +#: gui.py:84 +msgid "Putting interface up..." +msgstr "" + +#: gui.py:85 +msgid "Removing old connection..." +msgstr "" + +#: gui.py:86 +msgid "Generating PSK..." +msgstr "" + +#: gui.py:87 +msgid "Generating WPA configuration file..." +msgstr "" + +#: gui.py:88 +msgid "Flushing the routing table..." +msgstr "" + +#: gui.py:89 +msgid "Configuring wireless interface..." +msgstr "" + +#: gui.py:90 +msgid "Setting broadcast address..." +msgstr "" + +#: gui.py:91 +msgid "Setting static DNS servers..." +msgstr "" + +#: gui.py:92 +msgid "Setting static IP addresses..." +msgstr "" + +#: gui.py:93 +msgid "Obtaining IP address..." +msgstr "" + +#: gui.py:95 +msgid "Done connecting..." +msgstr "" diff --git a/tray-dapper.py b/tray-dapper.py new file mode 100644 index 0000000..5413720 --- /dev/null +++ b/tray-dapper.py @@ -0,0 +1 @@ +link tray.py \ No newline at end of file diff --git a/tray-edgy.py b/tray-edgy.py new file mode 100644 index 0000000..5413720 --- /dev/null +++ b/tray-edgy.py @@ -0,0 +1 @@ +link tray.py \ No newline at end of file diff --git a/tray.py b/tray.py new file mode 100644 index 0000000..f9385c5 --- /dev/null +++ b/tray.py @@ -0,0 +1,9 @@ +#!/usr/bin/python +import os,sys +if __name__ == '__main__': + os.chdir(os.path.dirname(os.path.normpath(os.path.join(os.getcwd(),sys.argv[0])))) +import gtk +if gtk.gtk_version[0] >= 2 and gtk.gtk_version[1] >= 10: + import edgy +else: + import dapper