source: taskScheduler/trunk/fuentes/server-scheduler.install/usr/share/n4d/python-plugins/ServerScheduler.py @ 6078

Last change on this file since 6078 was 6078, checked in by Juanma, 2 years ago

Initial Release

File size: 4.0 KB
Line 
1#!/usr/bin/env python
2######
3#Scheduler library for Lliurex
4#Add to N4D the scheduled tasks
5#This class reads the json file with the scheduled tasks and
6#distributes the info among the clients
7
8import os
9import json
10
11class ServerScheduler():
12        def __init__(self):
13                self.dbg=1
14                self.taskDir="/etc/scheduler/tasks.d"
15                self.schedTasksDir=self.taskDir+"/scheduled"
16                self.remote_tasks_dir=self.schedTasksDir+"/remote"
17                self.crondir="/etc/cron.d"
18                self.cronPrefix="scheduler-"
19                self.status=0
20                self.errormsg=''
21                sw_readErr=False
22        #def __init__
23
24        def _debug(self,msg):
25                if (self.dbg):
26                        print("Scheduler: %s" % msg)
27        #def _debug
28
29        def get_tasks(self):
30                scheduled_tasks=[]
31                wrkfiles=self._get_wrkfiles()
32                for wrkfile in wrkfiles:
33                        content=self._read_tasks_file(wrkfile)
34                        if not self.readErr:
35                                scheduled_tasks.append(content)
36                self._debug("Tasks loaded")
37                self._debug(str(scheduled_tasks))
38                return(scheduled_tasks)
39        #def get_tasks
40
41        def _get_wrkfiles(self):
42                if not os.path.isdir(self.remote_tasks_dir):
43                        os.makedirs(self.remote_tasks_dir)
44
45                wrkfiles=[]
46                for f in os.listdir(self.remote_tasks_dir):
47                        wrkfiles.append(self.remote_tasks_dir+'/'+f)
48                return wrkfiles
49
50        def _read_tasks_file(self,wrkfile):
51                self._debug("Opening %s" % wrkfile)
52                self.readErr=0
53                tasks={}
54                if os.path.isfile(wrkfile):
55                        try:
56                                tasks=json.loads(open(wrkfile).read())
57                        except :
58                                self.errormsg=(("unable to open %s") % wrkfile)
59                                self._debug(self.errormsg)
60                                self.readErr=1
61                return(tasks)
62        #def _read_tasks_file
63       
64        def remove_task(self,task_name,task_serial,task_cmd):
65                self._debug("Removing task from system")
66                sw_del=False
67                wrkfile=self.remote_tasks_dir+'/'+task_name
68                wrkfile=wrkfile.replace(' ','_')
69                task=self._read_tasks_file(wrkfile)
70                if task_name in task.keys():
71                        if task_serial in task[task_name].keys():
72                                del task[task_name][task_serial]
73                                self._debug("Task deleted")
74                                sw_del=True
75
76                if sw_del:
77                        task=self._serialize_task(task)
78                        with open(wrkfile,'w') as json_data:
79                                json.dump(task,json_data,indent=4)
80                        self._register_cron_update()
81                return True
82
83        def _serialize_task(self,task):
84                serial_task={}
85                for name,task_data in task.items():
86                        cont=0
87                        serial_task[name]={}
88                        for serial,data in task_data.items():
89                                serial_task[name].update({cont+1:data})
90                                cont+=1
91                return(serial_task)
92
93        def write_tasks(self,tasks):
94                self._debug("Writing remote task info")
95                task_name=list(tasks.keys())[0]
96                task_serial=list(tasks[task_name].keys())[0]
97                self._debug(tasks)
98                serialized_task={}
99                sched_tasks={}
100                if not os.path.isdir(self.remote_tasks_dir):
101                        os.makedirs(self.remote_tasks_dir)
102
103                wrkfile=self.remote_tasks_dir+'/'+task_name
104                wrkfile=wrkfile.replace(' ','_')
105                if os.path.isfile(wrkfile):
106                        sched_tasks=json.loads(open(wrkfile).read())
107                        serial=len(sched_tasks[task_name])
108                        if task_serial in sched_tasks[task_name].keys():
109                                self._debug("Modify item %s" % serial)
110                                sched_tasks[task_name][task_serial]=tasks[task_name][task_serial]
111                                #Modify
112                        else:
113                                #Add
114                                self._debug("Add item %s" % serial)
115                                serialized_data={}
116                                serialized_data[serial+1]=tasks[task_name][task_serial]
117                                sched_tasks[task_name].update(serialized_data)
118                else:
119                        self._debug("Add new item 1 to %s"%wrkfile)
120                        tasks[task_name]={"1":tasks[task_name]["0"]}
121                        sched_tasks=tasks.copy()
122
123                try:
124                        with open(wrkfile,'w') as json_data:
125                                json.dump(sched_tasks,json_data,indent=4)
126                except Exception as e:
127                        print(e)
128                self._register_cron_update()
129                self._debug("%s updated" % task_name)
130        #def write_tasks
131
132        def _register_cron_update(self):
133                self._debug("Registering trigger var")
134                val=0
135                if not objects["VariablesManager"].get_variable("SCHEDULED_TASKS"):
136                        self._debug("Initializing trigger var")
137                        objects["VariablesManager"].add_variable("SCHEDULED_TASKS",{},"","Scheduled tasks trigger","n4d-scheduler-server",False,False)
138                val=objects["VariablesManager"].get_variable("SCHEDULED_TASKS")
139                if not val:
140                        val=0
141                if val>=1000:
142                        val=0
143                val+=1
144                objects["VariablesManager"].set_variable("SCHEDULED_TASKS",val)
145                self._debug("New value is %s"%val)
Note: See TracBrowser for help on using the repository browser.