1
0
mirror of https://github.com/gryf/wicd.git synced 2025-12-20 04:48:00 +01:00

Scripts now can only be setup with root access and always run as root, instead of trying to run as the current user.

Possibly fixed problems with scripts not running when they should and/or leaving zombies.
Slightly reworked the GUI to make the new script system look nicer.
Removed the ability to set script information through built in daemon functions, it now has to be done by directly editing configuration files (which require root access to read/write).
This commit is contained in:
imdano
2007-12-29 11:56:47 +00:00
parent 7d7b943ee7
commit 53fc40349d
6 changed files with 328 additions and 262 deletions

163
configscript.py Executable file
View File

@@ -0,0 +1,163 @@
#!/usr/bin/env python
"""Configure the scripts for a particular network
Script for configuring the scripts for a network passed in as a
command line argument. This needs to run a separate process because
editing scripts requires root access, and the GUI/Tray are typically
run as the current user.
"""
#
# Copyright (C) 2007 Adam Blackburn
# Copyright (C) 2007 Dan O'Reilly
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License Version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import os
import sys
import gtk
import ConfigParser
import dbus
import dbus.service
import pygtk
import gtk.glade
import wpath
import misc
_ = misc.get_gettext()
language = {}
language['configure_scripts'] = "Configure Scripts"
language['before_script'] = "Pre-connection Script"
language['after_script'] = "Post-connection Script"
language['disconnect_script'] = "Disconnection Script"
bus = dbus.SystemBus()
# Connect to the daemon
try:
print 'Attempting to connect tray to daemon...'
proxy_obj = bus.get_object('org.wicd.daemon', '/org/wicd/daemon')
print 'Success.'
except Exception:
print 'Daemon not running...'
misc.PromptToStartDaemon()
sys.exit(1)
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')
wireless_conf = wpath.etc + 'wireless-settings.conf'
wired_conf = wpath.etc + 'wired-settings.conf'
def none_to_blank(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 blank_to_none(text):
"""Convert an empty or null string to 'None'"""
if text == "" or text == None:
return "None"
else:
return str(text)
def get_script_info(network, network_type):
"""Reads script info from disk and load it into the configuration dialog"""
info = {}
con = ConfigParser.ConfigParser()
if network_type == "wired":
con.read(wired_conf)
if con.has_section(network):
info["pre_entry"] = con.get(network, "beforescript")
info["post_entry"] = con.get(network, "afterscript")
info["disconnect_entry"] = con.get(network, "disconnectscript")
else:
bssid = wireless.GetWirelessProperty(int(network), "bssid")
con.read(wireless_conf)
if con.has_section(bssid):
info["pre_entry"] = con.get(bssid, "beforescript")
info["post_entry"] = con.get(bssid, "afterscript")
info["disconnect_entry"] = con.get(bssid, "disconnectscript")
return info
def write_scripts(network, network_type, script_info):
"""Writes script info to disk and loads it into the daemon"""
con = ConfigParser.ConfigParser()
if network_type == "wired":
con.read(wired_conf)
if con.has_section(network):
con.set(network, "beforescript", script_info["pre_entry"])
con.set(network, "afterscript", script_info["post_entry"])
con.set(network, "disconnectscript", script_info["disconnect_entry"])
con.write(open(wired_conf, "w"))
config.ReadWiredNetworkProfile(network)
else:
bssid = wireless.GetWirelessProperty(int(network), "bssid")
con.read(wireless_conf)
if con.has_section(bssid):
con.set(bssid, "beforescript", script_info["pre_entry"])
con.set(bssid, "afterscript", script_info["post_entry"])
con.set(bssid, "disconnectscript", script_info["disconnect_entry"])
con.write(open(wireless_conf, "w"))
config.ReadWirelessNetworkProfile(int(network))
config.SaveWirelessNetworkProfile(int(network))
def main (argv):
"""Runs the script configuration dialog."""
if len(argv) < 2:
print 'Network id to configure is missing, aborting.'
sys.exit(1)
network = argv[1]
network_type = argv[2]
script_info = get_script_info(network, network_type)
gladefile = wpath.etc + "wicd.glade"
wTree = gtk.glade.XML(gladefile)
dialog = wTree.get_widget("configure_script_dialog")
wTree.get_widget("pre_label").set_label(language['before_script'] + ":")
wTree.get_widget("post_label").set_label(language['after_script'] + ":")
wTree.get_widget("disconnect_label").set_label(language['disconnect_script'] + ":")
wTree.get_widget("window1").hide()
pre_entry = wTree.get_widget("pre_entry")
post_entry = wTree.get_widget("post_entry")
disconnect_entry = wTree.get_widget("disconnect_entry")
pre_entry.set_text(none_to_blank(script_info["pre_entry"]))
post_entry.set_text(none_to_blank(script_info["post_entry"]))
disconnect_entry.set_text(none_to_blank(script_info["disconnect_entry"]))
dialog.show_all()
result = dialog.run()
if result == 1:
script_info["pre_entry"] = blank_to_none(pre_entry.get_text())
script_info["post_entry"] = blank_to_none(post_entry.get_text())
script_info["disconnect_entry"] = blank_to_none(disconnect_entry.get_text())
write_scripts(network, network_type, script_info)
dialog.destroy()
if __name__ == '__main__':
main(sys.argv)

300
daemon.py
View File

@@ -467,30 +467,6 @@ class ConnectionWizard(dbus.service.Object):
self.wired.Disconnect() self.wired.Disconnect()
#end function DisconnectWireless #end function DisconnectWireless
@dbus.service.method('org.wicd.daemon.wireless')
def SetWirelessBeforeScript(self,networkid,script):
if script == '':
script = None
self.SetWirelessProperty(networkid,"beforescript",script)
self.wifi.before_script = script
#end function SetWirelessBeforeScript
@dbus.service.method('org.wicd.daemon.wireless')
def SetWirelessDisconnectScript(self,networkid,script):
if script == '':
script = None
self.SetWirelessProperty(networkid,"disconnectscript",script)
self.wifi.disconnect_script = script
#end function SetWirelessDisconnectScript
@dbus.service.method('org.wicd.daemon.wireless')
def SetWirelessAfterScript(self,networkid,script):
if script == '':
script = None
self.SetWirelessProperty(networkid,"afterscript",script)
self.wifi.after_script = script
#end function SetWirelessAfterScript
@dbus.service.method('org.wicd.daemon.wireless') @dbus.service.method('org.wicd.daemon.wireless')
def GetNumberOfNetworks(self): def GetNumberOfNetworks(self):
'''returns number of networks''' '''returns number of networks'''
@@ -528,7 +504,7 @@ class ConnectionWizard(dbus.service.Object):
''' Retrieves wireless property from the network specified ''' ''' Retrieves wireless property from the network specified '''
value = self.LastScan[networkid].get(property) value = self.LastScan[networkid].get(property)
try: try:
value = value.encode('utf-8') value = misc.to_unicode(value)
except: except:
pass pass
if self.debug_mode == 1: if self.debug_mode == 1:
@@ -542,6 +518,10 @@ class ConnectionWizard(dbus.service.Object):
''' Sets property to value in network specified ''' ''' Sets property to value in network specified '''
#simple - set the value of the item in our current data #simple - set the value of the item in our current data
#to the value the client asked for #to the value the client asked for
if (property.strip()).endswith("script"):
print "Setting script properties through the daemon \
is not permitted."
return False
print 'setting wireless network',networkid,'property',property,'to value',value print 'setting wireless network',networkid,'property',property,'to value',value
self.LastScan[networkid][property] = misc.Noneify(value) self.LastScan[networkid][property] = misc.Noneify(value)
#end function SetProperty #end function SetProperty
@@ -710,33 +690,6 @@ class ConnectionWizard(dbus.service.Object):
return False return False
#end function CheckIfWiredConnecting #end function CheckIfWiredConnecting
@dbus.service.method('org.wicd.daemon.wired')
def SetWiredBeforeScript(self,script):
'''sets pre-connection script to run for a wired connection'''
if script == '':
script = None
self.SetWiredProperty("beforescript",script)
self.wired.before_script = script
#end function SetWiredBeforeScript
@dbus.service.method('org.wicd.daemon.wired')
def SetWiredDisconnectScript(self,script):
'''sets script to run on connection disconnect'''
if script == '':
script = None
self.SetWiredProperty("disconnectscript",script)
self.wired.disconnect_script = script
#end function SetWirelessDisconnectScript
@dbus.service.method('org.wicd.daemon.wired')
def SetWiredAfterScript(self,script):
'''sets post-connection script to run for a wired connection'''
if script == '':
script = None
self.SetWiredProperty("afterscript",script)
self.wired.after_script = script
#end function SetWiredAfterScript
@dbus.service.method('org.wicd.daemon.wired') @dbus.service.method('org.wicd.daemon.wired')
def SetWiredAutoConnectMethod(self,method): def SetWiredAutoConnectMethod(self,method):
'''sets which method the user wants to autoconnect to wired networks''' '''sets which method the user wants to autoconnect to wired networks'''
@@ -769,6 +722,10 @@ class ConnectionWizard(dbus.service.Object):
@dbus.service.method('org.wicd.daemon.wired') @dbus.service.method('org.wicd.daemon.wired')
def SetWiredProperty(self,property,value): def SetWiredProperty(self,property,value):
if self.WiredNetwork: if self.WiredNetwork:
if (property.strip()).endswith("script"):
print "Setting script properties through the daemon \
is not permitted."
return False
self.WiredNetwork[property] = misc.Noneify(value) self.WiredNetwork[property] = misc.Noneify(value)
if self.debug_mode == 1: if self.debug_mode == 1:
print 'set',property,'to',misc.Noneify(value) print 'set',property,'to',misc.Noneify(value)
@@ -938,7 +895,7 @@ class ConnectionWizard(dbus.service.Object):
def SaveWiredNetworkProfile(self,profilename): def SaveWiredNetworkProfile(self,profilename):
''' Writes a wired network profile to disk ''' ''' Writes a wired network profile to disk '''
#should include: profilename,ip,netmask,gateway,dns1,dns2 #should include: profilename,ip,netmask,gateway,dns1,dns2
profilename = profilename.encode('utf-8') profilename = misc.to_unicode(profilename)
print "setting profile for " + str(profilename) print "setting profile for " + str(profilename)
config = ConfigParser.ConfigParser() config = ConfigParser.ConfigParser()
config.read(self.wired_conf) config.read(self.wired_conf)
@@ -955,7 +912,7 @@ class ConnectionWizard(dbus.service.Object):
def ReadWiredNetworkProfile(self,profilename): def ReadWiredNetworkProfile(self,profilename):
''' Reads a wired network profile in as the currently active profile ''' ''' Reads a wired network profile in as the currently active profile '''
profile = {} profile = {}
profilename = profilename.encode('utf-8') profilename = misc.to_unicode(profilename)
config = ConfigParser.ConfigParser() config = ConfigParser.ConfigParser()
config.read(self.wired_conf) config.read(self.wired_conf)
if config.has_section(profilename) == True: if config.has_section(profilename) == True:
@@ -999,6 +956,9 @@ class ConnectionWizard(dbus.service.Object):
@dbus.service.method('org.wicd.daemon.config') @dbus.service.method('org.wicd.daemon.config')
def SaveWirelessNetworkProperty(self,id,option): def SaveWirelessNetworkProperty(self,id,option):
''' Writes a particular wireless property to disk ''' ''' Writes a particular wireless property to disk '''
if (option.strip()).endswith("script"):
print 'you cannot save script information to disk through the daemon.'
return
print "setting network option " + str(option) + " to " + str(self.LastScan[id][option]) print "setting network option " + str(option) + " to " + str(self.LastScan[id][option])
config = ConfigParser.ConfigParser() config = ConfigParser.ConfigParser()
config.read(self.wireless_conf) config.read(self.wireless_conf)
@@ -1015,27 +975,13 @@ class ConnectionWizard(dbus.service.Object):
print self.LastScan[id]["bssid"] print self.LastScan[id]["bssid"]
if config.has_section(self.LastScan[id]["bssid"]): if config.has_section(self.LastScan[id]["bssid"]):
self.LastScan[id]["has_profile"] = True self.LastScan[id]["has_profile"] = True
if config.has_option(self.LastScan[id]["bssid"], "beforescript"):
self.LastScan[id]["beforescript"] = misc.Noneify(config.get(self.LastScan[id]["bssid"], "beforescript"))
else:
self.LastScan[id]["beforescript"] = None
if config.has_option(self.LastScan[id]["bssid"], "afterscript"):
self.LastScan[id]["afterscript"] = misc.Noneify(config.get(self.LastScan[id]["bssid"],
"afterscript"))
else:
self.LastScan[id]["afterscript"] = None
if config.has_option(self.LastScan[id]["bssid"], "disconnectscript"):
self.LastScan[id]["disconnectscript"] = misc.Noneify(config.get(self.LastScan[id]["bssid"],
"disconnectscript"))
else:
self.LastScan[id]["disconnectscript"] = None
#read the essid because we be needing to name those hidden # Read the essid because we be needing to name those hidden
#wireless networks now - but only read it if it is hidden # wireless networks now - but only read it if it is hidden.
if self.LastScan[id]["hidden"] == True: if self.LastScan[id]["hidden"] == True:
self.LastScan[id]["essid"] = misc.Noneify(config.get(self.LastScan[id]["bssid"], "essid")) self.LastScan[id]["essid"] = misc.Noneify(config.get(self.LastScan[id]["bssid"], "essid"))
for x in config.options(self.LastScan[id]["bssid"]): for x in config.options(self.LastScan[id]["bssid"]):
if self.LastScan[id].has_key(x) == False: if self.LastScan[id].has_key(x) == False or x.endswith("script"):
self.LastScan[id][x] = misc.Noneify(config.get(self.LastScan[id]["bssid"], x)) self.LastScan[id][x] = misc.Noneify(config.get(self.LastScan[id]["bssid"], x))
return "100: Loaded Profile" return "100: Loaded Profile"
else: else:
@@ -1266,112 +1212,6 @@ class ConnectionWizard(dbus.service.Object):
#end function ReadConfig #end function ReadConfig
def usage():
print """
wicd 1.33
wireless (and wired) connection daemon.
Arguments:
\t-s\t--no-scan\tDon't auto-scan/auto-connect.
\t-f\t--no-daemon\tDon't daemonize (run in foreground).
\t-e\t--no-stderr\tDon't redirect stderr.
\t-o\t--no-stdout\tDon't redirect stdout.
\t-h\t--help\t\tPrint this help.
"""
def daemonize():
""" Disconnect from the controlling terminal.
Fork twice, once to disconnect ourselves from the parent terminal and a
second time to prevent any files we open from becoming our controlling
terminal.
For more info see http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012
"""
# Fork the first time to disconnect from the parent terminal and
# exit the parent process.
try:
pid = os.fork()
if pid > 0:
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 to stop us from being a zombie.
os.setsid()
os.umask(0)
# Fork the second time to prevent us from opening a file that will
# become our controlling terminal.
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)
def main(argv):
""" The main daemon program.
Keyword arguments:
argv -- The arguments passed to the script.
"""
do_daemonize = True
redirect_stderr = True
redirect_stdout = True
auto_scan = True
try:
opts, args = getopt.getopt(sys.argv[1:], 'feos',
['help', 'no-daemon', 'no-stderr', 'no-stdout', 'no-scan'])
except getopt.GetoptError:
# Print help information and exit
usage()
sys.exit(2)
for o, a in opts:
if o in ('-h', '--help'):
usage()
sys.exit()
if o in ('-e', '--no-stderr'):
redirect_stderr = False
if o in ('-o', '--no-stdout'):
redirect_stdout = False
if o in ('-f', '--no-daemon'):
do_daemonize = False
if o in ('-s', '--no-scan'):
auto_scan = False
if do_daemonize: daemonize()
if redirect_stderr or redirect_stdout: output = LogWriter()
if redirect_stdout: sys.stdout = output
if redirect_stderr: sys.stderr = output
print '---------------------------'
print 'wicd initializing...'
print '---------------------------'
# Open the DBUS session
session_bus = dbus.SystemBus()
bus_name = dbus.service.BusName('org.wicd.daemon', bus=session_bus)
object = ConnectionWizard(bus_name, auto_connect=auto_scan)
connection_status = ConnectionStatus(object)
gobject.timeout_add(3000, connection_status.update_connection_status)
# Enter the main loop
mainloop = gobject.MainLoop()
mainloop.run()
class ConnectionStatus(): class ConnectionStatus():
def __init__(self, connection): def __init__(self, connection):
"""Initialize variables needed for the connection status methods.""" """Initialize variables needed for the connection status methods."""
@@ -1515,5 +1355,111 @@ class ConnectionStatus():
conn.AutoConnect(True) conn.AutoConnect(True)
def usage():
print """
wicd 1.33
wireless (and wired) connection daemon.
Arguments:
\t-s\t--no-scan\tDon't auto-scan/auto-connect.
\t-f\t--no-daemon\tDon't daemonize (run in foreground).
\t-e\t--no-stderr\tDon't redirect stderr.
\t-o\t--no-stdout\tDon't redirect stdout.
\t-h\t--help\t\tPrint this help.
"""
def daemonize():
""" Disconnect from the controlling terminal.
Fork twice, once to disconnect ourselves from the parent terminal and a
second time to prevent any files we open from becoming our controlling
terminal.
For more info see http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012
"""
# Fork the first time to disconnect from the parent terminal and
# exit the parent process.
try:
pid = os.fork()
if pid > 0:
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 to stop us from being a zombie.
os.setsid()
os.umask(0)
# Fork the second time to prevent us from opening a file that will
# become our controlling terminal.
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)
def main(argv):
""" The main daemon program.
Keyword arguments:
argv -- The arguments passed to the script.
"""
do_daemonize = True
redirect_stderr = True
redirect_stdout = True
auto_scan = True
try:
opts, args = getopt.getopt(sys.argv[1:], 'feos',
['help', 'no-daemon', 'no-stderr', 'no-stdout', 'no-scan'])
except getopt.GetoptError:
# Print help information and exit
usage()
sys.exit(2)
for o, a in opts:
if o in ('-h', '--help'):
usage()
sys.exit()
if o in ('-e', '--no-stderr'):
redirect_stderr = False
if o in ('-o', '--no-stdout'):
redirect_stdout = False
if o in ('-f', '--no-daemon'):
do_daemonize = False
if o in ('-s', '--no-scan'):
auto_scan = False
if do_daemonize: daemonize()
if redirect_stderr or redirect_stdout: output = LogWriter()
if redirect_stdout: sys.stdout = output
if redirect_stderr: sys.stderr = output
print '---------------------------'
print 'wicd initializing...'
print '---------------------------'
# Open the DBUS session
session_bus = dbus.SystemBus()
bus_name = dbus.service.BusName('org.wicd.daemon', bus=session_bus)
object = ConnectionWizard(bus_name, auto_connect=auto_scan)
connection_status = ConnectionStatus(object)
gobject.timeout_add(3000, connection_status.update_connection_status)
# Enter the main loop
mainloop = gobject.MainLoop()
mainloop.run()
if __name__ == '__main__': if __name__ == '__main__':
main(sys.argv) main(sys.argv)

