From 0cdf82b7aa8705d5cadb3b02c648be43dad2e712 Mon Sep 17 00:00:00 2001 From: age Date: Tue, 30 Jan 2007 03:30:07 +0000 Subject: [PATCH] * added part of netmask change feature; Lars please add a regex * gateway change is in work.. * dhcp is stalled --- plugins/network/form_network.cs | 61 ++++++++++++------ plugins/network/language.hdf | 40 +++++++++--- plugins/network/network.py | 108 +++++++++++++++++++++++--------- plugins/network/root_action.py | 40 ++++++++---- 4 files changed, 181 insertions(+), 68 deletions(-) diff --git a/plugins/network/form_network.cs b/plugins/network/form_network.cs index 506af65..9561a3f 100644 --- a/plugins/network/form_network.cs +++ b/plugins/network/form_network.cs @@ -7,10 +7,17 @@ +
: + ." />.
- : - - ... -
- -

- -

- -

- +

+ +
+ + + + + + +
+ : + + ... +
+

+ + +

+ + + + +
+ diff --git a/plugins/network/language.hdf b/plugins/network/language.hdf index 241d958..30422fb 100644 --- a/plugins/network/language.hdf +++ b/plugins/network/language.hdf @@ -2,25 +2,45 @@ Name = Configure network Link = Network Title = Network settings -Title.IP = CryptoBox server +Title { + IP = CryptoBox server IP + GW = Gateway address +} Text { - IP = IP address - NM = Network mask - GW = Default gateway + IP = Address + NM = Netmask + GW = Gateway DHCP = Automatic configuration (Caution!) } -Button.Network = Change network settings +Button { + Network = Change server address + Gateway = Change default gateway +} Help { Network = Insert the network address of the CryptoBox server, the network mask and the default gateway. Be aware that you may lose your connection to the server under some circumstances. The actual values are visible in the form fields. + Gateway = If you have a gateway in your LAN and want to make use of it, type it's address in here. It will be added as default route. DHCP = If you enable automatic network configuration make sure you have a well configured DHCP server running. All values will be overridden by the settings from the DHCP server. If you don't know what DHCP means leave this box unchecked. +} WarningMessage { - InvalidIP { - Title = Invalid value - Text = An invalid network address (IP) was supplied. Please try again. + Failure { + Title = Failure + Text = The address could not be changed. + } + InvalidServerIP { + Title = Invalid value + Text = The server address is not a valid number. + } + InvalidNetmaskIP { + Title = Invalid value + Text = The netmask address is not a valid number. + } + InvalidGatewayIP { + Title = Invalid value + Text = The gateway address is not a valid number. } } @@ -29,6 +49,10 @@ SuccessMessage { Title = Network address changed Text = The network address has been changed. In a few seconds you will get redirected to the new address. } + GWChanged { + Title = Gateway address changed + Text = The gateway was added to your default route. + } } EnvironmentWarning { diff --git a/plugins/network/network.py b/plugins/network/network.py index 07aafb5..43623c5 100644 --- a/plugins/network/network.py +++ b/plugins/network/network.py @@ -48,7 +48,7 @@ class network(cryptobox.plugins.base.CryptoBoxPlugin): request_auth = True rank = 30 - def do_action(self, store=None, redirected="", ip1="", ip2="", ip3="", ip4="", gw1="", gw2="", gw3="", gw4=""): + def do_action(self, store=None, redirected="", ip1="", ip2="", ip3="", ip4="", nm1="", nm2="", nm3="", nm4=""): """Show a form containing the current IP - change it if requested. """ ## if we were redirected, then we should display the default page @@ -59,24 +59,25 @@ class network(cryptobox.plugins.base.CryptoBoxPlugin): ## check possible actions if store is None: ## no action was requested -> just show the form - self.cbox.log.debug("network plugin: show form") + self.cbox.log.debug("network plugin: show form (interface %s)" % self.__get_interface()) self.__prepare_form_data() return "form_network" + ## change of ip address and/or netmask requested elif store == "set_ip": - ## change ip address - self.cbox.log.debug("network plugin: changing IP") - try: - for ip_in in (ip1, ip2, ip3, ip4): - if (int(ip_in) < 0) or (int(ip_in) > 255): - self.cbox.log.info("invalid CryptoBox IP supplied: %s" % \ - str((ip1, ip2, ip3, ip4))) - raise ValueError + self.cbox.log.debug("network plugin: changing server IP") + if self.__IP_is_valid(ip1, ip2, ip3, ip4): new_ip = "%d.%d.%d.%d" % (int(ip1), int(ip2), int(ip3), int(ip4)) - except ValueError: - self.hdf["Data.Warning"] = "Plugins.network.InvalidIP" + else: + self.hdf["Data.Warning"] = "Plugins.network.InvalidServerIP" self.__prepare_form_data() return "form_network" - if self.__set_ip(new_ip): + if self.__IP_is_valid(nm1, nm2, nm3, nm4): + new_nm = "%d.%d.%d.%d" % (int(nm1), int(nm2), int(nm3), int(nm4)) + else: + self.hdf["Data.Warning"] = "Plugins.network.InvalidNetmaskIP" + self.__prepare_form_data() + return "form_network" + if self.__set_ip(new_ip, new_nm): self.cbox.log.info("the IP was successfully changed: %s" % new_ip) self.hdf["Data.Success"] = "Plugins.network.IPChanged" self.hdf["Data.Redirect.URL"] = self.__get_redirect_destination(new_ip) @@ -90,13 +91,26 @@ class network(cryptobox.plugins.base.CryptoBoxPlugin): return "empty" else: self.cbox.log.warn("failed to change IP address to: %s" % new_ip) - self.hdf["Data.Warning"] = "Plugins.network.InvalidIP" + self.hdf["Data.Warning"] = "Plugins.network.Failure" + self.__prepare_form_data() + return "form_network" + ## request for default gateway change + elif store == "set_gateway": + if self.__IP_is_valid(ip1, ip2, ip3, ip4): + new_ip = "%d.%d.%d.%d" % (int(ip1), int(ip2), int(ip3), int(ip4)) + else: + self.hdf["Data.Warning"] = "Plugins.network.InvalidGatewayIP" + self.__prepare_form_data() + return "form_network" + if self.__set_gw(new_ip): + self.cbox.log.info("the gateway IP was successfully changed: %s" % new_ip) + self.hdf["Data.Success"] = "Plugins.network.GWChanged" + + else: + self.cbox.log.warn("failed to change gateway address to: %s" % new_ip) + self.hdf["Data.Warning"] = "Plugins.network.Failure" self.__prepare_form_data() return "form_network" - ## request for default gateway change? - elif store == "set_gw": - ## TODO: route add default gw ... - pass else: ## invalid action was requested -> show default form self.cbox.log.debug("network plugin: invalid request (%s)" % str(store)) @@ -146,14 +160,18 @@ class network(cryptobox.plugins.base.CryptoBoxPlugin): def __prepare_form_data(self): """Set some hdf values. """ - (oc1, oc2, oc3, oc4) = self.__get_current_ip() + (oc1, oc2, oc3, oc4) = self.__get_current_ip("ip") 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 + (oc1, oc2, oc3, oc4) = self.__get_current_ip("nm") + self.hdf[self.hdf_prefix + "nm.oc1"] = oc1 + self.hdf[self.hdf_prefix + "nm.oc2"] = oc2 + self.hdf[self.hdf_prefix + "nm.oc3"] = oc3 + self.hdf[self.hdf_prefix + "nm.oc4"] = oc4 - - def __get_current_ip(self): + def __get_current_ip(self, type="ip"): """Retrieve the current IP. """ import re @@ -168,16 +186,22 @@ class network(cryptobox.plugins.base.CryptoBoxPlugin): if proc.returncode != 0: return (0, 0, 0, 0) ## this regex matches the four numbers of the IP - match = re.search(r'inet [\w]+:(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\s', stdout) - if match: - ## use the previously matched numbers - return tuple([int(e) for e in match.groups()]) - else: - return (0, 0, 0, 0) + if type == "ip": + match = re.search(r'inet [\w]+:(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\s', stdout) + if match: + ## use the previously matched numbers + return tuple([int(e) for e in match.groups()]) + else: + return (0, 0, 0, 0) + elif type == "nm": + ##TODO: Lars please leave a regex note for fetching the + ## netmask with ifconfig + #match = re.search(r'inet [\w]+:(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\s', stdout) + return ("L", "A", "3", "S") - def __set_ip(self, new_ip): - """Change the IP. + def __set_ip(self, new_ip, new_nm="0"): + """Change the IP, additionally a netmask can be applied """ import threading ## call the root_action script after some seconds - so we can deliver the page before @@ -196,7 +220,8 @@ class network(cryptobox.plugins.base.CryptoBoxPlugin): os.path.join(self.plugin_dir, "root_action.py"), "change_ip", self.__get_interface(), - new_ip]) + new_ip, + new_nm]) proc.wait() if proc.returncode != 0: self.cbox.log.warn("failed to change IP address: %s" % new_ip) @@ -210,6 +235,14 @@ class network(cryptobox.plugins.base.CryptoBoxPlugin): return True + def __set_gw(self, new_ip): + """Change the gateway IP adress + """ + ## TODO: route add default gw ... + ## as soon as lazy age has implemented this return True + return False + + def __get_interface(self): """Return the name of the configured network interface """ @@ -219,3 +252,18 @@ class network(cryptobox.plugins.base.CryptoBoxPlugin): return DEFAULT_INTERFACE + def __IP_is_valid(self, ip1, ip2, ip3, ip4): + try: + for ip_in in (ip1, ip2, ip3, ip4): + if (int(ip_in) < 0) or (int(ip_in) > 255): + ## we give an info only and a webwarning + ## further reaction depends on the case + self.cbox.log.info("IP number is invalid: %s" % \ + str((ip1, ip2, ip3, ip4))) + raise ValueError + except ValueError: + ## handled by individual caller + #self.hdf["Data.Warning"] = "Plugins.network.InvalidIP" + return False + return True + diff --git a/plugins/network/root_action.py b/plugins/network/root_action.py index 37be472..0512b9a 100755 --- a/plugins/network/root_action.py +++ b/plugins/network/root_action.py @@ -34,21 +34,37 @@ import subprocess import re import sys -def __changeIP(interface, address): +def __changeIP(interface, ipaddress, netmask="0"): + __check_address(ipaddress) + if netmask == "0": + ## change the IP only + proc = subprocess.Popen( + shell = False, + args = [IFCONFIG_BIN, interface, ipaddress]) + proc.wait() + else: + ## someone wants to change the netmask too + __check_address(netmask) + proc = subprocess.Popen( + shell = False, + args = [IFCONFIG_BIN, interface, ipaddress, "netmask", netmask]) + proc.wait() + return proc.returncode == 0 + + +def __changeGW(gwaddress): + ##TODO + return False + +def __check_address(address): + """Check for correct numbers in given address + """ match = re.search(r'^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$', address) ## did we match? If yes, then: are there wrong values inside? if not match or [e for e in match.groups() if int(e) > 255]: sys.stderr.write("%s: illegal argument (%s)\n" % (self_bin, address)) sys.exit(1) - proc = subprocess.Popen( - shell = False, - args = [IFCONFIG_BIN, interface, address]) - proc.wait() - return proc.returncode == 0 - - -def __changeGW(address): - return False + return if __name__ == "__main__": @@ -62,8 +78,8 @@ if __name__ == "__main__": try: if args[0] == "change_ip": - if len(args) != 3: raise "InvalidArgNum" - result = __changeIP(args[1], args[2]) + if len(args) != 4: raise "InvalidArgNum" + result = __changeIP(args[1], args[2], args[3]) elif args[0] == "change_gw": if len(args) != 2: raise "InvalidArgNum" result = __changeGW(args[1])