From 746bc1bb3ec333c62cc065cd4a3768f094facb1c Mon Sep 17 00:00:00 2001 From: age Date: Sun, 12 Aug 2007 01:10:10 +0000 Subject: [PATCH] * removed stupid network restart plugin, this fixes date again --- plugins/date/date.py | 116 ++++++++++++++++++++++++++++++++ plugins/date/form_date.cs | 51 ++++++++++++++ plugins/date/language.hdf | 46 ++++++++++--- plugins/date/network_restart.cs | 20 ------ plugins/date/network_restart.py | 74 -------------------- plugins/date/plugin_icon.gif | Bin 3609 -> 2116 bytes plugins/date/plugin_icon.png | Bin 6187 -> 3285 bytes plugins/date/root_action.py | 27 ++++++-- plugins/date/unittests.py | 97 ++++++++++++++++++++++++++ 9 files changed, 320 insertions(+), 111 deletions(-) create mode 100644 plugins/date/date.py create mode 100644 plugins/date/form_date.cs delete mode 100644 plugins/date/network_restart.cs delete mode 100644 plugins/date/network_restart.py create mode 100644 plugins/date/unittests.py diff --git a/plugins/date/date.py b/plugins/date/date.py new file mode 100644 index 0000000..88b0229 --- /dev/null +++ b/plugins/date/date.py @@ -0,0 +1,116 @@ +# +# Copyright 2006 sense.lab e.V. +# +# This file is part of the CryptoBox. +# +# The CryptoBox is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# The CryptoBox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with the CryptoBox; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +"""Change date and time. + +requires: + - date + - ntpdate (planned) +""" + +__revision__ = "$Id$" + +import cryptobox.plugins.base + + +class date(cryptobox.plugins.base.CryptoBoxPlugin): + """The date feature of the CryptoBox. + """ + + plugin_capabilities = [ "system" ] + plugin_visibility = [ "preferences" ] + request_auth = False + rank = 10 + + def do_action(self, store=None, year=0, month=0, day=0, hour=0, minute=0): + """The action handler. + """ + import datetime + if store: + try: + year, month, day = int(year), int(month), int(day) + hour, minute = int(hour), int(minute) + ## check if the values are valid + datetime.datetime(year, month, day, hour, minute) + except ValueError: + self.hdf["Data.Warning"] = "Plugins.date.InvalidDate" + else: + new_date = "%02d%02d%02d%02d%d" % (month, day, hour, minute, year) + if self.__set_date(new_date): + self.cbox.log.info("changed date to: %s" % new_date) + self.hdf["Data.Success"] = "Plugins.date.DateChanged" + else: + ## a failure should usually be an invalid date (we do not check it really) + self.cbox.log.info("failed to set date: %s" % new_date) + self.hdf["Data.Warning"] = "Plugins.date.InvalidDate" + self.__prepare_form_data() + return "form_date" + + + def get_status(self): + """Retrieve the status of the feature. + """ + now = self.__get_current_date() + return "%d/%d/%d/%d/%d/%d" % \ + (now.year, now.month, now.day, now.hour, now.minute, now.second) + + + def get_warnings(self): + import os + warnings = [] + if not os.path.isfile(self.root_action.DATE_BIN): + warnings.append((48, "Plugins.%s.MissingProgramDate" % self.get_name())) + return warnings + + + def __prepare_form_data(self): + """Set some hdf values. + """ + cur_date = self.__get_current_date() + self.hdf[self.hdf_prefix + "year"] = cur_date.year + self.hdf[self.hdf_prefix + "month"] = cur_date.month + self.hdf[self.hdf_prefix + "day"] = cur_date.day + self.hdf[self.hdf_prefix + "hour"] = cur_date.hour + self.hdf[self.hdf_prefix + "minute"] = cur_date.minute + + + def __get_current_date(self): + """Retrieve the current date and time. + """ + import datetime + return datetime.datetime(2000, 1, 1).now() + + + def __set_date(self, new_date): + """Set a new date and time. + """ + import subprocess + import os + proc = subprocess.Popen( + shell = False, + args = [ + self.cbox.prefs["Programs"]["super"], + self.cbox.prefs["Programs"]["CryptoBoxRootActions"], + "plugin", + os.path.join(self.plugin_dir, "root_action.py"), + new_date]) + proc.wait() + return proc.returncode == 0 + diff --git a/plugins/date/form_date.cs b/plugins/date/form_date.cs new file mode 100644 index 0000000..71d0d47 --- /dev/null +++ b/plugins/date/form_date.cs @@ -0,0 +1,51 @@ + + + + +
+ + + + + + + + + +


