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

Last change on this file since 6866 was 6866, checked in by Juanma, 19 months ago

refactorized

  • Property svn:executable set to *
File size: 3.4 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=0
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                        task_names={}
65                        for name in tasks.keys():
66                                for serial in tasks[name].keys():
67                                        sw_pass=False
68                                        if 'autoremove' in tasks[name][serial]:
69                                                if type(tasks[name][serial]['m'])==type(int):
70                                                        if tasks[name][serial]['m']<today.month:
71                                                                sw_pass=True
72                                                if sw_pass==False:
73                                                        if type(tasks[name][serial]['d'])==type(int):
74                                                                if tasks[name][serial]['d']<today.day:
75                                                                        sw_pass=True
76                                        if sw_pass:
77                                                continue
78                                        self._debug("Scheduling %s"%name)
79                                        fname=name.replace(' ','_')
80                                        task_names[fname]=tasks[name][serial].copy()
81                                        self._write_crontab_for_task(task_names,prefix)
82
83        #def process_tasks
84
85        def _write_crontab_for_task(self,ftask,prefix):
86                cron_array=[]
87                for task_name,task_data in ftask.iteritems():
88                        self._debug("Writing data %s"%task_name)
89                        fname=self.cron_dir+'/'+prefix+task_name.replace(' ','_')
90                        cron_task=("%s %s %s %s %s root %s"%(task_data['m'],task_data['h'],task_data['dom'],\
91                                                        task_data['mon'],task_data['dow'],u""+task_data['cmd']))
92                        cron_array.append(cron_task)
93                        if task_data:
94                                if os.path.isfile(fname):
95                                        mode='a'
96                                else:
97                                        mode='w'
98                                with open(fname,mode) as data:
99                                        if mode=='w':
100                                                data.write('#Scheduler tasks\n')
101                                                data.write('SHELL=/bin/bash\n')
102                                                data.write('PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\n')
103                                                data.write('DISPLAY=:0\n')
104                                                data.write('XAUTHORITY=/var/run/lightdm/root/:0\n')
105                                                if 'https_proxy' in os.environ.keys():
106                                                        https_proxy=os.environ['https_proxy']
107                                                        data.write('https_proxy=%s\n'%https_proxy)
108                                                if 'http_proxy' in os.environ.keys():
109                                                        http_proxy=os.environ['http_proxy']
110                                                        data.write('http_proxy=%s\n'%http_proxy)
111                                        for cron_line in cron_array:
112                                                data.write(cron_line.encode('utf8')+"\n")
113        #def _write_crontab_for_task
114
Note: See TracBrowser for help on using the repository browser.