small, stupid plugin for restarting networks
This commit is contained in:
parent
fbe7adb3e4
commit
cb19e37add
|
@ -1,116 +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.
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
<?cs # $Id$ ?>
|
|
||||||
|
|
||||||
<?cs call:handle_messages() ?>
|
|
||||||
|
|
||||||
<fieldset>
|
|
||||||
<legend>
|
|
||||||
<?cs call:show_plugin_icon() ?>
|
|
||||||
<?cs var:html_escape(Lang.Plugins.date.Title) ?>
|
|
||||||
</legend>
|
|
||||||
|
|
||||||
<?cs call:show_help(Lang.Plugins.date.Help.ChangeDate) ?>
|
|
||||||
|
|
||||||
<?cs call:print_form_header("set_date", "date") ?>
|
|
||||||
|
|
||||||
<p><label for="date"><?cs var:html_escape(Lang.Plugins.date.Text.Date) ?>: </label><br/>
|
|
||||||
<select id="date" name="day" tabindex="1" size="0"><?cs
|
|
||||||
loop: x = #1, #31, #1 ?>
|
|
||||||
<?cs if:x == Data.Plugins.date.day ?><option selected="selected"><?cs
|
|
||||||
else ?><option><?cs /if ?><?cs var:x ?></option><?cs /loop ?>
|
|
||||||
</select>
|
|
||||||
<select name="month" tabindex="2" size="0"><?cs
|
|
||||||
loop: x = #1, #12, #1 ?>
|
|
||||||
<?cs if:x == Data.Plugins.date.month ?><option selected="selected" <?cs
|
|
||||||
else ?><option <?cs /if ?>value="<?cs var:x ?>"><?cs
|
|
||||||
var:html_escape(Lang.Plugins.date.Text.Months[x]) ?></option><?cs /loop ?>
|
|
||||||
</select>
|
|
||||||
<select name="year" tabindex="3" size="0"><?cs
|
|
||||||
loop: x = #2006, #2025, #1 ?>
|
|
||||||
<?cs if:x == Data.Plugins.date.year ?><option selected="selected"><?cs
|
|
||||||
else ?><option><?cs /if ?><?cs var:x ?></option><?cs /loop ?>
|
|
||||||
</select></p>
|
|
||||||
|
|
||||||
<p><label for="time"><?cs var:html_escape(Lang.Plugins.date.Text.Time) ?>: </label><br/>
|
|
||||||
<select id="time" name="hour" tabindex="4" size="0"><?cs
|
|
||||||
loop: x = #0, #23, #1 ?>
|
|
||||||
<?cs if:x == Data.Plugins.date.hour ?><option selected="selected"><?cs
|
|
||||||
else ?><option><?cs /if ?><?cs if:x<10 ?>0<?cs /if ?><?cs var:x ?></option><?cs /loop ?>
|
|
||||||
</select> :
|
|
||||||
<select name="minute" tabindex="5" size="0"><?cs
|
|
||||||
loop: x = #0, #59, #1 ?>
|
|
||||||
<?cs if:x == Data.Plugins.date.minute ?><option selected="selected"><?cs
|
|
||||||
else ?><option><?cs /if ?><?cs if:x<10 ?>0<?cs /if ?><?cs var:x ?></option><?cs /loop ?>
|
|
||||||
</select></p>
|
|
||||||
|
|
||||||
<p><input type="hidden" name="store" value="yes" />
|
|
||||||
|
|
||||||
<button type="submit" tabindex="6"><?cs var:html_escape(Lang.Plugins.date.Button.ConfigDate) ?></button></p>
|
|
||||||
|
|
||||||
</form>
|
|
||||||
</fieldset>
|
|
||||||
|
|
|
@ -1,47 +1,23 @@
|
||||||
Name = Change date and time
|
Name = Network restart
|
||||||
Link = Date
|
Link = Network
|
||||||
|
|
||||||
Title = Date and time setting
|
Title = Network restart
|
||||||
|
|
||||||
Button.ConfigDate = Set date and time
|
Button.NetworkRestart = Restart network connections
|
||||||
|
|
||||||
Text.Date = Date
|
Help.NetworkRestart = Here you can restart all network connections of the cryptobox at once.
|
||||||
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 {
|
SuccessMessage {
|
||||||
DateChanged {
|
Restart {
|
||||||
Title = Date changed
|
Title = Network restart
|
||||||
Text = The date was changed successfully.
|
Text = The network connections were restarted
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WarningMessage {
|
WarningMessage {
|
||||||
InvalidDate {
|
RestartFailed {
|
||||||
Title = Invalid value
|
Title = Network restart failed
|
||||||
Text = An invalid value for date or time was supplied. Please try again.
|
Text = The network connections couldn't be restarted
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EnvironmentWarning {
|
|
||||||
MissingProgramDate {
|
|
||||||
Title = Missing program
|
|
||||||
Text = The program 'date' is not installed. Please ask the administrator of the CryptoBox server to configure it properly.
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
20
plugins/date/network_restart.cs
Normal file
20
plugins/date/network_restart.cs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?cs # $Id: form_date.cs 790 2007-02-08 02:16:41Z lars $ ?>
|
||||||
|
|
||||||
|
<?cs call:handle_messages() ?>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<legend>
|
||||||
|
<?cs call:show_plugin_icon() ?>
|
||||||
|
<?cs var:html_escape(Lang.Plugins.network_restart.Title) ?>
|
||||||
|
</legend>
|
||||||
|
|
||||||
|
<?cs call:show_help(Lang.Plugins.network_restart.Help.NetworkRestart) ?>
|
||||||
|
|
||||||
|
<?cs call:print_form_header("set_dsl", "network_restart") ?>
|
||||||
|
<p><input type="hidden" name="restart" value="yes" />
|
||||||
|
<button type="submit" tabindex="1"><?cs var:html_escape(Lang.Plugins.network_restart.Button.NetworkRestart) ?></button>
|
||||||
|
</p>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</fieldset>
|
||||||
|
|
74
plugins/date/network_restart.py
Normal file
74
plugins/date/network_restart.py
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 3.5 KiB |
Binary file not shown.
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 6 KiB |
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
#
|
#
|
||||||
# Copyright 2006 sense.lab e.V.
|
# Copyright 2007 sense.lab e.V.
|
||||||
#
|
#
|
||||||
# This file is part of the CryptoBox.
|
# This file is part of the CryptoBox.
|
||||||
#
|
#
|
||||||
|
@ -25,34 +25,19 @@ __revision__ = "$Id$"
|
||||||
## necessary: otherwise CryptoBoxRootActions.py will refuse to execute this script
|
## necessary: otherwise CryptoBoxRootActions.py will refuse to execute this script
|
||||||
PLUGIN_TYPE = "cryptobox"
|
PLUGIN_TYPE = "cryptobox"
|
||||||
|
|
||||||
DATE_BIN = "/bin/date"
|
BIN = "/etc/init.d/networking"
|
||||||
|
ACTION = "restart"
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import re
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
#import re
|
||||||
|
#import os
|
||||||
|
|
||||||
if __name__ == "__main__":
|
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(
|
proc = subprocess.Popen(
|
||||||
shell = False,
|
shell = False,
|
||||||
stdout = subprocess.PIPE,
|
stdout = subprocess.PIPE,
|
||||||
args = [DATE_BIN, args[0]])
|
args = [BIN, ACTION])
|
||||||
proc.wait()
|
proc.wait()
|
||||||
sys.exit(proc.returncode)
|
sys.exit(proc.returncode)
|
||||||
|
|
||||||
|
|
|
@ -1,97 +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
|
|
||||||
#
|
|
||||||
|
|
||||||
__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()
|
|
||||||
|
|
Loading…
Reference in a new issue