From 300f2c24570d08229fc4d9d3cb4be4c646451e2d Mon Sep 17 00:00:00 2001 From: Christian Zeitnitz Date: Mon, 29 Mar 2021 15:16:23 +0200 Subject: [PATCH] Cleanup and fix for udev rules written for clients Fix device type in client table --- ajax/networking/save_net_dev_config.php | 126 ++++++++++++------------ includes/get_clients.php | 33 +++++-- includes/internetRoute.php | 2 +- templates/networking.php | 2 +- 4 files changed, 89 insertions(+), 74 deletions(-) diff --git a/ajax/networking/save_net_dev_config.php b/ajax/networking/save_net_dev_config.php index c718ae9b..e90cd1ea 100644 --- a/ajax/networking/save_net_dev_config.php +++ b/ajax/networking/save_net_dev_config.php @@ -17,76 +17,78 @@ if (isset($_POST['interface'])) { $file = $int.".ini"; $cfgfile="/etc/wvdial.conf"; if ( $int == "mobiledata") { - $cfg['pin'] = $_POST["pin-mobile"]; - $cfg['apn'] = $_POST["apn-mobile"]; - $cfg['apn_user'] = $_POST["apn-user-mobile"]; - $cfg['apn_pw'] = $_POST["apn-pw-mobile"]; - if (file_exists($cfgfile)) { - if($cfg["pin"] !== "") exec('sudo /bin/sed -i "s/CPIN=\".*\"/CPIN=\"'.$cfg["pin"].'\"/gi" '.$cfgfile); - if($cfg["apn"] !== "") exec('sudo /bin/sed -i "s/\"IP\"\,\".*\"/\"IP\"\,\"'.$cfg["apn"].'\"/gi" '.$cfgfile); - if($cfg["apn_user"] !== "") exec('sudo /bin/sed -i "s/^username = .*$/Username = '.$cfg["apn_user"].'/gi" '.$cfgfile); - if($cfg["apn_pw"] !== "") exec('sudo /bin/sed -i "s/^password = .*$/Password = '.$cfg["apn_pw"].'/gi" '.$cfgfile); - } + $cfg['pin'] = $_POST["pin-mobile"]; + $cfg['apn'] = $_POST["apn-mobile"]; + $cfg['apn_user'] = $_POST["apn-user-mobile"]; + $cfg['apn_pw'] = $_POST["apn-pw-mobile"]; + if (file_exists($cfgfile)) { + if($cfg["pin"] !== "") exec('sudo /bin/sed -i "s/CPIN=\".*\"/CPIN=\"'.$cfg["pin"].'\"/gi" '.$cfgfile); + if($cfg["apn"] !== "") exec('sudo /bin/sed -i "s/\"IP\"\,\".*\"/\"IP\"\,\"'.$cfg["apn"].'\"/gi" '.$cfgfile); + if($cfg["apn_user"] !== "") exec('sudo /bin/sed -i "s/^username = .*$/Username = '.$cfg["apn_user"].'/gi" '.$cfgfile); + if($cfg["apn_pw"] !== "") exec('sudo /bin/sed -i "s/^password = .*$/Password = '.$cfg["apn_pw"].'/gi" '.$cfgfile); + } } else if ( preg_match("/netdevices/",$int)) { if(!isset($_POST['opts']) ) { - $jsonData = ['return'=>0,'output'=>['No valid data to add/delete udev rule ']]; - echo json_encode($jsonData); - return; + $jsonData = ['return'=>0,'output'=>['No valid data to add/delete udev rule ']]; + echo json_encode($jsonData); + return; } else { - $opts=explode(" ",$_POST['opts'] ); - $dev=$opts[0]; - $vid=$_POST["int-vid-".$dev]; - $pid=$_POST["int-pid-".$dev]; - $mac=$_POST["int-mac-".$dev]; - $name=trim($_POST["int-name-".$dev]); - $type=$_POST["int-type-".$dev]; - $newtype=$_POST["int-new-type-".$dev]; - $udevfile=$_SESSION["udevrules"]["udev_rules_file"]; - // $udevfile="/etc/udev/rules.d/80-net-devices.rules"; + $opts=explode(" ",$_POST['opts'] ); + $dev=$opts[0]; + $vid=$_POST["int-vid-".$dev]; + $pid=$_POST["int-pid-".$dev]; + $mac=$_POST["int-mac-".$dev]; + $name=trim($_POST["int-name-".$dev]); + $name=preg_replace("/[^a-z0-9]/", "", strtolower($name)); + $type=$_POST["int-type-".$dev]; + $newtype=$_POST["int-new-type-".$dev]; + $udevfile=$_SESSION["udevrules"]["udev_rules_file"]; // default file /etc/udev/rules.d/80-net-devices.rules"; - // find the rule prototype and prefix - $rule = ""; - foreach($_SESSION["udevrules"]["network_devices"] as $devt) { - if($devt["type"]==$newtype) { - $rule = $devt["udev_rule"]; - $prefix = $devt["name_prefix"]; - } - } - if(!empty($mac)) $rule = preg_replace("/\\\$MAC\\\$/i",$mac,$rule); - if(!empty($vid)) $rule = preg_replace("/\\\$IDVENDOR\\\$/i",$vid,$rule); - if(!empty($pid)) $rule = preg_replace("/\\\$IDPRODUCT\\\$/i",$pid,$rule); - // check for existing rule - $pre=""; - if(preg_match("/^(\w+)[0-9]$/",$dev,$match)=== 1) $pre=$match[1]; - $ruleold = preg_replace("/\\\$DEVNAME\\\$/i",$pre.".",$rule); - exec("grep -oP '".$ruleold."' $udevfile",$ret); - $newRule = empty($ret) || !empty($name); - // delete current entry - if(!empty($ret)) exec("sudo sed -i '/^".$ruleold."$/d' ".$udevfile); - exec('sudo sed -i "/^.*'.$mac.'.*$/d" '.$udevfile); - if($newRule) { + // find the rule prototype and prefix + $rule = ""; + foreach($_SESSION["udevrules"]["network_devices"] as $devt) { + if($devt["type"]==$newtype) { + $rulenew = $devt["udev_rule"]; + $prefix = $devt["name_prefix"]; + } + } + + // check for an existing rule and delete lines with same MAC or same VID/PID + if (!empty($vid) && !empty($pid)) { + $rule = '^.*ATTRS{idVendor}==\"' . $vid . '\".*ATTRS{idProduct}==\"' . $pid . '\".*$'; + exec('sudo sed -i "/'.$rule.'/Id" '.$udevfile); // clear all entries with this VID/PID + $rule = '^.*ATTRS{idProduct}==\"' . $pid . '\".*ATTRS{idVendor}==\"' . $vid . '\".*$'; + exec('sudo sed -i "/'.$rule.'/Id" '.$udevfile); // clear all entries with this VID/PID + } + if (!empty($mac)) { + exec('sudo sed -i "/^.*'.$mac.'.*$/d" '.$udevfile); // clear all entries with same MAC + } // create new entry - if(empty($name)) $name = $prefix."0"; - if(!empty($name)) $rule = preg_replace("/\\\$DEVNAME\\\$/i",$name,$rule); - if (!empty($rule) ) exec('echo \''.$rule.'\' | sudo /usr/bin/tee -a '.$udevfile); - } - $ret=print_r($ret,true); - $jsonData = ['return'=>0,'output'=>['Settings changed for device '.$dev ] ]; - echo json_encode($jsonData); - return; + if ( ($type != $newtype) || !empty($name) ) { // new device type or new name + if (empty($name)) $name = $prefix."*"; + if (!empty($mac)) $rule = preg_replace("/\\\$MAC\\\$/i", $mac, $rulenew); + if (!empty($vid)) $rule = preg_replace("/\\\$IDVENDOR\\\$/i", $vid, $rule); + if (!empty($pid)) $rule = preg_replace("/\\\$IDPRODUCT\\\$/i", $pid, $rule); + if (!empty($name)) $rule = preg_replace("/\\\$DEVNAME\\\$/i",$name,$rule); + if (!empty($rule)) exec('echo \''.$rule.'\' | sudo /usr/bin/tee -a '.$udevfile); + } + $ret=print_r($ret,true); + $jsonData = ['return'=>0,'output'=>['Settings changed for device '.$dev. '
Changes will only be in effect after reconnecting the device' ] ]; + echo json_encode($jsonData); + return; } } else { - $ip = $_POST[$int.'-ipaddress']; - $netmask = mask2cidr($_POST[$int.'-netmask']); - $dns1 = $_POST[$int.'-dnssvr']; - $dns2 = $_POST[$int.'-dnssvralt']; + $ip = $_POST[$int.'-ipaddress']; + $netmask = mask2cidr($_POST[$int.'-netmask']); + $dns1 = $_POST[$int.'-dnssvr']; + $dns2 = $_POST[$int.'-dnssvralt']; - $cfg['interface'] = $int; - $cfg['routers'] = $_POST[$int.'-gateway']; - $cfg['ip_address'] = $ip."/".$netmask; - $cfg['domain_name_server'] = $dns1." ".$dns2; - $cfg['static'] = $_POST[$int.'-static']; - $cfg['failover'] = $_POST[$int.'-failover']; + $cfg['interface'] = $int; + $cfg['routers'] = $_POST[$int.'-gateway']; + $cfg['ip_address'] = $ip."/".$netmask; + $cfg['domain_name_server'] = $dns1." ".$dns2; + $cfg['static'] = $_POST[$int.'-static']; + $cfg['failover'] = $_POST[$int.'-failover']; } if (write_php_ini($cfg, RASPI_CONFIG.'/networking/'.$file)) { $jsonData = ['return'=>0,'output'=>['Successfully Updated Network Configuration']]; diff --git a/includes/get_clients.php b/includes/get_clients.php index 0fd70e83..d322c423 100644 --- a/includes/get_clients.php +++ b/includes/get_clients.php @@ -20,16 +20,8 @@ function getClients($simple=true) } foreach ($rawdevs as $i => $dev) { $cl["device"][$i]["name"]=$dev; - if (preg_match("/^(\w+)[0-9]$/", $dev, $nam) === 1) { - $nam=$nam[1]; - } else { - $nam="none"; - } - if (($n = array_search($nam, $_SESSION["net-device-name-prefix"])) === false) { - $n = count($_SESSION["net-device-types"])-1; - } - $ty = $_SESSION["net-device-types"][$n]; - $cl["device"][$i]["type"]=$ty; + $nam = (preg_match("/^(\w+)[0-9]$/",$dev,$nam) === 1) ? $nam=$nam[1] : ""; + $cl["device"][$i]["type"]=$ty=getClientType($dev); unset($udevinfo); exec("udevadm info /sys/class/net/$dev 2> /dev/null", $udevinfo); if ($nam == "ppp" && isset($devtty)) { @@ -181,6 +173,27 @@ function getClients($simple=true) return $cl; } +function getClientType($dev) { + loadClientConfig(); + // check if device type stored in DEVTYPE or raspapType (from UDEV rule) protperty of the device + exec("udevadm info /sys/class/net/$dev 2> /dev/null", $udevadm); + $type="none"; + if (!empty($udevadm)) { + $type=preg_only_match("/raspapType=(\w*)/i",$udevadm); + if (empty($type)) { + $type=preg_only_match("/DEVTYPE=(\w*)/i",$udevadm); + } + } + if (empty($type) || array_search($type, $_SESSION["net-device-name-prefix"]) === false) { + // no device type yet -> get device type from device name + if (preg_match("/^(\w+)[0-9]$/",$dev,$nam) === 1) $nam=$nam[1]; + else $nam="none"; + if (($n = array_search($nam, $_SESSION["net-device-name-prefix"])) === false) $n = count($_SESSION["net-device-types"])-1; + $type = $_SESSION["net-device-types"][$n]; + } + return $type; +} + function loadClientConfig() { // load network device config file for UDEV rules into $_SESSION diff --git a/includes/internetRoute.php b/includes/internetRoute.php index bbb090f7..e83dca22 100755 --- a/includes/internetRoute.php +++ b/includes/internetRoute.php @@ -46,7 +46,7 @@ function getRouteInfo($checkAccess) $rInfo[$i]["access-ip"] = empty($okip) ? false : true; unset($okdns); exec('ping -W1 -c 1 -I ' . $prop[0] . ' ' . RASPI_ACCESS_CHECK_DNS . ' | sed -rn "s/.*icmp_seq=1.*time=.*/OK/p"', $okdns); - $rInfo[$i]["access-dns"] = empty($okdns) ? false : true; + $rInfo[$i]["access-dns"] = empty($okdns) ? false : true; } } } else { diff --git a/templates/networking.php b/templates/networking.php index 78f751a0..12b997b9 100755 --- a/templates/networking.php +++ b/templates/networking.php @@ -141,7 +141,7 @@ foreach($_SESSION["net-device-types"] as $i => $type) { $txt=$_SESSION["net-device-types-info"][$i]; $txtdisabled = in_array($type,array("ppp","tun")) ? "disabled":""; - if(preg_match("/^".$_SESSION["net-device-name-prefix"][$i]."[0-9]*$/",$dev["name"])===1) echo ''; + if(preg_match("/^".$_SESSION["net-device-name-prefix"][$i].".*$/",$dev["type"])===1) echo ''; else echo ''; } echo "";