84
gui.py
View File

@@ -117,11 +117,9 @@ language['use_static_dns'] = _('Use Static DNS')
language['use_encryption'] = _('Use Encryption') language['use_encryption'] = _('Use Encryption')
language['advanced_settings'] = _('Advanced Settings') language['advanced_settings'] = _('Advanced Settings')
language['wired_network'] = _('Wired Network') language['wired_network'] = _('Wired Network')
language['wired_network_instructions'] = _('To connect to a wired network, you \ language['wired_network_instructions'] = _('To connect to a wired network, you'
must create a network profile. To \ ' must create a network profile. To create a network profile, type a name that'
create a network profile, type a \ ' describes this network, and press Add.')
name that describes this network, \
and press Add.')
language['automatic_connect'] = _('Automatically connect to this network') language['automatic_connect'] = _('Automatically connect to this network')
language['secured'] = _('Secured') language['secured'] = _('Secured')
language['unsecured'] = _('Unsecured') language['unsecured'] = _('Unsecured')
@@ -166,6 +164,7 @@ language['choose_wired_profile'] = _('Select or create a wired profile to connec
language['wired_network_found'] = _('Wired connection detected') language['wired_network_found'] = _('Wired connection detected')
language['stop_showing_chooser'] = _('Stop Showing Autoconnect pop-up temporarily') language['stop_showing_chooser'] = _('Stop Showing Autoconnect pop-up temporarily')
language['display_type_dialog'] = _('Use dBm to measure signal strength') language['display_type_dialog'] = _('Use dBm to measure signal strength')
language['scripts'] = _('Scripts')
language['0'] = _('0') language['0'] = _('0')
language['1'] = _('1') language['1'] = _('1')
@@ -200,11 +199,11 @@ language['done'] = _('Done connecting...')
class LinkButton(gtk.EventBox): class LinkButton(gtk.EventBox):
label = None label = None
def __init__(self): def __init__(self, txt):
gtk.EventBox.__init__(self) gtk.EventBox.__init__(self)
self.connect("realize",self.__setHandCursor) #set the hand cursor when the box is initalized self.connect("realize",self.__setHandCursor) #set the hand cursor when the box is initalized
label = gtk.Label() label = gtk.Label()
label.set_markup(" <span color=\"blue\">" + language['connect'] + "</span>") label.set_markup("[ <span color=\"blue\">" + txt + "</span> ]")
label.set_alignment(0,.5) label.set_alignment(0,.5)
label.show() label.show()
self.add(label) self.add(label)
@@ -324,12 +323,13 @@ class PrettyNetworkEntry(gtk.HBox):
self.expander.higherLevel = self # Do this so that the expander can access the stuff inside me self.expander.higherLevel = self # Do this so that the expander can access the stuff inside me
self.tempVBox = gtk.VBox(False,1) self.tempVBox = gtk.VBox(False,1)
self.tempVBox.show() self.tempVBox.show()
self.connectButton = LinkButton() self.connectButton = LinkButton(language["connect"])
self.connectButton.show() self.connectButton.show()
self.tempVBox.pack_start(self.expander,fill=False,expand=False) self.tempVBox.pack_start(self.expander,fill=False,expand=False)
self.tempVBox.pack_start(self.connectButton,fill=False,expand=False) self.tempVBox.pack_start(self.connectButton,fill=False,expand=False)
self.pack_end(self.tempVBox) self.pack_end(self.tempVBox)
class PrettyWiredNetworkEntry(PrettyNetworkEntry): class PrettyWiredNetworkEntry(PrettyNetworkEntry):
def __init__(self): def __init__(self):
PrettyNetworkEntry.__init__(self,WiredNetworkEntry()) PrettyNetworkEntry.__init__(self,WiredNetworkEntry())
@@ -424,24 +424,13 @@ class NetworkEntry(gtk.Expander):
self.txtDNS1 = LabelEntry(language['dns'] + ' ' + language['1']) self.txtDNS1 = LabelEntry(language['dns'] + ' ' + language['1'])
self.txtDNS2 = LabelEntry(language['dns'] + ' ' + language['2']) self.txtDNS2 = LabelEntry(language['dns'] + ' ' + language['2'])
self.txtDNS3 = LabelEntry(language['dns'] + ' ' + language['3']) self.txtDNS3 = LabelEntry(language['dns'] + ' ' + language['3'])
#dns_addresses = daemon.GetGlobalDNSAddresses() self.scriptButton = LinkButton(language['scripts'])
#self.txtDNS1.set_text(dns_addresses[0])
#self.txtDNS2.set_text(dns_addresses[1])
#self.txtDNS3.set_text(dns_addresses[2])
self.txtBeforeScript = LabelEntry(language['before_script'])
self.txtAfterScript = LabelEntry(language['after_script'])
self.txtDisconnectScript = LabelEntry(language['disconnect_script'])
self.txtBeforeScript.label.set_size_request(200,-1)
self.txtAfterScript.label.set_size_request(200,-1)
self.txtDisconnectScript.label.set_size_request(200,-1)
self.checkboxStaticIP = gtk.CheckButton(language['use_static_ip']) self.checkboxStaticIP = gtk.CheckButton(language['use_static_ip'])
self.checkboxStaticDNS = gtk.CheckButton(language['use_static_dns']) self.checkboxStaticDNS = gtk.CheckButton(language['use_static_dns'])
self.checkboxGlobalDNS = gtk.CheckButton(language['use_global_dns']) self.checkboxGlobalDNS = gtk.CheckButton(language['use_global_dns'])
self.expanderAdvanced = gtk.Expander(language['advanced_settings']) self.expanderAdvanced = gtk.Expander(language['advanced_settings'])
self.expanderScripts = gtk.Expander(language['script_settings'])
self.vboxTop = gtk.VBox(False,0) self.vboxTop = gtk.VBox(False,0)
self.vboxAdvanced = gtk.VBox(False,0) self.vboxAdvanced = gtk.VBox(False,0)
self.vboxScripts = gtk.VBox(False,0)
self.hboxDNS = gtk.HBox(False,0) self.hboxDNS = gtk.HBox(False,0)
self.hboxDNS.pack_start(self.checkboxStaticDNS) self.hboxDNS.pack_start(self.checkboxStaticDNS)
self.hboxDNS.pack_start(self.checkboxGlobalDNS) self.hboxDNS.pack_start(self.checkboxGlobalDNS)
@@ -453,13 +442,8 @@ class NetworkEntry(gtk.Expander):
self.vboxAdvanced.pack_start(self.txtDNS1,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.txtDNS2,fill=False,expand=False)
self.vboxAdvanced.pack_start(self.txtDNS3,fill=False,expand=False) self.vboxAdvanced.pack_start(self.txtDNS3,fill=False,expand=False)
self.vboxScripts.pack_start(self.txtBeforeScript,fill=False,expand=False) self.vboxTop.pack_start(self.expanderAdvanced, fill=False, expand=False)
self.vboxScripts.pack_start(self.txtAfterScript,fill=False,expand=False)
self.vboxScripts.pack_start(self.txtDisconnectScript,fill=False,expand=False)
self.vboxTop.pack_end(self.expanderScripts,fill=False,expand=False)
self.vboxTop.pack_end(self.expanderAdvanced,fill=False,expand=False)
self.expanderAdvanced.add(self.vboxAdvanced) self.expanderAdvanced.add(self.vboxAdvanced)
self.expanderScripts.add(self.vboxScripts)
# Connect the events to the actions # Connect the events to the actions
self.checkboxStaticIP.connect("toggled",self.toggleIPCheckbox) self.checkboxStaticIP.connect("toggled",self.toggleIPCheckbox)
self.checkboxStaticDNS.connect("toggled",self.toggleDNSCheckbox) self.checkboxStaticDNS.connect("toggled",self.toggleDNSCheckbox)
@@ -567,22 +551,22 @@ class WiredNetworkEntry(NetworkEntry):
self.profileHelp = gtk.Label(language['wired_network_instructions']) self.profileHelp = gtk.Label(language['wired_network_instructions'])
self.checkboxDefaultProfile = gtk.CheckButton(language['default_wired']) self.checkboxDefaultProfile = gtk.CheckButton(language['default_wired'])
self.profileHelp.set_width_chars(5) #the default is a tad too long
self.profileHelp.set_padding(10,10)
self.profileHelp.set_justify(gtk.JUSTIFY_LEFT) self.profileHelp.set_justify(gtk.JUSTIFY_LEFT)
self.profileHelp.set_line_wrap(True) self.profileHelp.set_line_wrap(True)
self.vboxTop.pack_start(self.profileHelp,fill=False,expand=False) self.vboxTop.pack_start(self.profileHelp,fill=True,expand=True)
self.hboxTemp.pack_start(self.comboProfileNames,fill=True,expand=True) self.hboxTemp.pack_start(self.comboProfileNames,fill=True,expand=True)
self.hboxTemp.pack_start(self.buttonAdd,fill=False,expand=False) self.hboxTemp.pack_start(self.buttonAdd,fill=False,expand=False)
self.hboxTemp.pack_start(self.buttonDelete,fill=False,expand=False) self.hboxTemp.pack_start(self.buttonDelete,fill=False,expand=False)
hboxDef.pack_start(self.checkboxDefaultProfile,fill=False,expand=False) hboxDef.pack_start(self.checkboxDefaultProfile,fill=False,expand=False)
self.buttonAdd.connect("clicked",self.addProfile) #hook up our buttons self.buttonAdd.connect("clicked",self.addProfile)
self.buttonDelete.connect("clicked",self.removeProfile) self.buttonDelete.connect("clicked",self.removeProfile)
self.comboProfileNames.connect("changed",self.changeProfile) self.comboProfileNames.connect("changed",self.changeProfile)
self.scriptButton.connect("button-press-event", self.editScripts)
self.vboxTop.pack_start(self.hboxTemp) self.vboxTop.pack_start(self.hboxTemp)
self.vboxTop.pack_start(hboxDef) self.vboxTop.pack_start(hboxDef)
self.vboxTop.pack_start(self.scriptButton)
if stringToBoolean(wired.GetWiredProperty("default")) == True: if stringToBoolean(wired.GetWiredProperty("default")) == True:
self.checkboxDefaultProfile.set_active(True) self.checkboxDefaultProfile.set_active(True)
@@ -594,7 +578,7 @@ class WiredNetworkEntry(NetworkEntry):
self.profileHelp.hide() self.profileHelp.hide()
if self.profileList != None: if self.profileList != None:
prof = config.GetDefaultWiredNetwork() prof = config.GetDefaultWiredNetwork()
if prof != None: #make sure the default profile gets displayed if prof != None: # Make sure the default profile gets displayed.
i=0 i=0
while self.comboProfileNames.get_active_text() != prof: while self.comboProfileNames.get_active_text() != prof:
self.comboProfileNames.set_active(i) self.comboProfileNames.set_active(i)
@@ -609,6 +593,11 @@ class WiredNetworkEntry(NetworkEntry):
self.set_expanded(True) self.set_expanded(True)
self.profileHelp.show() self.profileHelp.show()
def editScripts(self, widget=None, event=None):
profile = self.comboProfileNames.get_active_text()
os.spawnlpe(os.P_WAIT, "gksudo", "gksudo", "./configscript.py",
profile, "wired", os.environ)
def checkEnable(self): def checkEnable(self):
profileList = config.GetWiredProfileList() profileList = config.GetWiredProfileList()
if profileList == None: if profileList == None:
@@ -674,10 +663,6 @@ class WiredNetworkEntry(NetworkEntry):
self.txtDNS2.set_text(noneToBlankString(wired.GetWiredProperty("dns2"))) self.txtDNS2.set_text(noneToBlankString(wired.GetWiredProperty("dns2")))
self.txtDNS3.set_text(noneToBlankString(wired.GetWiredProperty("dns3"))) self.txtDNS3.set_text(noneToBlankString(wired.GetWiredProperty("dns3")))
self.txtBeforeScript.set_text(noneToBlankString(wired.GetWiredProperty("beforescript")))
self.txtAfterScript.set_text(noneToBlankString(wired.GetWiredProperty("afterscript")))
self.txtDisconnectScript.set_text(noneToBlankString(wired.GetWiredProperty("disconnectscript")))
self.checkboxDefaultProfile.set_active(stringToBoolean(wired.GetWiredProperty("default"))) self.checkboxDefaultProfile.set_active(stringToBoolean(wired.GetWiredProperty("default")))
self.resetStaticCheckboxes() self.resetStaticCheckboxes()
@@ -715,6 +700,7 @@ class WirelessNetworkEntry(NetworkEntry):
self.vboxTop.pack_start(self.checkboxAutoConnect,fill=False,expand=False) self.vboxTop.pack_start(self.checkboxAutoConnect,fill=False,expand=False)
self.vboxTop.pack_start(self.hboxStatus,fill=True,expand=False) self.vboxTop.pack_start(self.hboxStatus,fill=True,expand=False)
self.vboxTop.pack_start(self.scriptButton)
self.vboxAdvanced.pack_start(self.checkboxEncryption,fill=False,expand=False) self.vboxAdvanced.pack_start(self.checkboxEncryption,fill=False,expand=False)
@@ -734,10 +720,6 @@ class WirelessNetworkEntry(NetworkEntry):
if wireless.GetWirelessProperty(networkID,'dns3') != None: if wireless.GetWirelessProperty(networkID,'dns3') != None:
self.txtDNS3.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"dns3"))) self.txtDNS3.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"dns3")))
self.txtBeforeScript.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"beforescript")))
self.txtAfterScript.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"afterscript")))
self.txtDisconnectScript.set_text(noneToBlankString(wireless.GetWirelessProperty(networkID,"disconnectscript")))
self.resetStaticCheckboxes() self.resetStaticCheckboxes()
encryptionTypes = misc.LoadEncryptionMethods() encryptionTypes = misc.LoadEncryptionMethods()
@@ -769,10 +751,16 @@ class WirelessNetworkEntry(NetworkEntry):
self.vboxAdvanced.pack_start(self.comboEncryption) self.vboxAdvanced.pack_start(self.comboEncryption)
self.vboxAdvanced.pack_start(self.vboxEncryptionInformation) self.vboxAdvanced.pack_start(self.vboxEncryptionInformation)
self.changeEncryptionMethod() self.changeEncryptionMethod()
self.scriptButton.connect("button-press-event", self.editScripts)
self.checkboxEncryption.connect("toggled",self.toggleEncryption) self.checkboxEncryption.connect("toggled",self.toggleEncryption)
self.comboEncryption.connect("changed",self.changeEncryptionMethod) self.comboEncryption.connect("changed",self.changeEncryptionMethod)
self.show_all() self.show_all()
def editScripts(self, widget=None, event=None):
result = os.spawnlpe(os.P_WAIT, "gksudo", "gksudo", "./configscript.py",
str(self.networkID), "wireless", os.environ)
print result
def updateAutoConnect(self,widget): def updateAutoConnect(self,widget):
wireless.SetWirelessProperty(self.networkID,"automatic", wireless.SetWirelessProperty(self.networkID,"automatic",
self.checkboxAutoConnect.get_active()) self.checkboxAutoConnect.get_active())
@@ -1298,14 +1286,6 @@ class appGui:
print "no encryption specified..." print "no encryption specified..."
wireless.SetWirelessProperty(networkid,"enctype",noneToString(None)) wireless.SetWirelessProperty(networkid,"enctype",noneToString(None))
# Script info
before_script = networkentry.expander.txtBeforeScript.get_text()
after_script = networkentry.expander.txtAfterScript.get_text()
disconnect_script = networkentry.expander.txtDisconnectScript.get_text()
wireless.SetWirelessBeforeScript(networkid,before_script)
wireless.SetWirelessAfterScript(networkid,after_script)
wireless.SetWirelessDisconnectScript(networkid,disconnect_script)
# if it exists. maybe kept as a value in the network entry? Not sure... # if it exists. maybe kept as a value in the network entry? Not sure...
print "connecting to wireless network..." print "connecting to wireless network..."
config.SaveWirelessNetworkProfile(networkid) config.SaveWirelessNetworkProfile(networkid)
@@ -1333,14 +1313,6 @@ class appGui:
wired.SetWiredProperty("dns2",'') wired.SetWiredProperty("dns2",'')
wired.SetWiredProperty("dns3",'') wired.SetWiredProperty("dns3",'')
# Script Info
before_script = networkentry.expander.txtBeforeScript.get_text()
after_script = networkentry.expander.txtAfterScript.get_text()
disconnect_script = networkentry.expander.txtDisconnectScript.get_text()
wired.SetWiredBeforeScript(before_script)
wired.SetWiredAfterScript(after_script)
wired.SetWiredDisconnectScript(disconnect_script)
config.SaveWiredNetworkProfile(networkentry.expander.comboProfileNames.get_active_text()) config.SaveWiredNetworkProfile(networkentry.expander.comboProfileNames.get_active_text())
wired.ConnectWired() wired.ConnectWired()
@@ -1354,7 +1326,7 @@ class appGui:
return True return True
def show_win(self): def show_win(self):
self.window.show_all() self.window.show()
# hide the status bar, as it might be confusing if it # hide the status bar, as it might be confusing if it
# pops up randomly :) # pops up randomly :)
self.status_area.hide_all() self.status_area.hide_all()

