source: taskscheduler/trunk/fuentes/server-scheduler.install/usr/share/n4d/python-plugins/SchedulerServer.py @ 6763

Last change on this file since 6763 was 6763, checked in by Juanma, 20 months ago

WIP on expert mode

File size: 5.5 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# -*- coding: utf-8 -*-
8import os
9import json
10
11class SchedulerServer():
12        def __init__(self):
13                self.dbg=1
14                self.taskDir="/etc/scheduler/tasks.d"
15                self.schedTasksDir=self.taskDir+"/scheduled"
16                self.available_tasks_dir="/etc/scheduler/conf.d/tasks"
17                self.custom_tasks=self.available_tasks_dir+"/personal.json"
18                self.remote_tasks_dir=self.taskDir+"/remote"
19                self.local_tasks_dir=self.taskDir+"/local"
20        #def __init__
21
22        def _debug(self,msg):
23                if (self.dbg):
24                        print("Scheduler: %s" %msg)
25        #def _debug
26
27        def get_tasks(self,sw_remote=False,available=False):
28                tasks={}
29                wrkfiles=self._get_wrkfiles(sw_remote,available)
30                self._debug(wrkfiles)
31                for wrkfile in wrkfiles:
32                        task=self._read_tasks_file(wrkfile)
33                        if task:
34                                tasks.update(task)
35                self._debug("Tasks loaded")
36                self._debug(str(tasks))
37                return({'status':True,'data':tasks})
38        #def get_tasks
39
40        def get_available_tasks(self):
41                tasks={}
42                wrkfiles=self._get_wrkfiles(available=True)
43                self._debug(wrkfiles)
44                for wrkfile in wrkfiles:
45                        task=self._read_tasks_file(wrkfile)
46                        if task:
47                                tasks.update(task)
48                self._debug(str(tasks))
49                return({'status':True,'data':tasks})
50
51        def _get_wrkfiles(self,sw_remote=False,available=False):
52                if available:
53                        wrk_dir=self.available_tasks_dir
54                else:
55                        if sw_remote:
56                                wrk_dir=self.remote_tasks_dir
57                        elif sw_remote==False:
58                                wrk_dir=self.local_tasks_dir
59                if not os.path.isdir(wrk_dir):
60                        os.makedirs(wrk_dir)
61                wrkfiles=[]
62                for f in os.listdir(wrk_dir):
63                        wrkfiles.append(wrk_dir+'/'+f)
64                return wrkfiles
65        #def _get_wrkfiles
66
67        def _read_tasks_file(self,wrkfile):
68                self._debug("Opening %s" % wrkfile)
69                tasks={}
70                if os.path.isfile(wrkfile):
71                        try:
72                                tasks=json.loads(open(wrkfile).read())
73                        except :
74                                errormsg=(("unable to open %s") % wrkfile)
75                                self._debug(errormsg)
76                return(tasks)
77        #def _read_tasks_file
78       
79        def remove_task(self,task_type,task_name,task_serial,task_cmd):
80                if task_type=='local':
81                        wrk_dir=self.local_tasks_dir
82                else:
83                        wrk_dir=self.remote_tasks_dir
84                self._debug("Removing task from system")
85                sw_del=False
86                msg=''
87                wrkfile=wrk_dir+'/'+task_name
88                wrkfile=wrkfile.replace(' ','_')
89                task=self._read_tasks_file(wrkfile)
90                if task_name in task.keys():
91                        if task_serial in task[task_name].keys():
92                                del task[task_name][task_serial]
93                                self._debug("Task deleted")
94                                sw_del=True
95
96                if sw_del:
97                        task=self._serialize_task(task)
98                        with open(wrkfile,'w') as json_data:
99                                json.dump(task,json_data,indent=4)
100                        self._register_cron_update()
101                return ({'status':sw_del,'data':msg})
102        #def remove_task
103
104        def _serialize_task(self,task):
105                serial_task={}
106                for name,task_data in task.items():
107                        cont=0
108                        serial_task[name]={}
109                        for serial,data in task_data.items():
110                                serial_task[name].update({cont+1:data})
111                                cont+=1
112                return(serial_task)
113        #def _serialize_task
114
115        def write_tasks(self,task_type,tasks):
116                if task_type=='local':
117                        wrk_dir=self.local_tasks_dir
118                else:
119                        wrk_dir=self.remote_tasks_dir
120                self._debug("Writing task info")
121                msg=''
122                status=True
123                task_name=list(tasks.keys())[0]
124                task_serial=list(tasks[task_name].keys())[0]
125                self._debug(tasks)
126                serialized_task={}
127                sched_tasks={}
128                if not os.path.isdir(wrk_dir):
129                        os.makedirs(wrk_dir)
130
131                wrkfile=wrk_dir+'/'+task_name
132                wrkfile=wrkfile.replace(' ','_')
133                if os.path.isfile(wrkfile):
134                        sched_tasks=json.loads(open(wrkfile).read())
135                        serial=len(sched_tasks[task_name])
136                        if task_serial in sched_tasks[task_name].keys():
137                                self._debug("Modify item %s" % serial)
138                                sched_tasks[task_name][task_serial]=tasks[task_name][task_serial]
139                                #Modify
140                        else:
141                                #Add
142                                self._debug("Add item %s" % serial)
143                                serialized_data={}
144                                serialized_data[serial+1]=tasks[task_name][task_serial]
145                                sched_tasks[task_name].update(serialized_data)
146                else:
147                        self._debug("Add new item 1 to %s"%wrkfile)
148                        tasks[task_name]={"1":tasks[task_name]["0"]}
149                        sched_tasks=tasks.copy()
150
151                try:
152                        with open(wrkfile,'w') as json_data:
153                                json.dump(sched_tasks,json_data,indent=4)
154                except Exception as e:
155                        msg=e
156                        status=False
157                self._register_cron_update()
158                self._debug("%s updated" % task_name)
159                return({'status':status,'data':msg})
160        #def write_tasks
161
162        def write_custom_task(self,cmd_name,cmd,parms):
163                status=True
164                msg=''
165                tasks={}
166                new_task={}
167                if os.path.isfile(self.custom_tasks):
168                        tasks=json.loads(open(self.custom_tasks).read())
169                        if not 'Personal' in tasks.keys():
170                                tasks['Personal']={}
171                else:
172                        tasks['Personal']={}
173                if '%s' in cmd:
174                        cmd=cmd.replace('%s','')
175                        new_task[cmd_name]=cmd+" '"+parms+"'"
176                else:
177                        new_task[cmd_name]=cmd+' '+parms
178                tasks['Personal'].update(new_task)
179                try:
180                        with open(self.custom_tasks,'w') as json_data:
181                                json.dump(tasks,json_data,indent=4)
182                except Exception as e:
183                        status=False
184                        msg=e
185                return({'status':status,'data':msg})
186        #def write_custom_task
187
188        def _register_cron_update(self):
189                self._debug("Registering trigger var")
190                val=0
191                if not objects["VariablesManager"].get_variable("SCHEDULED_TASKS"):
192                        self._debug("Initializing trigger var")
193                        objects["VariablesManager"].add_variable("SCHEDULED_TASKS",{},"","Scheduled tasks trigger","n4d-scheduler-server",False,False)
194                val=objects["VariablesManager"].get_variable("SCHEDULED_TASKS")
195                if not val:
196                        val=0
197                if val>=1000:
198                        val=0
199                val+=1
200                objects["VariablesManager"].set_variable("SCHEDULED_TASKS",val)
201                self._debug("New value is %s"%val)
202        #def _register_cron_update
Note: See TracBrowser for help on using the repository browser.