mirror of
				https://github.com/billz/raspap-webgui.git
				synced 2025-03-01 10:31:47 +00:00 
			
		
		
		
	Cleanup and fix for udev rules written for clients
Fix device type in client table
This commit is contained in:
		@@ -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. '<br>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']];
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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 '<option '.$txtdisabled.' selected value="'.$type.'">'.$txt.'</option>';
 | 
			
		||||
                                     if(preg_match("/^".$_SESSION["net-device-name-prefix"][$i].".*$/",$dev["type"])===1) echo '<option '.$txtdisabled.' selected value="'.$type.'">'.$txt.'</option>';
 | 
			
		||||
                                     else echo '<option '.$txtdisabled.' value="'.$type.'">'.$txt.'</option>';
 | 
			
		||||
                                   }
 | 
			
		||||
                                   echo "</select></td>";
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user