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

Make it possible for the user to select which graphical sudo application to use.

Make any external apps not installed on the system unselectable in the GUI.
Rework the app selection code in the backend to fall back to auto-selection if a requested app isn't installed.
Tweak the autoconnect attempt throttle in wicd-monitor to not be as aggressive.
Made sure the preferences dialog would reconnect to dbus when a DaemonStarting signal was sent.
This commit is contained in:
Dan O'Reilly
2009-02-01 23:10:11 -05:00
parent dca0f59b06
commit 8594116630
11 changed files with 365 additions and 188 deletions

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.5 on Mon Jan 26 10:54:15 2009 --> <!--Generated with glade3 3.4.5 on Sun Feb 1 21:38:09 2009 -->
<glade-interface> <glade-interface>
<widget class="GtkWindow" id="window1"> <widget class="GtkWindow" id="window1">
<property name="width_request">450</property> <property name="width_request">450</property>
@@ -895,7 +895,7 @@ is already active.</property>
<child> <child>
<widget class="GtkTable" id="table2"> <widget class="GtkTable" id="table2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="n_rows">6</property> <property name="n_rows">8</property>
<child> <child>
<widget class="GtkLabel" id="route_flush_label"> <widget class="GtkLabel" id="route_flush_label">
<property name="visible">True</property> <property name="visible">True</property>
@@ -961,7 +961,7 @@ is already active.</property>
<widget class="GtkRadioButton" id="route_flush_radio"> <widget class="GtkRadioButton" id="route_flush_radio">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="label" translatable="yes">route </property> <property name="label" translatable="yes">route</property>
<property name="response_id">0</property> <property name="response_id">0</property>
<property name="active">True</property> <property name="active">True</property>
<property name="draw_indicator">True</property> <property name="draw_indicator">True</property>
@@ -1125,6 +1125,92 @@ is already active.</property>
<property name="y_options"></property> <property name="y_options"></property>
</packing> </packing>
</child> </child>
<child>
<widget class="GtkLabel" id="sudo_app_label">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">&lt;b&gt;Graphical Sudo Application&lt;/b&gt;</property>
<property name="use_markup">True</property>
</widget>
<packing>
<property name="top_attach">6</property>
<property name="bottom_attach">7</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkAlignment" id="alignment25">
<property name="visible">True</property>
<property name="left_padding">12</property>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<child>
<widget class="GtkRadioButton" id="sudo_auto_radio">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Automatic (recommended)</property>
<property name="response_id">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="gksudo_radio">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">gksudo</property>
<property name="response_id">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">sudo_auto_radio</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="kdesu_radio">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">kdesu</property>
<property name="response_id">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">sudo_auto_radio</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="ktsuss_radio">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">ktsuss</property>
<property name="response_id">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">sudo_auto_radio</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</widget>
</child>
</widget>
<packing>
<property name="top_attach">7</property>
<property name="bottom_attach">8</property>
</packing>
</child>
</widget> </widget>
</child> </child>
</widget> </widget>

View File

