lars
56e954d1c4
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
110 lines
3.2 KiB
Python
110 lines
3.2 KiB
Python
import subprocess
|
|
import os
|
|
import CryptoBoxPlugin
|
|
|
|
## specify (in seconds), how long we should wait before redirecting and ip change
|
|
REDIRECT_DELAY=20
|
|
CHANGE_IP_DELAY=5
|
|
|
|
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:
|
|
## just show the form
|
|
self.__prepareFormData()
|
|
return "form_network"
|
|
|
|
|
|
def getStatus(self):
|
|
return "%d.%d.%d.%d" % self.__getCurrentIP()
|
|
|
|
|
|
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 __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 __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
|
|
|