summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/conf-mode/vyatta-update-crontab.py154
1 files changed, 88 insertions, 66 deletions
diff --git a/src/conf-mode/vyatta-update-crontab.py b/src/conf-mode/vyatta-update-crontab.py
index 605742828..381221bfb 100755
--- a/src/conf-mode/vyatta-update-crontab.py
+++ b/src/conf-mode/vyatta-update-crontab.py
@@ -1,6 +1,5 @@
#!/usr/bin/env python3
#
-# vyatta-update-ctontab.pl: crontab generator
#
# Maintainer: Daniil Baturin <daniil@baturin.org>
#
@@ -20,71 +19,79 @@
#
#
+#!/usr/bin/env python3
import io
-import os
import re
import sys
sys.path.append("/usr/lib/python3/dist-packages/vyos/")
-import config
-from config import VyOSError
-
-def update_crontab():
- conf = config.Config()
- count = 0
+from config import VyOSError, Config
- default_user = "root"
- crontab = "/etc/cron.d/vyatta-crontab"
- crontab_header = "### Added by /opt/vyatta/sbin/vyatta-update-crontab.py ###\n"
- if not conf.exists("system task-scheduler task"):
- os.remove(crontab)
- return 0
- crontab_append = crontab_header
+class CronTask(Config):
+ def __init__(self, task):
- conf.set_level("system task-scheduler task")
- tasks = conf.list_nodes("")
-
- for task in tasks:
- task = task.decode("utf-8")
- minutes = "*"
- hours = "*"
- days = "*"
+ 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
- months = "*"
- days_of_week = "*"
+ self.months = "*"
+ self.days_of_week = "*"
+ super(CronTask, self).set_level("system task-scheduler task")
try:
- user = conf.return_value(" ".join([task, "user"]))
+ self.user = super(CronTask, self).return_value(" ".join([self.task, "user"]))
except VyOSError:
- user = default_user
+ pass
try:
- executable = conf.return_value(" ".join([task, "executable path"]))
- executable = executable.decode("utf-8")
+ 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:
- arguments = conf.return_value(" ".join([task, "executable arguments"]))
+ byte_arguments = super(CronTask, self).return_value(" ".join([self.task, "executable arguments"]))
+ self.executable = byte_arguments.decode("utf-8")
except VyOSError:
- arguments = ""
+ pass
try:
- interval = conf.return_value(" ".join([task, "interval"]))
+ self.interval = super(CronTask, self).return_value(" ".join([self.task, "interval"]))
except VyOSError:
- interval = None
+ self.interval = None
try:
- crontab_spec = conf.return_value(" ".join([task, "crontab-spec"]))
+ byte_crontab_spec = super(CronTask, self).return_value(" ".join([self.task, "crontab-spec"]))
+ self.crontab_spec = byte_crontab_spec
except:
- crontab_spec = None
+ 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
- if interval and crontab_spec:
+
+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 interval:
- result = re.search(b"(\d+)([mdh]?)", interval)
+ if task.interval:
+ result = re.search(b"(\d+)([mdh]?)", task.interval)
value = int(result.group(1))
suffix = result.group(2)
@@ -92,56 +99,71 @@ def update_crontab():
if not suffix or suffix == b"m":
if value > 60:
raise VyOSError("Interval in minutes must not exceed 60!")
- minutes = "*/" + str(value)
+ task.minutes = "*/" + str(value)
elif suffix == b"h":
if value > 24:
raise VyOSError("Interval in hours must not exceed 24!")
- minutes = "0"
- hours = "*/" + str(value)
+ task.minutes = "0"
+ task.hours = "*/" + str(value)
elif suffix == b"d":
if value > 31:
raise VyOSError("Interval in days must not exceed 31!")
- minutes = "0"
- hours = "0"
- days = "*/" + str(value)
+ 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=minutes,
- hours=hours,
- days=days,
- months=months,
- days_of_week=days_of_week,
- user=user,
- executable=executable,
- arguments=arguments
+ 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 crontab_spec:
+ elif task.crontab_spec:
crontab_string = "{crontab_spec) {user} {executable} {arguments}\n".format(
- crontab_spec=crontab_spec,
- user=user,
- executable=executable,
- arguments=arguments
+ crontab_spec=task.crontab_spec,
+ user=task.user,
+ executable=task.executable,
+ arguments=task.arguments
)
- else:
- raise VyOSError(task, "must define either interval or crontab-spec")
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")
- else:
- os.remove(crontab)
+ print("Could not open /etc/crontab for write")
+
+
+def apply(config):
+ pass
+
if __name__ == '__main__':
try:
- update_crontab()
-
+ c = get_config()
+ verify(c)
+ generate(c)
+ apply(c)
except VyOSError:
- sys.exit(0) \ No newline at end of file
+ sys.exit(0)
+