@@ -220,10 +220,10 @@ class WiredInterface(Interface, wnettools.BaseWiredInterface):
except (IOError, ValueError, TypeError): except (IOError, ValueError, TypeError):
print 'Error checking link using /sys/class/net/%s/carrier' % self.iface print 'Error checking link using /sys/class/net/%s/carrier' % self.iface
if self.ETHTOOL_FOUND and self.link_detect != misc.MIITOOL: if self.miitool_cmd and self.link_detect == misc.MIITOOL:
return self._eth_get_plugged_in()
elif self.MIITOOL_FOUND:
return self._mii_get_plugged_in() return self._mii_get_plugged_in()
elif self.ethtool_cmd:
return self._eth_get_plugged_in()
else: else:
print 'Error: No way of checking for a wired connection. Make ' + \ print 'Error: No way of checking for a wired connection. Make ' + \
'sure that either mii-tool or ethtool is installed.' 'sure that either mii-tool or ethtool is installed.'
@@ -236,14 +236,15 @@ class WiredInterface(Interface, wnettools.BaseWiredInterface):
True if a link is detected, False otherwise. True if a link is detected, False otherwise.
""" """
link_tool = 'ethtool' cmd = "%s %s" % (self.ethtool_cmd, self.iface)
if not self.IsUp(): if not self.IsUp():
print 'Wired Interface is down, putting it up' print 'Wired Interface is down, putting it up'
self.Up() self.Up()
time.sleep(6) time.sleep(6)
tool_data = misc.Run(link_tool + ' ' + self.iface, True) if self.verbose: print cmd
if misc.RunRegex(re.compile('(Link detected: yes)', re.I | re.M | tool_data = misc.Run(cmd, include_stderr=True)
re.S), tool_data) is not None: if misc.RunRegex(re.compile('(Link detected: yes)', re.I | re.M | re.S),
tool_data):
return True return True
else: else:
return False return False
@@ -255,14 +256,16 @@ class WiredInterface(Interface, wnettools.BaseWiredInterface):
True if a link is detected, False otherwise. True if a link is detected, False otherwise.
""" """
link_tool = 'mii-tool' cmd = "%s %s" % (self.miitool_cmd, self.iface)
tool_data = misc.Run(link_tool + ' ' + self.iface, True) if self.verbose: print cmd
tool_data = misc.Run(cmd, include_stderr=True)
if misc.RunRegex(re.compile('(Invalid argument)', re.I | re.M | re.S), if misc.RunRegex(re.compile('(Invalid argument)', re.I | re.M | re.S),
tool_data) is not None: tool_data) is not None:
print 'Wired Interface is down, putting it up' print 'Wired Interface is down, putting it up'
self.Up() self.Up()
time.sleep(4) time.sleep(4)
tool_data = misc.Run(link_tool + ' ' + self.iface, True) if self.verbose: print cmd
tool_data = misc.Run(cmd, include_stderr=True)
if misc.RunRegex(re.compile('(link ok)', re.I | re.M | re.S), if misc.RunRegex(re.compile('(link ok)', re.I | re.M | re.S),
tool_data) is not None: tool_data) is not None:
@@ -421,14 +424,14 @@ class WirelessInterface(Interface, wnettools.BaseWirelessInterface):
""" """
# Right now there's no way to do this for these drivers # Right now there's no way to do this for these drivers
if self.wpa_driver == RALINK_DRIVER or not self.WPA_CLI_FOUND: if self.wpa_driver == RALINK_DRIVER or not self.wpa_cli_cmd:
return True return True
MAX_TIME = 35 MAX_TIME = 35
MAX_DISCONNECTED_TIME = 3 MAX_DISCONNECTED_TIME = 3
disconnected_time = 0 disconnected_time = 0
while (time.time() - auth_time) < MAX_TIME: while (time.time() - auth_time) < MAX_TIME:
cmd = 'wpa_cli -i ' + self.iface + ' status' cmd = '%s -i %s status' % (self.wpa_cli_cmd, self.iface)
output = misc.Run(cmd) output = misc.Run(cmd)
result = misc.RunRegex(auth_pattern, output) result = misc.RunRegex(auth_pattern, output)
if self.verbose: if self.verbose:

View File

@@ -215,9 +215,9 @@ class WiredInterface(Interface, wnettools.BaseWiredInterface):
""" """
if not self.iface: return False if not self.iface: return False
if self.ETHTOOL_FOUND and self.link_detect != misc.MIITOOL: if self.ethtool_cmd and self.link_detect != misc.MIITOOL:
return self._eth_get_plugged_in() return self._eth_get_plugged_in()
elif self.MIITOOL_FOUND: elif self.miitool_cmd:
return self._mii_get_plugged_in() return self._mii_get_plugged_in()
else: else:
print 'Error: No way of checking for a wired connection. Make \ print 'Error: No way of checking for a wired connection. Make \

View File

@@ -37,6 +37,7 @@ from dbus import version as dbus_version
from wicd import misc from wicd import misc
from wicd import wpath from wicd import wpath
from wicd import dbusmanager from wicd import dbusmanager
from wicd import prefs
from wicd.misc import noneToString from wicd.misc import noneToString
from wicd.netentry import WiredNetworkEntry, WirelessNetworkEntry from wicd.netentry import WiredNetworkEntry, WirelessNetworkEntry
from wicd.prefs import PreferencesDialog from wicd.prefs import PreferencesDialog
@@ -45,12 +46,6 @@ from wicd.guiutil import error, GreyLabel, LabelEntry, SmallLabel
if __name__ == '__main__': if __name__ == '__main__':
wpath.chdir(__file__) wpath.chdir(__file__)
try:
import pygtk
pygtk.require("2.0")
except:
pass
proxy_obj = daemon = wireless = wired = bus = None proxy_obj = daemon = wireless = wired = bus = None
language = misc.get_language_list_gui() language = misc.get_language_list_gui()
DBUS_AVAIL = False DBUS_AVAIL = False
@@ -71,6 +66,7 @@ def setup_dbus(force=True):
return False return False
else: else:
return False return False
prefs.setup_dbus()
bus = dbusmanager.get_bus() bus = dbusmanager.get_bus()
dbus_ifaces = dbusmanager.get_dbus_ifaces() dbus_ifaces = dbusmanager.get_dbus_ifaces()
daemon = dbus_ifaces['daemon'] daemon = dbus_ifaces['daemon']

View File

