1 | #!/usr/bin/env python3 |
---|
2 | import gettext |
---|
3 | gettext.textdomain('taskscheduler') |
---|
4 | _ = gettext.gettext |
---|
5 | |
---|
6 | class cronParser(): |
---|
7 | def __init__(self): |
---|
8 | self.expr={'of':_('of'),'each':_('each'),'at':_('at'),'on':_('on'),'from':_('from'),\ |
---|
9 | 'to':_('to'),'and':_('and'),'the':_('the'),'in':_('in'),\ |
---|
10 | 'atm':_("at minute"),'min':_("minutes"),'emin':_('each minute'),'tmin':_('the minute'),\ |
---|
11 | 'ehour':_("each hour"),'h':_("hours"),'hoc':_("o'clock"),'evhour':_('every hour'),\ |
---|
12 | 'evday':_('everyday'),'lmd':_("last day"),'eday':_("each day"),'days':_('days'),\ |
---|
13 | 'day':_('day'),'evmon':_('every month'),'emon':_("each month"),'months':_('months'),\ |
---|
14 | 'evweek':_("every week"),'weeks':_("weeks"),'eweek':_("weekly")} |
---|
15 | self.dbg=0 |
---|
16 | |
---|
17 | def _debug(self,msg): |
---|
18 | if self.dbg: |
---|
19 | print("cronParser: %s"%msg) |
---|
20 | ### |
---|
21 | #Input: dict |
---|
22 | ### |
---|
23 | def parse_taskData(self,taskData): |
---|
24 | self._debug ("parsing: "+str(taskData)) |
---|
25 | parsed_data=[] |
---|
26 | parsed_calendar='' |
---|
27 | expr={} |
---|
28 | # day_dict={'1':_('Monday'),'2':_('Tuesday'),'3':_('Wednesday'),'4':_('Thursday'),'5':_('Friday'),\ |
---|
29 | # '6':_('Saturday'),'7':_('Sunday'),'*':'every'} |
---|
30 | day_dict={'1':_('Mon'),'2':_('Tue'),'3':_('Wed'),'4':_('Thu'),'5':_('Fri'),\ |
---|
31 | '6':_('Sat'),'7':_('Sun'),'*':'every'} |
---|
32 | # mon_dict={'1':_('January'),'2':_('February'),'3':_('March'),'4':_('April'),'5':_('May'),\ |
---|
33 | # '6':_('June'),'7':_('July'),'8':_('August'),'9':_('September'),'10':_('October'),\ |
---|
34 | # '11':_('November'),'12':_('December'),'*':'every'} |
---|
35 | mon_dict={'1':_('Jan'),'2':_('Feb'),'3':_('Mar'),'4':_('Apr'),'5':_('May'),\ |
---|
36 | '6':_('Jun'),'7':_('Jul'),'8':_('Aug'),'9':_('Sep'),'10':_('Oct'),\ |
---|
37 | '11':_('Nov'),'12':_('Dec'),'*':'every'} |
---|
38 | mon_expr=self._parse_cron_expression(taskData['mon'],mon_dict) |
---|
39 | dow_expr=self._parse_cron_expression(taskData['dow'],day_dict) |
---|
40 | if 'lmd' in taskData.keys(): |
---|
41 | dom_expr=self.expr['lmd'] |
---|
42 | else: |
---|
43 | dom_expr=self._parse_cron_expression(taskData['dom']) |
---|
44 | min_expr=self._parse_cron_expression(taskData['m']) |
---|
45 | hou_expr=self._parse_cron_expression(taskData['h']) |
---|
46 | time_expr=self._parse_time_expr(hou_expr,min_expr) |
---|
47 | date_expr=self._parse_date_expr(mon_expr,dow_expr,dom_expr) |
---|
48 | parsed_data=" ".join([time_expr,date_expr]) |
---|
49 | if parsed_data[0].isdigit(): |
---|
50 | parsed_calendar=self.expr['at'] +' ' + parsed_data |
---|
51 | else: |
---|
52 | parsed_calendar=parsed_data |
---|
53 | return parsed_calendar.capitalize() |
---|
54 | #def parse_taskData(self,taskData): |
---|
55 | |
---|
56 | def _parse_time_expr(self,hour,minute): |
---|
57 | sw_err=False |
---|
58 | try: |
---|
59 | int(hour) |
---|
60 | int(minute) |
---|
61 | except: |
---|
62 | sw_err=True |
---|
63 | if not sw_err: |
---|
64 | time_expr=hour+':'+minute |
---|
65 | else: |
---|
66 | if minute!='every': |
---|
67 | if hour.startswith(self.expr['each']): |
---|
68 | minute=self.expr['atm']+' '+minute |
---|
69 | else: |
---|
70 | if hour!='every': |
---|
71 | minute=minute+' '+self.expr['min'] |
---|
72 | else: |
---|
73 | minute=self.expr['emin'] |
---|
74 | if hour!='every': |
---|
75 | if hour.startswith(_('each')): |
---|
76 | if hour.endswith(' 1 '): |
---|
77 | hour=self.expr['ehour'] |
---|
78 | else: |
---|
79 | hour=hour+' '+self.expr['h'] |
---|
80 | else: |
---|
81 | hour="%s %s"%(hour,self.expr['hoc']) |
---|
82 | time_expr="%s %s" % (hour,minute) |
---|
83 | else: |
---|
84 | hour="%s"%(self.expr['evhour']) |
---|
85 | time_expr="%s %s %s %s" % (hour,self.expr['on'],self.expr['tmin'],minute) |
---|
86 | return time_expr |
---|
87 | #def parse_time_expr |
---|
88 | |
---|
89 | def _parse_date_expr(self,mon,dow,dom): |
---|
90 | sw_dom_err=False |
---|
91 | sw_mon_err=False |
---|
92 | time_expr='' |
---|
93 | try: |
---|
94 | int(dom) |
---|
95 | except: |
---|
96 | sw_dom_err=True |
---|
97 | try: |
---|
98 | int(mon) |
---|
99 | except: |
---|
100 | sw_mon_err=True |
---|
101 | time_expr="%s %s" % (dom,mon) |
---|
102 | if sw_dom_err: |
---|
103 | if dom=='every' or dom=='*': |
---|
104 | dom=self.expr['evday'] |
---|
105 | elif dom==self.expr['lmd']: |
---|
106 | pass |
---|
107 | elif 'every' in mon or mon=='*': |
---|
108 | if dom.startswith(self.expr['each']): |
---|
109 | if dom.endswith(' 1 '): |
---|
110 | dom=self.expr['eday'] |
---|
111 | else: |
---|
112 | self._debug(dom) |
---|
113 | interval=int(dom.rstrip(' ').split(' ')[-1]) |
---|
114 | if interval%7: |
---|
115 | dom="%s %s" % (dom,self.expr['days']) |
---|
116 | else: |
---|
117 | weeks=int(dom.rstrip(' ').split(' ')[-1])/7 |
---|
118 | if weeks==1: |
---|
119 | dom=self.expr['eweek'] |
---|
120 | else: |
---|
121 | dom="%s %s %s" % (self.expr['each'],int(weeks),self.expr['weeks']) |
---|
122 | else: |
---|
123 | dom="%s %s" % (self.expr['day'],dom) |
---|
124 | elif ',' in dom: |
---|
125 | dom="%s %s" % (self.expr['days'],dom) |
---|
126 | elif 'from' in dom: |
---|
127 | dom="%s %s" % (self.expr['days'],dom) |
---|
128 | elif dom.startswith(self.expr['each']): |
---|
129 | if dom.endswith(' 1 '): |
---|
130 | dom=self.expr['eday'] |
---|
131 | else: |
---|
132 | dom="%s %s" % (dom,self.expr['days']) |
---|
133 | else: |
---|
134 | # dom="%s %s %s" % (self.expr['on'],self.expr['day'],dom) |
---|
135 | dom="%s %s %s" % (self.expr['of'],self.expr['day'],dom) |
---|
136 | |
---|
137 | if sw_mon_err: |
---|
138 | if mon=='every' or mon =='*': |
---|
139 | if dow!='*' and dow!='every': |
---|
140 | # mon=self.expr['evweek'] |
---|
141 | mon='' |
---|
142 | else: |
---|
143 | mon=self.expr['evmon'] |
---|
144 | elif mon.startswith(self.expr['each']): |
---|
145 | if mon.endswith(' 1 '): |
---|
146 | mon=self.expr['emon'] |
---|
147 | else: |
---|
148 | mon="%s %s" % (mon,self.expr['months']) |
---|
149 | else: |
---|
150 | mon="%s %s" % (self,expr['mon'],mon) |
---|
151 | |
---|
152 | if dow!='every' and dow!='*': |
---|
153 | if mon==self.expr['emon'] or mon.startswith(self.expr['each']): |
---|
154 | time_expr="%s %s %s %s %s" % (self.expr['the'],dow,self.expr['in'],self.expr['evweek'],mon) |
---|
155 | else: |
---|
156 | if mon!=self.expr['emon'] and mon!=self.expr['evmon'] and mon!='': |
---|
157 | time_expr="%s %s %s %s" % (self.expr['the'],dow,self.expr['in'],mon) |
---|
158 | else: |
---|
159 | time_expr="%s %s" % (self.expr['the'],dow) |
---|
160 | else: |
---|
161 | if dom==self.expr['eday'] and mon==self.expr['emon']: |
---|
162 | time_expr="%s" % (self.expr['evday']) |
---|
163 | else: |
---|
164 | if dom.startswith(self.expr['each']): |
---|
165 | if mon!='*' and mon!=self.expr['evmon']: |
---|
166 | time_expr="%s %s %s" % (dom,self.expr['in'],mon) |
---|
167 | else: |
---|
168 | time_expr="%s" % (dom) |
---|
169 | else: |
---|
170 | if mon!=self.expr['evmon'] or (dom!=self.expr['evday'] and dom!=self.expr['eweek']): |
---|
171 | if dom==self.expr['evday']: |
---|
172 | dom=self.expr['eday'] |
---|
173 | time_expr="%s %s %s" % (dom,self.expr['in'],mon) |
---|
174 | else: |
---|
175 | time_expr="%s" % (dom) |
---|
176 | # time_expr="%s %s %s" % (self.expr['on'],dom,mon) |
---|
177 | # time_expr="%s %s %s" % (dom,self.expr['of'],mon) |
---|
178 | # if dom==self.expr['evday']: |
---|
179 | # time_expr="%s" % (dom) |
---|
180 | |
---|
181 | |
---|
182 | return time_expr |
---|
183 | #def parse_date_expr |
---|
184 | |
---|
185 | def _parse_cron_expression(self,data,description_dict={}): |
---|
186 | (each,at_values,range_values,extra_range,values)=('','','','','') |
---|
187 | # */2 -> Each two time units |
---|
188 | # 1-2 -> Range between 1 and 2 |
---|
189 | # 1,2 -> At 1 and 2 |
---|
190 | # 1 -> direct value |
---|
191 | if data in description_dict.keys(): |
---|
192 | values=description_dict[data] |
---|
193 | else: |
---|
194 | if '/' in data: |
---|
195 | expr=data.split('/') |
---|
196 | each=expr[-1] |
---|
197 | data=expr[0] |
---|
198 | if ',' in data: |
---|
199 | at_values=data.split(',') |
---|
200 | value_desc=[] |
---|
201 | for value in at_values: |
---|
202 | if '-' in value: |
---|
203 | extra_range=value |
---|
204 | else: |
---|
205 | if value in description_dict.keys(): |
---|
206 | value_desc.append(description_dict[value]) |
---|
207 | at_values=value_desc |
---|
208 | if '-' in data or extra_range: |
---|
209 | if extra_range: |
---|
210 | data=extra_range |
---|
211 | range_values=data.split('-') |
---|
212 | value_desc=[] |
---|
213 | for value in range_values: |
---|
214 | if value in description_dict.keys(): |
---|
215 | value_desc.append(description_dict[value]) |
---|
216 | if value_desc: |
---|
217 | range_values=value_desc |
---|
218 | (str_range,str_each,str_at)=('','','') |
---|
219 | if range_values: |
---|
220 | str_range="%s %s %s %s " % (self.expr['from'],range_values[0],self.expr['to'],range_values[1]) |
---|
221 | if each: |
---|
222 | str_each="%s %s " % (self.expr['each'],each) |
---|
223 | if at_values: |
---|
224 | if range_values: |
---|
225 | str_at="%s %s %s %s" % (self.expr['and'],', '.join(at_values[:-1]),self.expr['and'],at_values[-1]) |
---|
226 | else: |
---|
227 | str_at="%s %s %s" % (', '.join(at_values[:-1]),self.expr['and'],at_values[-1]) |
---|
228 | |
---|
229 | retval=str_range+str_at+str_each+values |
---|
230 | if retval=='': |
---|
231 | if len(data)<2 and data!='*': |
---|
232 | data='0'+data |
---|
233 | elif data=='*': |
---|
234 | data='every' |
---|
235 | retval=data |
---|
236 | return (retval.rstrip('\n')) |
---|
237 | #def parse_cron_expression |
---|