View File

@@ -217,6 +217,7 @@ def get_gettext():
def to_unicode(x): def to_unicode(x):
""" Attempts to convert a string to unicode """
try: # This may never fail, but let's be safe try: # This may never fail, but let's be safe
default_encoding = locale.getpreferredencoding() default_encoding = locale.getpreferredencoding()
except: except:

View File

@@ -1,16 +0,0 @@
#!/usr/bin/python
##
#Simple script that converts command line args to a string and executes it in usermode
##
import os,sys,misc
print 'executing script in user mode'
os.setuid(1000)
command = ''
for stuff in sys.argv[1:]:
command = command + ' ' + stuff
print 'command = ',command
pid = os.fork()
print 'hey'
if not pid:
misc.Run(command)

View File

@@ -36,23 +36,23 @@ import wpath
# Compile the regex patterns that will be used to search the output of iwlist # Compile 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 # 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) essid_pattern = re.compile('.*ESSID:"(.*?)"\n', re.I | re.M | re.S)
ap_mac_pattern = re.compile('.*Address: (.*?)\n',re.DOTALL | re.I | re.M | re.S) ap_mac_pattern = re.compile('.*Address: (.*?)\n', re.I | re.M | re.S)
channel_pattern = re.compile('.*Channel:? ?(\d\d?)',re.DOTALL | re.I | re.M | re.S) channel_pattern = re.compile('.*Channel:? ?(\d\d?)', re.I | re.M | re.S)
strength_pattern = re.compile('.*Quality:?=? ?(\d+)\s*/?\s*(\d*)',re.DOTALL | re.I | re.M | re.S) strength_pattern = re.compile('.*Quality:?=? ?(\d+)\s*/?\s*(\d*)', re.I | re.M | re.S)
# These next two look a lot a like, altstrength is for Signal level = xx/100, # These next two look a lot a like, altstrength is for Signal level = xx/100,
# which is just an alternate way of displaying link quality, signaldbm is # which is just an alternate way of displaying link quality, signaldbm is
# for displaying actual signal strength (-xx dBm). # for displaying actual signal strength (-xx dBm).
altstrength_pattern = re.compile('.*Signal level:?=? ?(\d\d*)',re.DOTALL | re.I | re.M | re.S) altstrength_pattern = re.compile('.*Signal level:?=? ?(\d\d*)', re.I | re.M | re.S)
signaldbm_pattern = re.compile('.*Signal level:?=? ?(-\d\d*)',re.DOTALL | re.I | re.M | re.S) signaldbm_pattern = re.compile('.*Signal level:?=? ?(-\d\d*)', re.I | re.M | re.S)
mode_pattern = re.compile('.*Mode:(.*?)\n',re.DOTALL | re.I | re.M | re.S) mode_pattern = re.compile('.*Mode:(.*?)\n', re.I | re.M | re.S)
freq_pattern = re.compile('.*Frequency:(.*?)\n',re.DOTALL | re.I | re.M | re.S) freq_pattern = re.compile('.*Frequency:(.*?)\n', re.I | re.M | re.S)
ip_pattern = re.compile(r'inet [Aa]d?dr[^.]*:([^.]*\.[^.]*\.[^.]*\.[0-9]*)',re.S) ip_pattern = re.compile(r'inet [Aa]d?dr[^.]*:([^.]*\.[^.]*\.[^.]*\.[0-9]*)',re.S)
wep_pattern = re.compile('.*Encryption key:(.*?)\n',re.DOTALL | re.I | re.M | re.S) wep_pattern = re.compile('.*Encryption key:(.*?)\n', re.I | re.M | re.S)
altwpa_pattern = re.compile('(wpa_ie)',re.DOTALL | re.I | re.M | re.S) altwpa_pattern = re.compile('(wpa_ie)', re.I | re.M | re.S)
wpa1_pattern = re.compile('(WPA Version 1)',re.DOTALL | re.I | re.M | re.S) wpa1_pattern = re.compile('(WPA Version 1)', re.I | re.M | re.S)
wpa2_pattern = re.compile('(WPA2)',re.DOTALL | re.I | re.M | re.S) wpa2_pattern = re.compile('(WPA2)', re.I | re.M | re.S)
def SetDNS(dns1=None, dns2=None, dns3=None): def SetDNS(dns1=None, dns2=None, dns3=None):
@@ -261,7 +261,7 @@ class WirelessInterface(Interface):
# Split the networks apart, using Cell as our split point # Split the networks apart, using Cell as our split point
# this way we can look at only one network at a time. # this way we can look at only one network at a time.
# the spaces around ' Cell ' are to minimize the chance that someone # The spaces around ' Cell ' are to minimize the chance that someone
# has an essid named Cell... # has an essid named Cell...
networks = results.split( ' Cell ' ) networks = results.split( ' Cell ' )