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:
@@ -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"><b>Graphical Sudo Application</b></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>
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
@@ -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']
|
||||||
|
|||||||
33
wicd/misc.py
33
wicd/misc.py
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user