From c3ec82dd6f60ac8057cc50d9bf6274738db9c02e Mon Sep 17 00:00:00 2001 From: ShevAbam Date: Fri, 19 Dec 2014 18:06:37 +0100 Subject: [PATCH] Rewriting the network module (#12 and #16) Some issues with Arch or old Ubuntu --- libs/Utils/Misc.class.php | 25 +++++++++++ libs/network.php | 91 ++++++++++++++++++++++++++++++++++----- 2 files changed, 105 insertions(+), 11 deletions(-) diff --git a/libs/Utils/Misc.class.php b/libs/Utils/Misc.class.php index d77bbf5..ae4b6d1 100644 --- a/libs/Utils/Misc.class.php +++ b/libs/Utils/Misc.class.php @@ -38,6 +38,31 @@ class Misc return $_SERVER['SERVER_ADDR']; } + + /** + * Returns a command that exists in the system among $cmds + */ + public static function whichCommand($cmds, $args = '', $returnWithArgs = true) + { + $return = ''; + + foreach ($cmds as $cmd) + { + if (trim(shell_exec($cmd.$args)) != '') + { + $return = $cmd; + + if ($returnWithArgs) + $return .= $args; + + break; + } + } + + return $return; + } + + /** * Allows to pluralize a word based on a number * Ex : echo 'mot'.Misc::pluralize(5); ==> prints mots diff --git a/libs/network.php b/libs/network.php index 20b5a3a..b63d990 100644 --- a/libs/network.php +++ b/libs/network.php @@ -1,12 +1,70 @@ array('ifconfig', '/sbin/ifconfig', '/usr/bin/ifconfig', '/usr/sbin/ifconfig'), + 'ip' => array('ip', '/bin/ip', '/sbin/ip', '/usr/bin/ip', '/usr/sbin/ip'), +); + +// Returns command line for retreive interfaces +function getInterfacesCommand($commands) +{ + $ifconfig = Misc::whichCommand($commands['ifconfig'], ' | awk -F \'[/ |: ]\' \'{print $1}\' | sed -e \'/^$/d\''); + + if (!empty($ifconfig)) + { + return $ifconfig; + } + else + { + $ip_cmd = Misc::whichCommand($commands['ip'], ' -V', false); + + if (!empty($ip_cmd)) + { + return $ip_cmd.' -oneline link show | awk \'{print $2}\' | sed "s/://"'; + } + else + { + return null; + } + } +} + +// Returns command line for retreive IP address from interface name +function getIpCommand($commands, $interface) +{ + $ifconfig = Misc::whichCommand($commands['ifconfig'], ' '.$interface.' | awk \'/inet / {print $2}\' | cut -d \':\' -f2'); + + if (!empty($ifconfig)) + { + return $ifconfig; + } + else + { + $ip_cmd = Misc::whichCommand($commands['ip'], ' -V', false); + + if (!empty($ip_cmd)) + { + return 'for family in inet inet6; do '. + $ip_cmd.' -oneline -family $family addr show '.$interface.' | grep -v fe80 | awk \'{print $4}\' | sed "s/\/.*//"; ' . + 'done'; + } + else + { + return null; + } + } +} + + +$getInterfaces_cmd = getInterfacesCommand($commands); + +if (is_null($getInterfaces_cmd) || !(exec($getInterfaces_cmd, $getInterfaces))) { $datas[] = array('interface' => 'N.A', 'ip' => 'N.A'); } @@ -15,15 +73,26 @@ else foreach ($getInterfaces as $name) { $ip = null; - exec($ifconfig.' '.$name.' | awk \'/inet / {print $2}\' | cut -d \':\' -f2', $ip); - if (!isset($ip[0])) - $ip[0] = ''; + $getIp_cmd = getIpCommand($commands, $name); - $network[] = array( - 'name' => $name, - 'ip' => $ip[0], - ); + if (is_null($getIp_cmd) || !(exec($getIp_cmd, $ip))) + { + $network[] = array( + 'name' => $name, + 'ip' => 'N.A', + ); + } + else + { + if (!isset($ip[0])) + $ip[0] = ''; + + $network[] = array( + 'name' => $name, + 'ip' => $ip[0], + ); + } } foreach ($network as $interface)