X-Git-Url: http://git.pjr.cc/?p=CBFWR.git;a=blobdiff_plain;f=libcbfwr%2Fconfig.php;h=70878f58a64e6987dd944ac1b7e59f1a7c9af9f1;hp=67c94a5742572786e8c7c2ae67750c31231a4b64;hb=cb45585d92144a65ff25bc1109cde4cbf60913de;hpb=22c669bff35547784d89c2c5c87e4311be63500b diff --git a/libcbfwr/config.php b/libcbfwr/config.php index 67c94a5..70878f5 100644 --- a/libcbfwr/config.php +++ b/libcbfwr/config.php @@ -1,2 +1,446 @@ config_file = null; + if(file_exists("../var/fw.conf")) { + $this->config_file = realpath("../var/fw.conf"); + $this->config["status"] = "conf"; + + } + if(file_exists("/var/lib/fwd/fw.conf")) { + $this->config_file = "/var/lib/fwd/fw.conf"; + $this->config["status"] = "conf"; + } + + + if($this->config_file == null) { + $this->config["status"] = "noconf"; + if(is_dir("/var/lib/fwd/")) { + echo "no config file found. Will use ../var/fw.conf for now\n"; + $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/fw.conf"; + } else { + echo "No directory where i can create a config, bailing\n"; + $this->config["status"] = "nodir"; + } + } + } + } + + 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) { + if($fname != "." && $fname != ".." && $fname != "lo" && is_dir("/sys/class/net/$fname/")) { + $this->config["hardware"]["netdev"][$fname]["name"] = $fname; + // now read drive name if you can + if(file_exists("/sys/class/net/$fname/device/uevent")) $fp = fopen("/sys/class/net/$fname/device/uevent", "r"); + else $fp = false; + if($fp) { + while(!feof($fp)) { + $line = trim(fgets($fp)); + $lpl = explode("=", $line); + if($lpl[0] == "DRIVER") { + $this->config["hardware"]["netdev"][$fname]["driver"] = $lpl[1]; + } + } + 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; + } + } + } + } + + function getConfig() + { + return $this->config; + } + + function setConfig($config) { + $this->config = $config; + } + + function applyConfig() + { + global $AM_DAEMON; + if(!$AM_DAEMON) return true; + + // oh the joy + return true; + } + + + + function loadConfigFile($file=null) + { + + 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"); + + $i = 1; + while($line = fgets($fp)) { + $line = trim($line); + echo "read line $line\n"; + 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 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; + for($i=0; $iconfig["hostname"]); + } else { + $this->config["hostname"] = $expl[1]; + } + break; + + case "domainname": + // set the hostname to $1 + if($delete) { + unset($this->config["domainname"]); + } else { + $this->config["domainname"] = $expl[1]; + } + break; + + case "zone": + 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; + } + break; + + case "interface": + switch($expl[1]) { + case "dev": + $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"]["dev"][$int]["description"] = $description; + } + + switch($expl[3]) { + case "address4": + $this->config["interface"]["dev"]["$int"]["address4"] = $expl[4]; + break; + case "address6": + $this->config["interface"]["dev"]["$int"]["address6"] = $expl[4]; + break; + case "name": + $this->config["interface"]["dev"]["$int"]["name"] = $expl[4]; + break; + case "status": + $this->config["interface"]["dev"]["$int"]["status"] = $expl[4]; + break; + case "mtu": + $this->config["interface"]["dev"]["$int"]["mtu"] = $expl[4]; + break; + case "zone": + $this->config["interface"]["dev"]["$int"]["zone"] = $expl[4]; + break; + case "speed": + $this->config["interface"]["dev"]["$int"]["speed"] = $expl[4]; + break; + case "duplex": + $this->config["interface"]["$int"]["duplex"] = $expl[4]; + break; + } + break; + + case "vlan": + $vlanid = $expl[2]; + $name = $expl[4]; + $from = $expl[6]; + $this->config["vlan"][$name]["parent"] = $from; + $this->config["vlan"][$name]["id"] = $vlanid; + if($hasdescription) { + $this->config["vlan"][$name]["description"] = $description; + } + break; + + case "lag": + $name = $expl[3]; + for($i=5; $iconfig["lag"][$name][$i-5] = $expl[$i]; + } + if($hasdescription) { + $this->config["lag"][$name]["description"] = $description; + } + break; + + case "bridge": + $name = $expl[3]; + for($i=5; $iconfig["bridge"][$name][$i-5] = $expl[$i]; + } + if($hasdescription) { + $this->config["bridge"][$name]["description"] = $description; + } + break; + + } + break; + + + case "login": + 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": + if($delete) { + unset($this->config["route4"][$expl[1]]); + } else { + $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; + } + } + break; + + + case "route6": + if($delete) { + unset($this->config["route6"][$expl[1]]); + } else { + $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; + } + } + // here we should check "$route" + break; + + + case "dns": + if(isset($this->config["dns"]["nservers"])) { + $dns_servers = $this->config["dns"]["nservers"]; + } else { + $dns_servers = 0; + } + if($expl[1] == "server") $this->config["dns"]["server"][$dns_servers]["address"] = $expl[2]; + if($hasdescription) { + $this->config["dns"]["server"][$dns_servers]["description"] = $description; + } + $this->config["dns"]["nservers"] = $dns_servers+1; + break; + + + case "ntp": + if(isset($this->config["ntp"]["nservers"])) { + $ntp_servers = $this->config["ntp"]["nservers"]; + } else { + $ntp_servers = 0; + } + if($expl[1] == "server") $this->config["ntp"]["server"][$ntp_servers]["address"] = $expl[2]; + if($hasdescription) { + $this->config["ntp"]["server"][$ntp_servers]["description"] = $description; + } + $this->config["ntp"]["nservers"] = $ntp_servers+1; + break; + + + + default: + echo "Errr, unknown config directive on line $lineno, $line\n"; + } + + + } + + function saveConfigFile($file) + { + global $AM_DAEMON; + if(!$AM_DAEMON) return true; + + } + + private $config_file; + private $config; +}; + ?> \ No newline at end of file