source: taskscheduler/trunk/fuentes/client-scheduler.install/usr/share/n4d/python-plugins/SchedulerClient.py @ 7100

Last change on this file since 7100 was 7100, checked in by Juanma, 3 years ago

Add holidays support

  • Property svn:executable set to *
File size: 3.8 KB
Line 
1#!/usr/bin/env python
2###
3#
4###
5
6# -*- coding: utf-8 -*-
7import os,socket
8import threading
9import time
10from  datetime import date
11import xmlrpclib as xmlrpc
12
13class SchedulerClient():
14        def __init__(self):
15                self.cron_dir='/etc/cron.d'
16                self.task_prefix='remote-' #Temp workaround->Must be declared on a n4d var
17                self.cron_dir='/etc/cron.d'
18                self.count=0
19                self.dbg=1
20                self.holidays_shell="/usr/bin/check_holidays.sh"
21
22        def startup(self,options):
23                t=threading.Thread(target=self._main_thread)
24                t.daemon=True
25                t.start()
26
27        def _debug(self,msg):
28                if self.dbg:
29                        print(str(msg))
30
31        def _main_thread(self):
32                objects["VariablesManager"].register_trigger("SCHEDULED_TASKS","SchedulerClient",self.process_tasks)
33                tries=10
34                for x in range (0,tries):
35                        self.scheduler_var=objects["VariablesManager"].get_variable("SCHEDULED_TASKS")
36                        if self.scheduler_var!=self.count:
37                                self.count=self.scheduler_var
38                                self.process_tasks()
39                                break
40                        else:
41                                time.sleep(1)
42
43        def process_tasks(self,data=None):
44                self._debug("Scheduling tasks")
45                today=date.today()
46                prefixes={'remote':True,'local':False}
47                tasks={}
48                try:
49                        socket.gethostbyname('server')
50                except:
51                                prefixes={'local':False}
52                for prefix,sw_remote in prefixes.iteritems():
53                        if prefix=='remote':
54                                n4d=xmlrpc.ServerProxy("https://server:9779")
55                                tasks=n4d.get_remote_tasks("","SchedulerServer")['data'].copy()
56                        else:
57                                n4d=xmlrpc.ServerProxy("https://localhost:9779")
58                                tasks=n4d.get_local_tasks("","SchedulerServer")['data'].copy()
59
60                        #Delete files
61                        for f in os.listdir(self.cron_dir):
62                                if f.startswith(prefix):
63                                        os.remove(self.cron_dir+'/'+f)
64                        #Create the cron files
65                        for name in tasks.keys():
66                                task_names={}
67                                self._debug("Processing task: %s"%name)
68                                for serial in tasks[name].keys():
69                                        self._debug("Item %s"%serial)
70                                        sw_pass=False
71                                        if 'autoremove' in tasks[name][serial]:
72                                                if (tasks[name][serial]['mon'].isdigit()):
73                                                        mon=int(tasks[name][serial]['mon'])
74                                                        if mon<today.month:
75                                                                sw_pass=True
76                                                if sw_pass==False:
77                                                        if (tasks[name][serial]['dom'].isdigit()):
78                                                                dom=int(tasks[name][serial]['dom'])
79                                                                if dom<today.day:
80                                                                        sw_pass=True
81                                        if sw_pass:
82                                                continue
83                                        self._debug("Scheduling %s"%name)
84                                        fname=name.replace(' ','_')
85                                        task_names[fname]=tasks[name][serial].copy()
86                                        self._write_crontab_for_task(task_names,prefix)
87
88        #def process_tasks
89
90        def _write_crontab_for_task(self,ftask,prefix):
91                cron_array=[]
92                for task_name,task_data in ftask.iteritems():
93                        self._debug("Writing data %s: %s"%(task_name,task_data))
94                        fname=self.cron_dir+'/'+prefix+task_name.replace(' ','_')
95                        if 'holidays' in task_data.keys():
96                                cron_task=("%s %s %s %s %s root %s && %s"%(task_data['m'],task_data['h'],task_data['dom'],\
97                                                        task_data['mon'],task_data['dow'],self.holidays_shell,u""+task_data['cmd']))
98                        else:
99                                cron_task=("%s %s %s %s %s root %s"%(task_data['m'],task_data['h'],task_data['dom'],\
100                                                        task_data['mon'],task_data['dow'],u""+task_data['cmd']))
101                        cron_array.append(cron_task)
102                        if task_data:
103                                if os.path.isfile(fname):
104                                        mode='a'
105                                else:
106                                        mode='w'
107                                with open(fname,mode) as data:
108                                        if mode=='w':
109                                                data.write('#Scheduler tasks\n')
110                                                data.write('SHELL=/bin/bash\n')
111                                                data.write('PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\n')
112                                                data.write('DISPLAY=:0\n')
113                                                data.write('XAUTHORITY=/var/run/lightdm/root/:0\n')
114                                                if 'https_proxy' in os.environ.keys():
115                                                        https_proxy=os.environ['https_proxy']
116                                                        data.write('https_proxy=%s\n'%https_proxy)
117                                                if 'http_proxy' in os.environ.keys():
118                                                        http_proxy=os.environ['http_proxy']
119                                                        data.write('http_proxy=%s\n'%http_proxy)
120                                        for cron_line in cron_array:
121                                                data.write(cron_line.encode('utf8')+"\n")
122        #def _write_crontab_for_task
123
Note: See TracBrowser for help on using the repository browser.