[stable-2.9] cron - Use the default crontab executable in cron and cronvar modules (#59765)

In some remote environments, the `crontab` executable is
overloaded with a custom executable, which typically does
some pre/post processing before forwarding to crontab.

Instead of using the hardcoded `/usr/bin/crontab`, this uses
the `get_bin_path` utility to locate the default crontab executable.
(cherry picked from commit 951a80c8b0)

Co-authored-by: Jean-Frédéric <JeanFred@users.noreply.github.com>
pull/62561/head
Jean-Frédéric 5 years ago committed by Toshio Kuratomi
parent 0b7fec8b11
commit 7f7acd915a

@ -0,0 +1,2 @@
bugfixes:
- cron and cronvar - use get_bin_path utility to locate the default crontab executable instead of the hardcoded /usr/bin/crontab. (https://github.com/ansible/ansible/pull/59765)

@ -216,9 +216,6 @@ from ansible.module_utils.basic import AnsibleModule, get_platform
from ansible.module_utils.six.moves import shlex_quote from ansible.module_utils.six.moves import shlex_quote
CRONCMD = "/usr/bin/crontab"
class CronTabError(Exception): class CronTabError(Exception):
pass pass
@ -512,28 +509,30 @@ class CronTab(object):
Returns the command line for reading a crontab Returns the command line for reading a crontab
""" """
user = '' user = ''
cron_cmd = self.module.get_bin_path('crontab', required=True)
if self.user: if self.user:
if platform.system() == 'SunOS': if platform.system() == 'SunOS':
return "su %s -c '%s -l'" % (shlex_quote(self.user), shlex_quote(CRONCMD)) return "su %s -c '%s -l'" % (shlex_quote(self.user), shlex_quote(cron_cmd))
elif platform.system() == 'AIX': elif platform.system() == 'AIX':
return "%s -l %s" % (shlex_quote(CRONCMD), shlex_quote(self.user)) return "%s -l %s" % (shlex_quote(cron_cmd), shlex_quote(self.user))
elif platform.system() == 'HP-UX': elif platform.system() == 'HP-UX':
return "%s %s %s" % (CRONCMD, '-l', shlex_quote(self.user)) return "%s %s %s" % (cron_cmd, '-l', shlex_quote(self.user))
elif pwd.getpwuid(os.getuid())[0] != self.user: elif pwd.getpwuid(os.getuid())[0] != self.user:
user = '-u %s' % shlex_quote(self.user) user = '-u %s' % shlex_quote(self.user)
return "%s %s %s" % (CRONCMD, user, '-l') return "%s %s %s" % (cron_cmd, user, '-l')
def _write_execute(self, path): def _write_execute(self, path):
""" """
Return the command line for writing a crontab Return the command line for writing a crontab
""" """
cron_cmd = self.module.get_bin_path('crontab', required=True)
user = '' user = ''
if self.user: if self.user:
if platform.system() in ['SunOS', 'HP-UX', 'AIX']: if platform.system() in ['SunOS', 'HP-UX', 'AIX']:
return "chown %s %s ; su '%s' -c '%s %s'" % (shlex_quote(self.user), shlex_quote(path), shlex_quote(self.user), CRONCMD, shlex_quote(path)) return "chown %s %s ; su '%s' -c '%s %s'" % (shlex_quote(self.user), shlex_quote(path), shlex_quote(self.user), cron_cmd, shlex_quote(path))
elif pwd.getpwuid(os.getuid())[0] != self.user: elif pwd.getpwuid(os.getuid())[0] != self.user:
user = '-u %s' % shlex_quote(self.user) user = '-u %s' % shlex_quote(self.user)
return "%s %s %s" % (CRONCMD, user, shlex_quote(path)) return "%s %s %s" % (cron_cmd, user, shlex_quote(path))
def main(): def main():

@ -108,8 +108,6 @@ import tempfile
from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.six.moves import shlex_quote from ansible.module_utils.six.moves import shlex_quote
CRONCMD = "/usr/bin/crontab"
class CronVarError(Exception): class CronVarError(Exception):
pass pass
@ -292,30 +290,32 @@ class CronVar(object):
""" """
Returns the command line for reading a crontab Returns the command line for reading a crontab
""" """
cron_cmd = self.module.get_bin_path('crontab', required=True)
user = '' user = ''
if self.user: if self.user:
if platform.system() == 'SunOS': if platform.system() == 'SunOS':
return "su %s -c '%s -l'" % (shlex_quote(self.user), shlex_quote(CRONCMD)) return "su %s -c '%s -l'" % (shlex_quote(self.user), shlex_quote(cron_cmd))
elif platform.system() == 'AIX': elif platform.system() == 'AIX':
return "%s -l %s" % (shlex_quote(CRONCMD), shlex_quote(self.user)) return "%s -l %s" % (shlex_quote(cron_cmd), shlex_quote(self.user))
elif platform.system() == 'HP-UX': elif platform.system() == 'HP-UX':
return "%s %s %s" % (CRONCMD, '-l', shlex_quote(self.user)) return "%s %s %s" % (cron_cmd, '-l', shlex_quote(self.user))
elif pwd.getpwuid(os.getuid())[0] != self.user: elif pwd.getpwuid(os.getuid())[0] != self.user:
user = '-u %s' % shlex_quote(self.user) user = '-u %s' % shlex_quote(self.user)
return "%s %s %s" % (CRONCMD, user, '-l') return "%s %s %s" % (cron_cmd, user, '-l')
def _write_execute(self, path): def _write_execute(self, path):
""" """
Return the command line for writing a crontab Return the command line for writing a crontab
""" """
cron_cmd = self.module.get_bin_path('crontab', required=True)
user = '' user = ''
if self.user: if self.user:
if platform.system() in ['SunOS', 'HP-UX', 'AIX']: if platform.system() in ['SunOS', 'HP-UX', 'AIX']:
return "chown %s %s ; su '%s' -c '%s %s'" % (shlex_quote(self.user), shlex_quote(path), shlex_quote(self.user), CRONCMD, shlex_quote(path)) return "chown %s %s ; su '%s' -c '%s %s'" % (shlex_quote(self.user), shlex_quote(path), shlex_quote(self.user), cron_cmd, shlex_quote(path))
elif pwd.getpwuid(os.getuid())[0] != self.user: elif pwd.getpwuid(os.getuid())[0] != self.user:
user = '-u %s' % shlex_quote(self.user) user = '-u %s' % shlex_quote(self.user)
return "%s %s %s" % (CRONCMD, user, shlex_quote(path)) return "%s %s %s" % (cron_cmd, user, shlex_quote(path))
# ================================================== # ==================================================

Loading…
Cancel
Save