/
crontab.py
72 lines (64 loc) · 2.39 KB
/
crontab.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import os
import subprocess
from shutil import copyfile
import dotbot
class Crontab(dotbot.Plugin):
# Dotbot methods
_comment = "#dotbot-crontab"
_directive = "crontab"
_temp_file = 'out.txt'
def can_handle(self, directive):
return directive == self._directive
def handle(self, directive, data):
if directive != self._directive:
self._log.error("We can't handle {}".format(directive))
return False
try:
cronjob_rows = []
for entry in data:
row = "{} {} {}".format(
entry["cron"], entry["command"], self._comment)
self._log.lowinfo("Add {}".format(row))
cronjob_rows.append(row)
self._read_cron_file(cronjob_rows)
self._log.info("All cron have been sync")
return True
except ValueError as e:
self._log.error(e)
return False
def _read_cron_file(self, rows):
try:
backup_file = self._temp_file + '.bak2'
with open(self._temp_file, 'w+') as fout:
out = subprocess.call(["crontab", '-l'], stdout=fout)
copyfile(self._temp_file,backup_file)
except Exception as e:
self._log.error(e)
self._delete_line(self._temp_file)
with open(self._temp_file, "a") as file_object:
for row in rows:
file_object.write("{}\n".format(row))
subprocess.call(["crontab", "-r"])
exit_code = subprocess.call(["crontab", self._temp_file])
if exit_code != 0:
exit_code = subprocess.call(["crontab", backup_file])
if exit_code == 0:
os.remove(backup_file)
os.remove(self._temp_file)
def _delete_line(self, original_file):
try:
is_skipped = False
dummy_file = original_file + '.bak'
with open(original_file, 'r') as read_obj, open(dummy_file, 'w+') as write_obj:
for line in read_obj:
if not self._comment in line:
write_obj.write(line)
else:
is_skipped = True
if is_skipped:
os.remove(original_file)
os.rename(dummy_file, original_file)
else:
os.remove(dummy_file)
except Exception as e:
self._log.error(e)