root/trunk/bcfg2/src/lib/Client/Tools/SMF.py

Revision 4923, 5.9 kB (checked in by solj, 2 months ago)

Pylint formatting fixes for client tool drivers

  • Property svn:keywords set to Revision Id
Line 
1 '''SMF support for Bcfg2'''
2 __revision__ = '$Revision$'
3
4 import glob, os
5 import Bcfg2.Client.Tools
6
7 class SMF(Bcfg2.Client.Tools.Tool):
8     '''Support for Solaris SMF Services'''
9     __handles__ = [('Service', 'smf')]
10     __execs__ = ['/usr/sbin/svcadm', '/usr/bin/svcs']
11     __name__ = 'SMF'
12     __req__ = {'Service':['name', 'status']}
13     __ireq__ = {'Service': ['name', 'status', 'FMRI']}
14
15     def GetFMRI(self, entry):
16         '''Perform FMRI resolution for service'''
17         if not entry.attrib.has_key('FMRI'):
18             name = self.cmd.run("/usr/bin/svcs -H -o FMRI %s 2>/dev/null" % \
19                                 entry.get('name'))[1]
20             if name:
21                 entry.set('FMRI', name[0])
22                 return True
23             else:
24                 self.logger.info('Failed to locate FMRI for service %s' % \
25                                  entry.get('name'))
26                 return False
27         return True
28    
29     def VerifyService(self, entry, _):
30         '''Verify SMF Service Entry'''
31         if not self.GetFMRI(entry):
32             self.logger.error("smf service %s doesn't have FMRI set" % \
33                               entry.get('name'))
34             return False
35         if entry.get('FMRI').startswith('lrc'):
36             filename = entry.get('FMRI').split('/')[-1]
37             # this is a legacy service
38             gname = "/etc/rc*.d/%s" % filename
39             files = glob.glob(gname.replace('_', '.'))
40             if files:
41                 self.logger.debug("Matched %s with %s" % \
42                                   (entry.get("FMRI"), ":".join(files)))
43                 return entry.get('status') == 'on'
44             else:
45                 self.logger.debug("No service matching %s" % (entry.get("FMRI")))
46                 return entry.get('status') == 'off'
47         try:
48             srvdata = self.cmd.run("/usr/bin/svcs -H -o STA %s" % \
49                                    entry.get('FMRI'))[1][0].split()
50         except IndexError:
51             # Ocurrs when no lines are returned (service not installed)
52             return False
53
54         if entry.get('status') == 'on':
55             return srvdata[0] == 'ON'
56         else:
57             return srvdata[0] in ['OFF', 'UN', 'MNT', 'DIS', 'DGD']
58
59     def InstallService(self, entry):
60         '''Install SMF Service Entry'''
61         self.logger.info("Installing Service %s" % (entry.get('name')))
62         if entry.get('status') == 'off':
63             if entry.get("FMRI").startswith('lrc'):
64                 try:
65                     loc = entry.get("FMRI")[4:].replace('_', '.')
66                     self.logger.debug("Renaming file %s to %s" % \
67                                       (loc, loc.replace('/S', '/DISABLED.S')))
68                     os.rename(loc, loc.replace('/S', '/DISABLED.S'))
69                     return True
70                 except OSError:
71                     self.logger.error("Failed to rename init script %s" % (loc))
72                     return False
73             else:
74                 cmdrc = self.cmd.run("/usr/sbin/svcadm disable %s" % \
75                                      (entry.get('FMRI')))[0]
76         else:
77             if entry.get('FMRI').startswith('lrc'):
78                 loc = entry.get("FMRI")[4:].replace('_', '.')
79                 try:
80                     os.stat(loc.replace('/S', '/Disabled.'))
81                     self.logger.debug("Renaming file %s to %s" % \
82                                       (loc.replace('/S', '/DISABLED.S'), loc))
83                     os.rename(loc.replace('/S', '/DISABLED.S'), loc)
84                     cmdrc = 0
85                 except OSError:
86                     self.logger.debug("Failed to rename %s to %s" \
87                                       % (loc.replace('/S', '/DISABLED.S'), loc))
88                     cmdrc = 1
89             else:
90                 srvdata = self.cmd.run("/usr/bin/svcs -H -o STA %s" %
91                                        entry.get('FMRI'))[1] [0].split()
92                 if srvdata[0] == 'MNT':
93                     cmdarg = 'clear'
94                 else:
95                     cmdarg = 'enable'
96                 cmdrc = self.cmd.run("/usr/sbin/svcadm %s -r %s" % \
97                                      (cmdarg, entry.get('FMRI')))[0]
98         return cmdrc == 0
99
100     def Remove(self, svcs):
101         '''Remove Extra SMF entries'''
102         # Extra service entry removal is nonsensical
103         # Extra service entries should be reflected in config, even if disabled
104         pass
105
106     def FindExtra(self):
107         '''Find Extra SMF Services'''
108         allsrv = [name for name, version in \
109                   [srvc.split() for srvc in
110                    self.cmd.run("/usr/bin/svcs -a -H -o FMRI,STATE")[1]]
111                   if version != 'disabled']
112
113         [allsrv.remove(svc.get('FMRI')) for svc in self.getSupportedEntries() \
114          if svc.get("FMRI") in allsrv]
115         return [Bcfg2.Client.XML.Element("Service", type='smf', name=name) \
116                 for name in allsrv]
117
118     def BundleUpdated(self, bundle, states):
119         '''Restart smf services'''
120         for entry in [entry for entry in bundle if self.handlesEntry(entry)]:
121             if not self.canInstall(entry):
122                 self.logger.error("Insufficient information to restart service %s" % \
123                                   (entry.get('name')))
124             else:
125                 if entry.get("FMRI").startswith('lrc'):
126                     if entry.get('status') == 'on':
127                         self.logger.info("Restarting smf/lrc service %s"%(entry.get("name")))
128                         self.cmd.run("/etc/init.d/%s %s" % (entry.get('name'),
129                                                             entry.get('reload', 'reload')))
130                 else:
131                     if entry.get('status') == 'on':
132                         self.logger.info("Restarting smf service %s" % (entry.get("FMRI")))
133                         self.cmd.run("/usr/sbin/svcadm restart %s" % (entry.get("FMRI")))
134                     else:
135                         self.cmd.run("/usr/sbin/svcadm disable %s" % (entry.get("FMRI")))
136
Note: See TracBrowser for help on using the browser.