mirror of
https://github.com/gryf/wicd.git
synced 2025-12-18 20:10:20 +01:00
419 lines
16 KiB
Python
419 lines
16 KiB
Python
#!/usr/bin/env python3
|
|
|
|
"""prefs_curses.py -- Pretty, tabbable, console preferences dialog"""
|
|
|
|
# Copyright (C) 2008-2009 Andrew Psaltis
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# 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, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
# MA 02110-1301, USA.
|
|
|
|
import urwid
|
|
import urwid.curses_display
|
|
|
|
from wicd import misc
|
|
from wicd.translations import _
|
|
from curses_misc import SelText, DynWrap, DynRadioButton, ComboBox, TabColumns
|
|
|
|
daemon = None
|
|
wireless = None
|
|
wired = None
|
|
|
|
|
|
class PrefsDialog(urwid.WidgetWrap):
|
|
"""Preferences dialog."""
|
|
# pylint: disable-msg=W0231
|
|
def __init__(self, body, pos, ui, dbus=None):
|
|
global daemon, wireless, wired
|
|
|
|
self.thebackends = None
|
|
self.backends = None
|
|
self.wpadrivers = None
|
|
self.thedrivers = None
|
|
|
|
daemon = dbus['daemon']
|
|
wireless = dbus['wireless']
|
|
wired = dbus['wired']
|
|
|
|
width, height = ui.get_cols_rows()
|
|
height -= 3
|
|
# width = 80
|
|
# height = 20
|
|
# Stuff that goes at the top
|
|
|
|
header0_t = _('General Settings')
|
|
header1_t = _('External Programs')
|
|
header2_t = _('Advanced Settings')
|
|
self.header0 = urwid.AttrWrap(SelText(header0_t), 'tab active',
|
|
'focus')
|
|
self.header1 = urwid.AttrWrap(SelText(header1_t), 'body', 'focus')
|
|
self.header2 = urwid.AttrWrap(SelText(header2_t), 'body', 'focus')
|
|
title = ('Preferences')
|
|
|
|
# Blank line
|
|
_blank = urwid.Text('')
|
|
|
|
# Text in the widgets
|
|
|
|
# General Settings
|
|
net_cat_t = ('header', ('Network Interfaces'))
|
|
wired_t = ('editcp', ('Wired Interface') + ': ')
|
|
wless_t = ('editcp', ('Wireless Interface') + ':')
|
|
always_show_wired_t = _('Always show wired interface')
|
|
prefer_wired_t = _('Always switch to wired connection when available')
|
|
|
|
global_dns_cat_t = ('header', _('Global DNS servers'))
|
|
global_dns_t = ('editcp', _('Use global DNS servers'))
|
|
dns_dom_t = ('editcp', ' ' + _('DNS domain') + ': ')
|
|
search_dom_t = ('editcp', ' ' + _('Search domain') + ':')
|
|
dns1_t = ('editcp', ' ' + _('DNS server') + ' 1: ')
|
|
dns2_t = ('editcp', ' ' + _('DNS server') + ' 2: ')
|
|
dns3_t = ('editcp', ' ' + _('DNS server') + ' 3: ')
|
|
|
|
wired_auto_cat_t = ('header', _('Wired Autoconnect Settings'))
|
|
wired_auto_1_t = _('Use default profile on wired autoconnect')
|
|
wired_auto_2_t = _('Prompt for profile on wired autoconnect')
|
|
wired_auto_3_t = _('Use last used profile on wired autoconnect')
|
|
|
|
auto_reconn_cat_t = ('header', _('Automatic Reconnection'))
|
|
auto_reconn_t = _('Automatically reconnect on connection loss')
|
|
|
|
# External Programs
|
|
automatic_t = _('Automatic (recommended)')
|
|
|
|
dhcp_header_t = ('header', _('DHCP Client'))
|
|
# Automatic
|
|
dhcp1_t = 'dhclient'
|
|
dhcp2_t = 'dhcpcd'
|
|
dhcp3_t = 'pump'
|
|
dhcp4_t = 'udhcpc'
|
|
|
|
wired_detect_header_t = ('header', _('Wired Link Detection'))
|
|
wired1_t = 'ethtool'
|
|
wired2_t = 'mii-tool'
|
|
|
|
flush_header_t = ('header', _('Route Table Flushing'))
|
|
flush1_t = 'ip'
|
|
flush2_t = 'route'
|
|
|
|
# Advanced Settings
|
|
wpa_cat_t = ('header', _('WPA Supplicant'))
|
|
wpa_t = ('editcp', 'Driver:')
|
|
wpa_list = []
|
|
wpa_warn_t = ('important', _('You should almost always use wext as '
|
|
'the WPA supplicant driver'))
|
|
|
|
backend_cat_t = ('header', _('Backend'))
|
|
backend_t = _('Backend') + ':'
|
|
backend_list = []
|
|
|
|
debug_cat_t = ('header', _('Debugging'))
|
|
debug_mode_t = _('Enable debug mode')
|
|
|
|
wless_cat_t = ('header', _('Wireless Interface'))
|
|
use_dbm_t = _('Use dBm to measure signal strength')
|
|
verify_ap_t = _('Ping static gateways after connecting to verify '
|
|
'association')
|
|
|
|
# UI Widgets
|
|
|
|
# General Settings
|
|
self.net_cat = urwid.Text(net_cat_t)
|
|
self.wired_edit = \
|
|
urwid.AttrWrap(urwid.Edit(wired_t), 'editbx', 'editfc')
|
|
self.wless_edit = \
|
|
urwid.AttrWrap(urwid.Edit(wless_t), 'editbx', 'editfc')
|
|
self.prefer_wired_chkbx = urwid.CheckBox(prefer_wired_t)
|
|
self.global_dns_cat = urwid.Text(global_dns_cat_t)
|
|
# Default the global DNS settings to off. They will be reenabled later
|
|
# if so required.
|
|
global_dns_state = False
|
|
self.global_dns_checkb = urwid.CheckBox(global_dns_t, global_dns_state,
|
|
on_state_change=self.
|
|
global_dns_trigger)
|
|
self.search_dom = DynWrap(urwid.Edit(search_dom_t), global_dns_state)
|
|
self.dns_dom = DynWrap(urwid.Edit(dns_dom_t), global_dns_state)
|
|
self.dns1 = DynWrap(urwid.Edit(dns1_t), global_dns_state)
|
|
self.dns2 = DynWrap(urwid.Edit(dns2_t), global_dns_state)
|
|
self.dns3 = DynWrap(urwid.Edit(dns3_t), global_dns_state)
|
|
|
|
self.always_show_wired_checkb = urwid.CheckBox(always_show_wired_t)
|
|
|
|
self.wired_auto_l = []
|
|
self.wired_auto_cat = urwid.Text(wired_auto_cat_t)
|
|
self.wired_auto_1 = urwid.RadioButton(self.wired_auto_l,
|
|
wired_auto_1_t)
|
|
self.wired_auto_2 = urwid.RadioButton(self.wired_auto_l,
|
|
wired_auto_2_t)
|
|
self.wired_auto_3 = urwid.RadioButton(self.wired_auto_l,
|
|
wired_auto_2_t)
|
|
|
|
self.auto_reconn_cat = urwid.Text(auto_reconn_cat_t)
|
|
self.auto_reconn_checkb = urwid.CheckBox(auto_reconn_t)
|
|
generalLB = urwid.ListBox([
|
|
self.net_cat,
|
|
self.wless_edit, # _blank,
|
|
self.wired_edit,
|
|
self.always_show_wired_checkb,
|
|
self.prefer_wired_chkbx, _blank,
|
|
self.global_dns_cat,
|
|
self.global_dns_checkb, # _blank,
|
|
self.search_dom, self.dns_dom,
|
|
self.dns1, self.dns2, self.dns3, _blank,
|
|
self.wired_auto_cat,
|
|
self.wired_auto_1,
|
|
self.wired_auto_2,
|
|
self.wired_auto_3, _blank,
|
|
self.auto_reconn_cat,
|
|
self.auto_reconn_checkb
|
|
])
|
|
|
|
# External Programs tab
|
|
|
|
automatic_t = _('Automatic (recommended)')
|
|
|
|
self.dhcp_header = urwid.Text(dhcp_header_t)
|
|
self.dhcp_l = []
|
|
|
|
# Order of these is flipped in the actual interface,
|
|
# (2, 3, 1 -> dhcpcd, pump, dhclient), because dhclient often doesn't
|
|
# like to work on several distros.
|
|
self.dhcp0 = urwid.RadioButton(self.dhcp_l, automatic_t)
|
|
self.dhcp1 = DynRadioButton(self.dhcp_l, dhcp1_t)
|
|
self.dhcp2 = DynRadioButton(self.dhcp_l, dhcp2_t)
|
|
self.dhcp3 = DynRadioButton(self.dhcp_l, dhcp3_t)
|
|
self.dhcp4 = DynRadioButton(self.dhcp_l, dhcp4_t)
|
|
self.dhcp_l = [
|
|
self.dhcp0, self.dhcp1, self.dhcp2, self.dhcp3, self.dhcp4
|
|
]
|
|
|
|
self.wired_l = []
|
|
self.wired_detect_header = urwid.Text(wired_detect_header_t)
|
|
self.wired0 = urwid.RadioButton(self.wired_l, automatic_t)
|
|
self.wired1 = DynRadioButton(self.wired_l, wired1_t)
|
|
self.wired2 = DynRadioButton(self.wired_l, wired2_t)
|
|
self.wired_l = [self.wired0, self.wired1, self.wired2]
|
|
|
|
self.flush_l = []
|
|
self.flush_header = urwid.Text(flush_header_t)
|
|
self.flush0 = urwid.RadioButton(self.flush_l, automatic_t)
|
|
self.flush1 = DynRadioButton(self.flush_l, flush1_t)
|
|
self.flush2 = DynRadioButton(self.flush_l, flush2_t)
|
|
self.flush_l = [self.flush0, self.flush1, self.flush2]
|
|
|
|
externalLB = urwid.ListBox([
|
|
self.dhcp_header,
|
|
self.dhcp0, self.dhcp2, self.dhcp3, self.dhcp1, self.dhcp4,
|
|
_blank,
|
|
self.wired_detect_header,
|
|
self.wired0, self.wired1, self.wired2,
|
|
_blank,
|
|
self.flush_header,
|
|
self.flush0, self.flush1, self.flush2
|
|
])
|
|
|
|
# Advanced settings
|
|
|
|
self.wpa_cat = urwid.Text(wpa_cat_t)
|
|
self.wpa_cbox = ComboBox(wpa_t)
|
|
self.wpa_warn = urwid.Text(wpa_warn_t)
|
|
|
|
self.backend_cat = urwid.Text(backend_cat_t)
|
|
self.backend_cbox = ComboBox(backend_t)
|
|
|
|
self.debug_cat = urwid.Text(debug_cat_t)
|
|
self.debug_mode_checkb = urwid.CheckBox(debug_mode_t)
|
|
|
|
self.wless_cat = urwid.Text(wless_cat_t)
|
|
self.use_dbm_checkb = urwid.CheckBox(use_dbm_t)
|
|
self.verify_ap_checkb = urwid.CheckBox(verify_ap_t)
|
|
|
|
advancedLB = urwid.ListBox([
|
|
self.wpa_cat,
|
|
self.wpa_cbox, self.wpa_warn, _blank,
|
|
self.backend_cat,
|
|
self.backend_cbox, _blank,
|
|
self.debug_cat,
|
|
self.debug_mode_checkb, _blank,
|
|
self.wless_cat,
|
|
self.use_dbm_checkb, _blank,
|
|
self.verify_ap_checkb, _blank
|
|
])
|
|
|
|
headerList = [self.header0, self.header1, self.header2]
|
|
lbList = [generalLB, externalLB, advancedLB]
|
|
self.tab_map = {
|
|
self.header0: generalLB,
|
|
self.header1: externalLB,
|
|
self.header2: advancedLB
|
|
}
|
|
|
|
# self.load_settings()
|
|
|
|
self.tabs = TabColumns(headerList, lbList, _('Preferences'))
|
|
# pylint: disable-msg=E1101
|
|
self.__super.__init__(self.tabs)
|
|
|
|
def load_settings(self):
|
|
"""Load settings to be used in the dialog."""
|
|
# General Settings
|
|
# ComboBox does not like dbus.Strings as text markups. My fault. :/
|
|
wless_iface = str(daemon.GetWirelessInterface())
|
|
wired_iface = str(daemon.GetWiredInterface())
|
|
self.wless_edit.set_edit_text(wless_iface)
|
|
self.wired_edit.set_edit_text(wired_iface)
|
|
|
|
self.always_show_wired_checkb.set_state(
|
|
daemon.GetAlwaysShowWiredInterface())
|
|
self.prefer_wired_chkbx.set_state(daemon.GetPreferWiredNetwork())
|
|
# DNS
|
|
self.global_dns_checkb.set_state(daemon.GetUseGlobalDNS())
|
|
theDNS = daemon.GetGlobalDNSAddresses()
|
|
|
|
i = 0
|
|
for w in (self.dns1, self.dns2, self.dns3, self.dns_dom,
|
|
self.search_dom):
|
|
w.set_edit_text(misc.noneToBlankString(theDNS[i]))
|
|
i += 1
|
|
|
|
# Wired Automatic Connection
|
|
self.wired_auto_l[daemon.GetWiredAutoConnectMethod() - 1]
|
|
self.auto_reconn_checkb.set_state(daemon.GetAutoReconnect())
|
|
|
|
def find_avail(apps):
|
|
"""Find available apps."""
|
|
for app in apps[1:]:
|
|
app.set_sensitive(daemon.GetAppAvailable(app.get_label()))
|
|
|
|
# External Programs
|
|
find_avail(self.dhcp_l)
|
|
dhcp_method = daemon.GetDHCPClient()
|
|
self.dhcp_l[dhcp_method].set_state(True)
|
|
|
|
find_avail(self.wired_l)
|
|
wired_link_method = daemon.GetLinkDetectionTool()
|
|
self.wired_l[wired_link_method].set_state(True)
|
|
|
|
find_avail(self.flush_l)
|
|
flush_method = daemon.GetFlushTool()
|
|
self.flush_l[flush_method].set_state(True)
|
|
|
|
# Advanced settings
|
|
# wpa_supplicant janx
|
|
self.wpadrivers = wireless.GetWpaSupplicantDrivers()
|
|
self.wpadrivers.append("ralink_legacy")
|
|
self.wpadrivers.append('none')
|
|
# Same as above with the dbus.String
|
|
self.thedrivers = [str(w) for w in self.wpadrivers]
|
|
self.wpa_cbox.set_list(self.thedrivers)
|
|
|
|
# Pick where to begin first:
|
|
def_driver = daemon.GetWPADriver()
|
|
try:
|
|
self.wpa_cbox.set_focus(self.wpadrivers.index(def_driver))
|
|
except ValueError:
|
|
pass # It defaults to 0 anyway (I hope)
|
|
|
|
self.backends = daemon.GetBackendList()
|
|
self.thebackends = [str(w) for w in self.backends]
|
|
self.backend_cbox.set_list(self.thebackends)
|
|
cur_backend = daemon.GetSavedBackend()
|
|
try:
|
|
self.backend_cbox.set_focus(self.thebackends.index(cur_backend))
|
|
except ValueError:
|
|
self.backend_cbox.set_focus(0)
|
|
|
|
# Three last checkboxes
|
|
self.debug_mode_checkb.set_state(daemon.GetDebugMode())
|
|
self.use_dbm_checkb.set_state(daemon.GetSignalDisplayType())
|
|
self.verify_ap_checkb.set_state(daemon.GetShouldVerifyAp())
|
|
|
|
def save_settings(self):
|
|
"""Pushes the selected settings to the daemon.
|
|
This exact order is found in prefs.py"""
|
|
daemon.SetUseGlobalDNS(self.global_dns_checkb.get_state())
|
|
|
|
for i in [
|
|
self.dns1, self.dns2, self.dns3,
|
|
self.dns_dom, self.search_dom, self.dns_dom
|
|
]:
|
|
i.set_edit_text(i.get_edit_text().strip())
|
|
|
|
daemon.SetGlobalDNS(
|
|
self.dns1.get_edit_text(),
|
|
self.dns2.get_edit_text(),
|
|
self.dns3.get_edit_text(),
|
|
self.dns_dom.get_edit_text(),
|
|
self.search_dom.get_edit_text()
|
|
)
|
|
daemon.SetWirelessInterface(self.wless_edit.get_edit_text())
|
|
daemon.SetWiredInterface(self.wired_edit.get_edit_text())
|
|
daemon.SetWPADriver(self.wpadrivers[self.wpa_cbox.get_focus()[1]])
|
|
daemon.SetAlwaysShowWiredInterface(
|
|
self.always_show_wired_checkb.get_state()
|
|
)
|
|
daemon.SetAutoReconnect(self.auto_reconn_checkb.get_state())
|
|
daemon.SetDebugMode(self.debug_mode_checkb.get_state())
|
|
daemon.SetSignalDisplayType(int(self.use_dbm_checkb.get_state()))
|
|
daemon.SetShouldVerifyAp(int(self.verify_ap_checkb.get_state()))
|
|
daemon.SetPreferWiredNetwork(bool(self.prefer_wired_chkbx.get_state()))
|
|
if self.wired_auto_2.get_state():
|
|
daemon.SetWiredAutoConnectMethod(2)
|
|
elif self.wired_auto_3.get_state():
|
|
daemon.SetWiredAutoConnectMethod(3)
|
|
else:
|
|
daemon.SetWiredAutoConnectMethod(1)
|
|
|
|
daemon.SetBackend(self.backends[self.backend_cbox.get_focus()[1]])
|
|
|
|
# External Programs Tab
|
|
if self.dhcp0.get_state():
|
|
dhcp_client = misc.AUTO
|
|
elif self.dhcp1.get_state():
|
|
dhcp_client = misc.DHCLIENT
|
|
elif self.dhcp2.get_state():
|
|
dhcp_client = misc.DHCPCD
|
|
elif self.dhcp3.get_state():
|
|
dhcp_client = misc.PUMP
|
|
else:
|
|
dhcp_client = misc.UDHCPC
|
|
daemon.SetDHCPClient(dhcp_client)
|
|
|
|
if self.wired0.get_state():
|
|
link_tool = misc.AUTO
|
|
elif self.wired1.get_state():
|
|
link_tool = misc.ETHTOOL
|
|
else:
|
|
link_tool = misc.MIITOOL
|
|
daemon.SetLinkDetectionTool(link_tool)
|
|
|
|
if self.flush0.get_state():
|
|
flush_tool = misc.AUTO
|
|
elif self.flush1.get_state():
|
|
flush_tool = misc.IP
|
|
else:
|
|
flush_tool = misc.ROUTE
|
|
daemon.SetFlushTool(flush_tool)
|
|
|
|
def global_dns_trigger(self, check_box, new_state, user_data=None):
|
|
"""DNS CheckBox callback."""
|
|
for w in (self.dns1, self.dns2, self.dns3, self.dns_dom,
|
|
self.search_dom):
|
|
w.set_sensitive(new_state)
|
|
|
|
def ready_widgets(self, ui, body):
|
|
"""Build comboboxes."""
|
|
self.wpa_cbox.build_combobox(body, ui, 4)
|
|
self.backend_cbox.build_combobox(body, ui, 8)
|