@@ -29,26 +29,40 @@ from commands import getoutput
# wicd imports # wicd imports
import wpath import wpath
if __name__ == '__main__': # Connection state constants
wpath.chdir(__file__)
NOT_CONNECTED = 0 NOT_CONNECTED = 0
CONNECTING = 1 CONNECTING = 1
WIRELESS = 2 WIRELESS = 2
WIRED = 3 WIRED = 3
SUSPENDED = 4 SUSPENDED = 4
# Automatic app selection constant
AUTO = 0 AUTO = 0
# DHCP Clients
DHCLIENT = 1 DHCLIENT = 1
DHCPCD = 2 DHCPCD = 2
PUMP = 3 PUMP = 3
# Link detection tools
ETHTOOL = 1 ETHTOOL = 1
MIITOOL = 2 MIITOOL = 2
# Route flushing tools
IP = 1 IP = 1
ROUTE = 2 ROUTE = 2
# Graphical sudo apps
GKSUDO = 1
KDESU = 2
KTSUSS = 3
sudo_dict = {
AUTO : "",
GKSUDO : "gksudo",
KDESU : "kdesu",
KTSUSS: "ktsuss",
}
class WicdError(Exception): class WicdError(Exception):
pass pass
@@ -375,9 +389,9 @@ def detect_desktop_environment():
pass pass
return desktop_environment return desktop_environment
def get_sudo_cmd(msg): def get_sudo_cmd(msg, prog_num=0):
""" Returns a graphical sudo command for generic use. """ """ Returns a graphical sudo command for generic use. """
sudo_prog = choose_sudo_prog() sudo_prog = choose_sudo_prog(prog_num)
if not sudo_prog: return None if not sudo_prog: return None
if re.search("(ktsuss|gksu|gksudo)$", sudo_prog): if re.search("(ktsuss|gksu|gksudo)$", sudo_prog):
msg_flag = "-m" msg_flag = "-m"
@@ -385,8 +399,10 @@ def get_sudo_cmd(msg):
msg_flag = "--caption" msg_flag = "--caption"
return [sudo_prog, msg_flag, msg] return [sudo_prog, msg_flag, msg]
def choose_sudo_prog(): def choose_sudo_prog(prog_num=0):
""" Try to intelligently decide which graphical sudo program to use. """ """ Try to intelligently decide which graphical sudo program to use. """
if prog_num:
return find_path(sudo_dict[prog_num])
desktop_env = detect_desktop_environment() desktop_env = detect_desktop_environment()
env_path = os.environ['PATH'].split(":") env_path = os.environ['PATH'].split(":")
@@ -412,7 +428,10 @@ def find_path(cmd):
the file can not be found. the file can not be found.
""" """
paths = os.getenv("PATH", default="/usr/bin:/usr/local/bin").split(':') paths = os.getenv("PATH").split(':')
if not paths:
paths = ["/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin",
"/sbin", "/bin"]
for path in paths: for path in paths:
if os.path.exists(os.path.join(path, cmd)): if os.path.exists(os.path.join(path, cmd)):
return os.path.join(path, cmd) return os.path.join(path, cmd)

View File

@@ -275,8 +275,9 @@ class ConnectionStatus(object):
return return
# Some checks to keep reconnect retries from going crazy. # Some checks to keep reconnect retries from going crazy.
if self.reconnect_tries > 2 and \ if (self.reconnect_tries > 3 and
(time.time() - self.last_reconnect_time) < 300: (time.time() - self.last_reconnect_time) < 200):
print "Throttling autoreconnect"
return return
self.reconnecting = True self.reconnecting = True

View File

@@ -237,7 +237,8 @@ class WiredSettingsDialog(AdvancedSettingsDialog):
profile = self.prof_name profile = self.prof_name
cmdend = [os.path.join(wpath.lib, "configscript.py"), profile, "wired"] cmdend = [os.path.join(wpath.lib, "configscript.py"), profile, "wired"]
if os.getuid() != 0: if os.getuid() != 0:
cmdbase = misc.get_sudo_cmd(language['scripts_need_pass']) cmdbase = misc.get_sudo_cmd(language['scripts_need_pass'],
prog_num=daemon.GetSudoApp())
if not cmdbase: if not cmdbase:
error(None, language["no_sudo_prog"]) error(None, language["no_sudo_prog"])
return return
@@ -336,7 +337,8 @@ class WirelessSettingsDialog(AdvancedSettingsDialog):
cmdend = [os.path.join(wpath.lib, "configscript.py"), cmdend = [os.path.join(wpath.lib, "configscript.py"),
str(self.networkID), "wireless"] str(self.networkID), "wireless"]
if os.getuid() != 0: if os.getuid() != 0:
cmdbase = misc.get_sudo_cmd(language['scripts_need_pass']) cmdbase = misc.get_sudo_cmd(language['scripts_need_pass'],
prog_num=daemon.GetSudoApp())
if not cmdbase: if not cmdbase:
error(None, language["no_sudo_prog"]) error(None, language["no_sudo_prog"])
return return

