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

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