diff options
author | Renato Botelho <renato@netgate.com> | 2015-09-01 14:14:11 -0300 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2015-09-01 14:14:11 -0300 |
commit | 93a957b34b718afa319424ab45e26171ceff1a19 (patch) | |
tree | a65dc1813150358208b4e55ad169f31bd06a6458 | |
parent | de3aa3c283313e190c7f8208c4eda51fdd1903aa (diff) | |
parent | 7265700a28961b4d103d5160c95c75b0aa42811f (diff) | |
download | pfsense-93a957b34b718afa319424ab45e26171ceff1a19.zip pfsense-93a957b34b718afa319424ab45e26171ceff1a19.tar.gz |
Merge branch 'master' into bootstrap
-rwxr-xr-x | build.sh | 5 | ||||
-rw-r--r-- | license.txt | 93 | ||||
-rw-r--r-- | src/etc/inc/pfsense-utils.inc | 4 | ||||
-rw-r--r-- | src/etc/inc/service-utils.inc | 7 | ||||
-rw-r--r-- | src/etc/inc/services.inc | 15 | ||||
-rw-r--r-- | src/etc/inc/system.inc | 17 | ||||
-rw-r--r-- | src/etc/inc/upgrade_config.inc | 95 | ||||
-rwxr-xr-x | src/etc/rc.php_ini_setup | 9 | ||||
-rwxr-xr-x | src/usr/local/bin/mail.php | 2 | ||||
-rw-r--r-- | src/usr/local/www/system_advanced_misc.php | 2 | ||||
-rw-r--r-- | src/usr/local/www/widgets/widgets/system_information.widget.php | 12 | ||||
-rwxr-xr-x | tools/build_snapshots.sh | 13 | ||||
-rw-r--r-- | tools/builder_common.sh | 64 | ||||
-rw-r--r-- | tools/builder_defaults.sh | 74 | ||||
-rw-r--r-- | tools/templates/core_pkg/default-config-vmware/metadir/+DESC | 3 | ||||
-rw-r--r-- | tools/templates/core_pkg/default-config-vmware/metadir/+INSTALL | 15 | ||||
-rw-r--r-- | tools/templates/core_pkg/default-config-vmware/metadir/+MANIFEST | 15 | ||||
-rw-r--r-- | tools/templates/core_pkg/default-config-vmware/pkg-plist | 1 |
18 files changed, 276 insertions, 170 deletions
@@ -72,7 +72,7 @@ usage() { echo " --update-poudriere-jails [-a ARCH_LIST] - Update poudriere jails using current patch versions" echo " --update-poudriere-ports - Update poudriere ports tree" echo " --update-pkg-repo - Rebuild necessary ports on poudriere and update pkg repo" - echo " --do-not-upload|-U - Do not send updated pkg repo to PKG_RSYNC_HOSTNAME" + echo " --do-not-upload|-u - Do not upload pkgs or snapshots" echo " -V VARNAME - print value of variable VARNAME" exit 1 } @@ -181,7 +181,7 @@ while test "$1" != ""; do --update-pkg-repo) BUILDACTION="update_pkg_repo" ;; - --do-not-upload|-U) + --do-not-upload|-u) export DO_NOT_UPLOAD=1 ;; all|*iso*|*ova*|*memstick*|*memstickserial*|*memstickadi*|*nanobsd*|*nanobsd-vga*|*fullupdate*) @@ -216,7 +216,6 @@ launch case $BUILDACTION in builder_setup) - update_freebsd_sources builder_setup ;; buildkernels) diff --git a/license.txt b/license.txt index 93f2f5f..c29218a 100644 --- a/license.txt +++ b/license.txt @@ -1,48 +1,45 @@ -/* ==================================================================== - * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. 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. - * - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgment: - * "This product includes software developed by the pfSense Project - * for use in the pfSense® software distribution. (http://www.pfsense.org/). - * - * 4. The names "pfSense" and "pfSense Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * coreteam@pfsense.org. - * - * 5. Products derived from this software may not be called "pfSense" - * nor may "pfSense" appear in their names without prior written - * permission of the Electric Sheep Fencing, LLC. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * - * "This product includes software developed by the pfSense Project - * for use in the pfSense software distribution (http://www.pfsense.org/). - * - * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY - * EXPRESSED 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 pfSense PROJECT OR - * ITS CONTRIBUTORS 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. - * ==================================================================== - */ +Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. 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. + +3. All advertising materials mentioning features or use of this software + must display the following acknowledgment: + "This product includes software developed by the pfSense Project + for use in the pfSense® software distribution. (http://www.pfsense.org/). + +4. The names "pfSense" and "pfSense Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + coreteam@pfsense.org. + +5. Products derived from this software may not be called "pfSense" + nor may "pfSense" appear in their names without prior written + permission of the Electric Sheep Fencing, LLC. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + +"This product includes software developed by the pfSense Project +for use in the pfSense software distribution (http://www.pfsense.org/). + +THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY +EXPRESSED 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 pfSense PROJECT OR +ITS CONTRIBUTORS 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. diff --git a/src/etc/inc/pfsense-utils.inc b/src/etc/inc/pfsense-utils.inc index be66e8b..2e12d96 100644 --- a/src/etc/inc/pfsense-utils.inc +++ b/src/etc/inc/pfsense-utils.inc @@ -2232,8 +2232,8 @@ function version_compare_string($a, $b) { } } function version_compare_numeric($a, $b) { - $a_arr = explode('.', rtrim($a, '.0')); - $b_arr = explode('.', rtrim($b, '.0')); + $a_arr = explode('.', rtrim($a, '.')); + $b_arr = explode('.', rtrim($b, '.')); foreach ($a_arr as $n => $val) { if (array_key_exists($n, $b_arr)) { diff --git a/src/etc/inc/service-utils.inc b/src/etc/inc/service-utils.inc index 2fa75cf..3a72295 100644 --- a/src/etc/inc/service-utils.inc +++ b/src/etc/inc/service-utils.inc @@ -344,13 +344,6 @@ function get_services() { $services[] = $pconfig; } - if (isset($config['installedpackages']['routed']) && $config['installedpackages']['routed']['config'][0]['enable']) { - $pconfig = array(); - $pconfig['name'] = "routed"; - $pconfig['description'] = gettext("RIP Daemon"); - $services[] = $pconfig; - } - if (isset($config['ipsec']['enable'])) { $pconfig = array(); $pconfig['name'] = "ipsec"; diff --git a/src/etc/inc/services.inc b/src/etc/inc/services.inc index 333261d..d13f44a 100644 --- a/src/etc/inc/services.inc +++ b/src/etc/inc/services.inc @@ -725,6 +725,14 @@ EOPP; // Setup pool options foreach ($all_pools as $poolconf) { + if (!(ip_in_subnet($poolconf['range']['from'], "{$subnet}/{$ifcfgsn}") && ip_in_subnet($poolconf['range']['to'], "{$subnet}/{$ifcfgsn}"))) { + // If the user has changed the subnet from the interfaces page and applied, + // but has not updated the DHCP range, then the range to/from of the pool can be outside the subnet. + // In that case, ignore the pool and post an error. + $error_msg = sprintf(gettext("Invalid DHCP pool %s - %s for %s subnet %s/%s detected. Please correct the settings in Services, DHCP Server"), $poolconf['range']['from'], $poolconf['range']['to'], convert_real_interface_to_friendly_descr($dhcpif), $subnet, $ifcfgsn); + file_notice("DHCP", $error_msg); + continue; + } $dhcpdconf .= " pool {\n"; /* is failover dns setup? */ if (is_array($poolconf['dnsserver']) && $poolconf['dnsserver'][0] <> "") { @@ -2438,8 +2446,13 @@ function configure_cron() { file_put_contents("/etc/crontab", $crontab_contents); unset($crontab_contents); + /* make sure that cron is running and start it if it got killed somehow */ + if (!is_process_running("cron")) { + exec("cd /tmp && /usr/sbin/cron -s 2>/dev/null"); + } else { /* do a HUP kill to force sync changes */ - sigkillbypid("{$g['varrun_path']}/cron.pid", "HUP"); + sigkillbypid("{$g['varrun_path']}/cron.pid", "HUP"); + } conf_mount_ro(); } diff --git a/src/etc/inc/system.inc b/src/etc/inc/system.inc index 41e798e..f7987e1 100644 --- a/src/etc/inc/system.inc +++ b/src/etc/inc/system.inc @@ -2042,6 +2042,7 @@ function system_dmesg_save() { function system_set_harddisk_standby() { global $g, $config; + if (isset($config['system']['developerspew'])) { $mt = microtime(); echo "system_set_harddisk_standby() being called $mt\n"; @@ -2055,11 +2056,17 @@ function system_set_harddisk_standby() { $standby = $config['system']['harddiskstandby']; // Check for a numeric value if (is_numeric($standby)) { - // Sync the disk(s) - pfSense_sync(); - if (set_single_sysctl('hw.ata.standby', (int)$standby)) { - // Reinitialize ATA-drives - mwexec('/usr/local/sbin/atareinit'); + // Get only suitable candidates for standby; using get_smart_drive_list() + // from utils.inc to get the list of drives. + $harddisks = get_smart_drive_list(); + + // Since get_smart_drive_list() only matches ad|da|ada; lets put the check below + // just in case of some weird pfSense platform installs. + if (count($harddisks) > 0) { + // Iterate disks and run the camcontrol command for each + foreach ($harddisks as $harddisk) { + mwexec("/sbin/camcontrol standby {$harddisk} -t {$standby}"); + } if (platform_booting()) { echo gettext("done.") . "\n"; } diff --git a/src/etc/inc/upgrade_config.inc b/src/etc/inc/upgrade_config.inc index f5268d2..d68d495 100644 --- a/src/etc/inc/upgrade_config.inc +++ b/src/etc/inc/upgrade_config.inc @@ -258,8 +258,8 @@ function upgrade_014_to_015() { if ($config['interfaces']['wan']['gateway'] <> "") { $config['system']['gateway'] = $config['interfaces']['wan']['gateway']; } + unset($config['interfaces']['wan']['gateway']); } - unset($config['interfaces']['wan']['gateway']); /* Queues are no longer interface specific */ if (isset($config['interfaces']['lan']['schedulertype'])) { @@ -285,9 +285,12 @@ function upgrade_015_to_016() { $config['system']['alt_firmware_url']['enabled'] = ""; $config['system']['alt_firmware_url']['firmware_base_url'] = $config['system']['firmwareurl']; $config['system']['alt_firmware_url']['firmware_filename'] = $config['system']['firmwarename']; - unset($config['system']['firmwareurl'], $config['system']['firmwarename']); - } else { - unset($config['system']['firmwareurl'], $config['system']['firmwarename']); + } + if (isset($config['system']['firmwareurl'])) { + unset($config['system']['firmwareurl']); + } + if (isset($config['system']['firmwarename'])) { + unset($config['system']['firmwarename']); } } @@ -295,12 +298,24 @@ function upgrade_015_to_016() { function upgrade_016_to_017() { global $config; /* wipe previous shaper configuration */ - unset($config['shaper']['queue']); - unset($config['shaper']['rule']); - unset($config['interfaces']['wan']['bandwidth']); - unset($config['interfaces']['wan']['bandwidthtype']); - unset($config['interfaces']['lan']['bandwidth']); - unset($config['interfaces']['lan']['bandwidthtype']); + if (isset($config['shaper']['queue'])) { + unset($config['shaper']['queue']); + } + if (isset($config['shaper']['rule'])) { + unset($config['shaper']['rule']); + } + if (isset($config['interfaces']['wan']['bandwidth'])) { + unset($config['interfaces']['wan']['bandwidth']); + } + if (isset($config['interfaces']['wan']['bandwidthtype'])) { + unset($config['interfaces']['wan']['bandwidthtype']); + } + if (isset($config['interfaces']['lan']['bandwidth'])) { + unset($config['interfaces']['lan']['bandwidth']); + } + if (isset($config['interfaces']['lan']['bandwidthtype'])) { + unset($config['interfaces']['lan']['bandwidthtype']); + } $config['shaper']['enable'] = FALSE; } @@ -350,7 +365,9 @@ function upgrade_017_to_018() { unset($config['installedpackages']['carp']); } /* Server NAT is no longer needed */ - unset($config['nat']['servernat']); + if (isset($config['nat']['servernat'])) { + unset($config['nat']['servernat']); + } /* enable SSH */ if ($config['version'] == "1.8") { @@ -361,7 +378,7 @@ function upgrade_017_to_018() { function upgrade_018_to_019() { global $config; - $config['theme']="metallic"; + $config['theme'] = "metallic"; } @@ -412,7 +429,9 @@ function upgrade_023_to_024() { function upgrade_024_to_025() { global $config; $config['interfaces']['wan']['use_rrd_gateway'] = $config['system']['use_rrd_gateway']; - unset($config['system']['use_rrd_gateway']); + if (isset($config['system']['use_rrd_gateway'])) { + unset($config['system']['use_rrd_gateway']); + } } @@ -587,7 +606,7 @@ function upgrade_039_to_040() { $config['system']['webgui']['auth_method'] = "session"; $config['system']['webgui']['backing_method'] = "htpasswd"; - if (isset ($config['system']['username'])) { + if (isset($config['system']['username'])) { $config['system']['group'] = array(); $config['system']['group'][0]['name'] = "admins"; $config['system']['group'][0]['description'] = gettext("System Administrators"); @@ -627,8 +646,10 @@ function upgrade_039_to_040() { $config['system']['nextgid'] = "111"; /* wipe previous auth configuration */ - unset ($config['system']['username']); - unset ($config['system']['password']); + unset($config['system']['username']); + if (isset($config['system']['password'])) { + unset($config['system']['password']); + } } } @@ -1495,7 +1516,9 @@ function upgrade_050_to_051() { $pconfig['value'] = "0"; $config['sysctl']['item'][] = $pconfig; - unset($config['bridge']); + if (isset($config['bridge'])) { + unset($config['bridge']); + } $convert_bridges = false; foreach ($config['interfaces'] as $intf) { @@ -2025,7 +2048,9 @@ function upgrade_053_to_054() { if (empty($config['load_balancer'])) { unset($config['load_balancer']); } else { - unset($config['load_balancer']['lbpool']); + if (isset($config['load_balancer']['lbpool'])) { + unset($config['load_balancer']['lbpool']); + } } } else { $config['load_balancer']['lbpool'] = $lbpool_srv_arr; @@ -2978,10 +3003,10 @@ function upgrade_083_to_084() { $config['hasync'] = $config['installedpackages']['carpsettings']['config'][0]; unset($config['installedpackages']['carpsettings']); } - if (empty($config['installedpackages']['carpsettings'])) { + if (empty($config['installedpackages']['carpsettings']) && isset($config['installedpackages']['carpsettings'])) { unset($config['installedpackages']['carpsettings']); } - if (empty($config['installedpackages'])) { + if (empty($config['installedpackages']) && isset($config['installedpackages'])) { unset($config['installedpackages']); } } @@ -3393,8 +3418,12 @@ function upgrade_102_to_103() { $config['nat']['outbound'] = $config['nat']['advancedoutbound']; - unset($config['nat']['ipsecpassthru']); - unset($config['nat']['advancedoutbound']); + if (isset($config['nat']['ipsecpassthru'])) { + unset($config['nat']['ipsecpassthru']); + } + if (isset($config['nat']['advancedoutbound'])) { + unset($config['nat']['advancedoutbound']); + } } function upgrade_103_to_104() { @@ -3685,18 +3714,20 @@ function upgrade_111_to_112() { function upgrade_112_to_113() { global $config; - if (isset($config['notifications']['smtp']['ssl']) && - $config['notifications']['smtp']['ssl'] == "checked") { - $config['notifications']['smtp']['ssl'] = true; - } else { - unset($config['notifications']['smtp']['ssl']); + if (isset($config['notifications']['smtp']['ssl'])) { + if ($config['notifications']['smtp']['ssl'] == "checked") { + $config['notifications']['smtp']['ssl'] = true; + } else { + unset($config['notifications']['smtp']['ssl']); + } } - if (isset($config['notifications']['smtp']['tls']) && - $config['notifications']['smtp']['tls'] == "checked") { - $config['notifications']['smtp']['tls'] = true; - } else { - unset($config['notifications']['smtp']['tls']); + if (isset($config['notifications']['smtp']['tls'])) { + if ($config['notifications']['smtp']['tls'] == "checked") { + $config['notifications']['smtp']['tls'] = true; + } else { + unset($config['notifications']['smtp']['tls']); + } } } diff --git a/src/etc/rc.php_ini_setup b/src/etc/rc.php_ini_setup index 3d53233..6d9e77f 100755 --- a/src/etc/rc.php_ini_setup +++ b/src/etc/rc.php_ini_setup @@ -139,10 +139,6 @@ PHPMODULES="$PHPMODULES filter" PHP_ZEND_MODULES="" -if [ "$LOWMEM" != "TRUE" ]; then - PHP_ZEND_MODULES="$PHP_ZEND_MODULES opcache" -fi - # Modules previously included. # can be turned on by touching # /etc/php_dynamodules/$modulename @@ -242,6 +238,11 @@ opcache.enable_cli="0" opcache.memory_consumption="${OPCACHEMEMSIZE}" EOF +else + /bin/cat >>/usr/local/lib/php.ini <<EOF +; opcache Settings +opcache.enabled="0" +EOF fi /bin/cat >>/usr/local/lib/php.ini <<EOF diff --git a/src/usr/local/bin/mail.php b/src/usr/local/bin/mail.php index 130d9e0..001ee67 100755 --- a/src/usr/local/bin/mail.php +++ b/src/usr/local/bin/mail.php @@ -13,7 +13,7 @@ if ($options['s'] <> "") { $in = file("php://stdin"); -foreach ($in as $line){ +foreach ($in as $line) { $message .= "$line"; } diff --git a/src/usr/local/www/system_advanced_misc.php b/src/usr/local/www/system_advanced_misc.php index 2dba952..375589e 100644 --- a/src/usr/local/www/system_advanced_misc.php +++ b/src/usr/local/www/system_advanced_misc.php @@ -571,4 +571,4 @@ $section->addInput(new Form_Checkbox( $form->add($section); print $form; -include("foot.inc");
\ No newline at end of file +include("foot.inc"); diff --git a/src/usr/local/www/widgets/widgets/system_information.widget.php b/src/usr/local/www/widgets/widgets/system_information.widget.php index d00b127..21aaf92 100644 --- a/src/usr/local/www/widgets/widgets/system_information.widget.php +++ b/src/usr/local/www/widgets/widgets/system_information.widget.php @@ -73,14 +73,18 @@ if ($_REQUEST['getupdatestatus']) { } else { $needs_system_upgrade = false; - if (pfs_version_compare($current_installed_buildtime, $current_installed_version, $remote_version) == -1) { + $version_compare = pfs_version_compare($current_installed_buildtime, $g['product_version'], $remote_version); + if ($version_compare == -1) { ?> <div class="alert alert-warning" role="alert"> Version <?=$remote_version?> is available. <a href="/system_firmware_check.php" class="alert-link">Click Here to view.</a> </div> <?php - } else - echo "You are on the latest version."; + } elseif ($version_compare == 1) { + echo "You are on a later version than the official release."; + } else { + echo "You are on the latest version."; + } } } exit; @@ -308,4 +312,4 @@ function systemStatusGetUpdateStatus() { events.push(function(){ setTimeout('systemStatusGetUpdateStatus()', 4000); }); -</script>
\ No newline at end of file +</script> diff --git a/tools/build_snapshots.sh b/tools/build_snapshots.sh index 2d053f5..fc16794 100755 --- a/tools/build_snapshots.sh +++ b/tools/build_snapshots.sh @@ -165,8 +165,8 @@ dobuilds() { copy_to_staging_nanobsd() { for NANOTYPE in nanobsd nanobsd-vga; do for FILESIZE in ${1}; do - FILENAMEFULL="${PRODUCT_NAME}-${PRODUCT_VERSION}-${FILESIZE}-${TARGET}-${NANOTYPE}-${DATESTRING}.img.gz" - FILENAMEUPGRADE="${PRODUCT_NAME}-${PRODUCT_VERSION}-${FILESIZE}-${TARGET}-${NANOTYPE}-upgrade-${DATESTRING}.img.gz" + FILENAMEFULL="${PRODUCT_NAME}-${PRODUCT_VERSION}-${FILESIZE}-${TARGET}-${NANOTYPE}${TIMESTAMP_SUFFIX}.img.gz" + FILENAMEUPGRADE="${PRODUCT_NAME}-${PRODUCT_VERSION}-${FILESIZE}-${TARGET}-${NANOTYPE}-upgrade${TIMESTAMP_SUFFIX}.img.gz" mkdir -p $STAGINGAREA/nanobsd mkdir -p $STAGINGAREA/nanobsdupdates @@ -218,7 +218,9 @@ copy_to_staging_iso_updates() { cp ${UPDATES_TARBALL_FILENAME}* $STAGINGAREA/ 2>/dev/null # NOTE: Updates need a file with output similar to date output # Use the file generated at start of dobuilds() to be consistent on times - cp $BUILTDATESTRINGFILE $STAGINGAREA/version 2>/dev/null + if [ -z "${_IS_RELEASE}" ]; then + cp $BUILTDATESTRINGFILE $STAGINGAREA/version 2>/dev/null + fi } scp_files() { @@ -275,13 +277,13 @@ scp_files() { ssh ${RSYNCUSER}@${RSYNCIP} "rm -f ${RSYNCPATH}/.updaters/latest-nanobsd-vga-${i}.img.gz" ssh ${RSYNCUSER}@${RSYNCIP} "rm -f ${RSYNCPATH}/.updaters/latest-nanobsd-vga-${i}.img.gz.sha256" - FILENAMEUPGRADE="${PRODUCT_NAME}-${PRODUCT_VERSION}-${i}-${TARGET}-nanobsd-upgrade-${DATESTRING}.img.gz" + FILENAMEUPGRADE="${PRODUCT_NAME}-${PRODUCT_VERSION}-${i}-${TARGET}-nanobsd-upgrade${TIMESTAMP_SUFFIX}.img.gz" ssh ${RSYNCUSER}@${RSYNCIP} "ln -s ${RSYNCPATH}/updates/${FILENAMEUPGRADE} \ ${RSYNCPATH}/.updaters/latest-nanobsd-${i}.img.gz" ssh ${RSYNCUSER}@${RSYNCIP} "ln -s ${RSYNCPATH}/updates/${FILENAMEUPGRADE}.sha256 \ ${RSYNCPATH}/.updaters/latest-nanobsd-${i}.img.gz.sha256" - FILENAMEUPGRADE="${PRODUCT_NAME}-${PRODUCT_VERSION}-${i}-${TARGET}-nanobsd-vga-upgrade-${DATESTRING}.img.gz" + FILENAMEUPGRADE="${PRODUCT_NAME}-${PRODUCT_VERSION}-${i}-${TARGET}-nanobsd-vga-upgrade${TIMESTAMP_SUFFIX}.img.gz" ssh ${RSYNCUSER}@${RSYNCIP} "ln -s ${RSYNCPATH}/updates/${FILENAMEUPGRADE} \ ${RSYNCPATH}/.updaters/latest-nanobsd-vga-${i}.img.gz" ssh ${RSYNCUSER}@${RSYNCIP} "ln -s ${RSYNCPATH}/updates/${FILENAMEUPGRADE}.sha256 \ @@ -371,6 +373,7 @@ else # Override it here to have continuous builds with proper labels rm -f $DATESTRINGFILE rm -f $BUILTDATESTRINGFILE + unset TIMESTAMP_SUFFIX unset DATESTRING unset BUILTDATESTRING unset ISOPATH diff --git a/tools/builder_common.sh b/tools/builder_common.sh index 7e51a83..f8d7b5d 100644 --- a/tools/builder_common.sh +++ b/tools/builder_common.sh @@ -381,8 +381,8 @@ print_flags() { printf " Git Branch or Tag: %s\n" $GIT_REPO_BRANCH_OR_TAG printf " MODULES_OVERRIDE: %s\n" $MODULES_OVERRIDE printf " VMDK_DISK_CAPACITY_IN_GB: %s\n" $VMDK_DISK_CAPACITY_IN_GB - printf " OVA_FIRST_PART_SIZE: %s\n" $OVA_FIRST_PART_SIZE - printf " OVA_SWAP_PART_SIZE: %s\n" $OVA_SWAP_PART_SIZE + printf " OVA_FIRST_PART_SIZE_IN_GB: %s\n" $OVA_FIRST_PART_SIZE_IN_GB + printf " OVA_SWAP_PART_SIZE_IN_GB: %s\n" $OVA_SWAP_PART_SIZE_IN_GB printf " OVFTEMPLATE: %s\n" $OVFTEMPLATE printf " OVFVMDK: %s\n" $OVFVMDK printf " SRC_CONF: %s\n" $SRC_CONF @@ -549,8 +549,8 @@ create_nanobsd_diskimage () { echo ">>> building NanoBSD(${1}) disk image with size ${_NANO_MEDIASIZE} for platform (${TARGET})..." | tee -a ${LOGFILE} echo "" > $BUILDER_LOGS/nanobsd_cmds.sh - IMG="${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-${PRODUCT_VERSION}-${_NANO_MEDIASIZE}-${TARGET}-${1}-${DATESTRING}.img" - IMGUPDATE="${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-${PRODUCT_VERSION}-${_NANO_MEDIASIZE}-${TARGET}-${1}-upgrade-${DATESTRING}.img" + IMG="${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-${PRODUCT_VERSION}-${_NANO_MEDIASIZE}-${TARGET}-${1}${TIMESTAMP_SUFFIX}.img" + IMGUPDATE="${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-${PRODUCT_VERSION}-${_NANO_MEDIASIZE}-${TARGET}-${1}-upgrade${TIMESTAMP_SUFFIX}.img" nanobsd_set_flash_details ${_NANO_MEDIASIZE} @@ -794,14 +794,15 @@ create_ova_image() { # Fill fstab echo ">>> Installing platform specific items..." | tee -a ${LOGFILE} - echo "/dev/label/${PRODUCT_NAME} / ufs rw 0 0" > ${FINAL_CHROOT_DIR}/etc/fstab - echo "/dev/label/swap0 none swap sw 0 0" >> ${FINAL_CHROOT_DIR}/etc/fstab + echo "/dev/gpt/${PRODUCT_NAME} / ufs rw 0 0" > ${FINAL_CHROOT_DIR}/etc/fstab + echo "/dev/gpt/swap0 none swap sw 0 0" >> ${FINAL_CHROOT_DIR}/etc/fstab # Create / partition + echo -n ">>> Creating / partition... " | tee -a ${LOGFILE} makefs \ -B little \ -o label=${PRODUCT_NAME} \ - -s ${OVA_FIRST_PART_SIZE} \ + -s ${OVA_FIRST_PART_SIZE_IN_GB}g \ ${OVA_TMP}/${OVFUFS} \ ${FINAL_CHROOT_DIR} 2>&1 >> ${LOGFILE} @@ -809,55 +810,64 @@ create_ova_image() { if [ -f ${OVA_TMP}/${OVFUFS} ]; then rm -f ${OVA_TMP}/${OVFUFS} fi + echo "Failed!" | tee -a ${LOGFILE} echo ">>> ERROR: Error creating vmdk / partition. STOPPING!" | tee -a ${LOGFILE} print_error_pfS fi + echo "Done!" | tee -a ${LOGFILE} - # Create vmdk file + # Create raw disk + echo -n ">>> Creating raw disk... " | tee -a ${LOGFILE} mkimg \ -s gpt \ - -f vmdk \ + -f raw \ -b /boot/pmbr \ -p freebsd-boot:=/boot/gptboot \ -p freebsd-ufs/${PRODUCT_NAME}:=${OVA_TMP}/${OVFUFS} \ -p freebsd-swap/swap0::${OVA_SWAP_PART_SIZE} \ - -o ${OVA_TMP}/${OVFVMDK}.tmp 2>&1 >> ${LOGFILE} + -o ${OVA_TMP}/${OVFRAW} 2>&1 >> ${LOGFILE} - if [ $? -ne 0 -o ! -f ${OVA_TMP}/${OVFVMDK}.tmp ]; then + if [ $? -ne 0 -o ! -f ${OVA_TMP}/${OVFRAW} ]; then if [ -f ${OVA_TMP}/${OVFUFS} ]; then rm -f ${OVA_TMP}/${OVFUFS} fi - if [ -f ${OVA_TMP}/${OVFVMDK}.tmp ]; then - rm -f ${OVA_TMP}/${OVFVMDK}.tmp + if [ -f ${OVA_TMP}/${OVFRAW} ]; then + rm -f ${OVA_TMP}/${OVFRAW} fi + echo "Failed!" | tee -a ${LOGFILE} echo ">>> ERROR: Error creating temporary vmdk image. STOPPING!" | tee -a ${LOGFILE} print_error_pfS fi + echo "Done!" | tee -a ${LOGFILE} # We don't need it anymore rm -f ${OVA_TMP}/${OVFUFS} >/dev/null 2>&1 - # Convert vmdk disk to modern version - vmdktool -v ${OVA_TMP}/${OVFVMDK} ${OVA_TMP}/i${OVFVMDK}.tmp + # Convert raw to vmdk + echo -n ">>> Creating vmdk disk... " | tee -a ${LOGFILE} + vmdktool -z9 -v ${OVA_TMP}/${OVFVMDK} ${OVA_TMP}/${OVFRAW} - if [ $? -ne 0 -o ! -f ${OVA_TMP}/${OVFVMDK}.tmp ]; then - if [ -f ${OVA_TMP}/${OVFVMDK}.tmp ]; then - rm -f ${OVA_TMP}/${OVFVMDK}.tmp + if [ $? -ne 0 -o ! -f ${OVA_TMP}/${OVFVMDK} ]; then + if [ -f ${OVA_TMP}/${OVFRAW} ]; then + rm -f ${OVA_TMP}/${OVFRAW} fi if [ -f ${OVA_TMP}/${OVFVMDK} ]; then rm -f ${OVA_TMP}/${OVFVMDK} fi + echo "Failed!" | tee -a ${LOGFILE} echo ">>> ERROR: Error creating vmdk image. STOPPING!" | tee -a ${LOGFILE} print_error_pfS fi + echo "Done!" | tee -a ${LOGFILE} - rm -f ${OVA_TMP}/i${OVFVMDK}.tmp + rm -f ${OVA_TMP}/i${OVFRAW} ova_setup_ovf_template - # We repack the file with a more universal xml file that - # works in both virtual box and esx server + echo -n ">>> Writing final ova image... " | tee -a ${LOGFILE} + # Create OVA file for vmware gtar -C ${OVA_TMP} -cpf ${OVAPATH} ${PRODUCT_NAME}.ovf ${OVFVMDK} + echo "Done!" | tee -a ${LOGFILE} rm -f ${OVA_TMP}/${OVFVMDK} >/dev/null 2>&1 echo ">>> OVA created: $(LC_ALL=C date)" | tee -a ${LOGFILE} @@ -900,7 +910,7 @@ ova_setup_ovf_template() { -e "s,%%PRODUCT_NAME%%,${PRODUCT_NAME},g" \ -e "s,%%PRODUCT_VERSION%%,${PRODUCT_VERSION},g" \ -e "s,%%PRODUCT_URL%%,${PRODUCT_URL},g" \ - -e "/^%%PRODUCT_LICENSE%%/r ${BUILDER_TOOR}/license.txt" \ + -e "/^%%PRODUCT_LICENSE%%/r ${BUILDER_ROOT}/license.txt" \ -e "/^%%PRODUCT_LICENSE%%/d" \ ${OVFTEMPLATE} > ${OVA_TMP}/${PRODUCT_NAME}.ovf } @@ -1027,6 +1037,14 @@ clone_to_staging_area() { core_pkg_create default-config "" ${CORE_PKG_VERSION} ${STAGE_CHROOT_DIR} local DEFAULTCONF=${STAGE_CHROOT_DIR}/conf.default/config.xml + + # Change default interface names to match vmware driver + sed -i '' -e 's,em0,vmx0,' -e 's,em1,vmx1,' ${DEFAULTCONF} + core_pkg_create default-config-vmware "" ${CORE_PKG_VERSION} ${STAGE_CHROOT_DIR} + + # Restore default values to be used by serial package + sed -i '' -e 's,vmx0,em0,' -e 's,vmx1,em1,' ${DEFAULTCONF} + # Activate serial console in config.xml # If it was there before, clear the setting to be sure we don't add it twice. sed -i "" -e "/ <enableserial\/>/d" ${DEFAULTCONF} @@ -1088,6 +1106,8 @@ customize_stagearea_for_image() { "${1}" = "memstickserial" -o \ "${1}" = "memstickadi" ]; then pkg_chroot_add ${FINAL_CHROOT_DIR} default-config-serial + elif [ "${1}" = "ova" ]; then + pkg_chroot_add ${FINAL_CHROOT_DIR} default-config-vmware else pkg_chroot_add ${FINAL_CHROOT_DIR} default-config fi diff --git a/tools/builder_defaults.sh b/tools/builder_defaults.sh index 536c220..d90db84 100644 --- a/tools/builder_defaults.sh +++ b/tools/builder_defaults.sh @@ -105,7 +105,7 @@ fi # Product details export PRODUCT_NAME=${PRODUCT_NAME:-"nonSense"} -export PRODUCT_URL=${PRODUCT_VERSION:-""} +export PRODUCT_URL=${PRODUCT_URL:-""} export PRODUCT_SRC=${PRODUCT_SRC:-"${BUILDER_ROOT}/src"} if [ "${PRODUCT_NAME}" = "pfSense" -a "${BUILD_AUTHORIZED_BY_ELECTRIC_SHEEP_FENCING}" != "yes" ]; then @@ -155,6 +155,9 @@ export EXTRA_TOOLS=${EXTRA_TOOLS:-"uuencode uudecode ex"} # Path to kernel files being built export KERNEL_BUILD_PATH=${KERNEL_BUILD_PATH:-"${SCRATCHDIR}/kernels"} +# Do not touch builder /usr/obj +export MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX:-"${SCRATCHDIR}/obj"} + # Controls how many concurrent make processes are run for each stage _CPUS="" if [ -z "${NO_MAKEJ}" ]; then @@ -196,14 +199,18 @@ export MEMORYDISK_SIZE=${MEMORYDISK_SIZE:-"768M"} export OVFTEMPLATE=${OVFTEMPLATE:-"${BUILDER_TOOLS}/templates/ovf/${PRODUCT_NAME}.ovf"} # / partition to be used by mkimg export OVFUFS=${OVFUFS:-"${PRODUCT_NAME}-disk1.ufs"} +# Raw disk to be converted to vmdk +export OVFRAW=${OVFRAW:-"${PRODUCT_NAME}-disk1.raw"} # On disk name of VMDK file included in OVA export OVFVMDK=${OVFVMDK:-"${PRODUCT_NAME}-disk1.vmdk"} # 8 gigabyte on disk VMDK size export VMDK_DISK_CAPACITY_IN_GB=${VMDK_DISK_CAPACITY_IN_GB:-"8"} # first partition size (freebsd-ufs) -export OVA_FIRST_PART_SIZE=${OVA_FIRST_PART_SIZE:-"6g"} +export OVA_FIRST_PART_SIZE_IN_GB=${OVA_FIRST_PART_SIZE_IN_GB:-"6"} # swap partition size (freebsd-swap) -export OVA_SWAP_PART_SIZE=${OVA_SWAP_PART_SIZE:-"2G"} +export OVA_SWAP_PART_SIZE_IN_GB=${OVA_SWAP_PART_SIZE_IN_GB:-"2"} +# Calculate real swap size, removing 128 blocks (65536 bytes) beggining/loader +export OVA_SWAP_PART_SIZE=$((${OVA_SWAP_PART_SIZE_IN_GB}*1024*1024*1024-65536)) # Temporary place to save files export OVA_TMP=${OVA_TMP:-"${SCRATCHDIR}/ova_tmp"} # end of OVF @@ -229,42 +236,27 @@ export NANO_BOOT0CFG="-o packet -s 1 -m 3" # NOTE: Date string is used for creating file names of images # The file is used for sharing the same value with build_snapshots.sh -_BUILDER_EPOCH=$(date +"%s") export DATESTRINGFILE=${DATESTRINGFILE:-"$SCRATCHDIR/version.snapshots"} -if [ "${DATESTRING}" = "" ]; then - if [ -f $DATESTRINGFILE ]; then - # If the file is more than 30 minutes old regenerate it - TMPDATESTRINGFILE=$(($_BUILDER_EPOCH - `stat -f %m $DATESTRINGFILE`)) - if [ -z "${_USE_OLD_DATESTRING}" -a $TMPDATESTRINGFILE -gt 1800 ]; then - export DATESTRING=`date "+%Y%m%d-%H%M"` - else - export DATESTRING=`cat $DATESTRINGFILE` - fi - unset TMPDATESTRINGFILE +if [ -z "${DATESTRING}" ]; then + if [ -f "${DATESTRINGFILE}" -a -n "${_USE_OLD_DATESTRING}" ]; then + export DATESTRING=$(cat $DATESTRINGFILE) else - export DATESTRING=`date "+%Y%m%d-%H%M"` + export DATESTRING=$(date "+%Y%m%d-%H%M"`) fi - echo "$DATESTRING" > $DATESTRINGFILE fi +echo "$DATESTRING" > $DATESTRINGFILE # NOTE: Date string is placed on the final image etc folder to help detect new updates # The file is used for sharing the same value with build_snapshots.sh export BUILTDATESTRINGFILE=${BUILTDATESTRINGFILE:-"$SCRATCHDIR/version.buildtime"} -if [ "${BUILTDATESTRING}" = "" ]; then - if [ -f $BUILTDATESTRINGFILE ]; then - # If the file is more than 30 minutes old regenerate it - TMPBUILTDATESTRINGFILE=$(($_BUILDER_EPOCH - `stat -f %m $BUILTDATESTRINGFILE`)) - if [ $TMPBUILTDATESTRINGFILE -gt 1800 ]; then - export BUILTDATESTRING=`date "+%a %b %d %T %Z %Y"` - else - export BUILTDATESTRING=`cat $BUILTDATESTRINGFILE` - fi - unset TMPBUILTDATESTRINGFILE +if [ -z "${BUILTDATESTRING}" ]; then + if [ -f "${BUILTDATESTRINGFILE}" -a -n "${_USE_OLD_DATESTRING}" ]; then + export BUILTDATESTRING=$(cat $BUILTDATESTRINGFILE) else - export BUILTDATESTRING=`date "+%a %b %d %T %Z %Y"` + export BUILTDATESTRING=$(date "+%a %b %d %T %Z %Y") fi - echo "$BUILTDATESTRING" > $BUILTDATESTRINGFILE fi +echo "$BUILTDATESTRING" > $BUILTDATESTRINGFILE # Poudriere export ZFS_TANK=${ZFS_TANK:-"tank"} @@ -282,9 +274,15 @@ export PKG_RSYNC_DESTDIR=${PKG_RSYNC_DESTDIR:-"/usr/local/www/beta/packages"} export PKG_REPO_SERVER=${PKG_REPO_SERVER:-"pkg+http://beta.pfsense.org/packages"} export PKG_REPO_CONF_BRANCH=${PKG_REPO_CONF_BRANCH:-"${GIT_REPO_BRANCH_OR_TAG}"} +if echo "${PRODUCT_VERSION}" | grep -qv -- '-RELEASE'; then + export _IS_RELEASE=yes +else + unset _IS_RELEASE +fi + # Define base package version, based on date for snaps CORE_PKG_VERSION=${PRODUCT_VERSION%%-*} -if echo "${PRODUCT_VERSION}" | grep -qv -- '-RELEASE'; then +if [ -n "${_IS_RELEASE}" ]; then CORE_PKG_VERSION="${CORE_PKG_VERSION}.${DATESTRING}" fi export CORE_PKG_PATH=${CORE_PKG_PATH:-"${SCRATCHDIR}/core_pkg"} @@ -300,15 +298,21 @@ export CORE_PKG_TMP=${CORE_PKG_TMP:-"${SCRATCHDIR}/core_pkg_tmp"} #export custom_package_list="" # General builder output filenames +if [ -n "${_IS_RELEASE}" ]; then + export TIMESTAMP_SUFFIX="" +else + export TIMESTAMP_SUFFIX="-${DATESTRING}" +fi + export UPDATESDIR=${UPDATESDIR:-"${IMAGES_FINAL_DIR}/updates"} -export ISOPATH=${ISOPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-LiveCD-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.iso"} -export MEMSTICKPATH=${MEMSTICKPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-memstick-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.img"} -export MEMSTICKSERIALPATH=${MEMSTICKSERIALPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-memstick-serial-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.img"} -export MEMSTICKADIPATH=${MEMSTICKADIPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-memstick-ADI-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.img"} -export OVAPATH=${OVAPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.ova"} +export ISOPATH=${ISOPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-LiveCD-${PRODUCT_VERSION}-${TARGET}${TIMESTAMP_SUFFIX}.iso"} +export MEMSTICKPATH=${MEMSTICKPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-memstick-${PRODUCT_VERSION}-${TARGET}${TIMESTAMP_SUFFIX}.img"} +export MEMSTICKSERIALPATH=${MEMSTICKSERIALPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-memstick-serial-${PRODUCT_VERSION}-${TARGET}${TIMESTAMP_SUFFIX}.img"} +export MEMSTICKADIPATH=${MEMSTICKADIPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-memstick-ADI-${PRODUCT_VERSION}-${TARGET}${TIMESTAMP_SUFFIX}.img"} +export OVAPATH=${OVAPATH:-"${IMAGES_FINAL_DIR}/${PRODUCT_NAME}-${PRODUCT_VERSION}-${TARGET}${TIMESTAMP_SUFFIX}.ova"} # set full-update update filename -export UPDATES_TARBALL_FILENAME=${UPDATES_TARBALL_FILENAME:-"${UPDATESDIR}/${PRODUCT_NAME}-Full-Update-${PRODUCT_VERSION}-${TARGET}-${DATESTRING}.tgz"} +export UPDATES_TARBALL_FILENAME=${UPDATES_TARBALL_FILENAME:-"${UPDATESDIR}/${PRODUCT_NAME}-Full-Update-${PRODUCT_VERSION}-${TARGET}${TIMESTAMP_SUFFIX}.tgz"} # Rsync data to send snapshots export RSYNCUSER=${RSYNCUSER:-"snapshots"} diff --git a/tools/templates/core_pkg/default-config-vmware/metadir/+DESC b/tools/templates/core_pkg/default-config-vmware/metadir/+DESC new file mode 100644 index 0000000..d732511 --- /dev/null +++ b/tools/templates/core_pkg/default-config-vmware/metadir/+DESC @@ -0,0 +1,3 @@ +%%PRODUCT_NAME%% default config (vmware) + +WWW: %%PRODUCT_URL%% diff --git a/tools/templates/core_pkg/default-config-vmware/metadir/+INSTALL b/tools/templates/core_pkg/default-config-vmware/metadir/+INSTALL new file mode 100644 index 0000000..11c69cd --- /dev/null +++ b/tools/templates/core_pkg/default-config-vmware/metadir/+INSTALL @@ -0,0 +1,15 @@ +#!/bin/sh + +if [ "${2}" != "POST-INSTALL" ]; then + exit 0 +fi + +if [ ! -f /cf/conf/config.xml ]; then + cp /conf.default/config.xml /cf/conf/config.xml +fi + +if [ ! -L /conf ]; then + ln -sf /cf/conf /conf +fi + +exit 0 diff --git a/tools/templates/core_pkg/default-config-vmware/metadir/+MANIFEST b/tools/templates/core_pkg/default-config-vmware/metadir/+MANIFEST new file mode 100644 index 0000000..cd1e098 --- /dev/null +++ b/tools/templates/core_pkg/default-config-vmware/metadir/+MANIFEST @@ -0,0 +1,15 @@ +name: "%%PRODUCT_NAME%%-default-config-vmware" +version: "%%VERSION%%" +origin: "security/%%PRODUCT_NAME%%-default-config" +comment: <<EOD +%%PRODUCT_NAME%% default config (vmware) +EOD +maintainer: development@pfsense.org +prefix: / +deps: { + +} +categories [ security, ] +licenselogic: single +licenses: [ BSD2CLAUSE, ] +options: { } diff --git a/tools/templates/core_pkg/default-config-vmware/pkg-plist b/tools/templates/core_pkg/default-config-vmware/pkg-plist new file mode 100644 index 0000000..b6fe8df --- /dev/null +++ b/tools/templates/core_pkg/default-config-vmware/pkg-plist @@ -0,0 +1 @@ +/conf.default/config.xml |