View File

@@ -106,6 +106,30 @@ def get_backend_description_dict():
d[be] = get_backend_description(be) d[be] = get_backend_description(be)
return d return d
def expand_script_macros(script, msg, bssid, essid):
"""Expands any supported macros in a script.
Keyword arguments:
script -- the script to execute.
msg -- the name of the script, %{script} will be expanded to this.
bssid -- the bssid of the network we connect to, defaults to 'wired'.
essid -- the essid of the network we connect to, defaults to 'wired'."""
def repl(match):
macro = match.group(1).lower()
if macro_dict.has_key(macro):
return macro_dict[macro]
print 'Warning: found illegal macro %s in %s script' % (macro, msg)
return match.group()
macro_dict = { 'script' : msg,
'bssid' : bssid,
'essid' : essid }
regex = re.compile(r'%\{([a-zA-Z0-9]+)\}')
expanded = regex.sub(repl, script)
print "Expanded '%s' to '%s'" % (script, expanded)
return expanded
class Controller(object): class Controller(object):
""" Parent class for the different interface types. """ """ Parent class for the different interface types. """
def __init__(self): def __init__(self):
@@ -138,8 +162,6 @@ class Controller(object):
self._dhcp_client = value self._dhcp_client = value
if self.iface: if self.iface:
self.iface.DHCP_CLIENT = value self.iface.DHCP_CLIENT = value
self.iface.CheckDHCP()
def get_dhcp_client(self): return self._dhcp_client def get_dhcp_client(self): return self._dhcp_client
dhcp_client = property(get_dhcp_client, set_dhcp_client) dhcp_client = property(get_dhcp_client, set_dhcp_client)
@@ -166,6 +188,7 @@ class Controller(object):
return True return True
def StopDHCP(self): def StopDHCP(self):
""" Stops all running DHCP clients. """
return BACKEND.StopDHCP() return BACKEND.StopDHCP()
def GetIP(self, ifconfig=""): def GetIP(self, ifconfig=""):
@@ -215,31 +238,10 @@ class Controller(object):
""" """
return self.iface.Down() return self.iface.Down()
def expand_script_macros(script, msg, bssid, essid): def AppAvailable(self, app):
"""Expands any supported macros in a script. """ Determine if the given application is installed. """
return self.iface.AppAvailable(app)
Keyword arguments:
script -- the script to execute.
msg -- the name of the script, %{script} will be expanded to this.
bssid -- the bssid of the network we connect to, defaults to 'wired'.
essid -- the essid of the network we connect to, defaults to 'wired'."""
macro_dict = { 'script' : msg,
'bssid' : bssid,
'essid' : essid }
# Define a replacement function, this is done here so that %{script} will be substituted correctly
def repl(match):
macro = match.group( 1 ).lower()
if macro_dict.has_key( macro ):
return macro_dict[macro]
print 'Warning: found illegal macro %s in %s script' % (macro, msg)
return match.group()
regex = re.compile( r'%\{([a-zA-Z0-9]+)\}' )
expanded = regex.sub( repl, script )
print "Expanded '%s' to '%s'" % (script, expanded)
return expanded
class ConnectThread(threading.Thread): class ConnectThread(threading.Thread):
""" A class to perform network connections in a multi-threaded way. """ A class to perform network connections in a multi-threaded way.

View File

