summaryrefslogtreecommitdiff
path: root/src/conf-mode/vyatta-update-crontab.py
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2017-09-07 02:50:23 +0200
committerDaniil Baturin <daniil@baturin.org>2017-09-07 02:50:23 +0200
commit76a7790b6b4f45253109c2863522724a0fe06904 (patch)
treea2d222100ed0c57604b60bb118643ec15a108a58 /src/conf-mode/vyatta-update-crontab.py
parentc106f822c84941f9470169e55aeb09cf6b479ae5 (diff)
parentce0758ee620e2c2b04724e74e8561682fad23f58 (diff)
downloadvyos-1x-76a7790b6b4f45253109c2863522724a0fe06904.tar.gz
vyos-1x-76a7790b6b4f45253109c2863522724a0fe06904.zip
Merge branch 'current' of https://github.com/vyos/vyos-1x into current
Diffstat (limited to 'src/conf-mode/vyatta-update-crontab.py')
-rwxr-xr-xsrc/conf-mode/vyatta-update-crontab.py169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/conf-mode/vyatta-update-crontab.py b/src/conf-mode/vyatta-update-crontab.py
new file mode 100755
index 000000000..381221bfb
--- /dev/null
+++ b/src/conf-mode/vyatta-update-crontab.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python3
+#
+#
+# Maintainer: Daniil Baturin <daniil@baturin.org>
+#
+# Copyright (C) 2013 SO3Group
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# 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, see <http://www.gnu.org/licenses/>.
+#
+#
+
+#!/usr/bin/env python3
+import io
+import re
+import sys
+sys.path.append("/usr/lib/python3/dist-packages/vyos/")
+
+from config import VyOSError, Config
+
+
+class CronTask(Config):
+ def __init__(self, task):
+
+ self.task = task
+ self.minutes = "*"
+ self.hours = "*"
+ self.days = "*"
+ self.user = "root"
+ self.executable = None
+ self.arguments = ""
+ self.interval = None
+ self.crontab_spec = None
+ self._cli_shell_api = "/bin/cli-shell-api"
+
+ # Unused now
+ self.months = "*"
+ self.days_of_week = "*"
+ super(CronTask, self).set_level("system task-scheduler task")
+ try:
+ self.user = super(CronTask, self).return_value(" ".join([self.task, "user"]))
+ except VyOSError:
+ pass
+
+ try:
+ byte_executable = super(CronTask, self).return_value(" ".join([self.task, "executable path"]))
+ self.executable = byte_executable.decode("utf-8")
+ except VyOSError:
+ raise VyOSError (task + "must define executable")
+
+ try:
+ byte_arguments = super(CronTask, self).return_value(" ".join([self.task, "executable arguments"]))
+ self.executable = byte_arguments.decode("utf-8")
+ except VyOSError:
+ pass
+
+ try:
+ self.interval = super(CronTask, self).return_value(" ".join([self.task, "interval"]))
+ except VyOSError:
+ self.interval = None
+
+ try:
+ byte_crontab_spec = super(CronTask, self).return_value(" ".join([self.task, "crontab-spec"]))
+ self.crontab_spec = byte_crontab_spec
+ except:
+ self.crontab_spec = None
+
+
+def get_config():
+ conf = Config()
+ conf.set_level("system task-scheduler task")
+ tasks = conf.list_nodes("")
+ list_of_instanses=[]
+ for task in tasks:
+ list_of_instanses.append(CronTask(task.decode("utf-8")))
+ return list_of_instanses
+
+
+def verify(config):
+ for task in config:
+ if task.interval and task.crontab_spec:
+ raise VyOSError(task, "can not use interval and crontab-spec at the same time!")
+
+ if task.interval:
+ result = re.search(b"(\d+)([mdh]?)", task.interval)
+ value = int(result.group(1))
+ suffix = result.group(2)
+
+
+ if not suffix or suffix == b"m":
+ if value > 60:
+ raise VyOSError("Interval in minutes must not exceed 60!")
+ task.minutes = "*/" + str(value)
+
+ elif suffix == b"h":
+ if value > 24:
+ raise VyOSError("Interval in hours must not exceed 24!")
+ task.minutes = "0"
+ task.hours = "*/" + str(value)
+
+ elif suffix == b"d":
+ if value > 31:
+ raise VyOSError("Interval in days must not exceed 31!")
+
+ task.minutes = "0"
+ task.hours = "0"
+ task.days = "*/" + str(value)
+ elif task.interval and task.crontab_spec:
+ raise VyOSError(task, "must define either interval or crontab-spec")
+ return None
+
+
+def generate(config):
+ crontab = "/etc/cron.d/vyatta-crontab"
+ crontab_header = "### Added by /opt/vyatta/sbin/vyatta-update-crontab.py ###\n"
+ crontab_append = crontab_header
+ count = 0
+ for task in config:
+ if task.interval:
+ crontab_string = "{minutes} {hours} {days} {months} {days_of_week} {user} {executable} {arguments}\n".format(
+ minutes=task.minutes,
+ hours=task.hours,
+ days=task.days,
+ months=task.months,
+ days_of_week=task.days_of_week,
+ user=task.user,
+ executable=task.executable,
+ arguments=task.arguments
+ )
+ elif task.crontab_spec:
+ crontab_string = "{crontab_spec) {user} {executable} {arguments}\n".format(
+ crontab_spec=task.crontab_spec,
+ user=task.user,
+ executable=task.executable,
+ arguments=task.arguments
+ )
+ crontab_append = crontab_append + crontab_string
+ count = count + 1
+ if count > 0:
+ try:
+ f = io.open(crontab, "w")
+ f.write(crontab_append)
+ f.close()
+ except IOError:
+ print("Could not open /etc/crontab for write")
+
+
+def apply(config):
+ pass
+
+
+if __name__ == '__main__':
+ try:
+ c = get_config()
+ verify(c)
+ generate(c)
+ apply(c)
+ except VyOSError:
+ sys.exit(0)
+