## Copyright (C) 2001-2005 Red Hat, Inc.
## Copyright (C) 2001, 2002 Than Ngo
## Copyright (C) 2001-2005 Harald Hoyer
## Copyright (C) 2001, 2002 Philipp Knirsch
## 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., 675 Mass Ave, Cambridge, MA 02139, USA.
import os.path
import re
from netconfpkg.NCDevice import Device
from netconfpkg.NCDeviceFactory import getDeviceFactory
from netconfpkg.NC_functions import (_, log, ConfDevices,
generic_longinfo_dialog, getDeviceType,
getRoot, OLDSYSCONFDEVICEDIR, QETH,
SYSCONFDEVICEDIR, updateNetworkScripts,
getCHAPConf, getPAPConf, IPSEC,
SYSCONFNETWORK, testFilename, unlink,
WVDIALCONF)
from netconfpkg.conf import ConfSMB, ConfShellVar
from netconfpkg.gdt import Gdtlist, gdtlist_properties
class DeviceList(Gdtlist):
gdtlist_properties(Device)
def load(self):
from netconfpkg.NCDevice import ConfDevice
updateNetworkScripts()
self.__delslice__(0, len(self))
df = getDeviceFactory()
devdir = getRoot() + SYSCONFDEVICEDIR
devices = []
log.log(5, "Checking %s" % devdir)
if os.path.isdir(devdir):
devices = ConfDevices()
if not devices:
log.log(5, "Checking %s" % devdir)
devdir = getRoot() + OLDSYSCONFDEVICEDIR
devices = ConfDevices(devdir)
for dev in devices:
log.log(5, "Checking %s" % dev)
if dev == 'lo':
continue
conf = ConfDevice(dev, devdir)
mtype = None
device = None
# take a peek in the config file
if conf.has_key("TYPE"):
mtype = conf["TYPE"]
if conf.has_key("DEVICE"):
device = conf["DEVICE"]
if conf.has_key("NETTYPE"):
if conf["NETTYPE"] == "qeth":
mtype = QETH
del conf
if mtype == "IPSEC":
continue
if not mtype or mtype == "" or mtype == _("Unknown"):
from netconfpkg import NCHardwareList
hwlist = NCHardwareList.getHardwareList()
for hw in hwlist:
if hw.Name == device:
mtype = hw.Type
break
else:
mtype = getDeviceType(device)
devclass = df.getDeviceClass(mtype)
if devclass:
newdev = devclass()
newdev.load(dev)
self.append(newdev)
# try:
# newdev.load(dev)
# except BaseException, e:
# # FIXME: better exception handling
# generic_error_dialog (_("Error loading file %s\n%s")
# % (devdir +
# "/ifcfg-" + dev, str(e)),
# dialog_type="error")
# else:
# self.append(newdev)
else:
log.log(1, "NO DEVICE CLASS FOUND FOR %s" % dev)
d = Device()
self.append(d)
d.load(dev)
self.commit()
self.setunmodified()
chdev = {}
# the initscripts do not like '-'
for dev in self:
newDeviceId = re.sub('-', '_', dev.DeviceId)
if newDeviceId != dev.DeviceId:
chdev[dev.DeviceId] = newDeviceId
#log.log(4, "%s != %s" % (newDeviceId, dev.DeviceId))
# Fixed change device names in active list of all profiles
import netconfpkg.NCProfileList
profilelist = netconfpkg.NCProfileList.getProfileList()
for prof in profilelist:
#log.log(4, str(prof.ActiveDevices))
if dev.DeviceId in prof.ActiveDevices:
pos = prof.ActiveDevices.index(dev.DeviceId)
prof.ActiveDevices[pos] = newDeviceId
#log.log(4, "changed %s" % (prof.ActiveDevices[pos]))
#log.log(4, str(prof.ActiveDevices))
prof.commit()
dev.DeviceId = newDeviceId
dev.commit()
dev.setunmodified()
if len(chdev.keys()):
s = _("Changed the following Nicknames due to the initscripts:\n")
for n, d in chdev.items():
s += "%s -> %s\n" % (n, d)
generic_longinfo_dialog(_("Nicknames changed"), s)
def addDeviceType(self, mtype):
df = getDeviceFactory()
devclass = df.getDeviceClass(mtype)
if devclass:
newdev = devclass()
self.append(newdev)
# else: # FIXME: !!
# generic_error_dialog()
return newdev
def test(self):
pass
def __repr__(self):
return repr(self.__dict__)
def tostr(self, prefix_string = None):
"returns a string in gdt representation"
#print "tostr %s " % prefix_string
if prefix_string == None:
prefix_string = self.__class__.__name__
mstr = ""
for value in self:
if isinstance(value, Device):
mstr += value.tostr("%s.%s.%s"
% (prefix_string, value.Type,
value.DeviceId))
return mstr
def fromstr(self, vals, value):
if len(vals) <= 1:
return
if vals[0] == "DeviceList":
del vals[0]
else:
return
for dev in self:
if dev.DeviceId == vals[1]:
if dev.Type != vals[0]:
self.pop(dev)
log.log(1, "Deleting device %s" % vals[1] )
break
dev.fromstr(vals[2:], value) # pylint: disable-msg=W0212
return
dev = self.addDeviceType(vals[0])
dev.DeviceId = vals[1]
dev.fromstr(vals[2:], value)
def save(self):
# FIXME: [163040] "Exception Occurred" when saving
# fail gracefully, with informing, which file, and why
from netconfpkg.NCDevice import ConfDevice
from types import DictType
self.commit()
nwconf = ConfShellVar.ConfShellVar(getRoot() + SYSCONFNETWORK)
if len(self) > 0:
nwconf["NETWORKING"] = "yes"
nwconf.write()
#
# clear all Dialer sections in wvdial.conf
# before the new Dialer sections written
#
wvdialconf = ConfSMB.ConfSMB(filename = getRoot() + WVDIALCONF)
for wvdialkey in wvdialconf.vars.keys():
if wvdialkey[:6] == 'Dialer':
del wvdialconf[wvdialkey]
wvdialconf.write()
#
# Clear all pap and chap-secrets generated by netconf
#
papconf = getPAPConf()
chapconf = getCHAPConf()
for key in papconf.keys():
if isinstance(papconf[key], DictType):
for server in papconf[key].keys():
papconf.delallitem([key, server])
del papconf[key]
for key in chapconf.keys():
if isinstance(chapconf[key], DictType):
for server in chapconf[key].keys():
chapconf.delallitem([key, server])
del chapconf[key]
#
# traverse all devices in the list
#
for dev in self:
#
# really save the device
#
#if dev.changed:
dev.save()
papconf.write()
chapconf.write()
dirname = getRoot() + SYSCONFDEVICEDIR
#
# Remove old config files
#
try:
mdir = os.listdir(dirname)
except OSError, msg:
raise IOError, 'Cannot save in ' \
+ dirname + ': ' + str(msg)
for entry in mdir:
if not testFilename(dirname + entry):
log.log(5, "not testFilename(%s)" % (dirname + entry))
continue
if (len(entry) <= 6) or \
entry[:6] != 'ifcfg-':
log.log(5, "not ifcfg %s" % (entry))
continue
devid = entry[6:]
for dev in self:
if dev.DeviceId == devid:
break
else:
# check for IPSEC
conf = ConfDevice(devid, mdir=dirname)
mtype = IPSEC
if conf.has_key("TYPE"):
mtype = conf["TYPE"]
if mtype == IPSEC:
log.log(5, "IPSEC %s" % (entry))
continue
# now remove the file
unlink(dirname + entry)
unlink(getRoot() + OLDSYSCONFDEVICEDIR + \
'/ifcfg-' + devid)
# remove old route files
for entry in mdir:
if not testFilename(dirname + entry):
continue
if (len(entry) <= 6) or \
entry[:6] != '.route':
continue
devid = entry[6:]
for dev in self:
if dev.DeviceId == devid:
break
else:
# remove route file, if no routes defined
unlink(dirname + entry)
unlink(getRoot() + OLDSYSCONFDEVICEDIR + \
devid + '.route')
# bug #78043
# we should have device specific gateways
# fixed this way, until we have a way to mark the
# default GATEWAY/GATEWAYDEV
cfg = ConfShellVar.ConfShellVar(getRoot() + SYSCONFNETWORK)
if cfg.has_key('GATEWAY'):
del cfg['GATEWAY']
if cfg.has_key('GATEWAYDEV'):
del cfg['GATEWAYDEV']
cfg.write()
self.commit()
self.setunmodified()
__DVList = None
__DVList_root = getRoot()
def getDeviceList(refresh = None):
# pylint: disable-msg=W0603
global __DVList
global __DVList_root
if __DVList == None or refresh or \
__DVList_root != getRoot():
__DVList = DeviceList()
__DVList.load()
__DVList_root = getRoot()
return __DVList
def getNextDev(base):
devlist = getDeviceList()
num = 0
for num in xrange(0, 100):
for dev in devlist:
if dev.Device == base + str(num):
break
else:
# no card seems to use this
break
return base + str(num) # pylint: disable-msg=W0631
__author__ = "Harald Hoyer "