diff options
Diffstat (limited to 'etc')
-rw-r--r-- | etc/inc/captiveportal.inc | 12 | ||||
-rw-r--r-- | etc/inc/cmd_chain.inc | 132 | ||||
-rw-r--r-- | etc/inc/filter.inc | 6 | ||||
-rw-r--r-- | etc/inc/gwlb.inc | 4 | ||||
-rw-r--r-- | etc/inc/interfaces.inc | 89 | ||||
-rw-r--r-- | etc/inc/pkg-utils.inc | 28 | ||||
-rw-r--r-- | etc/inc/services.inc | 10 | ||||
-rw-r--r-- | etc/inc/util.inc | 2 | ||||
-rwxr-xr-x | etc/rc.linkup | 47 | ||||
-rwxr-xr-x | etc/rc.start_packages | 5 |
10 files changed, 96 insertions, 239 deletions
diff --git a/etc/inc/captiveportal.inc b/etc/inc/captiveportal.inc index 9f7d8e0..23ac756 100644 --- a/etc/inc/captiveportal.inc +++ b/etc/inc/captiveportal.inc @@ -835,7 +835,7 @@ function captiveportal_disconnect($dbent, $radiusservers,$term_cause = 1,$stop_t if (is_ipaddr($dbent[2])) { captiveportal_ipfw_set_context($cpzone); - /* Delete client's ip entry from tables 3 and 4. */ + /* Delete client's ip entry from tables 1 and 2. */ pfSense_ipfw_Tableaction($cpzone, IP_FW_TABLE_DEL, 1, $dbent[2]); pfSense_ipfw_Tableaction($cpzone, IP_FW_TABLE_DEL, 2, $dbent[2]); /* XXX: Redundant?! Ensure all pf(4) states are killed. */ @@ -1346,7 +1346,7 @@ function captiveportal_get_next_dn_ruleno($rulenos_start = 2000, $rulenos_range_ break; } } else { - $rules = array_pad(array(), $rulenos_range_max - $rulenos_start, false); + $rules = array_pad(array(), $rulenos_range_max, false); $rules[$rulenos_start] = "used"; $rules[++$rulenos_start] = "used"; $ruleno = $rulenos_start; @@ -1377,9 +1377,9 @@ function captiveportal_get_dn_passthru_ruleno($value) { if(!isset($cpcfg['enable'])) return NULL; - $cpruleslck = lock("captiveportalrules{$cpzone}", LOCK_EX); - if (file_exists("{$g['vardb_path']}/captiveportal_{$cpzone}.rules")) { - $rules = unserialize(file_get_contents("{$g['vardb_path']}/captiveportal_{$cpzone}.rules")); + $cpruleslck = lock("captiveportalrulesdn", LOCK_EX); + if (file_exists("{$g['vardb_path']}/captiveportaldn.rules")) { + $rules = unserialize(file_get_contents("{$g['vardb_path']}/captiveportaldn.rules")); captiveportal_ipfw_set_context($cpzone); $ruleno = intval(`/sbin/ipfw show | /usr/bin/grep {$value} | /usr/bin/grep -v grep | /usr/bin/cut -d " " -f 5 | /usr/bin/head -n 1`); if ($rules[$ruleno]) { @@ -1423,7 +1423,7 @@ function captiveportal_get_next_ipfw_ruleno($rulenos_start = 2, $rulenos_range_m break; } } else { - $rules = array_pad(array(), $rulenos_range_max - $rulenos_start, false); + $rules = array_pad(array(), $rulenos_range_max, false); $rules[$rulenos_start] = "used"; $rules[++$rulenos_start] = "used"; $ruleno = 2; diff --git a/etc/inc/cmd_chain.inc b/etc/inc/cmd_chain.inc deleted file mode 100644 index 4c1e69e..0000000 --- a/etc/inc/cmd_chain.inc +++ /dev/null @@ -1,132 +0,0 @@ -<?php -/* $Id$ */ -/* - cmd_chain.inc - Part of pfSense - Copyright (C) 2008 Scott Ullrich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - pfSense_MODULE: utils -*/ - -/* - * HANDY FOR STAND ALONE DEBUGGING OF CLASS. - * - - function log_error($text) { - echo $text . "\n"; - } - -*/ - -/* - * CmdCHAIN allows a chaining of commands into one call. - * If debugging is enabled verbose logging is applied. - * During the command(s) execution if it fails the result - * will be reported to syslog so that the problem can be reported. - */ -Class CmdCHAIN { - - var $cmd_chain_array = array(); - var $is_debugging; - var $halt_on_errors = true; - - /* clear() erases the current cmdchain */ - function clear() { - unset($cmd_chain_array); - $this->cmd_chain_array = array(); - } - - /* enables log_error() of each command we run */ - function setdebug() { - $this->is_debugging = true; - } - - /* no halt execution of CmdCHAIN if there is a failure */ - function nohaltonerror() { - $this->halt_on_errors = false; - } - - /* halts execution of CmdCHAIN if there is a failure */ - function sethaltonerror() { - $this->halt_on_errors = true; - } - - /* adds a command to the CmdCHAIN */ - function add($cmd_title = "", $command = "", $ignore_return_text = false) { - if(!$cmd_title) - return; - if(!$command) - return; - $temp = array(); - $temp['cmd_title'] = $cmd_title; - $temp['command'] = $command; - if($ignore_return_text) - $temp['ignore_return_text'] = true; - else - $temp['ignore_return_text'] = false; - $this->cmd_chain_array[] = $temp; // add array to class - return array(); - } - - /* executes the CmdCHAIN one command at a time */ - function execute() { - foreach($this->cmd_chain_array as $cmd) { - $cmd_title = $cmd['cmd_title']; - $command = $cmd['command']; - $ignore_return_text = $cmd['ignore_return_text']; - // Should we perform verbose debugging? - if($this->is_debugging == true) { - log_error(sprintf(gettext('CmdCHAIN is executing -> %1$s - %2$s'), $cmd_title, $command)); - usleep(100); // give network stack time to deliver network syslog message - } - // Execute command - $status = exec($command); - if($this->ignore_return_text == true) - continue; - if(intval($status) <> 0) { - log_error(sprintf(gettext('%1$s failed with return code -> %2$s. The command was %3$s'), $cmd_title, $status, $command)); - if($this->halt_on_errors == true) - return(sprintf(gettext('%1$s failed with return code -> %2$s. The command was %3$s'), $cmd_title, $status, $command)); - } - } - return; - } -} - -/* - * example usage: - * - -$cmdchain = new CmdCHAIN(); -$cmdchain->add("grab freebsd version", "uname -a", false); -$cmdchain->setdebug(); // optional for verbose logging -$cmdchain->nohaltonerror(); // tells cmdchain to keep processing commands if any of them fail -$cmdchain->execute(); - -$cmdchain->clear(); // clears the previous added entries - -*/ - -?> diff --git a/etc/inc/filter.inc b/etc/inc/filter.inc index 6e0da37..6bd77d6 100644 --- a/etc/inc/filter.inc +++ b/etc/inc/filter.inc @@ -336,12 +336,8 @@ function filter_configure_sync($delete_states_if_needed = true) { layer7_start_l7daemon(); if(!empty($filterdns)) { - $filterdnsfd = fopen("{$g['varetc_path']}/filterdns.conf", "w"); - if($filterdnsfd) { - fwrite($filterdnsfd, $filterdns); - fclose($filterdnsfd); - } killbypid("{$g['tmp_path']}/filterdns.pid"); + @file_put_contents("{$g['varetc_path']}/filterdns.conf", $filterdns); /* * FilterDNS has three debugging levels. The default choosen is 1. * Availabe are level 2 and greater then 2. diff --git a/etc/inc/gwlb.inc b/etc/inc/gwlb.inc index 173a185..3dc7e2b 100644 --- a/etc/inc/gwlb.inc +++ b/etc/inc/gwlb.inc @@ -522,7 +522,7 @@ function return_gateways_array($disabled = false, $localhost = false) { $ctype = strtoupper($ifcfg['ipaddr']); break; default: - if (substr($ifcfg['if'], 0, 5) == "ovpnc") + if (substr($ifcfg['if'], 0, 4) == "ovpn") $ctype = "VPNv4"; break; } @@ -588,7 +588,7 @@ function return_gateways_array($disabled = false, $localhost = false) { $ctype = strtoupper($ifcfg['ipaddrv6']); break; default: - if (substr($ifcfg['if'], 0, 5) == "ovpnc") + if (substr($ifcfg['if'], 0, 4) == "ovpn") $ctype = "VPNv6"; break; } diff --git a/etc/inc/interfaces.inc b/etc/inc/interfaces.inc index 7b12d02..07d621d 100644 --- a/etc/inc/interfaces.inc +++ b/etc/inc/interfaces.inc @@ -44,7 +44,6 @@ /* include all configuration functions */ require_once("globals.inc"); -require_once("cmd_chain.inc"); require_once("util.inc"); require_once("gwlb.inc"); @@ -834,13 +833,19 @@ function interface_gif_configure(&$gif, $gifkey = "") { return -1; $realif = get_real_interface($gif['if']); + $ipaddr = $gif['ipaddr']; - if(is_ipaddrv4($gif['remote-addr'])) { - $realifip = get_interface_ip($gif['if']); + if (is_ipaddrv4($gif['remote-addr'])) { + if (is_ipaddrv4($ipaddr)) + $realifip = $ipaddr; + else + $realifip = get_interface_ip($gif['if']); $realifgw = get_interface_gateway($gif['if']); - } - if(is_ipaddrv6($gif['remote-addr'])) { - $realifip = get_interface_ipv6($gif['if']); + } else if (is_ipaddrv6($gif['remote-addr'])) { + if (is_ipaddrv6($ipaddr)) + $realifip = $ipaddr; + else + $realifip = get_interface_ipv6($gif['if']); $realifgw = get_interface_gatewayv6($gif['if']); } /* make sure the parent interface is up */ @@ -1747,24 +1752,18 @@ EOD; function interfaces_carp_setup() { global $g, $config; - $balanacing = ""; - $pfsyncinterface = ""; - $pfsyncenabled = ""; - if(isset($config['system']['developerspew'])) { + if (isset($config['system']['developerspew'])) { $mt = microtime(); echo "interfaces_carp_setup() being called $mt\n"; } - // Prepare CmdCHAIN that will be used to execute commands. - $cmdchain = new CmdCHAIN(); - if ($g['booting']) { echo gettext("Configuring CARP settings..."); mute_kernel_msgs(); } /* suck in configuration items */ - if($config['hasync']) { + if ($config['hasync']) { $pfsyncenabled = $config['hasync']['pfsyncenabled']; $balanacing = $config['hasync']['balancing']; $pfsyncinterface = $config['hasync']['pfsyncinterface']; @@ -1775,46 +1774,30 @@ function interfaces_carp_setup() { unset($pfsyncenabled); } - if($balanacing) { - $cmdchain->add(gettext("Enable CARP ARP-balancing"), "/sbin/sysctl net.inet.carp.arpbalance=1", true); - $cmdchain->add(gettext("Disallow CARP preemption"), "/sbin/sysctl net.inet.carp.preempt=0", true); + if ($balanacing) { + mwexec("/sbin/sysctl net.inet.carp.arpbalance=1", true); + mwexec("/sbin/sysctl net.inet.carp.preempt=0", true); } else - $cmdchain->add(gettext("Enable CARP preemption"), "/sbin/sysctl net.inet.carp.preempt=1", true); + mwexec("/sbin/sysctl net.inet.carp.preempt=1", true); - $cmdchain->add(gettext("Enable CARP logging"), "/sbin/sysctl net.inet.carp.log=1", true); + mwexec("sbin/sysctl net.inet.carp.log=1", true); if (!empty($pfsyncinterface)) $carp_sync_int = get_real_interface($pfsyncinterface); - - if($g['booting']) { - /* install rules to alllow pfsync to sync up during boot - * carp interfaces will remain down until the bootup sequence finishes - */ - $fd = fopen("{$g['tmp_path']}/rules.boot", "w"); - if ($fd) { - fwrite($fd, "block quick proto carp \n"); - fwrite($fd, "block quick proto pfsync \n"); - fwrite($fd, "pass out quick from any to any keep state\n"); - fclose($fd); - mwexec("/sbin/pfctl -f {$g['tmp_path']}/rules.boot"); - } else - log_error(gettext("Could not create rules.boot file!")); - } + else + unset($carp_sync_int); /* setup pfsync interface */ - if($carp_sync_int and $pfsyncenabled) { + if ($carp_sync_int and $pfsyncenabled) { if (is_ipaddr($pfsyncpeerip)) - $cmdchain->add(gettext("Bring up pfsync0 syncpeer"), "/sbin/ifconfig pfsync0 syncdev {$carp_sync_int} syncpeer {$pfsyncpeerip} up", false); + mwexec("/sbin/ifconfig pfsync0 syncdev {$carp_sync_int} syncpeer {$pfsyncpeerip} up", false); else - $cmdchain->add(gettext("Bring up pfsync0 syncdev"), "/sbin/ifconfig pfsync0 syncdev {$carp_sync_int} up", false); - } else - $cmdchain->add(gettext("Bring up pfsync0"), "/sbin/ifconfig pfsync0 syncdev lo0 up", false); + mwexec("/sbin/ifconfig pfsync0 syncdev {$carp_sync_int} up", false); - sleep(1); + sleep(1); - /* XXX: Handle an issue with pfsync(4) and carp(4). In a cluster carp will come up before pfsync(4) has updated and so will cause issues - * for existing sessions. - */ - if ($config['hasync']['pfsyncenabled'] === "on"){ + /* XXX: Handle an issue with pfsync(4) and carp(4). In a cluster carp will come up before pfsync(4) has updated and so will cause issues + * for existing sessions. + */ log_error("waiting for pfsync..."); $i = 0; while (intval(trim(`/sbin/ifconfig pfsync0 | /usr/bin/grep 'syncok: 0' | /usr/bin/grep -v grep | /usr/bin/wc -l`)) == 0 && $i < 30) { @@ -1826,16 +1809,10 @@ function interfaces_carp_setup() { } if($config['virtualip']['vip']) - $cmdchain->add(gettext("Allow CARP."), "/sbin/sysctl net.inet.carp.allow=1", true); + mwexec("/sbin/sysctl net.inet.carp.allow=1", true); else - $cmdchain->add(gettext("Disallow CARP."), "/sbin/sysctl net.inet.carp.allow=0", true); + mwexec("/sbin/sysctl net.inet.carp.allow=0", true); - if($g['debug']) - $cmdchain->setdebug(); // optional for verbose logging - - $cmdchain->execute(); - $cmdchain->clear(); - if ($g['booting']) { unmute_kernel_msgs(); echo gettext("done.") . "\n"; @@ -3156,6 +3133,7 @@ function interface_6rd_configure($interface = "wan") { /* stf approach only works when embedding the entire 32 bits of the v4 */ mwexec("/sbin/ifconfig stf0 create"); + pfSense_interface_flags("stf0", IFF_LINK2); mwexec("/sbin/ifconfig stf0 inet6 {$rd6prefix}/{$rd6prefixlen}"); log_error("Created 6rd interface stf0 {$rd6prefix}/{$rd6prefixlen}"); @@ -3251,6 +3229,7 @@ function interface_6to4_configure($interface = "wan"){ /* setup the stf interface */ mwexec("/sbin/ifconfig stf0 destroy"); mwexec("/sbin/ifconfig stf0 create"); + pfSense_interface_flags("stf0", IFF_LINK2); mwexec("/sbin/ifconfig stf0 inet6 {$stflanpr} prefixlen 16"); log_error("Set IPv6 address inet6 {$stflanpr} prefixlen 16 for stf0, route {$stfbrgw}"); @@ -4287,7 +4266,7 @@ function get_interfaces_with_gateway() { $ints[$ifdescr] = $ifdescr; break; default: - if (substr($ifname['if'], 0, 5) == "ovpnc" || + if (substr($ifname['if'], 0, 4) == "ovpn" || !empty($ifname['gateway'])) $ints[$ifdescr] = $ifdescr; break; @@ -4311,7 +4290,7 @@ function interface_has_gateway($friendly) { return true; break; default: - if (substr($ifname['if'], 0, 5) == "ovpnc") + if (substr($ifname['if'], 0, 4) == "ovpn") return true; if (!empty($ifname['gateway'])) return true; @@ -4340,7 +4319,7 @@ function interface_has_gatewayv6($friendly) { return true; break; default: - if (substr($ifname['if'], 0, 5) == "ovpnc") + if (substr($ifname['if'], 0, 4) == "ovpn") return true; if (!empty($ifname['gatewayv6'])) return true; diff --git a/etc/inc/pkg-utils.inc b/etc/inc/pkg-utils.inc index d667c12..87dd0ae 100644 --- a/etc/inc/pkg-utils.inc +++ b/etc/inc/pkg-utils.inc @@ -168,6 +168,24 @@ function get_pkg_id($pkg_name) { return -1; } +/****f* pkg-utils/get_pkg_internal_name + * NAME + * get_pkg_internal_name - Find a package's internal name (e.g. squid3 internal name is squid) + * INPUTS + * $package - array of package data from config + * RESULT + * string - internal name (if defined) or default to package name + ******/ +function get_pkg_internal_name($package) { + if (isset($package['internal_name']) && ($package['internal_name'] != "")) { + /* e.g. name is Ipguard-dev, internal name is ipguard */ + $pkg_internal_name = $package['internal_name']; + } else { + $pkg_internal_name = $package['name']; + } + return $pkg_internal_name; +} + /****f* pkg-utils/get_pkg_info * NAME * get_pkg_info - Retrieve package information from pfsense.com. @@ -240,7 +258,7 @@ function resync_all_package_configs($show_message = false) { echo " " . $package['name']; get_pkg_depends($package['name'], "all"); if($g['booting'] != true) - stop_service($package['name']); + stop_service(get_pkg_internal_name($package)); sync_package($idx, true, true); if($pkg_interface == "console") echo "\n" . gettext("Syncing packages:"); @@ -356,10 +374,9 @@ function uninstall_package($pkg_name) { } } - stop_service($pkg_name); - $id = get_pkg_id($pkg_name); if ($id >= 0) { + stop_service(get_pkg_internal_name($config['installedpackages']['package'][$id])); $pkg_depends =& $config['installedpackages']['package'][$id]['depends_on_package_pbi']; $static_output .= "Removing package...\n"; update_output_window($static_output); @@ -1281,8 +1298,9 @@ function stop_packages() { if (is_array($config['installedpackages']['package'])) { foreach($config['installedpackages']['package'] as $package) { echo " Stopping package {$package['name']}..."; - stop_service($package['name']); - unset($rcfiles[RCFILEPREFIX . $package['name'] . ".sh"]); + $internal_name = get_pkg_internal_name($package); + stop_service($internal_name); + unset($rcfiles[RCFILEPREFIX . strtolower($internal_name) . ".sh"]); echo "done.\n"; } } diff --git a/etc/inc/services.inc b/etc/inc/services.inc index d5c6b3a..4e6a532 100644 --- a/etc/inc/services.inc +++ b/etc/inc/services.inc @@ -6,7 +6,7 @@ originally part of m0n0wall (http://m0n0.ch/wall) Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>. - Copyright (C) 2010 Ermal Lu�i + Copyright (C) 2010 Ermal Luci All rights reserved. Redistribution and use in source and binary forms, with or without @@ -1493,15 +1493,9 @@ function services_dyndns_configure($int = "") { echo gettext("Starting DynDNS clients..."); foreach ($dyndnscfg as $dyndns) { - $failovergroup = interface_gateway_group_member($int); - if (!empty($int) && $int == $dyndns['interface']) { + if ((empty($int)) || ($int == $dyndns['interface']) || (is_array($gwgroups[$dyndns['interface']]))) { services_dyndns_configure_client($dyndns); sleep(1); - } elseif (is_array($gwgroups[$dyndns['interface']])){ - services_dyndns_configure_client($dyndns); - sleep(1); - } else { - continue; } } diff --git a/etc/inc/util.inc b/etc/inc/util.inc index 81f2dc4..a86fe92 100644 --- a/etc/inc/util.inc +++ b/etc/inc/util.inc @@ -62,7 +62,7 @@ function isvalidproc($proc) { /* sigkill a process by pid file */ /* return 1 for success and 0 for a failure */ function sigkillbypid($pidfile, $sig) { - if (is_file($pidfile)) + if (file_exists($pidfile)) return mwexec("/bin/pkill -{$sig} -F {$pidfile}", true); return 0; diff --git a/etc/rc.linkup b/etc/rc.linkup index 23d7c9b..217fe65 100755 --- a/etc/rc.linkup +++ b/etc/rc.linkup @@ -39,9 +39,14 @@ require_once("interfaces.inc"); function handle_argument_group($iface, $argument2) { global $config; + if (!is_array($config['interfaces'][$iface])) + return; + $ipaddr = $config['interfaces'][$iface]['ipaddr']; - if (is_ipaddr($ipaddr) || empty($ipaddr)) { - log_error("Hotplug event detected for {$iface} but ignoring since interface is configured with static IP ({$ipaddr})"); + $ip6addr = $config['interfaces'][$iface]['ipaddrv6']; + if ((!empty($ipaddr) && is_ipaddrv4($ipaddr)) || (empty($ipaddr) && empty($ip6addr)) || (!empty($ip6addr) && is_ipaddrv6($ip6addr))) { + $friendly = convert_friendly_interface_to_friendly_descr($iface); + log_error("Hotplug event detected for {$friendly}({$iface}) but ignoring since interface is configured with static IP ({$ipaddr} {$ip6addr})"); interfaces_staticarp_configure($iface); $iface = get_real_interface($iface); interfaces_bring_up($iface); @@ -75,28 +80,24 @@ global $g; if (file_exists("{$g['varrun_path']}/booting")) { /* ignore all linkup events */ } else { - foreach($_SERVER['argv'] as $argv) { - switch($argv) { - case "start": - $action = "start"; - break; - case "stop": - $action = "stop"; - break; - case "/etc/rc.linkup": - break; - default: - $interface = convert_real_interface_to_friendly_interface_name($argv); - if($interface == "") { - unset($interface); - } - break; - } - if(($action) && ($interface)) { - handle_argument_group($interface, $action); - unset ($action, $interface); - } + if ($argc < 3) { + log_error("HOTPLUG event: The number of required parameters not passed!"); + exit; + } + $action = $argv[1]; + switch($action) { + case "start": + case "stop": + break; + default: + log_error("HOTPLUG event: The action parameter passed is wrong($action) only start/stop/up/down are allowed!"); + exit; + /* NOTREACHED */ + break; } + $interface = convert_real_interface_to_friendly_interface_name($argv[2]); + if (!empty($interface)) + handle_argument_group($interface, $action); } ?> diff --git a/etc/rc.start_packages b/etc/rc.start_packages index 15f62e1..3d30587 100755 --- a/etc/rc.start_packages +++ b/etc/rc.start_packages @@ -54,8 +54,9 @@ if (is_array($config['installedpackages']['package'])) { foreach($config['installedpackages']['package'] as $package) { echo " Starting package {$package['name']}..."; sync_package($package['name']); - start_service($package['name']); - unset($rcfiles[RCFILEPREFIX . $package['name'] . ".sh"]); + $internal_name = get_pkg_internal_name($package); + start_service($internal_name); + unset($rcfiles[RCFILEPREFIX . strtolower($internal_name) . ".sh"]); echo "done.\n"; } } |