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

Revision 5408, 5.4 KB (checked in by solj, 3 months ago)

Client tools: Remove unnecessary extra whitespace

Signed-off-by: Sol Jerome <solj@…>

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