plugin interface changed: now we use classes (inherited by CryptoBoxPlugin) instead of plain scripts
added some log entries use threading module instead of "fork" for background formatting redirection for "network" plugin fixed empty return value of plugins defaults to plugin overview page
This commit is contained in:
parent
52ccaeb530
commit
56e954d1c4
11 changed files with 545 additions and 436 deletions
|
@ -4,7 +4,7 @@ Rank = 30
|
|||
|
||||
Title.Network = Network settings
|
||||
|
||||
Button.Network = Update settings
|
||||
Button.Network = Update network settings
|
||||
|
||||
Text.IP = Network address
|
||||
|
||||
|
|
|
@ -1,71 +1,110 @@
|
|||
import re
|
||||
import subprocess
|
||||
import imp
|
||||
import os
|
||||
import CryptoBoxPlugin
|
||||
|
||||
## specify (in seconds), how long we should wait before redirecting and ip change
|
||||
REDIRECT_DELAY=20
|
||||
CHANGE_IP_DELAY=5
|
||||
|
||||
def doAction(hdf, cbox, store=None, ip1="", ip2="", ip3="", ip4=""):
|
||||
__prepareFormData(hdf, cbox)
|
||||
if store:
|
||||
try:
|
||||
for ip_in in (ip1, ip2, ip3, ip4):
|
||||
if (int(ip_in) < 0) or (int(ip_in) > 255):
|
||||
cbox.log.debug("invalid IP supplied: %s" % str((ip1,ip2,ip3,ip4)))
|
||||
raise ValueError
|
||||
ip = "%d.%d.%d.%d" % (int(ip1), int(ip2), int(ip3), int(ip4))
|
||||
except ValueError:
|
||||
hdf["Data.Warning"] = "Plugins.network.InvalidIP"
|
||||
return "form_system"
|
||||
if __setIP(cbox, ip):
|
||||
hdf["Data.Success"] = "Plugins.network.IPChanged"
|
||||
hdf["Data.Redirect.URL"] = ""
|
||||
hdf["Data.Redirect.Delay"] = 30
|
||||
return "form_system"
|
||||
class network(CryptoBoxPlugin.CryptoBoxPlugin):
|
||||
|
||||
def doAction(self, store=None, redirected="", ip1="", ip2="", ip3="", ip4=""):
|
||||
## if we were redirected, then we should display the default page
|
||||
if redirected == "1":
|
||||
return None
|
||||
## request for IP change?
|
||||
if store:
|
||||
try:
|
||||
for ip_in in (ip1, ip2, ip3, ip4):
|
||||
if (int(ip_in) < 0) or (int(ip_in) > 255):
|
||||
self.cbox.log.info("invalid IP supplied: %s" % str((ip1,ip2,ip3,ip4)))
|
||||
raise ValueError
|
||||
ip = "%d.%d.%d.%d" % (int(ip1), int(ip2), int(ip3), int(ip4))
|
||||
except ValueError:
|
||||
self.hdf["Data.Warning"] = "Plugins.network.InvalidIP"
|
||||
return None
|
||||
if self.__setIP(ip):
|
||||
self.cbox.log.info("the IP was successfully changed: %s" % ip)
|
||||
self.hdf["Data.Success"] = "Plugins.network.IPChanged"
|
||||
self.hdf["Data.Redirect.URL"] = self.__getRedirectDestination(ip)
|
||||
self.hdf["Data.Redirect.Delay"] = REDIRECT_DELAY
|
||||
return None
|
||||
else:
|
||||
self.cbox.log.warn("failed to change IP address to: %s" % ip)
|
||||
self.hdf["Data.Warning"] = "Plugins.network.InvalidIP"
|
||||
self.__prepareFormData()
|
||||
return "form_network"
|
||||
else:
|
||||
hdf["Data.Warning"] = "Plugins.network.InvalidIP"
|
||||
## just show the form
|
||||
self.__prepareFormData()
|
||||
return "form_network"
|
||||
else:
|
||||
return "form_network"
|
||||
|
||||
|
||||
def getStatus(cbox):
|
||||
return "%d.%d.%d.%d" % __getCurrentIP(cbox)
|
||||
def getStatus(self):
|
||||
return "%d.%d.%d.%d" % self.__getCurrentIP()
|
||||
|
||||
|
||||
def __prepareFormData(hdf, cbox):
|
||||
(oc1, oc2, oc3, oc4) = __getCurrentIP(cbox)
|
||||
hdf["Data.Plugins.network.ip.oc1"] = oc1
|
||||
hdf["Data.Plugins.network.ip.oc2"] = oc2
|
||||
hdf["Data.Plugins.network.ip.oc3"] = oc3
|
||||
hdf["Data.Plugins.network.ip.oc4"] = oc4
|
||||
def __getRedirectDestionation(self, ip):
|
||||
import cherrypy
|
||||
req = cherrypy.request
|
||||
dest = ip
|
||||
base_parts = req.base.split(":")
|
||||
if len(base_parts) == 3:
|
||||
dest += ":%s" % base_parts[2]
|
||||
return dest
|
||||
|
||||
|
||||
def __getCurrentIP(cbox):
|
||||
root_action_plug = imp.load_source("root_action", os.path.join(os.path.dirname(__file__), "root_action.py"))
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdout = subprocess.PIPE,
|
||||
args = [
|
||||
root_action_plug.IFCONFIG_BIN,
|
||||
root_action_plug.IFACE])
|
||||
(output, error) = proc.communicate()
|
||||
if proc.returncode != 0: return (0,0,0,0)
|
||||
match = re.search(u'inet [\w]+:(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\s',output)
|
||||
if match:
|
||||
return tuple([int(e) for e in match.groups()])
|
||||
else:
|
||||
return (0,0,0,0)
|
||||
def __prepareFormData(self):
|
||||
(oc1, oc2, oc3, oc4) = self.__getCurrentIP()
|
||||
self.hdf[self.hdf_prefix + "ip.oc1"] = oc1
|
||||
self.hdf[self.hdf_prefix + "ip.oc2"] = oc2
|
||||
self.hdf[self.hdf_prefix + "ip.oc3"] = oc3
|
||||
self.hdf[self.hdf_prefix + "ip.oc4"] = oc4
|
||||
|
||||
|
||||
def __setIP(cbox, ip):
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
args = [
|
||||
cbox.prefs["Programs"]["super"],
|
||||
cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"plugin",
|
||||
os.path.join(os.path.dirname(__file__), "root_action.py"),
|
||||
ip])
|
||||
proc.communicate()
|
||||
return proc.returncode == 0
|
||||
def __getCurrentIP(self):
|
||||
import re
|
||||
import imp
|
||||
## load some values from the root_action.py script
|
||||
root_action_plug = imp.load_source("root_action", os.path.join(self.pluginDir, "root_action.py"))
|
||||
## get the current IP of the network interface
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdout = subprocess.PIPE,
|
||||
args = [
|
||||
root_action_plug.IFCONFIG_BIN,
|
||||
root_action_plug.IFACE])
|
||||
(output, error) = proc.communicate()
|
||||
if proc.returncode != 0: return (0,0,0,0)
|
||||
## this regex matches the four numbers of the IP
|
||||
match = re.search(u'inet [\w]+:(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\s',output)
|
||||
if match:
|
||||
## use the previously matched numbers
|
||||
return tuple([int(e) for e in match.groups()])
|
||||
else:
|
||||
return (0,0,0,0)
|
||||
|
||||
|
||||
def __setIP(self, ip):
|
||||
import threading
|
||||
## call the root_action script after some seconds - so we can deliver the page before
|
||||
def delayedIPchange():
|
||||
import time
|
||||
time.sleep(CHANGE_IP_DELAY)
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["super"],
|
||||
self.cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"plugin",
|
||||
os.path.join(self.pluginDir, "root_action.py"),
|
||||
ip])
|
||||
proc.communicate()
|
||||
return
|
||||
thread = threading.Thread()
|
||||
thread.run = delayedIPchange
|
||||
thread.setDaemon(True)
|
||||
thread.start()
|
||||
# TODO: how could we guess, if it failed?
|
||||
return True
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue