1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
'''This is the bcfg2 support for debian'''
__revision__ = '$Revision$'
from glob import glob
from os import environ, stat, system
from popen2 import Popen4
import apt_pkg
from Bcfg2.Client.Toolset import Toolset
class Debian(Toolset):
'''The Debian toolset implements package and service operations and inherits
the rest from Toolset.Toolset'''
__important__ = ["/etc/apt/sources.list", "/var/cache/debconf/config.dat", \
"/var/cache/debconf/templates.dat", '/etc/passwd', '/etc/group', \
'/etc/apt/apt.conf']
pkgtool = ('apt-get --reinstall -q=2 --force-yes -y install %s',
('%s=%s', ['name', 'version']))
def __init__(self, cfg, setup):
Toolset.__init__(self, cfg, setup)
self.cfg = cfg
environ["DEBIAN_FRONTEND"] = 'noninteractive'
system("dpkg --force-confold --configure -a")
if not self.setup['build']:
system("dpkg-reconfigure -f noninteractive debconf < /dev/null")
system("apt-get clean")
system("apt-get -q=2 -y update")
self.installed = {}
self.pkgwork = {'add':[], 'update':[], 'remove':[]}
self.extra_services = []
self.Refresh()
def Refresh(self):
'''Refresh memory hashes of packages'''
apt_pkg.init()
cache = apt_pkg.GetCache()
self.installed = {}
for pkg in cache.Packages:
if pkg.CurrentVer:
self.installed[pkg.Name] = pkg.CurrentVer.VerStr
# implement entry (Verify|Install) ops
def VerifyService(self, entry):
'''Verify Service status for entry'''
files = glob("/etc/rc*.d/*%s" % (entry.get('name')))
if entry.get('status') == 'off':
if files:
return False
else:
return True
else:
if files:
return True
else:
return False
def InstallService(self, entry):
'''Install Service for entry'''
cmdrc = 1
self.CondPrint('verbose', "Installing Service %s" % (entry.get('name')))
try:
stat('/etc/init.d/%s' % entry.get('name'))
except OSError:
self.CondPrint('debug', "Init script for service %s does not exist" % entry.get('name'))
return False
if entry.attrib['status'] == 'off':
if self.setup['dryrun']:
print "Disabling service %s" % (entry.get('name'))
else:
cmdrc = system("update-rc.d -f %s remove" % entry.get('name'))
else:
if self.setup['dryrun']:
print "Enabling service %s" % (entry.attrib['name'])
else:
cmdrc = system("update-rc.d %s defaults" % (entry.attrib['name']))
if cmdrc:
return False
return True
def VerifyPackage(self, entry, modlist):
'''Verify Package for entry'''
if self.installed.has_key(entry.attrib['name']):
if self.installed[entry.attrib['name']] == entry.attrib['version']:
if not self.setup['quick']:
cmd = Popen4("debsums -s %s"%(entry.attrib['name']))
cstat = cmd.poll()
output = cmd.fromchild.read()
while cstat == -1:
output += cmd.fromchild.read()
cstat = cmd.poll()
output = [line for line in output.split('\n') if line]
if [filename for filename in output if filename not in modlist]:
return False
return True
return False
def Inventory(self):
'''Do standard inventory plus debian extra service check'''
Toolset.Inventory(self)
allsrv = []
[allsrv.append(fname[14:]) for fname in glob("/etc/rc[12345].d/S*") if fname[14:] not in allsrv]
csrv = self.cfg.findall(".//Service")
[allsrv.remove(svc.get('name')) for svc in csrv if svc.get('status') == 'on' and svc.get('name') in allsrv]
self.extra_services = allsrv
def HandleExtra(self):
'''Deal with extra configuration detected'''
if len(self.pkgwork) > 0:
if self.setup['remove'] in ['all', 'packages']:
self.CondPrint('verbose', "Removing packages: %s" % self.pkgwork['remove'])
system("apt-get remove %s" % " ".join(self.pkgwork['remove']))
else:
self.CondPrint('verbose', "Need to remove packages: %s" % self.pkgwork['remove'])
if len(self.extra_services) > 0:
if self.setup['remove'] in ['all', 'services']:
self.CondPrint("Removing services: %s" % self.extra_services)
for service in self.extra_services:
system("rm -f /etc/rc*.d/S*%s" % service)
else:
self.CondPrint('verbose', "Need to remove services: %s" % self.extra_services)
|