diff options
author | Scott Ullrich <sullrich@pfsense.org> | 2006-01-15 10:48:19 +0000 |
---|---|---|
committer | Scott Ullrich <sullrich@pfsense.org> | 2006-01-15 10:48:19 +0000 |
commit | 1da9fea0d4746f1a1cf556a4a65aa92f9a1b1d09 (patch) | |
tree | b0b2a6119710eaf3994e4dc7675cf05677f9d428 /etc/inc/pfsense-utils.inc | |
parent | c9fbacb77e9ddf13b69396be2f61a8bbd546b822 (diff) | |
download | pfsense-1da9fea0d4746f1a1cf556a4a65aa92f9a1b1d09.zip pfsense-1da9fea0d4746f1a1cf556a4a65aa92f9a1b1d09.tar.gz |
Revert to 1.377
Diffstat (limited to 'etc/inc/pfsense-utils.inc')
-rw-r--r-- | etc/inc/pfsense-utils.inc | 2233 |
1 files changed, 1504 insertions, 729 deletions
diff --git a/etc/inc/pfsense-utils.inc b/etc/inc/pfsense-utils.inc index 7cbee90..ecbb672 100644 --- a/etc/inc/pfsense-utils.inc +++ b/etc/inc/pfsense-utils.inc @@ -1,14 +1,14 @@ <?php -/****h* pfSense/pkg-utils +/****h* pfSense/pfsense-utils * NAME - * pkg-utils.inc - Package subsystem + * pfsense-utils.inc - Utilities specific to pfSense * DESCRIPTION - * This file contains various functions used by the pfSense package system. + * This include contains various pfSense specific functions. * HISTORY * $Id$ ****** * - * Copyright (C) 2005 Colin Smith (ethethlay@gmail.com) + * Copyright (C) 2005 Scott Ullrich (sullrich@gmail.com) * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -32,813 +32,1588 @@ * POSSIBILITY OF SUCH DAMAGE. * */ -require_once("xmlrpc.inc"); -require_once("xmlparse.inc"); -require_once("service-utils.inc"); -require_once("pfsense-utils.inc"); -require_once("globals.inc"); -safe_mkdir("/var/db/pkg"); -$g['platform'] = trim(file_get_contents("/etc/platform")); -if($g['platform'] == "pfSense") { - safe_mkdir("/usr/local/pkg"); - safe_mkdir("/usr/local/pkg/pf"); +function get_tmp_file() { + return "/tmp/tmp-" . time(); } -/****f* pkg-utils/is_package_installed +/****f* pfsense-utils/get_dns_servers * NAME - * is_package_installed - Check whether a package is installed. + * get_dns_servres - get system dns servers * INPUTS - * $packagename - name of the package to check + * $dns_servers - an array of the dns servers * RESULT - * boolean - true if the package is installed, false otherwise + * null + ******/ +function get_dns_servers() { + $dns_servers = array(); + $dns = `cat /etc/resolv.conf`; + $dns_s = split("\n", $dns); + foreach($dns_s as $dns) { + $matches = ""; + if (preg_match("/nameserver (.*)/", $dns, $matches)) + $dns_servers[] = $matches[1]; + } + $dns_server_master = array(); + sort($dns_servers); + $lastseen = ""; + foreach($dns_servers as $t) { + if($t <> $lastseen) + if($t <> "") + $dns_server_master[] = $t; + $lastseen = $t; + } + return $dns_server_master; +} + +/****f* pfsense-utils/log_error +* NAME +* log_error - Sends a string to syslog. +* INPUTS +* $error - string containing the syslog message. +* RESULT +* null +******/ +function log_error($error) { + $page = $_SERVER['PHP_SELF']; + syslog(LOG_WARNING, "$page: $error"); + return; +} + +/****f* pfsense-utils/get_interface_mac_address + * NAME + * get_interface_mac_address - Return a interfaces mac address + * INPUTS + * $interface - interface to obtain mac address from + * RESULT + * $mac - the mac address of the interface + ******/ +function get_interface_mac_address($interface) { + $mac = exec("ifconfig {$interface} | awk '/ether/ {print $2}'"); + return trim($mac); +} + +/****f* pfsense-utils/return_dir_as_array + * NAME + * return_dir_as_array - Return a directory's contents as an array. + * INPUTS + * $dir - string containing the path to the desired directory. + * RESULT + * $dir_array - array containing the directory's contents. This array will be empty if the path specified is invalid. + ******/ +function return_dir_as_array($dir) { + $dir_array = array(); + if (is_dir($dir)) { + if ($dh = opendir($dir)) { + while (($file = readdir($dh)) !== false) { + $canadd = 0; + if($file == ".") $canadd = 1; + if($file == "..") $canadd = 1; + if($canadd == 0) + array_push($dir_array, $file); + } + closedir($dh); + } + } + return $dir_array; +} + +/****f* pfsense-utils/enable_hardware_offloading + * NAME + * enable_hardware_offloading - Enable a NIC's supported hardware features. + * INPUTS + * $interface - string containing the physical interface to work on. + * RESULT + * null * NOTES - * This function is deprecated - get_pkg_id() can already check for installation. + * This function only supports the fxp driver's loadable microcode. ******/ -function is_package_installed($packagename) { - $pkg = get_pkg_id($packagename); - if($pkg == -1) return false; - return true; +function enable_hardware_offloading($interface) { + global $g, $config; + + if(stristr($interface,"lnc")) + return; + if(isset($config['system']['do_not_use_nic_microcode'])) + return; + + if($g['booting']) { + /* translate wan, lan, opt -> real interface if needed */ + $int = filter_translate_type_to_real_interface($interface); + if($int <> "") $interface = $int; + $int_family = preg_split("/[0-9]+/", $int); + $options = strtolower(`/sbin/ifconfig {$interface} | grep options`); + $supported_ints = array('fxp'); + if (in_array($int_family, $supported_ints)) + mwexec("/sbin/ifconfig {$interface} link0"); + + if(stristr($options, "txcsum") == true) + mwexec("/sbin/ifconfig {$interface} txcsum 2>/dev/null"); + if(stristr($options, "rxcsum") == true) + mwexec("/sbin/ifconfig {$interface} rxcsum 2>/dev/null"); + if(stristr($options, "polling") == true) + mwexec("/sbin/ifconfig {$interface} polling 2>/dev/null"); + } + return; } - -/****f* pkg-utils/get_pkg_id + +/****f* pfsense-utils/is_alias_inuse * NAME - * get_pkg_id - Find a package's numeric ID. + * checks to see if an alias is currently in use by a rule * INPUTS - * $pkg_name - name of the package to check + * * RESULT - * integer - -1 if package is not found, >-1 otherwise + * true or false + * NOTES + * ******/ -function get_pkg_id($pkg_name) { - global $config; - if(is_array($config['installedpackages']['package'])) { - $i = 0; - foreach($config['installedpackages']['package'] as $pkg) { - if($pkg['name'] == $pkg_name) return $i; - $i++; - } - } - return -1; -} - -/****f* pkg-utils/get_pkg_info +function is_alias_inuse($alias) { + global $g, $config; + + if($alias == "") return false; + /* loop through firewall rules looking for alias in use */ + if(is_array($config['nat']['rule'])) + foreach($config['filter']['rule'] as $rule) { + if(is_array($rule['source']['address'])) + if($rule['source']['address'] == $alias) + return true; + if(is_array($rule['destination']['address'])) + if($rule['destination']['address'] == $alias) + return true; + } + /* loop through nat rules looking for alias in use */ + if(is_array($config['nat']['rule'])) + foreach($config['nat']['rule'] as $rule) { + if($rule['target'] == $alias) + return true; + if($rule['external-address'] == $alias) + return true; + } + return false; +} + +/****f* pfsense-utils/setup_polling_defaults * NAME - * get_pkg_info - Retrive package information from pfsense.com. + * sets up sysctls for pollingS * INPUTS - * $pkgs - 'all' to retrive all packages, an array containing package names otherwise - * $info - 'all' to retrive all information, an array containing keys otherwise + * * RESULT - * $raw_versions - Array containing retrieved information, indexed by package name. + * null + * NOTES + * ******/ -function get_pkg_info($pkgs = 'all', $info = 'all') { - global $g; - $params = array("pkg" => $pkgs, "info" => $info); - $msg = new XML_RPC_Message('pfsense.get_pkgs', array(php_value_to_xmlrpc($params))); - $cli = new XML_RPC_Client($g['xmlrpcpath'], $g['xmlrpcbaseurl']); - $resp = $cli->send($msg, 10); - if($resp and !$resp->faultCode()) { - $raw_versions = $resp->value(); - return xmlrpc_value_to_php($raw_versions); - } else { - return array(); +function setup_polling_defaults() { + global $g, $config; + if($config['system']['polling_each_burst']) + mwexec("sysctl kern.polling.each_burst={$config['system']['polling_each_burst']}"); + if($config['system']['polling_burst_max']) + mwexec("sysctl kern.polling.burst_max={$config['system']['polling_burst_max']}"); + if($config['system']['polling_user_frac']) + mwexec("sysctl kern.polling.user_frac={$config['system']['polling_user_frac']}"); +} + +/****f* pfsense-utils/setup_polling + * NAME + * sets up polling + * INPUTS + * + * RESULT + * null + * NOTES + * + ******/ +function setup_polling() { + global $g, $config; + + setup_polling_defaults(); + /* build an array of interfaces to work with */ + $iflist = array("lan" => "LAN", "wan" => "WAN"); + for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) + $iflist['opt' . $i] = $config['interfaces']['opt' . $i]['descr']; + /* activate polling for interface if it supports it + * man polling on a freebsd box for the following list + */ + /* loop through all interfaces and handle pftpx redirections */ + foreach ($iflist as $ifent => $ifname) { + $supported_ints = array('dc', 'em', 'fwe', 'fwip', 'fxp', 'ixgb', 'ste', + 'nge', 're', 'rl', 'sf', 'sis', 'ste', 'vge', 'vr', 'xl'); + if (in_array($ifname, $supported_ints) and isset($config['system']['polling'])) { + mwexec("/sbin/ifconfig {$interface} polling"); + } else { + mwexec("/sbin/ifconfig {$interface} -polling"); + } } } -function get_pkg_sizes($pkgs = 'all') { +/****f* pfsense-utils/setup_microcode + * NAME + * enumerates all interfaces and calls enable_hardware_offloading which + * enables a NIC's supported hardware features. + * INPUTS + * + * RESULT + * null + * NOTES + * This function only supports the fxp driver's loadable microcode. + ******/ +function setup_microcode() { + global $config; + + $ifdescrs = array('wan', 'lan'); + for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++) { + $ifdescrs['opt' . $j] = "opt" . $j; + } + foreach($ifdescrs as $if) + enable_hardware_offloading($if); +} + +/****f* pfsense-utils/return_filename_as_array + * NAME + * return_filename_as_array - Return a file's contents as an array. + * INPUTS + * $filename - string containing the path to the desired file. + * $strip - array of characters to strip - default is '#'. + * RESULT + * $file - array containing the file's contents. + * NOTES + * This function strips lines starting with '#' and leading/trailing whitespace by default. + ******/ +function return_filename_as_array($filename, $strip = array('#')) { + if(file_exists($filename)) $file = file($filename); + if(is_array($file)) { + foreach($file as $line) $line = trim($line); + foreach($strip as $tostrip) $file = preg_grep("/^{$tostrip}/", $file, PREG_GREP_INVERT); + } + return $file; +} + +/****f* pfsense-utils/file_put_contents + * NAME + * file_put_contents - Wrapper for file_put_contents if it doesn't exist + * RESULT + * none + ******/ +if(!function_exists("file_put_contents")) { + function file_put_contents($filename, $data) { + $fd = fopen($filename,"w"); + fwrite($fd, $data); + fclose($fd); + } +} + +/****f* pfsense-utils/get_carp_status + * NAME + * get_carp_status - Return whether CARP is enabled or disabled. + * RESULT + * boolean - true if CARP is enabled, false if otherwise. + ******/ +function get_carp_status() { + /* grab the current status of carp */ + $status = `/sbin/sysctl net.inet.carp.allow | cut -d" " -f2`; + if(intval($status) == "0") return false; + return true; +} + +/****f* pfsense-utils/is_carp_defined + * NAME + * is_carp_defined - Return whether CARP is detected in the kernel. + * RESULT + * boolean - true if CARP is detected, false otherwise. + ******/ +function is_carp_defined() { + /* is carp compiled into the kernel and userland? */ + $command = "/sbin/sysctl -a | grep carp"; + $fd = popen($command . " 2>&1 ", "r"); + if(!$fd) { + log_error("Warning, could not execute command {$command}"); + return 0; + } + while(!feof($fd)) { + $tmp .= fread($fd,49); + } + fclose($fd); + + if($tmp == "") + return false; + else + return true; +} + +/****f* pfsense-utils/get_interface_mtu + * NAME + * get_interface_mtu - Return the mtu of an interface + * RESULT + * $tmp - Returns the mtu of an interface + ******/ +function get_interface_mtu($interface) { + $mtu = `/sbin/ifconfig {$interface} | /usr/bin/grep mtu | /usr/bin/cut -d" " -f4`; + return $mtu; +} + +/****f* pfsense-utils/is_interface_wireless + * NAME + * is_interface_wireless - Returns if an interface is wireless + * RESULT + * $tmp - Returns if an interface is wireless + ******/ +function is_interface_wireless($interface) { + global $config, $g; + $interface = convert_real_interface_to_friendly_interface_name($interface); + if(isset($config['interfaces'][$interface]['wireless'])) + return true; + else + return false; +} + +/****f* pfsense-utils/find_number_of_created_carp_interfaces + * NAME + * find_number_of_created_carp_interfaces - Return the number of CARP interfaces. + * RESULT + * $tmp - Number of currently created CARP interfaces. + ******/ +function find_number_of_created_carp_interfaces() { + $command = "/sbin/ifconfig | /usr/bin/grep \"carp*:\" | /usr/bin/wc -l"; + $fd = popen($command . " 2>&1 ", "r"); + if(!$fd) { + log_error("Warning, could not execute command {$command}"); + return 0; + } + while(!feof($fd)) { + $tmp .= fread($fd,49); + } + fclose($fd); + $tmp = intval($tmp); + return $tmp; +} + +/****f* pfsense-utils/link_ip_to_carp_interface + * NAME + * link_ip_to_carp_interface - Find where a CARP interface links to. + * INPUTS + * $ip + * RESULT + * $carp_ints + ******/ +function link_ip_to_carp_interface($ip) { + global $config; + if($ip == "") return; + + $ifdescrs = array('wan', 'lan'); + for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++) { + $ifdescrs['opt' . $j] = "opt" . $j; + } + + $ft = split("\.", $ip); + $ft_ip = $ft[0] . "." . $ft[1] . "." . $ft[2] . "."; + + $carp_ints = ""; + $num_carp_ints = find_number_of_created_carp_interfaces(); + foreach ($ifdescrs as $ifdescr => $ifname) { + for($x=0; $x<$num_carp_ints; $x++) { + $carp_int = "carp{$x}"; + $carp_ip = find_interface_ip($carp_int); + $carp_ft = split("\.", $carp_ip); + $carp_ft_ip = $carp_ft[0] . "." . $carp_ft[1] . "." . $carp_ft[2] . "."; + $result = does_interface_exist($carp_int); + if($result <> true) break; + if($ft_ip == $carp_ft_ip) + if(stristr($carp_ints,$carp_int) == false) + $carp_ints .= " " . $carp_int; + } + } + return $carp_ints; +} + +/****f* pfsense-utils/exec_command + * NAME + * exec_command - Execute a command and return a string of the result. + * INPUTS + * $command - String of the command to be executed. + * RESULT + * String containing the command's result. + * NOTES + * This function returns the command's stdout and stderr. + ******/ +function exec_command($command) { + $output = array(); + exec($command . ' 2>&1 ', $output); + return(implode("\n", $output)); +} + +/****f* interfaces/is_jumbo_capable + * NAME + * is_jumbo_capable - Test if interface is jumbo frame capable. Useful for determining VLAN capability. + * INPUTS + * $int - string containing interface name + * RESULT + * boolean - true or false + ******/ +function is_jumbo_capable($int) { + /* Per: + * http://www.freebsd.org/cgi/man.cgi?query=vlan&manpath=FreeBSD+6.0-RELEASE&format=html + * Only the following drivers support large frames + * + * 'de' chipset purposely left out of this list + * requires defining BIG_PACKET in the + * /usr/src/sys/pci/if_de.c source file and rebuilding the + * kernel or module. The hack works only for the 21041, + * 21140, and 21140A chips. + */ global $g; - $params = array("pkg" => $pkgs); - $msg = new XML_RPC_Message('pfsense.get_pkg_sizes', array(php_value_to_xmlrpc($params))); - $cli = new XML_RPC_Client($g['xmlrpcpath'], $g['xmlrpcbaseurl']); - $resp = $cli->send($msg, 10); - if($resp and !$resp->faultCode()) { - $raw_versions = $resp->value(); - return xmlrpc_value_to_php($raw_versions); - } else { - return array(); - } + + $capable = $g['vlan_long_frame']; + + $int_family = preg_split("/[0-9]+/", $int); + + if (in_array($int_family[0], $capable)) + return true; + else + return false; } /* - * resync_all_package_configs() Force packages to setup their configuration and rc.d files. - * This function may also print output to the terminal indicating progress. + * does_interface_exist($interface): return true or false if a interface is detected. */ -function resync_all_package_configs($show_message = false) { - global $config; - $i = 0; - log_error("Resyncing configuration for all packages."); - if(!$config['installedpackages']['package']) return; - if($show_message == true) print "Syncing packages:"; - foreach($config['installedpackages']['package'] as $package) { - if($show_message == true) print " " . $package['name']; - sync_package($i, true, true); - $i++; - } - if($show_message == true) print ".\n"; +function does_interface_exist($interface) { + $ints = exec_command("/sbin/ifconfig -l"); + if(stristr($ints, $interface) !== false) + return true; + else + return false; } /* - * is_freebsd_pkg_installed() - Check /var/db/pkg to determine whether or not a FreeBSD - * package is installed. + * convert_ip_to_network_format($ip, $subnet): converts an ip address to network form */ -function is_freebsd_pkg_installed($pkg) { - global $g; - if(in_array($pkg, return_dir_as_array("{$g['vardb_path']}/pkg"))) return true; - return false; +function convert_ip_to_network_format($ip, $subnet) { + $ipsplit = split('[.]', $ip); + $string = $ipsplit[0] . "." . $ipsplit[1] . "." . $ipsplit[2] . ".0/" . $subnet; + return $string; } /* - * get_pkg_depends($pkg_name, $filetype = ".xml", $format = "files", return_nosync = 1): Return a package's dependencies. - * - * $filetype = "all" || ".xml", ".tgz", etc. - * $format = "files" (full filenames) || "names" (stripped / parsed depend names) - * $return_nosync = 1 (return depends that have nosync set) | 0 (ignore packages with nosync) - * + * find_interface_ip($interface): return the interface ip (first found) */ -function get_pkg_depends($pkg_name, $filetype = ".xml", $format = "files", $return_nosync = 1) { - global $config; - $pkg_id = get_pkg_id($pkg_name); - if(!is_numeric($pkg_name)) { - if($pkg_id == -1) return -1; // This package doesn't really exist - exit the function. - } else { - if(!isset($config['installedpackages']['package'][$pkg_id])) return; // No package belongs to the pkg_id passed to this function. - } - $package = $config['installedpackages']['package'][$pkg_id]; - if(!file_exists("/usr/local/pkg/" . $package['configurationfile'])) { - file_notice($package['name'], "The {$package['name']} package is missing its configuration file and must be reinstalled.", "Packages", "/pkg_mgr_install.php?mode=reinstallpkg&pkg={$package['name']}", 1); - return; +function find_interface_ip($interface) { + if(does_interface_exist($interface) == false) return; + $ip = exec_command("/sbin/ifconfig {$interface} | /usr/bin/grep -w \"inet\" | /usr/bin/cut -d\" \" -f 2"); + $ip = str_replace("\n","",$ip); + return $ip; +} + +function guess_interface_from_ip($ipaddress) { + $ints = `/sbin/ifconfig -l`; + $ints_split = split(" ", $ints); + $ip_subnet_split = split("\.", $ipaddress); + $ip_subnet = $ip_subnet_split[0] . "." . $ip_subnet_split[1] . "." . $ip_subnet_split[2] . "."; + foreach($ints_split as $int) { + $ip = find_interface_ip($int); + $ip_split = split("\.", $ip); + $ip_tocheck = $ip_split[0] . "." . $ip_split[1] . "." . $ip_split[2] . "."; + if(stristr($ip_tocheck, $ip_subnet) != false) return $int; } - $pkg_xml = parse_xml_config_pkg("/usr/local/pkg/" . $package['configurationfile'], "packagegui"); - if($pkg_xml['additional_files_needed'] != "") { - foreach($pkg_xml['additional_files_needed'] as $item) { - if (($return_nosync == 0) && (isset($item['nosync']))) continue; // Do not return depends with nosync set if not required. - $depend_file = substr(strrchr($item['item']['0'], '/'),1); // Strip URLs down to filenames. - $depend_name = substr(substr($depend_file,0,strpos($depend_file,".")+1),0,-1); // Strip filename down to dependency name. - if (($filetype != "all") && (!preg_match("/${filetype}/i", $depend_file))) continue; - if ($item['prefix'] != "") { - $prefix = $item['prefix']; - } else { - $prefix = "/usr/local/pkg/"; - } - if(!file_exists($prefix . $pkg_name)) { - file_notice($package['name'], "The {$package['name']} package is missing required dependencies and must be reinstalled.", "Packages", "/pkg_mgr_install.php?mode=reinstallpkg&pkg={$package['name']}", 1); - } - switch ($format) { - case "files": - $depends[] = $depend_file; - break; - case "names": - switch ($filetype) { - case "all": - if(preg_match("/\.xml/i", $depend_file)) { - $depend_xml = parse_xml_config_pkg("/usr/local/pkg/" . $depend_file, "packagegui"); - $depends[] = $depend_xml['name']; - break; - } else { - $depends[] = $depend_name; // If this dependency isn't package XML, use the stripped filename. - break; - } - case ".xml": - $depend_xml = parse_xml_config_pkg("/usr/local/pkg/" . $depend_file, "packagegui"); - $depends[] = $depend_xml['name']; - break; - default: - $depends[] = $depend_name; // If we aren't looking for XML, use the stripped filename (it's all we have). - break; - } - } - } - return $depends; - } -} - -/* - * sync_package($pkg_name, $sync_depends = true, $show_message = false) Force a package to setup its configuration and rc.d files. - */ -function sync_package($pkg_name, $sync_depends = true, $show_message = false) { +} + +function filter_opt_interface_to_real($opt) { global $config; + return $config['interfaces'][$opt]['if']; +} - if(!$config['installedpackages']['package']) return; - if(!is_numeric($pkg_name)) { - $pkg_id = get_pkg_id($pkg_name); - if($pkg_id == -1) return -1; // This package doesn't really exist - exit the function. - } else { - $pkg_id = $pkg_name; - if(!isset($config['installedpackages']['package'][$pkg_id])) - return; // No package belongs to the pkg_id passed to this function. +function filter_get_opt_interface_descr($opt) { + global $config; + return $config['interfaces'][$opt]['descr']; +} + +function get_friendly_interface_list_as_array() { + global $config; + $ints = array(); + $ifdescrs = array('wan', 'lan'); + for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++) { + $ifdescrs['opt' . $j] = "opt" . $j; } - $package = $config['installedpackages']['package'][$pkg_id]; - if(!file_exists("/usr/local/pkg/" . $package['configurationfile'])) { - file_notice($package['name'], "The {$package['name']} package is missing its configuration file and must be reinstalled.", "Packages", "/pkg_mgr_install.php?mode=reinstallpkg&pkg={$package['name']}", 1); + $ifdescrs = get_interface_list(); + foreach ($ifdescrs as $ifdescr => $ifname) { + array_push($ints,$ifdescr); + } + return $ints; +} + +/* + * find_ip_interface($ip): return the interface where an ip is defined + */ +function find_ip_interface($ip) { + global $config; + $ifdescrs = array('wan', 'lan'); + for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++) { + $ifdescrs['opt' . $j] = "opt" . $j; + } + foreach ($ifdescrs as $ifdescr => $ifname) { + $int = filter_translate_type_to_real_interface($ifname); + $ifconfig = exec_command("/sbin/ifconfig {$int}"); + if(stristr($ifconfig,$ip) <> false) + return $int; + } + return false; +} + +/* + * filter_translate_type_to_real_interface($interface): returns the real interface name + * for a friendly interface. ie: wan + */ +function filter_translate_type_to_real_interface($interface) { + global $config; + if($config['interfaces'][$interface]['if'] <> "") { + return $config['interfaces'][$interface]['if']; } else { - $pkg_config = parse_xml_config_pkg("/usr/local/pkg/" . $package['configurationfile'], "packagegui"); - /* XXX: Zend complains about the next line "Wrong break depth" - * The code is obviously wrong, but I'm not sure what it's supposed to do? - */ - if(isset($pkg_config['nosync'])) continue; - if($pkg_config['custom_php_global_functions'] <> "") - eval($pkg_config['custom_php_global_functions']); - if($pkg_config['custom_php_resync_config_command'] <> "") - eval($pkg_config['custom_php_resync_config_command']); - if($sync_depends == true) { - $depends = get_pkg_depends($pkg_name, ".xml", "files", 1); // Call dependency handler and do a little more error checking. - if(is_array($depends)) { - foreach($depends as $item) { - if(!file_exists("/usr/local/pkg" . $item)) { - file_notice($package['name'], "The {$package['name']} package is missing required dependencies and must be reinstalled.", "Packages", "/pkg_mgr_install.php?mode=reinstallpkg&pkg={$package['name']}", 1); - } else { - $item_config = parse_xml_config_pkg("/usr/local/pkg/" . $item, "packagegui"); - if(isset($item_config['nosync'])) continue; - if($item_config['custom_php_command_before_form'] <> "") { - eval($item_config['custom_php_command_before_form']); - } - if($item_config['custom_php_resync_config_command'] <> "") { - eval($item_config['custom_php_resync_config_command']); - } - if($show_message == true) print " " . $item_config['name']; - } - } - } - } + return $interface; } } /* - * pkg_fetch_recursive: Download and install a FreeBSD package and its dependencies. This function provides output to - * a progress bar and output window. - * - * XXX: This function needs to return where a pkg_add fails. Our current error messages aren't very descriptive. - */ -function pkg_fetch_recursive($pkgname, $filename, $dependlevel = 0, $base_url = 'http://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-5.4-release/Latest') { - global $pkgent, $static_output, $g, $fd_log; - $pkg_extension = strrchr($filename, '.'); - $static_output .= "\n" . str_repeat(" ", $dependlevel * 2) . $pkgname . " "; - $fetchto = "/tmp/apkg_" . $pkgname . $pkg_extension; - download_file_with_progress_bar($base_url . '/' . $filename, $fetchto); - $static_output .= " (extracting)"; - update_output_window($static_output); - $slaveout = ""; - exec("/usr/bin/tar --fast-read -O -f {$fetchto} -x +CONTENTS 2>&1", $slaveout); - $workingdir = preg_grep("/instmp/", $slaveout); - $workingdir = $workingdir[0]; - $raw_depends_list = array_values(preg_grep("/\@pkgdep/", $slaveout)); - if($raw_depends_list != "") { - if($pkgent['exclude_dependency'] != "") - $raw_depends_list = array_values(preg_grep($pkgent['exclude_dependency'], PREG_GREP_INVERT)); - foreach($raw_depends_list as $adepend) { - $working_depend = explode(" ", $adepend); - //$working_depend = explode("-", $working_depend[1]); - $depend_filename = $working_depend[1] . $pkg_extension; - if(is_freebsd_pkg_installed($working_depend[1]) === false) { - pkg_fetch_recursive($working_depend[1], $depend_filename, $dependlevel + 1, $base_url); - } else { -// $dependlevel++; - $static_output .= "\n" . str_repeat(" ", $dependlevel * 2) . $working_depend[1] . " "; - @fwrite($fd_log, $working_depend[1] . "\n"); - } - } - } - $pkgaddout = ""; - exec("cat {$g['tmp_path']}/y | /usr/sbin/pkg_add -fv {$fetchto} 2>&1", $pkgaddout); - @fwrite($fd_log, $pkgname . " " . print_r($pkgaddout, true) . "\n"); - return true; -} - -function download_file_with_progress_bar($url_file, $destination_file) { - global $ch, $fout, $file_size, $downloaded, $pkg_interface; - $file_size = 1; - $downloaded = 1; - /* open destination file */ - $fout = fopen($destination_file, "wb"); - - /* - Originally by Author: Keyvan Minoukadeh - Modified by Scott Ullrich to return Content-Length size - */ - - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url_file); - curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header'); - curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'read_body'); - curl_setopt($ch, CURLOPT_NOPROGRESS, '1'); - - curl_exec($ch); - $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); - fclose($fout); - curl_close($ch); - return ($http_code == 200) ? true : $http_code; -} - -function read_header($ch, $string) { - global $file_size, $fout; - $regs = ""; - $length = strlen($string); - ereg("(Content-Length:) (.*)", $string, $regs); - if($regs[2] <> "") { - $file_size = intval($regs[2]); - } - return $length; -} - -function read_body($ch, $string) { - global $fout, $file_size, $downloaded, $sendto, $static_status, $static_output, $lastseen, $pkg_interface; - $length = strlen($string); - $downloaded += intval($length); - $downloadProgress = round(100 * (1 - $downloaded / $file_size), 0); - $downloadProgress = 100 - $downloadProgress; - if($lastseen <> $downloadProgress and $downloadProgress < 101) { - if($sendto == "status") { - $tostatus = $static_status . $downloadProgress . "%"; - update_status($tostatus); - } else { - $tooutput = $static_output . $downloadProgress . "%"; - update_output_window($tooutput); - } - update_progress_bar($downloadProgress); - $lastseen = $downloadProgress; - } - fwrite($fout, $string); - return $length; -} - -function install_package($package, $pkg_info = "") { - global $g, $config, $pkg_interface, $fd_log, $static_output; - /* open logfiles and begin installation */ - if(!$fd_log) { - if(!$fd_log = fopen("{$g['tmp_path']}/pkg_mgr_{$package}.log", "w")) { - update_output_window("Warning, could not open log for writing."); + * get_carp_interface_status($carpinterface): returns the status of a carp ip + */ +function get_carp_interface_status($carpinterface) { + /* basically cache the contents of ifconfig statement + to speed up this routine */ + global $carp_query; + if($carp_query == "") + $carp_query = split("\n", `/sbin/ifconfig | /usr/bin/grep carp`); + $found_interface = 0; + foreach($carp_query as $int) { + if($found_interface == 1) { + if(stristr($int, "MASTER") == true) return "MASTER"; + if(stristr($int, "BACKUP") == true) return "BACKUP"; + if(stristr($int, "INIT") == true) return "INIT"; + return false; } + if(stristr($int, $carpinterface) == true) + $found_interface=1; } - @fwrite($fd_log, "Beginning package installation.\n"); - log_error('Beginning package installation for ' . $package . '.'); - update_status("Beginning package installation for " . $package . "..."); - /* fetch package information if needed */ - if(!$pkg_info or !is_array($pkg_info[$package])) { - $pkg_info = get_pkg_info(array($package)); - $pkg_info = $pkg_info[$package]; // We're only dealing with one package, so we can strip away the extra array. - } - /* fetch the package's configuration file */ - if($pkg_info['config_file'] != "") { - $static_output .= "Downloading package configuration file... "; - update_output_window($static_output); - @fwrite($fd_log, "Downloading package configuration file...\n"); - $fetchto = substr(strrchr($pkg_info['config_file'], '/'), 1); - download_file_with_progress_bar($pkg_info['config_file'], '/usr/local/pkg/' . $fetchto); - if(!file_exists('/usr/local/pkg/' . $fetchto)) { - @fwrite($fd_log, "ERROR! Unable to fetch package configuration file. Aborting installation.\n"); - if($pkg_interface == "console") { - print "\nERROR! Unable to fetch package configuration file. Aborting package installation.\n"; - return; - } else { - $static_output .= "failed!\n\nInstallation aborted."; - update_output_window($static_output); - echo "<br>Show <a href=\"pkg_mgr_install.php?showlog=true\">install log</a></center>"; - return -1; - } + return; +} + +/* + * get_pfsync_interface_status($pfsyncinterface): returns the status of a pfsync + */ +function get_pfsync_interface_status($pfsyncinterface) { + $result = does_interface_exist($pfsyncinterface); + if($result <> true) return; + $status = exec_command("/sbin/ifconfig {$pfsyncinterface} | /usr/bin/grep \"pfsync:\" | /usr/bin/cut -d\" \" -f5"); + return $status; +} + +/* + * find_carp_interface($ip): return the carp interface where an ip is defined + */ +function find_carp_interface($ip) { + global $find_carp_ifconfig; + if($find_carp_ifconfig == "") { + $find_carp_ifconfig = array(); + $num_carp_ints = find_number_of_created_carp_interfaces(); + for($x=0; $x<$num_carp_ints; $x++) { + $find_carp_ifconfig[$x] = exec_command("/sbin/ifconfig carp{$x}"); } - $static_output .= "done.\n"; - update_output_window($static_output); - } - /* add package information to config.xml */ - $pkgid = get_pkg_id($pkg_info['name']); - $static_output .= "Saving updated package information... "; - update_output_window($static_output); - if($pkgid == -1) { - $config['installedpackages']['package'][] = $pkg_info; - $changedesc = "Installed {$pkg_info['name']} package."; - $to_output = "done.\n"; - } else { - $config['installedpackages']['package'][$pkgid] = $pkg_info; - $changedesc = "Overwrote previous installation of {$pkg_info['name']}."; - $to_output = "overwrite!\n"; - } - $static_output .= $to_output; - update_output_window($static_output); - /* install other package components */ - install_package_xml($package); - $static_output .= "Writing configuration... "; - update_output_window($static_output); - write_config($changedesc); - $static_output .= "done."; - update_output_window($static_output); -} - -function eval_once($toeval) { - global $evaled; - if(!$evaled) $evaled = array(); - $evalmd5 = md5($toeval); - if(!in_array($evalmd5, $evaled)) { - eval($toeval); - $evaled[] = $evalmd5; } - return; + $carps = 0; + foreach($find_carp_ifconfig as $fci) { + if(stristr($fci, $ip) == true) + return "carp{$carps}"; + $carps++; + } } -function install_package_xml($pkg) { - global $g, $config, $fd_log, $static_output; - if(($pkgid = get_pkg_id($pkg)) == -1) { - $static_output .= "The {$pkg} package is not installed.\n\nInstallation aborted."; - update_output_window($static_output); - echo "\n<script language=\"JavaScript\">document.progressbar.style.visibility='hidden';</script>"; - echo "\n<script language=\"JavaScript\">document.progholder.style.visibility='hidden';</script>"; - sleep(1); - return; - } else { - $pkg_info = $config['installedpackages']['package'][$pkgid]; +/* + * setup_filter_bridge(): toggle filtering bridge + */ +function setup_filter_bridge() { + global $config, $g; + if(isset($config['bridge']['filteringbridge'])) { + mwexec("/sbin/sysctl net.link.bridge.pfil_member=1"); + mwexec("/sbin/sysctl net.link.bridge.pfil_bridge=1"); + } else { + mwexec("/sbin/sysctl net.link.bridge.pfil_member=0"); + mwexec("/sbin/sysctl net.link.bridge.pfil_bridge=0"); } - /* set up logging if needed */ - if(!$fd_log) { - if(!$fd_log = fopen("{$g['tmp_path']}/pkg_mgr_{$pkg}.log", "w")) { - update_output_window("Warning, could not open log for writing."); +} + +/* + * find_number_of_created_bridges(): returns the number of currently created bridges + */ +function find_number_of_created_bridges() { + return `/sbin/ifconfig | grep \"bridge[0-999]\:" | wc -l`; +} + +/* + * add_rule_to_anchor($anchor, $rule): adds the specified rule to an anchor + */ +function add_rule_to_anchor($anchor, $rule, $label) { + mwexec("echo " . $rule . " | /sbin/pfctl -a " . $anchor . ":" . $label . " -f -"); +} + +/* + * remove_text_from_file + * remove $text from file $file + */ +function remove_text_from_file($file, $text) { + global $fd_log; + fwrite($fd_log, "Adding needed text items:\n"); + $filecontents = exec_command_and_return_text("cat " . $file); + $textTMP = str_replace($text, "", $filecontents); + $text .= $textTMP; + fwrite($fd_log, $text . "\n"); + $fd = fopen($file, "w"); + fwrite($fd, $text); + fclose($fd); +} + +/* + * add_text_to_file($file, $text): adds $text to $file. + * replaces the text if it already exists. + */ +function add_text_to_file($file, $text) { + if(file_exists($file) and is_writable($file)) { + $filecontents = file($file); + $filecontents[] = $text; + $tmpfile = get_tmp_file(); + $fout = fopen($tmpfile, "w"); + foreach($filecontents as $line) { + fwrite($fout, rtrim($line) . "\n"); } + fclose($fout); + rename($tmpfile, $file); + return true; + } else { + return false; } +} - /* set up package logging streams */ - if($pkg_info['logging']) { - mwexec("/usr/sbin/clog -i -s 32768 {$g['varlog_path']}/{$pkg_info['logging']['logfilename']}"); - chmod($g['varlog_path'] . '/' . $pkg_info['logging']['logfilename'], 0600); - @fwrite($fd_log, "Adding text to file /etc/syslog.conf\n"); - mwexec("killall syslogd"); - system_syslogd_start(); - } - - /* make 'y' file */ - $fd = fopen("{$g['tmp_path']}/y", "w"); - for($line = 0; $line < 10; $line++) { - fwrite($fd, "y\n"); - } - fclose($fd); - - /* pkg_add the package and its dependencies */ - if($pkg_info['depends_on_package_base_url'] != "") { - update_status("Installing " . $pkg_info['name'] . " and its dependencies."); - $static_output .= "Downloading " . $pkg_info['name'] . " and its dependencies... "; - $static_orig = $static_output; - $static_output .= "\n"; - update_output_window($static_output); - $pkg_name = substr(reverse_strrchr($pkg_info['depends_on_package'], "."), 0, -1); - if(isset($pkg_info['skip_install_checks'])) { - $pkg_installed = true; - } else { - $pkg_installed = is_freebsd_pkg_installed($pkg_name); - } - if($pkg_installed == false) pkg_fetch_recursive($pkg_name, $pkg_info['depends_on_package'], 0, $pkg_info['depends_on_package_base_url']); - $static_output = $static_orig . "done.\nChecking for successful package installation... "; - update_output_window($static_output); - /* make sure our package was successfully installed */ - if($pkg_installed == false) $pkg_installed = is_freebsd_pkg_installed($pkg_name); - if($pkg_installed == true) { - $static_output .= "done.\n"; - update_output_window($static_output); - fwrite($fd_log, "pkg_add successfully completed.\n"); - } else { - $static_output .= "failed!\n\nInstallation aborted."; - update_output_window($static_output); - fwrite($fd_log, "Package WAS NOT installed properly.\n"); - fclose($fd_log); - echo "\n<script language=\"JavaScript\">document.progressbar.style.visibility='hidden';</script>"; - echo "\n<script language=\"JavaScript\">document.progholder.style.visibility='hidden';</script>"; - sleep(1); - die; - } - } - - $configfile = substr(strrchr($pkg_info['config_file'], '/'), 1); - if(file_exists("/usr/local/pkg/" . $configfile)) { - $static_output .= "Loading package configuration... "; - update_output_window($static_output); - $pkg_config = parse_xml_config_pkg("/usr/local/pkg/" . $configfile, "packagegui"); - $static_output .= "done.\n"; - update_output_window($static_output); - $static_output .= "Configuring package components...\n"; - update_output_window($static_output); - /* modify system files */ - if($pkg_config['modify_system']['item'] <> "") { - $static_output .= "\tSystem files... "; - update_output_window($static_output); - foreach($pkg_config['modify_system']['item'] as $ms) { - if($ms['textneeded']) { - add_text_to_file($ms['modifyfilename'], $ms['textneeded']); - } - } - $static_output .= "done.\n"; - update_output_window($static_output); +/* + * after_sync_bump_adv_skew(): create skew values by 1S + */ +function after_sync_bump_adv_skew() { + global $config, $g; + $processed_skew = 1; + $a_vip = &$config['virtualip']['vip']; + foreach ($a_vip as $vipent) { + if($vipent['advskew'] <> "") { + $processed_skew = 1; + $vipent['advskew'] = $vipent['advskew']+1; } - /* download additional files */ - if($pkg_config['additional_files_needed'] <> "") { - $static_output .= "\tAdditional files... "; - $static_orig = $static_output; - update_output_window($static_output); - foreach($pkg_config['additional_files_needed'] as $afn) { - $filename = get_filename_from_url($afn['item'][0]); - if($afn['chmod'] <> "") { - $pkg_chmod = $afn['chmod']; - } else { - $pkg_chmod = ""; - } - if($afn['prefix'] <> "") { - $prefix = $afn['prefix']; - } else { - $prefix = "/usr/local/pkg/"; - } - $static_output .= $filename . " "; - update_output_window($static_output); - download_file_with_progress_bar($afn['item'][0], $prefix . $filename); - if(stristr($filename, ".tgz") <> "") { - fwrite($fd_log, "Extracting tarball to -C for " . $filename . "...\n"); - $tarout = ""; - exec("/usr/bin/tar xvzf " . $prefix . $filename . " -C / 2>&1", $tarout); - fwrite($fd_log, print_r($tarout, true) . "\n"); - } - if($pkg_chmod <> "") { - fwrite($fd_log, "Changing file mode to {$pkg_chmod} for {$prefix}{$filename}\n"); - chmod($prefix . $filename, $pkg_chmod); - system("/bin/chmod {$pkg_chmod} {$prefix}{$filename}"); - } - $static_output = $static_orig; - update_output_window($static_output); - } - $static_output .= "done.\n"; - update_output_window($static_output); + } + if($processed_skew == 1) + write_config("After synch increase advertising skew"); +} + +/* + * get_filename_from_url($url): converts a url to its filename. + */ +function get_filename_from_url($url) { + return basename($url); +} + +/* + * update_output_window: update bottom textarea dynamically. + */ +function update_output_window($text) { + $log = ereg_replace("\n", "\\n", $text); + echo "\n<script language=\"JavaScript\">this.document.forms[0].output.value = \"" . $log . "\";</script>"; + /* ensure that contents are written out */ + ob_flush(); +} + +/* + * get_dir: return an array of $dir + */ +function get_dir($dir) { + $dir_array = array(); + $d = dir($dir); + while (false !== ($entry = $d->read())) { + array_push($dir_array, $entry); + } + $d->close(); + return $dir_array; +} + +/* + * update_output_window: update top textarea dynamically. + */ +function update_status($status) { + echo "\n<script language=\"JavaScript\">document.forms[0].status.value=\"" . $status . "\";</script>"; + /* ensure that contents are written out */ + ob_flush(); +} + +/* + * exec_command_and_return_text_array: execute command and return output + */ +function exec_command_and_return_text_array($command) { + $fd = popen($command . " 2>&1 ", "r"); + while(!feof($fd)) { + $tmp .= fread($fd,49); + } + fclose($fd); + $temp_array = split("\n", $tmp); + return $temp_array; +} + +/* + * exec_command_and_return_text: execute command and return output + */ +function exec_command_and_return_text($command) { + return exec_command($command); +} + +/* + * exec_command_and_return_text: execute command and update output window dynamically + */ +function execute_command_return_output($command) { + global $fd_log; + $fd = popen($command . " 2>&1 ", "r"); + echo "\n<script language=\"JavaScript\">this.document.forms[0].output.value = \"\";</script>"; + $counter = 0; + $counter2 = 0; + while(!feof($fd)) { + $tmp = fread($fd, 50); + $tmp1 = ereg_replace("\n","\\n", $tmp); + $text = ereg_replace("\"","'", $tmp1); + $lasttext = ""; + if($lasttext == "..") { + $text = ""; + $lasttext = ""; + $counter=$counter-2; + } else { + $lasttext .= $text; } - /* sidebar items */ - if($pkg_config['menu'] != "") { - $static_output .= "\tMenu items... "; - update_output_window($static_output); - if(is_array($pkg_config['menu'])) { - foreach($pkg_config['menu'] as $menu) { - if(is_array($config['installedpackages']['menu'])) { - foreach($config['installedpackages']['menu'] as $amenu) { - if($amenu['name'] == $menu['name']) continue 2; - } - } - $config['installedpackages']['menu'][] = $menu; - } - } - $static_output .= "done.\n"; - update_output_window($static_output); + if($counter > 51) { + $counter = 0; + $extrabreak = "\\n"; + } else { + $extrabreak = ""; + $counter++; } - /* services */ - if($pkg_config['service'] != "") { - $static_output .= "\tServices... "; - update_output_window($static_output); - foreach($pkg_config['service'] as $service) { - $config['installedpackages']['service'][] = $service; - } - $static_output .= "done.\n"; - update_output_window($static_output); + if($counter2 > 600) { + echo "\n<script language=\"JavaScript\">this.document.forms[0].output.value = \"\";</script>"; + $counter2 = 0; + } else + $counter2++; + echo "\n<script language=\"JavaScript\">this.document.forms[0].output.value = this.document.forms[0].output.value + \"" . $text . $extrabreak . "\"; f('output'); </script>"; + } + fclose($fd); +} + +/* + * convert_friendly_interface_to_real_interface_name($interface): convert WAN to FXP0 + */ +function convert_friendly_interface_to_real_interface_name($interface) { + global $config; + $lc_interface = strtolower($interface); + if($lc_interface == "lan") return $config['interfaces']['lan']['if']; + if($lc_interface == "wan") return $config['interfaces']['wan']['if']; + $ifdescrs = array(); + for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++) + $ifdescrs['opt' . $j] = "opt" . $j; + foreach ($ifdescrs as $ifdescr => $ifname) { + if(strtolower($ifname) == $lc_interface) + return $config['interfaces'][$ifname]['if']; + if(strtolower($config['interfaces'][$ifname]['descr']) == $lc_interface) + return $config['interfaces'][$ifname]['if']; + } + return $interface; +} + +/* + * convert_real_interface_to_friendly_interface_name($interface): convert fxp0 -> wan, etc. + */ +function convert_real_interface_to_friendly_interface_name($interface) { + global $config; + $ifdescrs = array('wan', 'lan'); + for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++) + $ifdescrs['opt' . $j] = "opt" . $j; + foreach ($ifdescrs as $ifdescr => $ifname) { + $int = filter_translate_type_to_real_interface($ifname); + if($ifname == $interface) return $ifname; + if($int == $interface) return $ifname; + } + return $interface; +} + +/* + * update_progress_bar($percent): updates the javascript driven progress bar. + */ +function update_progress_bar($percent) { + if($percent > 100) $percent = 1; + echo "\n<script type=\"text/javascript\" language=\"javascript\">"; + echo "\ndocument.progressbar.style.width='" . $percent . "%';"; + echo "\n</script>"; +} + +/****f* pfsense-utils/WakeOnLan + * NAME + * WakeOnLan - Wake a machine up using the wake on lan format/protocol + * RESULT + * true/false - true if the operation was successful + ******/ +function WakeOnLan($addr, $mac) +{ + $addr_byte = explode(':', $mac); + $hw_addr = ''; + + for ($a=0; $a < 6; $a++) + $hw_addr .= chr(hexdec($addr_byte[$a])); + + $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255); + + for ($a = 1; $a <= 16; $a++) + $msg .= $hw_addr; + + // send it to the broadcast address using UDP + $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + if ($s == false) { + log_error("Error creating socket!"); + log_error("Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s))); + } else { + // setting a broadcast option to socket: + $opt_ret = socket_set_option($s, 1, 6, TRUE); + if($opt_ret < 0) + log_error("setsockopt() failed, error: " . strerror($opt_ret)); + $e = socket_sendto($s, $msg, strlen($msg), 0, $addr, 2050); + socket_close($s); + log_error("Magic Packet sent ({$e}) to {$addr} MAC={$mac}"); + return true; + } + + return false; +} + +/* + * gather_altq_queue_stats(): gather altq queue stats and return an array that + * is queuename|qlength|measured_packets + * NOTE: this command takes 5 seconds to run + */ +function gather_altq_queue_stats($dont_return_root_queues) { + mwexec("/usr/bin/killall -9 pfctl"); + $stats = `/sbin/pfctl -vvsq & /bin/sleep 5;/usr/bin/killall pfctl 2>/dev/null`; + $stats_array = split("\n", $stats); + $queue_stats = array(); + foreach ($stats_array as $stats_line) { + $match_array = ""; + if (preg_match_all("/queue\s+(\w+)\s+/",$stats_line,$match_array)) + $queue_name = $match_array[1][0]; + if (preg_match_all("/measured:\s+.*packets\/s\,\s(.*)\s+\]/",$stats_line,$match_array)) + $speed = $match_array[1][0]; + if (preg_match_all("/borrows:\s+(.*)/",$stats_line,$match_array)) + $borrows = $match_array[1][0]; + if (preg_match_all("/suspends:\s+(.*)/",$stats_line,$match_array)) + $suspends = $match_array[1][0]; + if (preg_match_all("/dropped pkts:\s+(.*)/",$stats_line,$match_array)) + $drops = $match_array[1][0]; + if (preg_match_all("/measured:\s+(.*)packets/",$stats_line,$match_array)) { + $measured = $match_array[1][0]; + if($dont_return_root_queues == true) + if(stristr($queue_name,"root_") == false) + array_push($queue_stats, "{$queue_name}|{$speed}|{$measured}|{$borrows}|{$suspends}|{$drops}"); } - /* custom commands */ - $static_output .= "\tCustom commands... "; - update_output_window($static_output); - if($pkg_config['custom_php_global_functions'] <> "") { - update_output_window("Running custom_php_global_functions..."); - eval_once($pkg_config['custom_php_global_functions']); + } + return $queue_stats; +} + +/* + * reverse_strrchr($haystack, $needle): Return everything in $haystack up to the *last* instance of $needle. + * Useful for finding paths and stripping file extensions. + */ +function reverse_strrchr($haystack, $needle) { + return strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle) +1 ) : false; +} + +/* + * backup_config_section($section): returns as an xml file string of + * the configuration section + */ +function backup_config_section($section) { + global $config; + $new_section = &$config[$section]; + /* generate configuration XML */ + $xmlconfig = dump_xml_config($new_section, $section); + $xmlconfig = str_replace("<?xml version=\"1.0\"?>", "", $xmlconfig); + return $xmlconfig; +} + +/* + * backup_vip_config_section($section): returns as an xml file string of + * the configuration section + */ +function backup_vip_config_section() { + global $config; + $new_section = &$config['virtualip']; + foreach($new_section['vip'] as $section) { + if($section['mode'] == "proxyarp") { + unset($section); } - if($pkg_config['custom_php_install_command']) { - update_output_window("Running custom_php_install_command..."); - eval_once($pkg_config['custom_php_install_command']); + if($section['advskew'] <> "") { + $section_val = intval($section['advskew']); + $section_val=$section_val+100; + if($section_val > 255) + $section_val = 255; + $section['advskew'] = $section_val; } - if($pkg_config['custom_php_resync_config_command'] <> "") { - update_output_window("Running custom_php_resync_config_command..."); - eval_once($pkg_config['custom_php_resync_config_command']); - } - $static_output .= "done.\n"; - update_output_window($static_output); - } else { - $static_output .= "Loading package configuration... failed!\n\nInstallation aborted."; - update_output_window($static_output); - fwrite($fd_log, "Unable to load package configuration. Installation aborted.\n"); - fclose($fd_log); - echo "\n<script language=\"JavaScript\">document.progressbar.style.visibility='hidden';</script>"; - echo "\n<script language=\"JavaScript\">document.progholder.style.visibility='hidden';</script>"; - sleep(1); - return; - } + $temp['vip'][] = $section; + } + return $temp; } -function delete_package($pkg) { - global $g, $config, $fd_log, $static_output; - update_status("Removing package..."); - $static_output .= "Removing package... "; - update_output_window($static_output); - delete_package_recursive($pkg); - $static_output .= "done.\n"; - update_output_window($static_output); +/* + * restore_config_section($section, new_contents): restore a configuration section, + * and write the configuration out + * to disk/cf. + */ +function restore_config_section($section, $new_contents) { + global $config, $g; + conf_mount_rw(); + $fout = fopen("{$g['tmp_path']}/tmpxml","w"); + fwrite($fout, $new_contents); + fclose($fout); + $section_xml = parse_xml_config($g['tmp_path'] . "/tmpxml", $section); + $config[$section] = &$section_xml; + unlink($g['tmp_path'] . "/tmpxml"); + write_config("Restored {$section} of config file (maybe from CARP partner)"); + conf_mount_ro(); return; } -function delete_package_recursive($pkg) { - $info = ""; - $pkgdb = ""; - exec("/usr/sbin/pkg_info -r " . $pkg . " 2>&1", $info); - exec("cat {$g['tmp_path']}/y | /usr/sbin/pkg_delete " . $pkg ." > /dev/null 2>&1"); - exec("/bin/ls /var/db/pkg", $pkgdb); - if(stristr($info[0], "can't find package") != false) return; - foreach($info as $line) { - $depend = trim(array_pop(explode(":", $line))); - if(in_array($depend, $pkgdb)) delete_package_recursive($depend); - } - $fd = fopen("{$g['tmp_path']}/y", "w"); - for($line = 0; $line < 10; $line++) { - fwrite($fd, "y\n"); +/* + * http_post($server, $port, $url, $vars): does an http post to a web server + * posting the vars array. + * written by nf@bigpond.net.au + */ +function http_post($server, $port, $url, $vars) { + $user_agent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)"; + $urlencoded = ""; + while (list($key,$value) = each($vars)) + $urlencoded.= urlencode($key) . "=" . urlencode($value) . "&"; + $urlencoded = substr($urlencoded,0,-1); + $content_length = strlen($urlencoded); + $headers = "POST $url HTTP/1.1 +Accept: */* +Accept-Language: en-au +Content-Type: application/x-www-form-urlencoded +User-Agent: $user_agent +Host: $server +Connection: Keep-Alive +Cache-Control: no-cache +Content-Length: $content_length + +"; + + $errno = ""; + $errstr = ""; + $fp = fsockopen($server, $port, $errno, $errstr); + if (!$fp) { + return false; } - fclose($fd); - return; + + fputs($fp, $headers); + fputs($fp, $urlencoded); + + $ret = ""; + while (!feof($fp)) + $ret.= fgets($fp, 1024); + fclose($fp); + + return $ret; } -function delete_package_xml($pkg) { - global $g, $config, $fd_log, $static_output; - if(($pkgid = get_pkg_id($pkg)) == -1) { - $static_output .= "The {$pkg} package is not installed.\n\nDeletion aborted."; - update_output_window($static_output); - echo "\n<script language=\"JavaScript\">document.progressbar.style.visibility='hidden';</script>"; - echo "\n<script language=\"JavaScript\">document.progholder.style.visibility='hidden';</script>"; - sleep(1); - return; - } - /* set up logging if needed */ - if(!$fd_log) { - if(!$fd_log = fopen("{$g['tmp_path']}/pkg_mgr_{$pkg}.log", "w")) { - update_output_window("Warning, could not open log for writing."); - } - } - update_status("Removing {$pkg} components..."); - fwrite($fd_log, "Removing {$pkg} package... "); - $static_output .= "Removing {$pkg} components...\n"; - update_output_window($static_output); - /* parse package configuration */ - $packages = &$config['installedpackages']['package']; - $menus = &$config['installedpackages']['menu']; - $services = &$config['installedpackages']['service']; - if(file_exists("/usr/local/pkg/" . $packages[$pkgid]['configurationfile'])) { - $pkg_config = parse_xml_config_pkg("/usr/local/pkg/" . $packages[$pkgid]['configurationfile'], "packagegui"); - /* remove menu items */ - if(is_array($pkg_config['menu'])) { - $static_output .= "\tMenu items... "; - update_output_window($static_output); - foreach($menus as $menu) $instmenus[] = $menu['name']; - foreach($pkg_config['menu'] as $menu) { - foreach($instmenus as $key => $instmenu) { - if($instmenu == $menu['name']) unset($menus[$key]); - } - } - $static_output .= "done.\n"; - update_output_window($static_output); +/* + * php_check_syntax($code_tocheck, $errormessage): checks $code_to_check for errors + */ +if (!function_exists('php_check_syntax')){ + function php_check_syntax($code_to_check, &$errormessage){ + return false; + $fout = fopen("/tmp/codetocheck.php","w"); + $code = $_POST['content']; + $code = str_replace("<?php", "", $code); + $code = str_replace("?>", "", $code); + fwrite($fout, "<?php\n\n"); + fwrite($fout, $code_to_check); + fwrite($fout, "\n\n?>\n"); + fclose($fout); + $command = "/usr/local/bin/php -l /tmp/codetocheck.php"; + $output = exec_command($command); + if (stristr($output, "Errors parsing") == false) { + echo "false\n"; + $errormessage = ''; + return(false); + } else { + $errormessage = $output; + return(true); } - /* remove services */ - if(is_array($pkg_config['service'])) { - $static_output .= "\tServices... "; - update_output_window($static_output); - foreach($services as $service) $instservices[] = $service['name']; - foreach($pkg_config['service'] as $service) { - foreach($instservices as $key => $instservice) { - if($instservice == $service['name']) { - stop_service($service['name']); - unset($services[$key]); - } - } - } - $static_output .= "done.\n"; - update_output_window($static_output); + } +} + +/* + * php_check_filename_syntax($filename, $errormessage): checks the file $filename for errors + */ +if (!function_exists('php_check_syntax')){ + function php_check_syntax($code_to_check, &$errormessage){ + return false; + $command = "/usr/local/bin/php -l " . $code_to_check; + $output = exec_command($command); + if (stristr($output, "Errors parsing") == false) { + echo "false\n"; + $errormessage = ''; + return(false); + } else { + $errormessage = $output; + return(true); } - /* evalate this package's global functions and pre deinstall commands */ - if($pkg_config['custom_php_global_functions'] <> "") - eval_once($pkg_config['custom_php_global_functions']); - if($pkg_config['custom_php_pre_deinstall_command'] <> "") - eval_once($pkg_config['custom_php_pre_deinstall_command']); - /* remove all additional files */ - if($pkg_config['additional_files_needed'] <> "") { - $static_output .= "\tAuxiliary files... "; - update_output_window($static_output); - foreach($pkg_config['additional_files_needed'] as $afn) { - $filename = get_filename_from_url($afn['item'][0]); - if($afn['prefix'] <> "") { - $prefix = $afn['prefix']; - } else { - $prefix = "/usr/local/pkg/"; + } +} + +/* + * rmdir_recursive($path,$follow_links=false) + * Recursively remove a directory tree (rm -rf path) + * This is for directories _only_ + */ +function rmdir_recursive($path,$follow_links=false) { + $to_do = glob($path); + if(!is_array($to_do)) $to_do = array($to_do); + foreach($to_do as $workingdir) { // Handle wildcards by foreaching. + if(file_exists($workingdir)) { + if(is_dir($workingdir)) { + $dir = opendir($workingdir); + while ($entry = readdir($dir)) { + if (is_file("$workingdir/$entry") || ((!$follow_links) && is_link("$workingdir/$entry"))) + unlink("$workingdir/$entry"); + elseif (is_dir("$workingdir/$entry") && $entry!='.' && $entry!='..') + rmdir_recursive("$workingdir/$entry"); } - unlink_if_exists($prefix . $filename); - if(file_exists($prefix . $filename)) - mwexec("rm -rf {$prefix}{$filename}"); + closedir($dir); + rmdir($workingdir); + } elseif (is_file($workingdir)) { + unlink($workingdir); } - $static_output .= "done.\n"; - update_output_window($static_output); + } + } + return; +} + +/* + * get_memory() + * returns an array listing the amount of + * memory installed in the hardware + * [0]real and [1]available + */ +function get_memory() { + if(file_exists("/var/log/dmesg.boot")) { + $mem = `cat /var/log/dmesg.boot | grep memory`; + $matches = ""; + if (preg_match_all("/real memory = .* \((.*) MB/", $mem, $matches)) + $real = $matches[1]; + if (preg_match_all("/avail memory = .* \((.*) MB/", $mem, $matches)) + $avail = $matches[1]; + return array($real[0],$avail[0]); + } + return array("64","64"); +} + +/* + * safe_mkdir($path, $mode = 0755) + * create directory if it doesn't already exist and isn't a file! + */ +function safe_mkdir($path, $mode=0755) { + global $g; + + /* cdrom is ro. */ + if($g['platform'] == "cdrom") + return false; + + if (!is_file($path) && !is_dir($path)) + return mkdir($path, $mode); + else + return false; +} + +/* + * make_dirs($path, $mode = 0755) + * create directory tree recursively (mkdir -p) + */ +function make_dirs($path, $mode = 0755) { + /* is dir already created? */ + if(is_dir($path)) return; + /* create directory in question */ + $to_create = explode("/", $path); + foreach($to_create as $tc) + if(!is_dir($tc)) + safe_mkdir($path, $mode); +} + +/* + * call_pfsense_method(): Call a method exposed by the pfsense.com XMLRPC server. + */ +function call_pfsense_method($method, $params, $timeout = 0) { + global $g, $config; + $xmlrpc_base_url = $g['xmlrpcbaseurl']; + $xmlrpc_path = $g['xmlrpcpath']; + $msg = new XML_RPC_Message($method, array(XML_RPC_Encode($params))); + $cli = new XML_RPC_Client($xmlrpc_path, $xmlrpc_base_url); + $resp = $cli->send($msg, $timeout); + if(!$resp or $resp->faultCode()) { + log_error("XMLRPC request failed with error " . $resp->faultCode() . ": " . $resp->faultString()); + return false; + } + return XML_RPC_Decode($resp->value()); +} + +/* + * check_firmware_version(): Check whether the current firmware installed is the most recently released. + */ +function check_firmware_version($tocheck = "all", $return_php = true) { + global $g, $config; + $rawparams = array("firmware" => array("version" => trim(file_get_contents('/etc/version'))), + "kernel" => array("version" => trim(file_get_contents('/etc/version_kernel'))), + "base" => array("version" => trim(file_get_contents('/etc/version_base'))), + "platform" => trim(file_get_contents('/etc/platform')) + ); + if($tocheck == "all") { + $params = $rawparams; + } else { + foreach($tocheck as $check) { + $params['check'] = $rawparams['check']; + $params['platform'] = $rawparams['platform']; } - /* system files */ - if($pkg_config['modify_system']['item'] <> "") { - $static_output .= "\tSystem files... "; - update_output_window($static_output); - foreach($pkg_config['modify_system']['item'] as $ms) { - if($ms['textneeded']) remove_text_from_file($ms['modifyfilename'], $ms['textneeded']); - } - $static_output .= "done.\n"; - update_output_window($static_output); + } + if($config['system']['firmware']['branch']) { + $params['branch'] = $config['system']['firmware']['branch']; + } + if(!$versions = call_pfsense_method('pfsense.get_firmware_version', $params)) { + return false; + } else { + $versions["current"] = $params; + } + return $versions; +} + +function get_disk_info() { + $diskout = ""; + exec("/bin/df -h | /usr/bin/grep -w '/' | /usr/bin/awk '{ print $2, $3, $4, $5 }'", $diskout); + return explode(' ', $diskout[0]); + // $size, $used, $avail, $cap +} + +/****f* pfsense-utils/display_top_tabs + * NAME + * display_top_tabs - display tabs with rounded edges + * INPUTS + * $text - array of tabs + * RESULT + * null + ******/ +function display_top_tabs($tab_array) { + echo "<table cellpadding='0' cellspacing='0'>\n"; + echo " <tr height='1'>\n"; + $tabscounter = 0; + foreach ($tab_array as $ta) { + if($ta[1] == true) { + echo " <td bgcolor='#EEEEEE' onClick=\"document.location='{$ta[2]}'\"><div id='tabactive'></div></td>\n"; + } else { + echo " <td bgcolor='#777777' onClick=\"document.location='{$ta[2]}'\"><div id='tabdeactive{$tabscounter}'></div></td>\n"; } - /* syslog */ - if($pkg_config['logging']['logfile_name'] <> "") { - $static_output .= "\tSyslog entries... "; - update_output_window($static_output); - remove_text_from_file("/etc/syslog.conf", $pkg_config['logging']['facilityname'] . "\t\t\t\t" . $pkg_config['logging']['logfilename']); - $static_output .= "done.\n"; - update_output_window($static_output); + $tabscounter++; + } + echo "</tr>\n<tr>\n"; + foreach ($tab_array as $ta) { + if($ta[1] == true) { + echo " <td bgcolor='#EEEEEE' onClick=\"document.location='{$ta[2]}'\"><B> {$ta[0]}"; + echo " "; + echo "<font size='-12'> </td>\n"; + } else { + echo " <td bgcolor='#777777' onClick=\"document.location='{$ta[2]}'\"><B> <a href='{$ta[2]}'>"; + echo "<font color='white'>{$ta[0]}</a> "; + echo "<font size='-12'> </td>\n"; } - /* deinstall commands */ - if($pkg_config['custom_php_deinstall_command'] <> "") { - $static_output .= "\tDeinstall commands... "; - update_output_window($static_output); - eval_once($pkg_config['custom_php_deinstall_command']); - $static_output .= "done.\n"; - update_output_window($static_output); + } + echo "</tr>\n<tr height='5px'>\n"; + foreach ($tab_array as $ta) { + if($ta[1] == true) { + echo " <td bgcolor='#EEEEEE' onClick=\"document.location='{$ta[2]}'\"></td>\n"; + } else { + echo " <td bgcolor='#777777' onClick=\"document.location='{$ta[2]}'\"></td>\n"; } - /* package XML file */ - $static_output .= "\tPackage XML... "; - update_output_window($static_output); - unlink_if_exists("/usr/local/pkg/" . $packages[$pkgid]['configurationfile']); - $static_output .= "done.\n"; - update_output_window($static_output); - } - /* remove config.xml entries */ - $static_output .= "\tConfiguration... "; - update_output_window($static_output); - unset($config['installedpackages']['package'][$pkgid]); - $static_output .= "done.\n"; - update_output_window($static_output); - write_config("Removed {$pkg} package."); - /* file cleanup */ - $ctag = file("/etc/crontab"); - foreach($ctag as $line) { - if(trim($line) != "") $towrite[] = $line; - } - $tmptab = fopen("/tmp/crontab", "w"); - foreach($towrite as $line) { - fwrite($tmptab, $line); - } - fclose($tmptab); - rename("/tmp/crontab", "/etc/crontab"); -} - -function expand_to_bytes($size) { - $conv = array( - "G" => "3", - "M" => "2", - "K" => "1", - "B" => "0" - ); - $suffix = substr($size, -1); - if(!in_array($suffix, array_keys($conv))) return $size; - $size = substr($size, 0, -1); - for($i = 0; $i < $conv[$suffix]; $i++) { - $size *= 1024; + $tabscounter++; } - return $size; + echo " </tr>\n"; + echo "</table>\n"; + + echo "<script type=\"text/javascript\">"; + echo "NiftyCheck();\n"; + echo "Rounded(\"div#tabactive\",\"top\",\"#FFF\",\"#EEEEEE\",\"smooth\");\n"; + for($x=0; $x<$tabscounter; $x++) + echo "Rounded(\"div#tabdeactive{$x}\",\"top\",\"#FFF\",\"#777777\",\"smooth\");\n"; + echo "</script>"; } -function get_pkg_db() { - global $g; - return return_dir_as_array($g['vardb_path'] . '/pkg'); -} - -function walk_depend($depend, $pkgdb = "", $alreadyseen = "") { - if(!$pkgdb) $pkgdb = get_pkg_db(); - if(!$alreadyseen) $alreadyseen = array(); - foreach($depend as $adepend) { - $pkgname = reverse_strrchr($adepend['name'], '.'); - if(in_array($pkgname, $alreadyseen)) { - continue; - } elseif(!in_array($pkgname, $pkgdb)) { - $size += expand_to_bytes($adepend['size']); - $alreadyseen[] = $pkgname; - if(is_array($adepend['depend'])) $size += walk_depend($adepend['depend'], $pkgdb, $alreadyseen); - } else { - continue; + +/****f* pfsense-utils/display_topbar + * NAME + * display_topbar - top a table off with rounded edges + * INPUTS + * $text - (optional) Text to include in bar + * RESULT + * null + ******/ +function display_topbar($text = "", $bg_color="#990000", $replace_color="#FFFFFF", $rounding_style="smooth") { + echo " <table width='100%' cellpadding='0' cellspacing='0'>\n"; + echo " <tr height='1'>\n"; + echo " <td width='100%' valign='top' color='{$bg_color}' bgcolor='{$bg_color}'>"; + echo " <div id='topbar'></div></td>\n"; + echo " </tr>\n"; + echo " <tr height='1'>\n"; + if ($text != "") + echo " <td height='1' class='listtopic'>{$text}</td>\n"; + else + echo " <td height='1' class='listtopic'></td>\n"; + echo " </tr>\n"; + echo " </table>"; + echo "<script type=\"text/javascript\">"; + echo "NiftyCheck();\n"; + echo "Rounded(\"div#topbar\",\"top\",\"{$replace_color}\",\"{$bg_color}\",\"{$rounding_style}\");\n"; + echo "</script>"; +} + +/****f* pfsense-utils/generate_random_mac_address + * NAME + * generate_random_mac - generates a random mac address + * INPUTS + * none + * RESULT + * $mac - a random mac address + ******/ +function generate_random_mac_address() { + $mac = "00:a0:8e"; + for($x=0; $x<3; $x++) + $mac .= ":" . dechex(rand(16, 255)); + + return $mac; +} + +/****f* pfsense-utils/strncpy + * NAME + * strncpy - copy strings + * INPUTS + * &$dst, $src, $length + * RESULT + * none + ******/ +function strncpy(&$dst, $src, $length) { + if (strlen($src) > $length) { + $dst = substr($src, 0, $length); + } else { + $dst = $src; + } +} + +/****f* pfsense-utils/reload_interfaces_sync + * NAME + * reload_interfaces - reload all interfaces + * INPUTS + * none + * RESULT + * none + ******/ +function reload_interfaces_sync() { + global $config, $g; + + touch("{$g['tmp_path']}/reloading_all"); + + if(file_exists("{$g['tmp_path']}/config.cache")) + unlink("{$g['tmp_path']}/config.cache"); + + /* parse config.xml again */ + $config = parse_config(true); + + /* delete all old interface information */ + $iflist = split(" ", str_replace("\n", "", `/sbin/ifconfig -l`)); + foreach ($iflist as $ifent => $ifname) { + $ifname_real = convert_friendly_interface_to_real_interface_name($ifname); + mwexec("/sbin/ifconfig {$ifname_real} down"); + mwexec("/sbin/ifconfig {$ifname_real} delete"); + } + + /* set up VLAN virtual interfaces */ + interfaces_vlan_configure(); + + /* set up LAN interface */ + interfaces_lan_configure(); + + /* set up WAN interface */ + interfaces_wan_configure(); + + /* set up Optional interfaces */ + interfaces_optional_configure(); + + /* set up static routes */ + system_routing_configure(); + + /* enable routing */ + system_routing_enable(); + + /* setup captive portal if needed */ + captiveportal_configure(); + + /* bring up carp interfaces */ + interfaces_carp_configure(); + + /* bring up carp interfaces*/ + interfaces_carp_bring_up_final(); + + unlink_if_exists("{$g['tmp_path']}/reloading_all"); +} + +/****f* pfsense-utils/reload_all + * NAME + * reload_all - triggers a reload of all settings + * * INPUTS + * none + * RESULT + * none + ******/ +function reload_all() { + touch("/tmp/reload_all"); +} + +/****f* pfsense-utils/reload_interfaces + * NAME + * reload_interfaces - triggers a reload of all interfaces + * INPUTS + * none + * RESULT + * none + ******/ +function reload_interfaces() { + touch("/tmp/reload_interfaces"); +} + +/****f* pfsense-utils/sync_webgui_passwords + * NAME + * sync_webgui_passwords - syncs webgui and ssh passwords + * INPUTS + * none + * RESULT + * none + ******/ +function sync_webgui_passwords() { + global $config, $g; + conf_mount_rw(); + $fd = fopen("{$g['varrun_path']}/htpasswd", "w"); + if (!$fd) { + printf("Error: cannot open htpasswd in system_password_configure().\n"); + return 1; + } + /* set admin account */ + $username = $config['system']['username']; + + /* set defined user account */ + if($username <> "admin") { + $username = $config['system']['username']; + fwrite($fd, $username . ":" . $config['system']['password'] . "\n"); + } else { + fwrite($fd, $username . ":" . $config['system']['password'] . "\n"); + } + fclose($fd); + chmod("{$g['varrun_path']}/htpasswd", 0600); + $crypted_pw = $config['system']['password']; + mwexec("/usr/sbin/pwd_mkdb -d /etc -p /etc/master.passwd"); + mwexec("/usr/sbin/pwd_mkdb -p /etc/master.passwd"); + /* sync root */ + $fd = popen("/usr/sbin/pw usermod -n root -H 0", "w"); + fwrite($fd, $crypted_pw); + pclose($fd); + mwexec("/usr/sbin/pw usermod -n root -s /bin/sh"); + /* sync admin */ + $fd = popen("/usr/sbin/pw usermod -n admin -H 0", "w"); + fwrite($fd, $crypted_pw); + pclose($fd); + mwexec("/usr/sbin/pw usermod -n admin -s /etc/rc.initial"); + mwexec("/usr/sbin/pwd_mkdb -d /etc -p /etc/master.passwd"); + mwexec("/usr/sbin/pwd_mkdb -p /etc/master.passwd"); + conf_mount_ro(); +} + +/****f* pfsense-utils/cleanup_opt_interfaces_after_removal + * NAME + * cleanup_opt_interfaces_after_removal - renumber interfaces after removing + * * INPUTS + * optional interface number + * RESULT + * none + ******/ +function cleanup_opt_interfaces_after_removal($opt_interface_num) { + global $config; + unlink_if_exists("/tmp/config.cache"); + $config_file = file_get_contents("/cf/conf/config.xml"); + /* loop through and reassign optional items */ + for ($i = 255; isset($config['interfaces']['opt' . $i]); $i--) { + if($i < $opt_interface_num) + break; + /* replace opt$i with $i -1 */ + str_replace("opt" . $i, "opt" . ($i-1), $config_file); + } + $fd = fopen("/cf/conf/config.xml", "w"); + fwrite($fd, $config_file); + fclose($fd); + $config = parse_config(true); + return true; +} + +/****f* pfsense-utils/get_number_of_wan_netgraph_interfaces_needed + * NAME + * get_number_of_wan_netgraph_interfaces_needed - returns the + * amount of netgraph interfaces needed for system wans + * * INPUTS + * none + * RESULT + * number of needed netgraph (ng) interfaces + ******/ +function get_number_of_wan_netgraph_interfaces_needed() { + global $config, $g; + /* build an array of interfaces to work with */ + $iflist = array("wan" => "WAN"); + for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) + $iflist['opt' . $i] = $config['interfaces']['opt' . $i]['descr']; + $ng_interfaces_needed = 0; + foreach ($iflist as $ifent => $ifname) { + if($config['inerfaces'][$ifname]['ipaddr'] == "pppoe") { + $ng_interfaces_needed++; } } - return $size; + return $ng_interfaces_needed; } -function get_package_install_size($pkg = 'all', $pkg_info = "") { +function get_netgaph_interface_assignment($friendly_interface) { global $config, $g; - if((!is_array($pkg)) and ($pkg != 'all')) $pkg = array($pkg); - $pkgdb = get_pkg_db(); - if(!$pkg_info) $pkg_info = get_pkg_sizes($pkg); - foreach($pkg as $apkg) { - if(!$pkg_info[$apkg]) continue; - $toreturn[$apkg] = expand_to_bytes(walk_depend(array($pkg_info[$apkg]), $pkgdb)); - } - return $toreturn; -} - -function squash_from_bytes($size, $round = "") { - $conv = array(1 => "B", "K", "M", "G"); - foreach($conv as $div => $suffix) { - $sizeorig = $size; - if(($size /= 1024) < 1) { - if($round) { - $sizeorig = round($sizeorig, $round); - } - return $sizeorig . $suffix; + /* build an array of interfaces to work with */ + $iflist = array("wan" => "WAN"); + for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) + $iflist['opt' . $i] = $config['interfaces']['opt' . $i]['descr']; + $ng_interfaces_needed = 0; + $ng_interfaces_number = 0; + foreach ($iflist as $ifent => $ifname) { + if($config['inerfaces'][$ifname]['ipaddr'] == "pppoe") { + $ng_interfaces_number++; } + if($friendly_interface == $ifname) + break; } - return; + return $ng_interfaces_number; } -?> + +/****f* pfsense-utils/reload_all_sync + * NAME + * reload_all - reload all settings + * * INPUTS + * none + * RESULT + * none + ******/ +function reload_all_sync() { + global $config, $g; + + touch("{$g['tmp_path']}/reloading_all"); + + if(file_exists("{$g['tmp_path']}/config.cache")) + unlink("{$g['tmp_path']}/config.cache"); + + /* parse config.xml again */ + $config = parse_config(true); + + /* set up our timezone */ + system_timezone_configure(); + + /* set up our hostname */ + system_hostname_configure(); + + /* make hosts file */ + system_hosts_generate(); + + /* generate resolv.conf */ + system_resolvconf_generate(); + + /* delete all old interface information */ + $iflist = split(" ", str_replace("\n", "", `/sbin/ifconfig -l`)); + foreach ($iflist as $ifent => $ifname) { + $ifname_real = convert_friendly_interface_to_real_interface_name($ifname); + if($ifname_real == "lo0") + continue; + mwexec("/sbin/ifconfig {$ifname_real} down"); + mwexec("/sbin/ifconfig {$ifname_real} delete"); + } + + /* set up VLAN virtual interfaces */ + interfaces_vlan_configure(); + + /* set up LAN interface */ + interfaces_lan_configure(); + + /* set up WAN interface */ + interfaces_wan_configure(); + + /* set up Optional interfaces */ + interfaces_optional_configure(); + + /* bring up carp interfaces */ + interfaces_carp_configure(); + + /* set up static routes */ + system_routing_configure(); + + /* enable routing */ + system_routing_enable(); + + /* ensure passwords are sync'd */ + system_password_configure(); + + /* start dnsmasq service */ + services_dnsmasq_configure(); + + /* start dyndns service */ + services_dyndns_configure(); + + /* start DHCP service */ + services_dhcpd_configure(); + + /* start the NTP client */ + system_ntp_configure(); + + /* start ftp proxy helpers if they are enabled */ + system_start_ftp_helpers(); + + /* start the captive portal */ + captiveportal_configure(); + + /* reload the filter */ + filter_configure_sync(); + + /* bring up carp interfaces*/ + interfaces_carp_bring_up_final(); + + /* sync pw database */ + conf_mount_rw(); + mwexec("/usr/sbin/pwd_mkdb -d /etc/ /etc/master.passwd"); + conf_mount_ro(); + + /* restart sshd */ + touch("/tmp/start_sshd"); + + unlink_if_exists("{$g['tmp_path']}/reloading_all"); + +} + +function print_value_list($list, $count = 10, $separator = ",") { + $list = implode($separator, array_slice($list, 0, $count)); + if(count($list) < $count) { + $list .= "."; + } else { + $list .= "..."; + } + return $list; +} + +?>
\ No newline at end of file |