[gnome-schedule] Make sure get_job_data returns correct types on fail
- From: Gaute Hope <gauteh src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnome-schedule] Make sure get_job_data returns correct types on fail
- Date: Thu, 9 Jul 2009 11:54:44 +0000 (UTC)
commit e0b8db2ec9fb54d72425e4cabc6aa52ee5fd8228
Author: Gaute Hope <eg gaute vetsj com>
Date: Thu Jul 9 13:54:02 2009 +0200
Make sure get_job_data returns correct types on fail
src/crontab.py | 239 ++++++++++++++++++++++++++++----------------------------
1 files changed, 119 insertions(+), 120 deletions(-)
---
diff --git a/src/crontab.py b/src/crontab.py
index 9b30e2e..23042b6 100644
--- a/src/crontab.py
+++ b/src/crontab.py
@@ -35,7 +35,7 @@ class Crontab:
self.root = root
self.set_rights(user,uid,gid, user_home_dir)
self.user_home_dir = user_home_dir
-
+
self.output = ["",
">/dev/null 2>&1",
config.gs_dir + "/xwrapper.py",
@@ -45,10 +45,10 @@ class Crontab:
self.crontabRecordRegex = re.compile('([^\s]+)\s([^\s]+)\s([^\s]+)\s([^\s]+)\s([^\s]+)\s([^#\n$]*)(\s#\s([^\n$]*)|$)')
self.__setup_timespec__()
self.env_vars = [ ]
-
+
self.crontabdata = self.user_home_dir + "/.gnome/gnome-schedule/crontab"
self.crontabdatafileversion = 5
-
+
if os.path.exists (self.user_home_dir + "/.gnome") != True:
os.mkdir (self.user_home_dir + "/.gnome", 0700)
os.chown (self.user_home_dir + "/.gnome", self.uid, self.gid)
@@ -60,9 +60,9 @@ class Crontab:
os.chown (self.crontabdata, self.uid, self.gid)
except:
print _("Failed to create data dir! Make sure ~/.gnome and ~/.gnome/gnome-schedule are writable.")
-
-
-
+
+
+
def __setup_timespec__ (self):
self.special = {
"@reboot" : '@reboot',
@@ -74,9 +74,9 @@ class Crontab:
"@annually": '0 0 1 1 *',
"@midnight": '0 0 * * *'
}
-
- self.timeranges = {
- "minute" : range(0,60),
+
+ self.timeranges = {
+ "minute" : range(0,60),
"hour" : range(0,24),
"day" : range(1,32),
"month" : range(1,13),
@@ -90,7 +90,7 @@ class Crontab:
"month" : _("Month"),
"weekday" : _("Weekday")
}
-
+
self.monthnames = {
"1" : "jan",
"2" : "feb",
@@ -119,7 +119,7 @@ class Crontab:
"nov" : "11",
"dec" : "12"
}
-
+
self.downames = {
"0" : "sun",
"1" : "mon",
@@ -130,7 +130,7 @@ class Crontab:
"6" : "sat",
"7" : "sun"
}
-
+
self.downumbers = {
"sun" : "0",
"mon" : "1",
@@ -141,7 +141,7 @@ class Crontab:
"sat" : "6",
"sun" : "7"
}
-
+
def set_rights(self,user,uid,gid, ud):
self.user = user
@@ -163,7 +163,7 @@ class Crontab:
def get_type (self):
return "crontab"
-
+
def checkfield (self, expr, type):
"""Verifies format of Crontab timefields
@@ -173,15 +173,15 @@ class Crontab:
a "first to last" expression. Then the expression will be splitted
into the comma separated subexpressions.
- Each subexpression will run through:
+ Each subexpression will run through:
1. Check for stepwidth in range (if it has one)
2. Check for validness of range-expression (if it is one)
3. If it is no range: Check for simple numeric
4. If it is numeric: Check if it's in range
If one of this checks failed, an exception is raised. Otherwise it will
- do nothing. Therefore this function should be used with
- a try/except construct.
+ do nothing. Therefore this function should be used with
+ a try/except construct.
"""
# reboot?
@@ -193,8 +193,8 @@ class Crontab:
else:
timerange = self.timeranges[type]
- # Replace alias names only if no leading and following alphanumeric and
- # no leading slash is present. Otherwise terms like "JanJan" or
+ # Replace alias names only if no leading and following alphanumeric and
+ # no leading slash is present. Otherwise terms like "JanJan" or
# "1Feb" would give a valid check. Values after a slash are stepwidths
# and shouldn't have an alias.
if type == "month": alias = self.monthnames.copy()
@@ -207,7 +207,7 @@ class Crontab:
expr = re.sub("(?<!\w|/)" + value + "(?!\w)", key, expr)
expr = expr.replace("*", str(min(timerange)) + "-" + str(max(timerange)) )
-
+
list = expr.split(",")
rexp_step = re.compile("^(\d+-\d+)/(\d+)$")
rexp_range = re.compile("^(\d+)-(\d+)$")
@@ -218,23 +218,23 @@ class Crontab:
field = result.groups()[0]
if int(result.groups()[1]) not in timerange:
raise ValueError("stepwidth", self.timenames[type], _("Must be between %(min)s and %(max)s") % { "min": min(timerange), "max": max(timerange) } )
-
+
result = rexp_range.match(field)
- if (result != None):
+ if (result != None):
if (int(result.groups()[0]) not in timerange) or (int(result.groups()[1]) not in timerange):
raise ValueError("range", self.timenames[type], _("Must be between %(min)s and %(max)s") % { "min": min(timerange), "max": max(timerange) } )
elif field.isdigit() != True:
raise ValueError("fixed", self.timenames[type], _("%s is not a number") % ( field ) )
elif int(field) not in timerange:
raise ValueError("fixed", self.timenames[type], _("Must be between %(min)s and %(max)s") % { "min": min(timerange), "max": max(timerange) } )
-
+
def update (self, minute, hour, day, month, weekday, command, linenumber, parentiter, output, job_id, comment, title, desc):
if self.check_command (command) == False:
return False
-
+
# update crontab
-
+
easystring = self.__easy__ (minute, hour, day, month, weekday)
if job_id == False:
@@ -247,7 +247,7 @@ class Crontab:
last_id = 1
else:
last_id = int (r)
-
+
#print "last_id" + str (last_id)
job_id = last_id + 1
#print "job_id" + str (job_id)
@@ -262,8 +262,8 @@ class Crontab:
fh.close ()
os.chown (f, self.uid, self.gid)
- os.chmod (f, 0600)
-
+ os.chmod (f, 0600)
+
record = command
display = "0"
if output == 1:
@@ -278,15 +278,15 @@ class Crontab:
record = record + " " + self.output [3]
if minute == "@reboot":
- record = "@reboot " + record
+ record = "@reboot " + record
else:
- record = minute + " " + hour + " " + day + " " + month + " " + weekday + " " + record
+ record = minute + " " + hour + " " + day + " " + month + " " + weekday + " " + record
record = record + " # JOB_ID_" + str (job_id)
-
+
if title == None:
title = _("Untitled")
-
+
f = os.path.join (self.crontabdata, str(job_id))
#print f
fh = open (f, 'w')
@@ -296,24 +296,24 @@ class Crontab:
fh.write ("title=" + title + "\n")
fh.write ("desc=" + desc + "\n")
fh.write ("output=" + str (output) + "\n")
- fh.write ("display=" + display + "\n")
+ fh.write ("display=" + display + "\n")
fh.write ("command_d=" + command + "\n")
- fh.close ()
+ fh.close ()
os.chown (f, self.uid, self.gid)
os.chmod (f, 0600)
-
+
self.lines[linenumber] = record
-
+
# TODO: let write trow an exception if failed
self.__write__ ()
-
-
+
+
def delete (self, linenumber, iter, job_id):
# delete file
f = os.path.join (self.crontabdata, job_id)
if os.access(f, os.F_OK):
os.unlink (f)
-
+
number = 0
newlines = list ()
for line in self.lines:
@@ -324,18 +324,18 @@ class Crontab:
self.lines = newlines
# TODO: let write trow an exception if failed
self.__write__ ()
-
-
+
+
def append (self, minute, hour, day, month, weekday, command, output, title, desc = None):
if self.check_command (command) == False:
return False
-
+
if title == None:
title = _("Untitled")
-
+
if desc == None:
desc = ""
-
+
# Create and write data file
f = os.path.join (self.crontabdata, "last_id")
if os.access (f, os.R_OK):
@@ -345,23 +345,23 @@ class Crontab:
last_id = 1
else:
last_id = int (r)
-
-
+
+
job_id = last_id + 1
-
+
fh.seek (0)
fh.truncate (1)
fh.write ( str(job_id))
- fh.close ()
+ fh.close ()
else:
job_id = 1
fh = open (f, 'w')
fh.write ('1')
fh.close ()
-
+
os.chown (f, self.uid, self.gid)
os.chmod (f, 0600)
-
+
record = command
display = "0"
if output == 1:
@@ -378,12 +378,12 @@ class Crontab:
if minute == "@reboot":
record = "@reboot " + record
else:
- record = minute + " " + hour + " " + day + " " + month + " " + weekday + " " + record
+ record = minute + " " + hour + " " + day + " " + month + " " + weekday + " " + record
record = record + " # JOB_ID_" + str (job_id)
self.lines.append (record)
-
+
f = os.path.join (self.crontabdata, str(job_id))
fh = open (f, 'w')
fh.truncate (1)
@@ -392,14 +392,14 @@ class Crontab:
fh.write ("title=" + title + "\n")
fh.write ("desc=" + desc + "\n")
fh.write ("output=" + str(output) + "\n")
- fh.write ("display=" + display + "\n")
+ fh.write ("display=" + display + "\n")
fh.write ("command_d=" + command + "\n")
fh.close ()
os.chown (f, self.uid, self.gid)
os.chmod (f, 0600)
# TODO: let write trow an exception if failed
self.__write__ ()
-
+
#check command for problems
def check_command (self, command):
@@ -414,23 +414,23 @@ class Crontab:
escaped = escaped + 1
part = part[0:len(part) - 1]
e = part.rfind ("\\")
-
+
if (escaped % 2 == 0):
return False
-
+
i = command.find ("%")
return True
-
+
#read tasks in crontab
def read (self):
-
+
data = []
if self.root:
execute = config.getCrontabbin () + " -l -u " + self.user
else:
execute = config.getCrontabbin () + " -l"
-
+
linecount = 0
self.lines = os.popen(execute).readlines()
for line in self.lines:
@@ -439,22 +439,22 @@ class Crontab:
if array_or_false != False:
if array_or_false[0] == 2:
(minute, hour, day, month, weekday, command, comment, job_id, title, desc, output, display) = array_or_false[1]
-
+
time = minute + " " + hour + " " + day + " " + month + " " + weekday
#make the command smaller if the lenght is to long
preview = self.__make_preview__ (command)
-
+
#add task to treemodel in mainWindow
if minute == "@reboot":
data.append([title, self.__easy__ (minute, hour, day, month, weekday), preview, line, linecount, time, self, None, job_id, "", "","", _("Recurrent"), "crontab", output, _("At reboot")])
else:
data.append([title, self.__easy__ (minute, hour, day, month, weekday), preview, line, linecount, time, self, None, job_id, "", "","", _("Recurrent"), "crontab", output, time])
-
-
- linecount = linecount + 1
-
-
+
+
+ linecount = linecount + 1
+
+
return data
@@ -472,26 +472,26 @@ class Crontab:
return _("weekday")
return frequency
-
-
+
+
#get info out of task line
def parse (self, line, nofile = False):
# nofile: no datafile for title and icon available
-
+
# Format of gnome-schedule job line
# * * * * * ls -l >/dev/null >2&1 # JOB_ID_1
-
+
# Return types
# 0: Special expression
# 1: Enivornment variable
# 2: Standard expression
# 3: Comment
-
+
origline = line
line = line.lstrip()
comment = ""
-
-
+
+
if line != "":
#print "Parsing line: " + line
if line[0] == "#":
@@ -501,20 +501,20 @@ class Crontab:
else:
if (line.find ('#') != -1):
line, comment = line.rsplit('#', 1)
-
+
comment = comment.strip ()
line = line.strip ()
-
+
if line == "":
#Empty
if comment != "":
return [3, comment]
else:
return False
- #special expressions
+ #special expressions
elif line[0] == "@":
special_expression, line = self.get_exp_sec (line)
-
+
if special_expression == "@reboot":
minute = "@reboot"
hour = "@reboot"
@@ -529,20 +529,20 @@ class Crontab:
# Minute
minute, line = self.get_exp_sec (line)
-
+
# Hour
hour, line = self.get_exp_sec (line)
-
+
# Day of Month
dom, line = self.get_exp_sec (line)
-
+
# Month of Year
moy, line = self.get_exp_sec (line)
-
+
# Day of Week
dow, line = self.get_exp_sec (line)
-
-
+
+
elif (line[0].isalpha()):
if line[0] != '*':
#ENVIRONMENT VARIABLE
@@ -550,10 +550,10 @@ class Crontab:
else:
# Minute
minute, line = self.get_exp_sec (line)
-
+
# Hour
hour, line = self.get_exp_sec (line)
-
+
# Day of Month
dom, line = self.get_exp_sec (line)
# Crontab bug? Let's not support
@@ -570,34 +570,34 @@ class Crontab:
except ValueError, ex:
print _("Failed to parse the Day of Month field, possibly due to a bug in crontab.")
return
-
+
# Month of Year
moy, line = self.get_exp_sec (line)
if moy.isdigit () == False:
moy = moy.lower ()
for m in self.monthnumbers:
moy = moy.replace (m, self.monthnumbers[m])
-
-
+
+
# Day of Week
dow, line = self.get_exp_sec (line)
if dow.isdigit() == False:
dow = dow.lower ()
for day in self.downumbers:
dow = dow.replace (day, self.downumbers[day])
-
-
-
+
+
+
command = line.strip ()
-
+
# Retrive jobid
i = comment.find ('JOB_ID_')
- if (i != -1):
+ if (i != -1):
job_id = int (comment[i + 7:].rstrip ())
else:
job_id = False
-
+
# Retrive title and icon data
if nofile == False:
if job_id:
@@ -610,7 +610,7 @@ class Crontab:
output = 0
display = ""
command_d = ""
-
+
if (output == 0) or (output == 3):
# remove devnull part of command
# searching reverse, and only if output is saved in the datafile
@@ -619,9 +619,9 @@ class Crontab:
command = command[:pos]
if output >= 2:
# rely on command from datafile, command from crontab line only contains xwrapper stuff
- command = command_d
+ command = command_d
- # support older datafiles/entries without removing the no output tag
+ # support older datafiles/entries without removing the no output tag
if ver <= 1:
# old version, no output declaration in datafile, migration
pos = command.rfind (self.output[1])
@@ -630,20 +630,20 @@ class Crontab:
output = 1
else:
output = 0
-
- command = command.strip ()
-
-
+
+ command = command.strip ()
+
+
return [2, [minute, hour, dom, moy, dow, command, comment, job_id, title, desc, output, display]]
else:
return minute, hour, dom, moy, dow, command
-
+
def get_job_data (self, job_id):
f = os.path.join (self.crontabdata, str (job_id))
if os.access (f, os.R_OK):
fh = open (f, 'r')
d = fh.read ()
-
+
ver_p = d.find ("ver=")
if ver_p == -1:
ver = 1
@@ -651,18 +651,18 @@ class Crontab:
ver_s = d[ver_p + 4:d.find ("\n")]
d = d[d.find ("\n") + 1:]
ver = int (ver_s)
-
+
title = d[6:d.find ("\n")]
d = d[d.find ("\n") + 1:]
-
+
if ver < 3:
- # not in use
+ # not in use, is discarded
icon = d[5:d.find ("\n")]
d = d[d.find ("\n") + 1:]
-
+
desc = d[5:d.find ("\n")]
d = d[d.find ("\n") + 1:]
-
+
output = 0
if (ver >= 2) and (ver < 4):
output_str = d[9:d.find ("\n")]
@@ -673,7 +673,7 @@ class Crontab:
output_str = d[7:d.find ("\n")]
output = int (output_str)
d = d[d.find ("\n") + 1:]
-
+
display = ""
if ver >= 4:
display = d[8:d.find ("\n")]
@@ -687,19 +687,18 @@ class Crontab:
d = d[d.find ("\n") + 1:]
if (len (command_d) < 1) or (output < 2):
command_d = ""
-
+
fh.close ()
return True, ver, title, desc, output, display, command_d
-
-
- else:
- return False, "", "", "", 0, 0, ""
-
+
+ else:
+ return False, 0, "", "", 0, "", ""
+
def get_exp_sec (self, line):
line = line.lstrip ()
#print "line: \"" + line + "\""
-
+
## find next whitespace
i = 0
found = False
@@ -713,7 +712,7 @@ class Crontab:
#print "sec: \"" + sec + "\""
line = line[i + 1:]
return sec, line
-
+
def __easy__ (self, minute, hour, day, month, weekday):
return lang.translate_crontab_easy (minute, hour, day, month, weekday)
@@ -749,12 +748,12 @@ class Crontab:
os.system (config.getCrontabbin () + " " + path)
os.unlink (path)
-
-
+
+
def __make_preview__ (self, str, preview_len = 0):
if preview_len == 0:
preview_len = self.preview_len
-
+
str = str.replace ("&", "&")
if len (str) <= preview_len:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]