+ + +

+ +


+  :  +

+ +

+ +

+ + +
+ diff --git a/plugins/date/language.hdf b/plugins/date/language.hdf index 9f83e62..610ca89 100644 --- a/plugins/date/language.hdf +++ b/plugins/date/language.hdf @@ -1,23 +1,47 @@ -Name = Network restart -Link = Network +Name = Change date and time +Link = Date -Title = Network restart +Title = Date and time setting -Button.NetworkRestart = Restart network connections +Button.ConfigDate = Set date and time -Help.NetworkRestart = Here you can restart all network connections of the cryptobox at once. +Text.Date = Date +Text.Time = Time +Text.Months { + 1 = January + 2 = February + 3 = March + 4 = April + 5 = May + 6 = June + 7 = July + 8 = August + 9 = September + 10 = October + 11 = November + 12 = December +} + +Help.ChangeDate = Change the time and date for the CryptoBox server. SuccessMessage { - Restart { - Title = Network restart - Text = The network connections were restarted + DateChanged { + Title = Date changed + Text = The date was changed successfully. } } WarningMessage { - RestartFailed { - Title = Network restart failed - Text = The network connections couldn't be restarted + InvalidDate { + Title = Invalid value + Text = An invalid value for date or time was supplied. Please try again. + } +} + +EnvironmentWarning { + MissingProgramDate { + Title = Missing program + Text = The program 'date' is not installed. Please ask the administrator of the CryptoBox server to configure it properly. } } diff --git a/plugins/date/network_restart.cs b/plugins/date/network_restart.cs deleted file mode 100644 index 1e1b1f7..0000000 --- a/plugins/date/network_restart.cs +++ /dev/null @@ -1,20 +0,0 @@ - - - - -
- - - - - - - - -

- -

- - -
- diff --git a/plugins/date/network_restart.py b/plugins/date/network_restart.py deleted file mode 100644 index 7cd6e6d..0000000 --- a/plugins/date/network_restart.py +++ /dev/null @@ -1,74 +0,0 @@ -# -# Copyright 2006 sense.lab e.V. -# -# This file is part of the CryptoBox. -# -# The CryptoBox is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# The CryptoBox is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with the CryptoBox; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -"""Change date and time. - -""" - -__revision__ = "$Id: date.py 916 2007-03-21 18:35:31Z lars $" - -import cryptobox.plugins.base - - -class network_restart(cryptobox.plugins.base.CryptoBoxPlugin): - """The network restart feature of the CryptoBox. - """ - - plugin_capabilities = [ "system" ] - # this plugin is per default invisible - plugin_visibility = [ ] - request_auth = True - rank = 31 - - def do_action(self, restart=None): - """Show the user interface. - """ - self.cbox.log.debug("executing network_restart plugin") - if restart == "yes": - if self.__net_restart(): - self.cbox.log.info("network restarted") - self.hdf["Data.Success"] = "Plugins.network_restart.Restart" - else: - self.cbox.log.error("failure while restarting network") - self.hdf["Data.Warning"] = "Plugins.network_restart.RestartFailed" - return "network_restart" - - - def get_status(self): - """ - """ - return - - - def __net_restart(self): - """Restart all local network connections. - """ - import subprocess - import os - proc = subprocess.Popen( - shell = False, - args = [ - self.cbox.prefs["Programs"]["super"], - self.cbox.prefs["Programs"]["CryptoBoxRootActions"], - "plugin", - os.path.join(self.plugin_dir, "root_action.py")]) - proc.wait() - return proc.returncode == 0 - diff --git a/plugins/date/plugin_icon.gif b/plugins/date/plugin_icon.gif index 4afc6bd46df03193f4edf75af5bfab957be4b36b..7b660d0a4f6d8fcf7331cd0a5e32db7475f65a98 100644 GIT binary patch literal 2116 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 JPDHLkV1jesxhntw diff --git a/plugins/date/root_action.py b/plugins/date/root_action.py index f3f7abd..7d3b91d 100755 --- a/plugins/date/root_action.py +++ b/plugins/date/root_action.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2007 sense.lab e.V. +# Copyright 2006 sense.lab e.V. # # This file is part of the CryptoBox. # @@ -25,19 +25,34 @@ __revision__ = "$Id$" ## necessary: otherwise CryptoBoxRootActions.py will refuse to execute this script PLUGIN_TYPE = "cryptobox" -BIN = "/etc/init.d/networking" -ACTION = "restart" +DATE_BIN = "/bin/date" import subprocess +import re import sys -#import re -#import os +import os if __name__ == "__main__": + args = sys.argv[1:] + + self_bin = sys.argv[0] + + if len(args) > 1: + sys.stderr.write("%s: too many arguments (%s)\n" % (self_bin, args)) + sys.exit(1) + + if len(args) == 0: + sys.stderr.write("%s: no argument supplied\n" % self_bin) + sys.exit(1) + + if re.search(r'\D', args[0]): + sys.stderr.write("%s: illegal argument (%s)\n" % (self_bin, args[0])) + sys.exit(1) + proc = subprocess.Popen( shell = False, stdout = subprocess.PIPE, - args = [BIN, ACTION]) + args = [DATE_BIN, args[0]]) proc.wait() sys.exit(proc.returncode) diff --git a/plugins/date/unittests.py b/plugins/date/unittests.py new file mode 100644 index 0000000..4d90010 --- /dev/null +++ b/plugins/date/unittests.py @@ -0,0 +1,97 @@ +# +# Copyright 2006 sense.lab e.V. +# +# This file is part of the CryptoBox. +# +# The CryptoBox is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# The CryptoBox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with the CryptoBox; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +__revision__ = "$Id$" + +from cryptobox.tests.base import WebInterfaceTestClass + +class unittests(WebInterfaceTestClass): + + def test_get_date(self): + """retrieve the current date""" + date = self._get_current_date() + + + def test_change_date(self): + """set the date back and forth""" + now = self._get_current_date() + ## copy current time + new_date = dict(now) + ## move three minutes forward (more is not nice because of screensavers) + new_date["minute"] = (now["minute"] + 3) % 60 + ## in case of minute-overflow we also have to move the hour a little bit forward + new_date["hour"] = now["hour"] + ((now["minute"] + 3) / 60) + ## move forward ... + self._setDate(new_date) + self.assertEquals(new_date, self._get_current_date()) + ## ... and backward + self._setDate(now) + self.assertEquals(now, self._get_current_date()) + + + def test_try_broken_date(self): + """expect error messages for invalid dates""" + self._setDate({"hour":12, "minute":40, "year":2004, "month":7, "day":0}) + self.cmd.find("invalid value for date") + self._setDate({"hour":12, "minute":40, "year":"x", "month":7, "day":2}) + self.cmd.find("invalid value for date") + self._setDate({"hour":12, "minute":40, "year":2004, "month":2, "day":31}) + self.cmd.find("invalid value for date") + + + def _get_current_date(self): + date_url = self.url + "date" + self.register_auth(date_url) + self.cmd.go(date_url) + self.cmd.find("Data.Status.Plugins.date=([0-9]+/[0-9]+/[0-9]+/[0-9]+/[0-9]+/[0-9]+)$", "m") + dateNumbers = self.locals["__match__"].split("/") + self.assertEquals(len(dateNumbers), 6) + ## we ignore seconds + dateField = { + "year" : int(dateNumbers[0]), + "month" : int(dateNumbers[1]), + "day" : int(dateNumbers[2]), + "hour" : int(dateNumbers[3]), + "minute" : int(dateNumbers[4])} + return dateField + + + def _setDate(self, date): + """for now we have to use this function instead of the one below""" + date_url = self.url + "date?weblang=en&store=1&year=%s&month=%s&day=%s&hour=%s&minute=%s"\ + % (str(date["year"]), str(date["month"]), str(date["day"]), + str(date["hour"]), str(date["minute"])) + self.register_auth(date_url) + self.cmd.go(date_url) + + + def _setDateBroken(self, date): + """this should work, but the parsing of twill seems to be broken + as soon as the twill bug is fixed, we should use this function""" + date_url = self.url + "date" + self.register_auth(date_url) + self.cmd.go(date_url) + self.cmd.formvalue("set_date", "year", str(date["year"])) + self.cmd.formvalue("set_date", "month", str(date["month"])) + self.cmd.formvalue("set_date", "day", str(date["day"])) + self.cmd.formvalue("set_date", "hour", str(date["hour"])) + self.cmd.formvalue("set_date", "minute", str(date["minute"])) + self.cmd.submit() +