@@ -32,6 +32,7 @@ import gtk.glade
from wicd import misc from wicd import misc
from wicd import wpath from wicd import wpath
from wicd import dbusmanager
from wicd.misc import checkboxTextboxToggle, noneToBlankString from wicd.misc import checkboxTextboxToggle, noneToBlankString
daemon = None daemon = None
@@ -40,17 +41,37 @@ wired = None
language = misc.get_language_list_gui() language = misc.get_language_list_gui()
def setup_dbus():
global daemon, wireless, wired
daemon = dbusmanager.get_interface('daemon')
wireless = dbusmanager.get_interface('wireless')
wired = dbusmanager.get_interface('wired')
class PreferencesDialog(object): class PreferencesDialog(object):
""" Class for handling the wicd preferences dialog window. """ """ Class for handling the wicd preferences dialog window. """
def __init__(self, wTree, dbus): def __init__(self, wTree, dbus):
global daemon, wireless, wired setup_dbus()
daemon = dbus['daemon']
wireless = dbus['wireless']
wired = dbus['wired']
self.wTree = wTree self.wTree = wTree
self.prep_settings_diag() self.prep_settings_diag()
self.load_preferences_diag() self.load_preferences_diag()
def _setup_external_app_radios(self, radio_list, get_method, set_method):
""" Generic function for setting up external app radios. """
def set_available(apps):
for app in apps:
app.set_sensitive(daemon.GetAppAvailable(app.get_label()))
# Disable radios for apps that aren't installed.
set_available(radio_list[1:])
selected_app = get_method()
# Make sure the app we want to select is actually available.
if radio_list[selected_app].get_property("sensitive"):
radio_list[selected_app].set_active(True)
else:
# If it isn't, default to Automatic.
set_method(misc.AUTO)
radio_list[misc.AUTO].set_active(True)
def load_preferences_diag(self): def load_preferences_diag(self):
""" Loads data into the preferences Dialog. """ """ Loads data into the preferences Dialog. """
@@ -62,19 +83,37 @@ class PreferencesDialog(object):
dhcp_list = [self.dhcpautoradio, self.dhclientradio, self.dhcpcdradio, dhcp_list = [self.dhcpautoradio, self.dhclientradio, self.dhcpcdradio,
self.pumpradio] self.pumpradio]
dhcp_method = daemon.GetDHCPClient() self._setup_external_app_radios(dhcp_list, daemon.GetDHCPClient,
print 'DHCP method is %s' % daemon.GetDHCPClient() daemon.SetDHCPClient)
dhcp_list[dhcp_method].set_active(True) #set_available(dhcp_list[1:])
#dhcp_method = daemon.GetDHCPClient()
#if dhcp_list[dhcp_method].get_sensitive():
#dhcp_list[dhcp_method].set_active(True)
#else:
#daemon.SetDHCPClient(misc.AUTO)
#self.dhcpautoradio.set_active(True)
wired_link_list = [self.linkautoradio, self.ethtoolradio, wired_link_list = [self.linkautoradio, self.ethtoolradio,
self.miitoolradio] self.miitoolradio]
wired_link_method = daemon.GetLinkDetectionTool() self._setup_external_app_radios(wired_link_list,
wired_link_list[wired_link_method].set_active(True) daemon.GetLinkDetectionTool,
daemon.SetLinkDetectionTool)
#set_available(wired_link_list[1:])
#wired_link_method = daemon.GetLinkDetectionTool()
#if wired_link_list[wired_link_method].get_sensitive():
#wired_link_list[wired_link_method].set_active(True)
flush_list = [self.flushautoradio, self.ipflushradio, flush_list = [self.flushautoradio, self.ipflushradio,
self.routeflushradio] self.routeflushradio]
flush_method = daemon.GetFlushTool() self._setup_external_app_radios(flush_list, daemon.GetFlushTool,
flush_list[flush_method].set_active(True) daemon.SetFlushTool)
#flush_method = daemon.GetFlushTool()
#flush_list[flush_method].set_active(True)
sudo_list = [self.sudoautoradio, self.gksudoradio, self.kdesuradio,
self.ktsussradio]
self._setup_external_app_radios(sudo_list, daemon.GetSudoApp,
daemon.SetAudoApp)
auto_conn_meth = daemon.GetWiredAutoConnectMethod() auto_conn_meth = daemon.GetWiredAutoConnectMethod()
if auto_conn_meth == 1: if auto_conn_meth == 1:
@@ -186,6 +225,16 @@ class PreferencesDialog(object):
flush_tool = misc.ROUTE flush_tool = misc.ROUTE
daemon.SetFlushTool(flush_tool) daemon.SetFlushTool(flush_tool)
if self.sudoautoradio.get_active():
sudo_tool = misc.AUTO
elif self.gksudoradio.get_active():
sudo_tool = misc.GKSUDO
elif self.kdesuradio.get_active():
sudo_tool = misc.KDESU
else:
sudo_tool = misc.KTSUSS
daemon.SetSudoApp(sudo_tool)
[width, height] = self.dialog.get_size() [width, height] = self.dialog.get_size()
daemon.WriteWindowSize(width, height, "pref") daemon.WriteWindowSize(width, height, "pref")
@@ -290,6 +339,12 @@ class PreferencesDialog(object):
self.ipflushradio = setup_label("ip_flush_radio") self.ipflushradio = setup_label("ip_flush_radio")
self.routeflushradio = setup_label("route_flush_radio") self.routeflushradio = setup_label("route_flush_radio")
# Graphical Sudo Apps
self.sudoautoradio = setup_label("sudo_auto_radio", "wicd_auto_config")
self.gksudoradio = setup_label("gksudo_radio")
self.kdesuradio = setup_label("kdesu_radio")
self.ktsussradio = setup_label("ktsuss_radio")
# Replacement for the combo box hack # Replacement for the combo box hack
self.wpadrivercombo = build_combobox("pref_wpa_combobox") self.wpadrivercombo = build_combobox("pref_wpa_combobox")
self.wpadrivers = ["wext", "hostap", "madwifi", "atmel", self.wpadrivers = ["wext", "hostap", "madwifi", "atmel",
@@ -317,10 +372,9 @@ class PreferencesDialog(object):
# Load backend combobox # Load backend combobox
self.backends = daemon.GetBackendList() self.backends = daemon.GetBackendList()
self.be_descriptions = daemon.GetBackendDescriptionDict() self.be_descriptions = daemon.GetBackendDescriptionDict()
# "" is included as a hack for DBus limitations, so we remove it.
self.backends.remove("")
for x in self.backends: for x in self.backends:
if x:
self.backendcombo.append_text(x) self.backendcombo.append_text(x)
def be_combo_changed(self, combo): def be_combo_changed(self, combo):

View File

@@ -99,6 +99,7 @@ class WicdDaemon(dbus.service.Object):
self.dhcp_client = 0 self.dhcp_client = 0
self.link_detect_tool = 0 self.link_detect_tool = 0
self.flush_tool = 0 self.flush_tool = 0
self.sudo_app = 0
# This will speed up the scanning process - if a client doesn't # 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 # need a fresh scan, just feed them the old one. A fresh scan
@@ -570,6 +571,11 @@ class WicdDaemon(dbus.service.Object):
""" """
return bool(self.need_profile_chooser) return bool(self.need_profile_chooser)
@dbus.service.method("org.wicd.daemon")
def GetAppAvailable(self, app):
""" Determine if a given application is available."""
return bool(self.wifi.AppAvailable(app) or self.wired.AppAvailable(app))
@dbus.service.method('org.wicd.daemon') @dbus.service.method('org.wicd.daemon')
def GetDHCPClient(self): def GetDHCPClient(self):
""" Returns the current DHCP client constant. """ Returns the current DHCP client constant.
@@ -631,6 +637,17 @@ class WicdDaemon(dbus.service.Object):
self.wifi.flush_tool = int(flush_tool) self.wifi.flush_tool = int(flush_tool)
self.config.set("Settings", "flush_tool", flush_tool, write=True) self.config.set("Settings", "flush_tool", flush_tool, write=True)
@dbus.service.method('org.wicd.daemon')
def GetSudoApp(self):
""" Get the preferred sudo app. """
return self.sudo_app
@dbus.service.method('org.wicd.daemon')
def SetSudoApp(self, sudo_app):
""" Set the preferred sudo app. """
self.sudo_app = sudo_app
self.config.set("Settings", "sudo_app", sudo_app, write=True)
@dbus.service.method('org.wicd.daemon') @dbus.service.method('org.wicd.daemon')
def WriteWindowSize(self, width, height, win_name): def WriteWindowSize(self, width, height, win_name):
""" Write the desired default window size. """ Write the desired default window size.
@@ -814,7 +831,6 @@ class WicdDaemon(dbus.service.Object):
b_wired = self.wired_bus b_wired = self.wired_bus
b_wifi = self.wireless_bus b_wifi = self.wireless_bus
app_conf= self.config app_conf= self.config
verbose = True
# Load the backend. # Load the backend.
be_def = 'external' be_def = 'external'
self.SetBackend(app_conf.get("Settings", "backend", default=be_def)) self.SetBackend(app_conf.get("Settings", "backend", default=be_def))
@@ -854,6 +870,7 @@ class WicdDaemon(dbus.service.Object):
self.SetLinkDetectionTool(app_conf.get("Settings", "link_detect_tool", self.SetLinkDetectionTool(app_conf.get("Settings", "link_detect_tool",
default=0)) default=0))
self.SetFlushTool(app_conf.get("Settings", "flush_tool", default=0)) self.SetFlushTool(app_conf.get("Settings", "flush_tool", default=0))
self.SetSudoApp(app_conf.get("Settings", "sudo_app", default=0))
self.SetPreferWiredNetwork(app_conf.get("Settings", "prefer_wired", self.SetPreferWiredNetwork(app_conf.get("Settings", "prefer_wired",
default=False)) default=False))
app_conf.write() app_conf.write()

View File

@@ -38,6 +38,7 @@ from string import maketrans, translate
import wpath import wpath
import misc import misc
from misc import find_path
RALINK_DRIVER = 'ralink legacy' RALINK_DRIVER = 'ralink legacy'
@@ -160,11 +161,6 @@ class BaseInterface(object):
self.iface = _sanitize_string_strict(iface) self.iface = _sanitize_string_strict(iface)
self.verbose = verbose self.verbose = verbose
self.DHCP_CLIENT = None self.DHCP_CLIENT = None
self.DHCP_CMD = None
self.DHCP_RELEASE = None
self.MIITOOL_FOUND = False
self.ETHTOOL_FOUND = False
self.IP_FOUND = False
self.flush_tool = None self.flush_tool = None
self.link_detect = None self.link_detect = None
@@ -181,112 +177,82 @@ class BaseInterface(object):
""" """
self.iface = _sanitize_string_strict(str(iface)) self.iface = _sanitize_string_strict(str(iface))
def _find_client_path(self, client): def _find_program_path(self, program):
""" Determines the full path for the given program. """ Determines the full path for the given program.
Searches a hardcoded list of paths for a given program name. Searches for a given program name on the PATH.
Keyword arguments: Keyword arguments:
client -- The name of the program to search for program -- The name of the program to search for
Returns: Returns:
The full path of the program or None The full path of the program or None
""" """
paths = ['/sbin/', '/usr/sbin/', '/bin/', '/usr/bin/', path = find_path(program)
'/usr/local/sbin/', '/usr/local/bin/'] if not path and self.verbose:
for path in paths: print "WARNING: No path found for %s" % program
if os.path.exists("%s%s" % (path, client)): return path
return "%s%s" % (path, client)
if self.verbose:
print "WARNING: No path found for %s" % (client)
return None
def CheckDHCP(self):
""" Check for a valid DHCP client.
Checks for the existence of a supported DHCP client. If one is def _get_dhcp_command(self, flavor=None):
found, the appropriate values for DHCP_CMD, DHCP_RELEASE, and """ Returns the correct DHCP client command.
DHCP_CLIENT are set. If a supported client is not found, a
warning is printed. Given a type of DHCP request (create or release a lease),
this method will build a command to complete the request
using the correct dhcp client, and cli options.
""" """
def get_client_name(cl): def get_client_name(cl):
""" Converts the integer value for a dhcp client to a string. """ """ Converts the integer value for a dhcp client to a string. """
if cl in [misc.DHCLIENT, "dhclient"]: if (cl in [misc.DHCLIENT, "dhclient"] or
(cl == misc.AUTO and self.dhclient_cmd)):
client = "dhclient" client = "dhclient"
elif cl in [misc.DHCPCD, "dhcpcd"]: cmd = self.dhclient_cmd
elif (cl in [misc.DHCPCD, "dhcpcd"] or
(cl == misc.AUTO and self.dhcpcd_cmd)):
client = "dhcpcd" client = "dhcpcd"
else: cmd = self.dhcpcd_cmd
elif (cl in [misc.PUMP, "pump"] or
(cl == misc.AUTO and self.pump_cmd)):
client = "pump" client = "pump"
return client cmd = self.pump_cmd
if self.DHCP_CLIENT:
dhcp_client = get_client_name(self.DHCP_CLIENT)
dhcp_path = self._find_client_path(dhcp_client)
if not dhcp_path:
print "WARNING: Could not find selected dhcp client. Wicd " + \
" will try to find another supported client."
if not self.DHCP_CLIENT or not dhcp_path:
dhcp_client = None
dhcp_path = None
dhcpclients = ["dhclient", "dhcpcd", "pump"]
for client in dhcpclients:
dhcp_path = self._find_client_path(client)
if dhcp_path:
dhcp_client = client
break
if not dhcp_client:
print "WARNING: No supported DHCP Client could be found!"
return
elif dhcp_client in [misc.DHCLIENT, "dhclient"]:
dhcp_client = misc.DHCLIENT
dhcp_cmd = dhcp_path
dhcp_release = dhcp_cmd + " -r"
elif dhcp_client in [misc.PUMP, "pump"]:
dhcp_client = misc.PUMP
dhcp_cmd = dhcp_path + " -i"
dhcp_release = dhcp_cmd + " -r -i"
elif dhcp_client in [misc.DHCPCD, "dhcpcd"]:
dhcp_client = misc.DHCPCD
dhcp_cmd = dhcp_path
dhcp_release = dhcp_cmd + " -k"
else: else:
dhcp_client = None client = None
dhcp_cmd = None cmd = ""
dhcp_release = None return (client, cmd)
self.DHCP_CMD = dhcp_cmd connect_dict = {
self.DHCP_RELEASE = dhcp_release "dhclient" : r"%s %s",
self.DHCP_CLIENT = dhcp_client "pump" : r"%s -i %s",
"dhcpcd" : r"%s %s",
}
release_dict = {
"dhclient" : r"%s -r %s",
"pump" : r"%s -r -i %s",
"dhcpcd" : r"%s -k %s",
}
(client_name, cmd) = get_client_name(self.DHCP_CLIENT)
if not client_name or not cmd:
print "WARNING: Failed to find a valid dhcp client!"
return ""
def CheckWiredTools(self): if flavor == "connect":
""" Check for the existence of ethtool and mii-tool. """ return connect_dict[client_name] % (cmd, self.iface)
miitool_path = self._find_client_path("mii-tool") elif flavor == "release":
if miitool_path: return release_dict[client_name] % (cmd, self.iface)
self.miitool_cmd = miitool_path
self.MIITOOL_FOUND = True
else: else:
self.miitool_cmd = None return str(cmd)
self.MIITOOL_FOUND = False
ethtool_path = self._find_client_path("ethtool") def AppAvailable(self, app):
if ethtool_path: """ Return whether a given app is available.
self.ethtool_cmd = ethtool_path
self.ETHTOOL_FOUND = True
else:
self.ethtool_cmd = None
self.ETHTOOL_FOUND = False
def CheckWirelessTools(self): Given the name of an executable, determines if it is
""" Check for the existence of wpa_cli """ available for use by checking for a defined 'app'_cmd
wpa_cli_path = self._find_client_path("wpa_cli") instance variable.
if wpa_cli_path:
self.WPA_CLI_FOUND = True """
else: return bool(self.__dict__.get("%s_cmd" % app.replace("-", "")))
self.WPA_CLI_FOUND = False
print "wpa_cli not found. Authentication will not be validated."
def Check(self): def Check(self):
""" Check that all required tools are available. """ """ Check that all required tools are available. """
@@ -294,14 +260,43 @@ class BaseInterface(object):
self.CheckDHCP() self.CheckDHCP()
self.CheckWiredTools() self.CheckWiredTools()
self.CheckWirelessTools() self.CheckWirelessTools()
self.CheckSudoApplications()
self.CheckRouteFlushTool()
ip_path = self._find_client_path("ip") def CheckDHCP(self):
if ip_path: """ Check for the existence of valid DHCP clients.
self.ip_cmd = ip_path
self.IP_FOUND = True Checks for the existence of a supported DHCP client. If one is
else: found, the appropriate values for DHCP_CMD, DHCP_RELEASE, and
self.ip_cmd = None DHCP_CLIENT are set. If a supported client is not found, a
self.IP_FOUND = False warning is printed.
"""
self.dhclient_cmd = self._find_program_path("dhclient")
self.dhcpcd_cmd = self._find_program_path("dhcpcd")
self.pump_cmd = self._find_program_path("pump")
def CheckWiredTools(self):
""" Check for the existence of ethtool and mii-tool. """
self.miitool_cmd = self._find_program_path("mii-tool")
self.ethtool_cmd = self._find_program_path("ethtool")
def CheckWirelessTools(self):
""" Check for the existence of wpa_cli """
self.wpa_cli_cmd = self._find_program_path("wpa_cli")
if not self.wpa_cli_cmd:
print "wpa_cli not found. Authentication will not be validated."
def CheckRouteFlushTool(self):
""" Check for a route flush tool. """
self.ip_cmd = self._find_program_path("ip")
self.route_cmd = self._find_program_path("route")
def CheckSudoApplications(self):
self.gksudo_cmd = self._find_program_path("gksudo")
self.kdesu_cmd = self._find_program_path("kdesu")
self.ktsuss_cmd = self._find_program_path("ktsuss")
def Up(self): def Up(self):
""" Bring the network interface up. """ Bring the network interface up.
@@ -461,7 +456,8 @@ class BaseInterface(object):
""" """
if not self.iface: return False if not self.iface: return False
cmd = self.DHCP_CMD + " " + self.iface cmd = "%s %s" % (self._get_dhcp_command('connect'), self.iface)
#cmd = self.DHCP_CMD + " " + self.iface
if self.verbose: print cmd if self.verbose: print cmd
pipe = misc.Run(cmd, include_stderr=True, return_pipe=True) pipe = misc.Run(cmd, include_stderr=True, return_pipe=True)
@@ -476,19 +472,20 @@ class BaseInterface(object):
def ReleaseDHCP(self): def ReleaseDHCP(self):
""" Release the DHCP lease for this interface. """ """ Release the DHCP lease for this interface. """
if not self.iface: return False if not self.iface: return False
cmd = self.DHCP_RELEASE + " " + self.iface cmd = "%s %s" % (self._get_dhcp_command("release"), self.iface)
#cmd = self.DHCP_RELEASE + " " + self.iface
if self.verbose: print cmd if self.verbose: print cmd
misc.Run(cmd) misc.Run(cmd)
def FlushRoutes(self): def FlushRoutes(self):
""" Flush all network routes. """ """ Flush all network routes. """
if not self.iface: return False if not self.iface: return False
if self.IP_FOUND and self.flush_tool == misc.IP: if self.route_cmd and self.flush_tool == misc.ROUTE:
#cmd = "ip route flush dev " + self.iface cmds = ['%s del default' % self.route_cmd]
cmds = ['ip route flush all']
else:
cmds = ['route del default']
cmds.append('route del dev %s' % self.iface) cmds.append('route del dev %s' % self.iface)
elif self.ip_cmd and self.flush_tool == misc.IP:
#cmd = "ip route flush dev " + self.iface
cmds = ['%s route flush all' % self.ip_cmd]
for cmd in cmds: for cmd in cmds:
if self.verbose: print cmd if self.verbose: print cmd
misc.Run(cmd) misc.Run(cmd)