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

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

WIP

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