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

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

bugfix autoremove

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