X-Git-Url: http://git.pjr.cc/?p=CBFWR.git;a=blobdiff_plain;f=libcbfwr%2Fconfig.php;h=70878f58a64e6987dd944ac1b7e59f1a7c9af9f1;hp=94cf1b31322af10fc4e25a28e5d02ab8202cf233;hb=cb45585d92144a65ff25bc1109cde4cbf60913de;hpb=a52a53bbe7ad884562d7fb39c87442a38e331dd2 diff --git a/libcbfwr/config.php b/libcbfwr/config.php index 94cf1b3..70878f5 100644 --- a/libcbfwr/config.php +++ b/libcbfwr/config.php @@ -4,11 +4,10 @@ class Config { // here we load a config if we can find it // there are two sides to every class, the fwd side // and the web page site (command line is web for all intents) - function __construct() + function __construct($look_for_config = false) { - global $AM_DAEMON; - if($AM_DAEMON) { + if($look_for_config) { $this->config_file = null; if(file_exists("../var/fw.conf")) { $this->config_file = realpath("../var/fw.conf"); @@ -28,32 +27,29 @@ class Config { $this->config_file = "/var/lib/fwd/fw.conf"; } else if(is_dir("../var/")) { echo "no config file found. Will use ../var/fw.conf for now\n"; - $this->config_file = "../var/"; + $this->config_file = "../var/fw.conf"; } else { echo "No directory where i can create a config, bailing\n"; - exit(0); + $this->config["status"] = "nodir"; } } - - if($this->config["status"] == "conf") { - - $this->loadConfig($this->config_file); - $this->findHardware(); - - print_r($this->config); - $this->applyConfig(); - } else { - // we go into firstrun mode - } - - - } else { - // config comes from shm... we'll get there - } + } + } + + function loadConfig($config) + { + $this->config = $config; + } + + function parseEthtool($interface) + { + // im not going to enjoy this, not one little bit } function findHardware() { + + // first, network interfaces $dh = opendir("/sys/class/net/"); while(($fname = readdir($dh)) !== false) { @@ -72,8 +68,22 @@ class Config { } fclose($fp); } + + // find hardware + if(file_exists("/sys/class/net/$fname/mtu")) $this->config["hardware"]["netdev"][$fname]["mtu"] = trim(file_get_contents("/sys/class/net/$fname/mtu")); + if(file_exists("/sys/class/net/$fname/address")) $this->config["hardware"]["netdev"][$fname]["hwaddress"] = trim(file_get_contents("/sys/class/net/$fname/address")); if(file_exists("/sys/class/net/$fname/bonding")) $this->config["hardware"]["netdev"][$fname]["bonding"] = true; if(file_exists("/sys/class/net/$fname/bridge")) $this->config["hardware"]["netdev"][$fname]["bridge"] = true; + if(file_exists("/sys/class/net/$fname/duplex")) { + $myval = trim(file_get_contents("/sys/class/net/$fname/duplex")); + if($myval == null) $myval = "default"; + $this->config["hardware"]["netdev"][$fname]["duplex"] = $myval; + } + if(file_exists("/sys/class/net/$fname/speed")) { + $myval = trim(file_get_contents("/sys/class/net/$fname/speed")); + if($myval == null) $myval = "default"; + $this->config["hardware"]["netdev"][$fname]["speed"] = $myval; + } } } } @@ -83,6 +93,10 @@ class Config { return $this->config; } + function setConfig($config) { + $this->config = $config; + } + function applyConfig() { global $AM_DAEMON; @@ -92,10 +106,18 @@ class Config { return true; } - function loadConfig($file) + + + function loadConfigFile($file=null) { - global $AM_DAEMON; - if(!$AM_DAEMON) return true; + + if($file == null) { + if($this->config["status"] == "nodir") { + return "nodir"; + } else $file = $this->config_file; + } + + if(!file_exists($file)) return "noconf"; $fp = fopen($file, "r"); @@ -103,16 +125,45 @@ class Config { while($line = fgets($fp)) { $line = trim($line); echo "read line $line\n"; - if($line != "") $this->parseLine($line, $i++); + if($line != "") $this->addConfigLine($line, $i++); + } + } + + function resolveInterfaceName($name) + { + // $config only ever contains real interface names + if(isset($this->config["interface"]["dev"][$name])) return $name; + + if(isset($this->config["interface"])) { + foreach($this->config["interface"]["dev"] as $key => $var) { + if(isset($var["name"])) { + if($var["name"] == $name) { + return $key; + } + } + } + } else { + // have to assume its a hardware name and check /sys + if(file_exists("/sys/class/net/$name")) return $name; } + + return null; } - function parseLine($line, $lineno) + function addConfigLine($line, $lineno=0) { + $line_n = trim($line); + $line = $line_n; $expl = preg_split("/ +/", $line); + if(count($expl) < 2) { + $c = count($expl); + error_log("Not a valid config line ($c), $line"); + return 0; + } echo "process command ".$expl[0]."\n"; + // TODO: when dealing with descriptions, we need to deal with a null description (i.e. delete the description) // find a description $description = null; $hasdescription = false; @@ -128,7 +179,7 @@ class Config { } } - // now rebuild the array if there was one + // now rebuild the array if there was a description if($hasdescription) { for($i=0; $i<$hasdescription; $i++) { $expl_r[$i] = $expl[$i]; @@ -136,54 +187,109 @@ class Config { $expl = $expl_r; } + // this is a special case for debugging + if($expl[0] == "hold") { + error_log("command is $line"); + return 0; + } + + $delete = false; + // check for delete on the line + if($expl[0] == "delete") { + $delete = true; + + // re-order the array + for($i=0; $i < (count($expl)-1); $i++) { + $expl[$i] = $expl[$i+1]; + } + unset($expl[count($expl)-1]); + } + + // now for modify + $modify = false; + // check for delete on the line + if($expl[0] == "modify") { + $modify = true; + + // re-order the array + for($i=0; $i < (count($expl)-1); $i++) { + $expl[$i] = $expl[$i+1]; + } + unset($expl[count($expl)-1]); + } + switch($expl[0]) { case "hostname": // set the hostname to $1 - $this->config["hostname"] = $expl[1]; + if($delete) { + unset($this->config["hostname"]); + } else { + $this->config["hostname"] = $expl[1]; + } break; case "domainname": // set the hostname to $1 - $this->config["domainname"] = $expl[1]; + if($delete) { + unset($this->config["domainname"]); + } else { + $this->config["domainname"] = $expl[1]; + } break; case "zone": - if($hasdescription) { - $this->config["zone"][$expl[2]]["description"] = $description; + if($delete) { + error_log("delete zone ".$expl[2]); + unset($this->config["zone"][$expl[2]]); + if(count($this->config["zone"]) < 1) { + error_log("zone now empty, delete zones"); + unset($this->config["zone"]); + } + } else { + if($hasdescription) { + $this->config["zone"][$expl[2]]["description"] = $description; + } + $this->config["zone"][$expl[2]]["name"] = true; } - $this->config["zone"][$expl[2]]["name"] = true; break; case "interface": switch($expl[1]) { case "dev": - $int = $expl[2]; - + $int = $this->resolveInterfaceName($expl[2]); + + if($int != $expl[2]) { + error_log("resolved int as $int from ".$expl[2]); + } + if($int == null) { + error_log("got config for interface ".$expl[2]." but i cannot find it, i will assume its hardware for now"); + $int = $expl[2]; + } if($hasdescription) { - $this->config["interface"][$int]["description"] = $description; + $this->config["interface"]["dev"][$int]["description"] = $description; } switch($expl[3]) { case "address4": - $this->config["interface"]["$int"]["address4"] = $expl[4]; + $this->config["interface"]["dev"]["$int"]["address4"] = $expl[4]; break; case "address6": - $this->config["interface"]["$int"]["address6"] = $expl[4]; + $this->config["interface"]["dev"]["$int"]["address6"] = $expl[4]; break; case "name": - $this->config["interface"]["$int"]["name"] = $expl[4]; + $this->config["interface"]["dev"]["$int"]["name"] = $expl[4]; break; case "status": - $this->config["interface"]["$int"]["status"] = $expl[4]; + $this->config["interface"]["dev"]["$int"]["status"] = $expl[4]; break; case "mtu": - $this->config["interface"]["$int"]["mtu"] = $expl[4]; + $this->config["interface"]["dev"]["$int"]["mtu"] = $expl[4]; break; case "zone": - $this->config["interface"]["$int"]["zone"] = $expl[4]; + $this->config["interface"]["dev"]["$int"]["zone"] = $expl[4]; break; case "speed": - $this->config["interface"]["$int"]["speed"] = $expl[4]; + $this->config["interface"]["dev"]["$int"]["speed"] = $expl[4]; break; case "duplex": $this->config["interface"]["$int"]["duplex"] = $expl[4]; @@ -227,54 +333,65 @@ class Config { case "login": - $this->config["login"][$expl[1]] = $expl[3]; - if($hasdescription) { - $this->config["login"][$expl[1]]["description"] = $description; + if($delete) { + unset($this->config["login"][$expl[1]]); + } else { + $this->config["login"][$expl[1]] = $expl[3]; + if($hasdescription) { + $this->config["login"][$expl[1]]["description"] = $description; + } } break; case "route4": - $route = $expl[1]; - $via = $expl[2]; - $dest = $expl[3]; - if($via == "to") { - $this->config["route4"][$route]["address"] = $dest; + if($delete) { + unset($this->config["route4"][$expl[1]]); } else { - $this->config["route4"][$route]["device"] = $dest; - } - if(isset($expl[4])) { - if($expl[4] == "dev") { - if(isset($expl[5])) { - $this->config["route4"][$route]["device"] = $expl[5]; + $route = $expl[1]; + $via = $expl[2]; + $dest = $expl[3]; + if($via == "to") { + $this->config["route4"][$route]["address"] = $dest; + } else { + $this->config["route4"][$route]["device"] = $dest; + } + if(isset($expl[4])) { + if($expl[4] == "dev") { + if(isset($expl[5])) { + $this->config["route4"][$route]["device"] = $expl[5]; + } } } - } - if($hasdescription) { - $this->config["route4"][$route]["description"] = $description; + if($hasdescription) { + $this->config["route4"][$route]["description"] = $description; + } } break; case "route6": - $route = $expl[1]; - $via = $expl[2]; - $dest = $expl[3]; - if($via == "to") { - $this->config["route6"][$route]["address"] = $dest; + if($delete) { + unset($this->config["route6"][$expl[1]]); } else { - $this->config["route6"][$route]["device"] = $dest; - } - if(isset($expl[4])) { - if($expl[4] == "dev") { - if(isset($expl[5])) { - $this->config["route6"][$route]["device"] = $expl[5]; + $route = $expl[1]; + $via = $expl[2]; + $dest = $expl[3]; + if($via == "to") { + $this->config["route6"][$route]["address"] = $dest; + } else { + $this->config["route6"][$route]["device"] = $dest; + } + if(isset($expl[4])) { + if($expl[4] == "dev") { + if(isset($expl[5])) { + $this->config["route6"][$route]["device"] = $expl[5]; + } } } + if($hasdescription) { + $this->config["route6"][$route]["description"] = $description; + } } - if($hasdescription) { - $this->config["route6"][$route]["description"] = $description; - } - // here we should check "$route" break; @@ -315,7 +432,7 @@ class Config { } - function saveConfig() + function saveConfigFile($file) { global $AM_DAEMON; if(!$AM_DAEMON) return true;