summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHari <hari289@outlook.com>2015-09-11 10:57:02 +0530
committerHari <hari289@outlook.com>2015-09-11 10:57:02 +0530
commit2f266da1801f1c9f71c38aa8d31b4e8b18a09440 (patch)
tree78c00ac7dac5b97b61b07cc269571b97426abe05 /src
parentd42a31a96e2a00b5e0c66c08217735d4b91a97bd (diff)
parentf37a29b0fcc206321740f352662fb5a6e9dfe013 (diff)
downloadpfsense-2f266da1801f1c9f71c38aa8d31b4e8b18a09440.zip
pfsense-2f266da1801f1c9f71c38aa8d31b4e8b18a09440.tar.gz
Merge remote-tracking branch 'upstream/bootstrap' into bootstrap
Diffstat (limited to 'src')
-rw-r--r--src/etc/inc/auth.inc2
-rwxr-xr-xsrc/etc/rc24
-rwxr-xr-xsrc/etc/rc.carpbackup13
-rwxr-xr-xsrc/etc/rc.carpmaster2
-rwxr-xr-xsrc/usr/local/sbin/pfsense-upgrade.sh243
-rw-r--r--src/usr/local/www/load_balancer_virtual_server.php196
-rw-r--r--src/usr/local/www/load_balancer_virtual_server_edit.php337
-rw-r--r--src/usr/local/www/services_dhcpv6.php25
-rw-r--r--src/usr/local/www/services_router_advertisements.php674
-rw-r--r--src/usr/local/www/services_wol.php5
-rw-r--r--src/usr/local/www/vpn_openvpn_client.php47
-rw-r--r--src/usr/local/www/vpn_openvpn_server.php49
12 files changed, 1021 insertions, 596 deletions
diff --git a/src/etc/inc/auth.inc b/src/etc/inc/auth.inc
index 8f4c281..0668493 100644
--- a/src/etc/inc/auth.inc
+++ b/src/etc/inc/auth.inc
@@ -538,7 +538,7 @@ function local_user_set(& $user) {
}
$un = $lock_account ? "" : "un";
- exec("/usr/sbin/pw {$un}lock {$user_name} -q");
+ exec("/usr/sbin/pw {$un}lock {$user_name} -q 2>/dev/null");
conf_mount_ro();
}
diff --git a/src/etc/rc b/src/etc/rc
index 1215883..4c4b848 100755
--- a/src/etc/rc
+++ b/src/etc/rc
@@ -166,10 +166,6 @@ elif [ "$PLATFORM" = "nanobsd" ] || [ ${USE_MFS_TMPVAR} -gt 0 ]; then
/bin/mkdir -p /root/var/db/pkg
/bin/rm -rf /var/db/pkg
/bin/ln -s /root/var/db/pkg/ /var/db/pkg
- # Ensure that PBI packages can be persistent across reboots
- /bin/mkdir -p /root/var/db/pbi
- /bin/rm -rf /var/db/pbi
- /bin/ln -s /root/var/db/pbi/ /var/db/pbi
else
SWAPDEVICE=`/bin/cat /etc/fstab | /usr/bin/grep swap | /usr/bin/cut -f1`
/sbin/swapon -a 2>/dev/null >/dev/null
@@ -179,19 +175,9 @@ else
# User must have just disabled RAM disks, move these back into place.
/bin/mkdir -p /var/db/pkg
/bin/mv /root/var/db/pkg /var/db/pkg
- /bin/mkdir -p /var/db/pbi
- /bin/mv /root/var/db/pbi /var/db/pbi
fi
fi
-# Copy PBI keys
-if ls /usr/local/share/pbi-keys/*.ssl >/dev/null 2>&1; then
- if [ ! -d "/var/db/pbi/keys" ]; then
- mkdir -p /var/db/pbi/keys
- fi
- cp -f /usr/local/share/pbi-keys/*.ssl /var/db/pbi/keys
-fi
-
if [ "$PLATFORM" = "cdrom" ] ; then
echo -n "Mounting unionfs directories..."
/bin/mkdir /tmp/unionfs
@@ -280,10 +266,6 @@ if [ ! -d /var/tmp ]; then
/bin/mkdir -p /var/tmp
fi
-if [ ! -d /cf/conf/backup/ ]; then
- /bin/mkdir -p /cf/conf/backup/
-fi
-
set -T
trap "echo 'Reboot interrupted'; exit 1" 3
@@ -350,6 +332,12 @@ echo "done."
# Recreate capabilities DB
/usr/bin/cap_mkdb /etc/login.conf
+# Finish update
+if [ -f /cf/conf/upgrade_in_progress ]; then
+ echo "Running second stage of upgrade process..."
+ /usr/local/sbin/pfsense-upgrade.sh -y
+fi
+
# Run the php.ini setup file and populate
# /usr/local/etc/php.ini and /usr/local/lib/php.ini
/etc/rc.php_ini_setup 2>/tmp/php_errors.txt
diff --git a/src/etc/rc.carpbackup b/src/etc/rc.carpbackup
index 34fca29..bf27a17 100755
--- a/src/etc/rc.carpbackup
+++ b/src/etc/rc.carpbackup
@@ -50,12 +50,15 @@ $friendly = convert_real_interface_to_friendly_interface_name($iface);
$friendly_descr = convert_friendly_interface_to_friendly_descr($friendly);
$vips = link_interface_to_vips($friendly, '', $vhid);
$carp_iface = "{$friendly}_vip{$vhid}";
-foreach ($vips as $vip) {
- $notificationmsg = sprintf('Carp cluster member "{$friendly_descr)(%2$s): {$vip["subnet"]} (%1$s)" has resumed the state "BACKUP" for vhid %s', $argument, $vip['descr'], $vhid);
- notify_via_smtp($notificationmsg);
- notify_via_growl($notificationmsg);
- log_error($notificationmsg);
+if(is_array($vips)) {
+ foreach ($vips as $vip) {
+ $notificationmsg = sprintf('Carp cluster member "(%1$s): (%2$s)" has resumed the state "BACKUP" for vhid %3$s', $argument, $friendly_descr, $vhid);
+
+ notify_via_smtp($notificationmsg);
+ notify_via_growl($notificationmsg);
+ log_error($notificationmsg);
+ }
}
/* Stop OpenVPN clients running on this VIP, since multiple active OpenVPN clients on a CARP cluster can be problematic. */
diff --git a/src/etc/rc.carpmaster b/src/etc/rc.carpmaster
index 91f3c0e..8413b04 100755
--- a/src/etc/rc.carpmaster
+++ b/src/etc/rc.carpmaster
@@ -51,7 +51,7 @@ $friendly_descr = convert_friendly_interface_to_friendly_descr($friendly);
$vips = link_interface_to_vips($friendly, '', $vhid);
$carp_iface = "{$friendly}_vip{$vhid}";
foreach ($vips as $vip) {
- $notificationmsg = sprintf('Carp cluster member "{$friendly_descr)(%2$s): {$vip["subnet"]} (%1$s)" has resumed the state "MASTER" for vhid %s', $argument, $vip['descr'], $vhid);
+ $notificationmsg = sprintf('Carp cluster member "(%1$s): (%2$s)" has resumed the state "MASTER" for vhid %3$s', $argument, $friendly_descr, $vhid);
notify_via_smtp($notificationmsg);
notify_via_growl($notificationmsg);
diff --git a/src/usr/local/sbin/pfsense-upgrade.sh b/src/usr/local/sbin/pfsense-upgrade.sh
new file mode 100755
index 0000000..6081442
--- /dev/null
+++ b/src/usr/local/sbin/pfsense-upgrade.sh
@@ -0,0 +1,243 @@
+#!/bin/sh
+
+# 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.
+
+# pkg should not ask for confirmations
+export ASSUME_ALWAYS_YES=true
+
+# Firmware lock subsystem
+firmwarelock=/var/run/firmwarelock.dirty
+
+# File used to detect second call, after kernel update and reboot
+upgrade_in_progress="/cf/conf/upgrade_in_progress"
+
+if [ -f "${firmwarelock}" ]; then
+ echo "ERROR: Another upgrade is running... aborting."
+ exit 0
+fi
+
+stdout='/dev/null'
+unset yes
+while getopts dys opt; do
+ case ${opt} in
+ d)
+ stdout=''
+ ;;
+ y)
+ yes=1
+ ;;
+ *)
+ usage
+ exit 1
+ ;;
+ esac
+done
+
+usage() {
+ echo "Usage: $(basename ${0}) [-d] [-y] [-c]"
+}
+
+_exec() {
+ local _cmd="${1}"
+ local _msg="${2}"
+ local _mute="${3}"
+ local _ignore_result="${4}"
+ local _stdout="${stdout}"
+
+ if [ -z "${_cmd}" -o -z "${_msg}" ]; then
+ return 1
+ fi
+
+ if [ "${_mute}" != "mute" ]; then
+ _stdout=''
+ fi
+
+ echo -n ">>> ${_msg}... "
+ if [ -z "${_stdout}" ]; then
+ echo ""
+ ${_cmd} 2>&1
+ else
+ ${_cmd} >${_stdout} 2>&1
+ fi
+ local _result=$?
+
+ if [ ${_result} -eq 0 -o -n "${_ignore_result}" ]; then
+ [ -n "${_stdout}" ] \
+ && echo "done."
+ return 0
+ else
+ [ -n "${_stdout}" ] \
+ && echo "failed."
+ return 1
+ fi
+}
+
+_exit() {
+ if [ -n "${kernel_pkg}" ]; then
+ _exec "pkg lock ${kernel_pkg}" "Locking kernel package" mute ignore_result
+ fi
+ if [ -f "${firmwarelock}" ]; then
+ rm -f ${firmwarelock}
+ fi
+}
+
+first_step() {
+ _exec "pkg update" "Updating repositories" mute ignore_result
+
+ # figure out which kernel variant is running
+ kernel_pkg=$(pkg query %n $(pkg info pfSense-kernel-\*))
+
+ if [ -z "${kernel_pkg}" ]; then
+ echo "ERROR: It was not possible to identify which pfSense kernel is installed"
+ exit 1
+ fi
+
+ kernel_local=$(pkg query %v ${kernel_pkg})
+
+ if [ -z "${kernel_local}" ]; then
+ echo "ERROR: It was not possible to determine pfSense kernel local version"
+ exit 1
+ fi
+
+ kernel_remote=$(pkg rquery %v ${kernel_pkg})
+
+ if [ -z "${kernel_remote}" ]; then
+ echo "ERROR: It was not possible to determine pfSense kernel remote version"
+ exit 1
+ fi
+
+ kernel_version_compare=$(pkg version -t ${kernel_local} ${kernel_remote})
+
+ if [ "${kernel_version_compare}" = "<" ]; then
+ kernel_update=1
+ # Make sure we lock kernel package again
+ trap _exit 1 2 15 EXIT
+ _exec "pkg unlock ${kernel_pkg}" "Unlocking kernel package" mute ignore_result
+ elif [ "${kernel_version_compare}" = "=" ]; then
+ kernel_update=0
+ elif [ "${kernel_version_compare}" = ">" ]; then
+ echo "ERROR: You are using a newer kernel version than remote repository"
+ exit 1
+ else
+ echo "ERROR: Error comparing pfSense kernel local and remote versions"
+ exit 1
+ fi
+
+ # XXX find a samrter way to do it
+ l=$(pkg upgrade -Unq | wc -l)
+ if [ ${l} -eq 1 ]; then
+ echo "Your packages are up to date"
+ exit 0
+ fi
+
+ if [ -z "${yes}" ]; then
+ # Show user which packages are going to be upgraded
+ pkg upgrade -Unq
+
+ echo ""
+ if [ ${kernel_update} -eq 1 ]; then
+ echo "**** WARNING ****"
+ echo "Reboot will be required!!"
+ fi
+ echo -n "Proceed with upgrade? (y/N) "
+ read answer
+ if [ "${answer}" != "y" ]; then
+ echo "Aborting..."
+ exit 0
+ fi
+ fi
+
+ echo ">>> Downloading packages..."
+ if ! pkg upgrade -UF; then
+ echo "ERROR: It was not possible to download packages"
+ exit 1
+ fi
+
+ # Mark firmware subsystem dirty
+ trap _exit 1 2 15 EXIT
+ touch ${firmwarelock}
+
+ # First upgrade kernel and reboot
+ if [ ${kernel_update} -eq 1 ]; then
+ _exec "pkg upgrade -U ${kernel_pkg}" "Upgrading pfSense krenel"
+ touch ${upgrade_in_progress}
+ echo "Rebooting..."
+ reboot
+ fi
+}
+
+second_step() {
+ echo "Upgrading necessary packages..."
+ if ! pkg upgrade -U; then
+ echo "ERROR: An error occurred when upgrade was running..."
+ exit 1
+ fi
+
+ _exec "pkg autoremove" "Removing unnecessary packages" mute ignore_result
+ _exec "pkg clean" "Cleanup pkg cache" mute ignore_result
+
+ # cleanup caches
+
+ rm -f ${upgrade_in_progress}
+ rm -f ${firmwarelock}
+}
+
+unset need_reboot
+if [ ! -f "${upgrade_in_progress}" ]; then
+ first_step
+else
+ need_reboot=1
+fi
+
+second_step
+
+if [ -n "${need_reboot}" ]; then
+ echo "Rebooting..."
+ reboot
+fi
+
+exit 0
diff --git a/src/usr/local/www/load_balancer_virtual_server.php b/src/usr/local/www/load_balancer_virtual_server.php
index bd13894..8f8a812 100644
--- a/src/usr/local/www/load_balancer_virtual_server.php
+++ b/src/usr/local/www/load_balancer_virtual_server.php
@@ -2,36 +2,61 @@
/* $Id$ */
/*
load_balancer_virtual_server.php
- part of pfSense (https://www.pfsense.org/)
-
- Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ * Copyright (c) 2005-2008 Bill Marquette <bill.marquette@gmail.com>
+ *
+ * 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -103,52 +128,83 @@ $shortcut_section = "relayd-virtualservers";
include("head.inc");
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg);
+
+if (is_subsystem_dirty('loadbalancer'))
+ print_info_box_np(gettext("The virtual server configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
+
+/* active tabs */
+$tab_array = array();
+$tab_array[] = array(gettext("Pools"), false, "load_balancer_pool.php");
+$tab_array[] = array(gettext("Virtual Servers"), true, "load_balancer_virtual_server.php");
+$tab_array[] = array(gettext("Monitors"), false, "load_balancer_monitor.php");
+$tab_array[] = array(gettext("Settings"), false, "load_balancer_setting.php");
+display_top_tabs($tab_array);
?>
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
+
<form action="load_balancer_virtual_server.php" method="post">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<?php if (is_subsystem_dirty('loadbalancer')): ?><br/>
-<?php print_info_box_np(gettext("The virtual server configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
-<?php endif; ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="load balancer virtual server">
- <tr><td class="tabnavtbl">
+ <div class="panel panel-default">
+ <div class="panel-heading"><h2 class="panel-title"><?=gettext('Virtual ervers')?></h2></div>
+ <div class="panel-body table-responsive">
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><?=gettext('Name')?></th>
+ <th><?=gettext('Protocol')?></th>
+ <th><?=gettext('IP Address'); ?></th>
+ <th><?=gettext('Port'); ?></th>
+ <th><?=gettext('Pool'); ?></th>
+ <th><?=gettext('Fallback pool'); ?></th>
+ <th><?=gettext('Description'); ?></th>
+ <th><!-- Action buttons --></th>
+ </tr>
+ </thead>
+ <tbody>
<?php
- /* active tabs */
- $tab_array = array();
- $tab_array[] = array(gettext("Pools"), false, "load_balancer_pool.php");
- $tab_array[] = array(gettext("Virtual Servers"), true, "load_balancer_virtual_server.php");
- $tab_array[] = array(gettext("Monitors"), false, "load_balancer_monitor.php");
- $tab_array[] = array(gettext("Settings"), false, "load_balancer_setting.php");
- display_top_tabs($tab_array);
+if(!empty($a_vs)) {
+ $i = 0;
+ foreach($a_vs as $a_v) {
?>
- </td></tr>
- <tr>
- <td>
- <div id="mainarea">
+ <tr>
+ <td><?=htmlspecialchars($a_v['name'])?></td>
+ <td><?=htmlspecialchars($a_v['relay_protocol'])?></td>
+ <td><?=htmlspecialchars($a_v['ipaddr'])?></td>
+ <td><?=htmlspecialchars($a_v['port'])?></td>
+ <td><?=$a_v['poolname']?></td>
+ <td><?=htmlspecialchars($a_v['sitedown'])?></td>
+ <td><?=htmlspecialchars($a_v['descr'])?></td>
+ <td>
+ <a type="button" class="btn btn-info btn-xs" href="load_balancer_virtual_server_edit.php?id=<?=$i?>"><?=gettext('Edit')?></a>
+ <a type="button" class="btn btn-warning btn-xs" href="load_balancer_virtual_server_edit.php?act=dup&id=<?=$i?>"><?=gettext('Copy')?></a>
+ <a type="button" class="btn btn-danger btn-xs" href="load_balancer_virtual_server_edit.php?act=del&id=<?=$i?>"><?=gettext('Del')?></a>
+ </td>
+ </tr>
<?php
- $t = new MainTable();
- $t->edit_uri('load_balancer_virtual_server_edit.php');
- $t->my_uri('load_balancer_virtual_server.php');
- $t->add_column(gettext('Name'), 'name', 10);
- $t->add_column(gettext('Protocol'), 'relay_protocol', 10);
- $t->add_column(gettext('IP Address'), 'ipaddr', 15);
- $t->add_column(gettext('Port'), 'port', 10);
- $t->add_column(gettext('Pool'), 'poolname', 15);
- $t->add_column(gettext('Fall Back Pool'), 'sitedown', 15);
- $t->add_column(gettext('Description'), 'descr', 30);
- $t->add_button('edit');
- $t->add_button('dup');
- $t->add_button('del');
- $t->add_content_array($a_vs);
- $t->display();
+ $i++;
+ }
+} else {
+?> <tr>
+ <td colspan="8"> <?php
+ print_info_box(gettext('No virtual servers have been configured'));
+?> </td>
+ </tr> <?php
+}
?>
- </div>
- </td>
- </tr>
-</table>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ <nav class="action-buttons">
+ <a href="load_balancer_virtual_server_edit.php" class="btn btn-success"><?=gettext("Add")?></a>
+ </nav>
+
</form>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+
+<?php
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/load_balancer_virtual_server_edit.php b/src/usr/local/www/load_balancer_virtual_server_edit.php
index f1a60bb..533ab1b 100644
--- a/src/usr/local/www/load_balancer_virtual_server_edit.php
+++ b/src/usr/local/www/load_balancer_virtual_server_edit.php
@@ -2,36 +2,61 @@
/* $Id$ */
/*
load_balancer_virtual_server_edit.php
- part of pfSense (https://www.pfsense.org/)
-
- Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
-
- 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ * Copyright (c) 2005-2008 Bill Marquette <bill.marquette@gmail.com>
+ *
+ * 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.
+ *
+ * ====================================================================
+ *
+ */
/*
- pfSense_MODULE: routing
+ pfSense_MODULE: routing
*/
##|+PRIV
@@ -95,7 +120,7 @@ if ($_POST) {
for ($i = 0; isset($config['load_balancer']['virtual_server'][$i]); $i++) {
if (($_POST['name'] == $config['load_balancer']['virtual_server'][$i]['name']) && ($i != $id)) {
- $input_errors[] = gettext("This virtual server name has already been used. Virtual server names must be unique.");
+ $input_errors[] = gettext("This virtual server name has already been used. Virtual server names must be unique.");
}
}
@@ -175,147 +200,113 @@ $shortcut_section = "relayd-virtualservers";
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
-<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
-<script type="text/javascript" src="/javascript/suggestions.js"></script>
-
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<form action="load_balancer_virtual_server_edit.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="load balancer server entry">
- <tr>
- <td colspan="3" valign="top" class="listtopic"><?=gettext("Edit Load Balancer - Virtual Server entry"); ?></td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input name="name" type="text" <?if (isset($pconfig['name'])) echo "value=\"" . htmlspecialchars($pconfig['name']) . "\"";?> size="32" maxlength="32" />
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input name="descr" type="text" <?if (isset($pconfig['descr'])) echo "value=\"" . htmlspecialchars($pconfig['descr']) . "\"";?> size="64" />
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("IP Address"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input class="formfldalias" id="ipaddr" name="ipaddr" type="text" <?if (isset($pconfig['ipaddr'])) echo "value=\"" . htmlspecialchars($pconfig['ipaddr']) . "\"";?> size="39" maxlength="39" />
- <br /><?=gettext("This is normally the WAN IP address that you would like the server to listen on. All connections to this IP and port will be forwarded to the pool cluster."); ?>
- <br /><?=gettext("You may also specify a host alias listed in Firewall -&gt; Aliases here."); ?>
- <script type="text/javascript">
- //<![CDATA[
- var host_aliases = <?= json_encode(get_alias_list(array("host", "network", "url", "urltable"))) ?>;
- var oTextbox1 = new AutoSuggestControl(document.getElementById("ipaddr"), new StateSuggestions(host_aliases));
- //]]>
- </script>
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncell"><?=gettext("Port"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <input class="formfldalias" name="port" id="port" type="text" <?if (isset($pconfig['port'])) echo "value=\"" . htmlspecialchars($pconfig['port']) . "\"";?> size="16" maxlength="16" />
- <br /><?=gettext("This is the port that the clients will connect to. All connections to this port will be forwarded to the pool cluster."); ?>
- <br /><?=gettext("If left blank, listening ports from the pool will be used."); ?>
- <br /><?=gettext("You may also specify a port alias listed in Firewall -&gt; Aliases here."); ?>
- <script type="text/javascript">
- //<![CDATA[
- var port_aliases = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
- var oTextbox2 = new AutoSuggestControl(document.getElementById("port"), new StateSuggestions(port_aliases));
- //]]>
- </script>
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Virtual Server Pool"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <?php if (count($config['load_balancer']['lbpool']) == 0): ?>
- <b><?=gettext("NOTE:"); ?></b> <?=gettext("Please add a pool on the Pools tab to use this feature."); ?>
- <?php else: ?>
- <select id="poolname" name="poolname">
- <?php
- for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
- $selected = "";
- if ($config['load_balancer']['lbpool'][$i]['name'] == $pconfig['poolname']) {
- $selected = " selected=\"selected\"";
- }
- echo "<option value=\"" . htmlspecialchars($config['load_balancer']['lbpool'][$i]['name']) . "\"{$selected}>{$config['load_balancer']['lbpool'][$i]['name']}</option>";
- }
- ?>
- </select>
- <?php endif; ?>
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Fall Back Pool"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <?php if (count($config['load_balancer']['lbpool']) == 0): ?>
- <b><?=gettext("NOTE:"); ?></b> <?=gettext("Please add a pool on the Pools tab to use this feature."); ?>
- <?php else: ?>
- <select id="sitedown" name="sitedown">
- <option value=""<?=htmlspecialchars($pconfig['sitedown']) == '' ? ' selected' : ''?>><?=gettext("none"); ?></option>
- <?php
- for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
- $selected = "";
- if ($config['load_balancer']['lbpool'][$i]['name'] == $pconfig['sitedown']) {
- $selected = " selected=\"selected\"";
- }
- echo "<option value=\"" . htmlspecialchars($config['load_balancer']['lbpool'][$i]['name']) . "\"{$selected}>{$config['load_balancer']['lbpool'][$i]['name']}</option>";
- }
- ?>
- </select>
- <br /><?=gettext("The server pool to which clients will be redirected if *ALL* servers in the Virtual Server Pool are offline."); ?>
- <br /><?=gettext("This option is NOT compatible with the DNS relay protocol."); ?>
- <?php endif; ?>
- </td>
- </tr>
- <tr style="display:none;"><td><input type="hidden" name="mode" value="redirect_mode" /></td></tr>
-<!--
- <tr align="left">
- <td width="22%" valign="top" class="vncellreq">Mode</td>
- <td width="78%" class="vtable" colspan="2">
- <input id="redirect_mode" type="radio" name="mode" value="redirect"<?=htmlspecialchars($pconfig['mode']) == 'redirect' ? ' checked="checked"': ''?> /> Redirect
- <input id="relay_mode" type="radio" name="mode" value="relay"<?=htmlspecialchars($pconfig['mode']) == 'relay' ? ' checked="checked"': ''?> /> Relay
- <br />
- </td>
- </tr>
--->
- <tr id="relay" align="left">
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Relay Protocol"); ?></td>
- <td width="78%" class="vtable" colspan="2">
- <select id="relay_protocol" name="relay_protocol">
- <?php
- $lb_def_protos = array("tcp", "dns");
- foreach ($lb_def_protos as $lb_proto) {
- $selected = "";
- if ($pconfig['relay_protocol'] == $lb_proto) {
- $selected = " selected=\"selected\"";
- }
- echo "<option value=\"{$lb_proto}\"{$selected}>{$lb_proto}</option>";
- }
- ?>
- </select>
- <br />
- </td>
- </tr>
- <tr align="left">
- <td width="22%" valign="top">&nbsp;</td>
- <td align="left" valign="bottom" width="78%">
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Submit"); ?>" />
- <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
- <input name="referer" type="hidden" value="<?=$referer;?>" />
- <?php if (isset($id) && $a_vs[$id] && $_GET['act'] != 'dup'): ?>
- <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
- <?php endif; ?>
- </td>
- </tr>
- </table>
-</form>
-<br />
-<span class="red"><strong><?=gettext("Note:"); ?></strong></span> <?=gettext("Don't forget to add a firewall rule for the virtual server/pool after you're finished setting it up."); ?>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+require_once('classes/Form.class.php');
+
+$form = new Form();
+
+$section = new Form_Section('Edit Load Balancer - Virtual Server entry');
+
+$section->addInput(new Form_Input(
+ 'name',
+ 'Name',
+ 'text',
+ $pconfig['name']
+));
+
+$section->addInput(new Form_Input(
+ 'descr',
+ 'Description',
+ 'text',
+ $pconfig['descr']
+));
+
+
+$section->addInput(new Form_IpAddress(
+ 'ipaddr',
+ 'IP Address',
+ $pconfig['ipaddr']
+))->setHelp('This is normally the WAN IP address that you would like the server to listen on. ' .
+ 'All connections to this IP and port will be forwarded to the pool cluster. ' .
+ 'You may also specify a host alias listed in Firewall -&gt; Aliases here.');
+
+$section->addInput(new Form_Input(
+ 'port',
+ 'Port',
+ 'number',
+ $pconfig['port']
+))->setHelp('Port that the clients will connect to. All connections to this port will be forwarded to the pool cluster. ' .
+ 'If left blank listening ports from the pool will be used.' .
+ 'You may also specify a port alias listed in Firewall -&gt; Aliases here.');
+
+if (count($config['load_balancer']['lbpool']) == 0) {
+ $section->addInput(new Form_StaticText(
+ 'Virtual Server Pool',
+ 'Please add a pool on the "Pools" tab to use this feature. '
+ ));
+} else {
+
+ $list = array();
+ for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
+ $list[$config['load_balancer']['lbpool'][$i]['name']] = $config['load_balancer']['lbpool'][$i]['name'];
+ }
+
+ $section->addInput(new Form_Select(
+ 'poolname',
+ 'Virtual Server Pool',
+ $pconfig['poolname'],
+ $list
+ ));
+}
+
+if (count($config['load_balancer']['lbpool']) == 0) {
+ $section->addInput(new Form_StaticText(
+ 'Fall-back Pool',
+ 'Please add a pool on the "Pools" tab to use this feature. '
+ ));
+} else {
+
+ $list = array();
+ for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
+ $list[$config['load_balancer']['lbpool'][$i]['name']] = $config['load_balancer']['lbpool'][$i]['name'];
+ }
+
+ $section->addInput(new Form_Select(
+ 'sitedown',
+ 'Fall-back Pool',
+ $pconfig['sitedown'],
+ $list
+ ));
+}
+
+$section->addInput(new Form_Input(
+ 'mode',
+ null,
+ 'hidden',
+ 'redirect_mode'
+));
+
+$section->addInput(new Form_Select(
+ 'relay_protocol',
+ 'Fall-back Pool',
+ $pconfig['relay_protocol'],
+ ['tcp' => 'TCP', 'dns' => 'DNS']
+));
+
+if (isset($id) && $a_vs[$id] && $_GET['act'] != 'dup') {
+ $section->addInput(new Form_Input(
+ 'id',
+ null,
+ 'hidden',
+ $id
+ ));
+}
+
+$form->add($section);
+print($form);
+
+print_info_box(gettext('Don\'t forget to add a firewall rule for the virtual server/pool after you have finished setting it up.'));
+
+include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_dhcpv6.php b/src/usr/local/www/services_dhcpv6.php
index 0dc8bd6..b837c27 100644
--- a/src/usr/local/www/services_dhcpv6.php
+++ b/src/usr/local/www/services_dhcpv6.php
@@ -80,8 +80,9 @@ $iflist = array_merge($iflist, get_configured_pppoe_server_interfaces());
if (!$if || !isset($iflist[$if])) {
foreach ($iflist as $ifent => $ifname) {
$oc = $config['interfaces'][$ifent];
+
if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
- (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
+ (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
continue;
}
$if = $ifent;
@@ -140,7 +141,7 @@ $dhcrelaycfg = $config['dhcrelay6'];
if (is_array($dhcrelaycfg)) {
foreach ($dhcrelaycfg as $dhcrelayif => $dhcrelayifconf) {
if (isset($dhcrelayifconf['enable']) && isset($iflist[$dhcrelayif]) &&
- (!link_interface_to_bridge($dhcrelayif))) {
+ (!link_interface_to_bridge($dhcrelayif))) {
$dhcrelay_enabled = true;
}
}
@@ -190,9 +191,9 @@ if ($_POST) {
$input_errors[] = gettext("A valid IPv6 address must be specified for the gateway.");
}
if (($_POST['dns1'] && !is_ipaddrv6($_POST['dns1'])) ||
- ($_POST['dns2'] && !is_ipaddrv6($_POST['dns2'])) ||
- ($_POST['dns3'] && !is_ipaddrv6($_POST['dns3'])) ||
- ($_POST['dns4'] && !is_ipaddrv6($_POST['dns4']))) {
+ ($_POST['dns2'] && !is_ipaddrv6($_POST['dns2'])) ||
+ ($_POST['dns3'] && !is_ipaddrv6($_POST['dns3'])) ||
+ ($_POST['dns4'] && !is_ipaddrv6($_POST['dns4']))) {
$input_errors[] = gettext("A valid IPv6 address must be specified for each of the DNS servers.");
}
@@ -209,7 +210,7 @@ if ($_POST) {
$input_errors[] = gettext("A valid primary domain name server IPv4 address must be specified for the dynamic domain name.");
}
if (($_POST['ddnsdomainkey'] && !$_POST['ddnsdomainkeyname']) ||
- ($_POST['ddnsdomainkeyname'] && !$_POST['ddnsdomainkey'])) {
+ ($_POST['ddnsdomainkeyname'] && !$_POST['ddnsdomainkey'])) {
$input_errors[] = gettext("You must specify both a valid domain key and key name.");
}
if ($_POST['domainsearchlist']) {
@@ -261,7 +262,7 @@ if ($_POST) {
if (is_ipaddrv6($ifcfgip)) {
if ((!is_inrange_v6($_POST['range_from'], $subnet_start, $subnet_end)) ||
- (!is_inrange_v6($_POST['range_to'], $subnet_start, $subnet_end))) {
+ (!is_inrange_v6($_POST['range_to'], $subnet_start, $subnet_end))) {
$input_errors[] = gettext("The specified range lies outside of the current subnet.");
}
}
@@ -288,7 +289,7 @@ if ($_POST) {
continue;
}
if ((inet_pton($map['ipaddrv6']) > $dynsubnet_start) &&
- (inet_pton($map['ipaddrv6']) < $dynsubnet_end)) {
+ (inet_pton($map['ipaddrv6']) < $dynsubnet_end)) {
$input_errors[] = sprintf(gettext("The DHCP range cannot overlap any static DHCP mappings."));
break;
}
@@ -458,9 +459,12 @@ if (is_subsystem_dirty('staticmaps'))
$tab_array = array();
$tabscounter = 0;
$i = 0;
+
foreach ($iflist as $ifent => $ifname) {
$oc = $config['interfaces'][$ifent];
- if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
+
+
+ if((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
(!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))))
continue;
@@ -472,6 +476,7 @@ foreach ($iflist as $ifent => $ifname) {
$tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}");
$tabscounter++;
}
+
/* tack on PPPoE or PPtP servers here */
/* pppoe server */
if (is_array($config['pppoes']['pppoe'])) {
@@ -491,7 +496,7 @@ if (is_array($config['pppoes']['pppoe'])) {
}
}
-if (empty($tabs_array)) {
+if ($tabscounter == 0) {
print_info_box(gettext("The DHCPv6 Server can only be enabled on interfaces configured with a static IPv6 address. This system has none."), 'danger');
include("foot.inc");
exit;
diff --git a/src/usr/local/www/services_router_advertisements.php b/src/usr/local/www/services_router_advertisements.php
index 3cf9dbb..a6b02da 100644
--- a/src/usr/local/www/services_router_advertisements.php
+++ b/src/usr/local/www/services_router_advertisements.php
@@ -2,40 +2,62 @@
/* $Id$ */
/*
services_router_advertisements.php
- part of m0n0wall (http://m0n0.ch/wall)
-
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- part of pfSense (https://www.pfsense.org)
- Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
- Copyright (C) 2013-2015 Electric Sheep Fencing, LP
- 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.
*/
+/* ====================================================================
+ * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved.
+ * Copyright (c) 2004, 2005 Scott Ullrich
+ * Copyright (c) 2010 Seth Mos <seth.mos@dds.nl>
+ *
+ * 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.
+ *
+ * ====================================================================
+ *
+ */
/*
pfSense_BUILDER_BINARIES: /bin/rm
- pfSense_MODULE: interfaces
+ pfSense_MODULE: interfaces
*/
##|+PRIV
@@ -52,8 +74,8 @@ if (!$g['services_dhcp_server_enable']) {
exit;
}
-/* Fix failover DHCP problem
- * http://article.gmane.org/gmane.comp.security.firewalls.pfsense.support/18749
+/* Fix failover DHCP problem
+ * http://article.gmane.org/gmane.comp.security.firewalls.pfsense.support/18749
*/
ini_set("memory_limit", "64M");
@@ -84,7 +106,7 @@ if (!$if || !isset($iflist[$if])) {
foreach ($iflist as $ifent => $ifname) {
$oc = $config['interfaces'][$ifent];
if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
- (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
+ (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
continue;
}
$if = $ifent;
@@ -121,10 +143,11 @@ $priority_modes = array("low" => "Low",
"high" => "High");
$carplist = get_configured_carp_interface_list();
-$subnets_help = gettext("Subnets are specified in CIDR format. " .
- "Select the CIDR mask that pertains to each entry. " .
+$subnets_help = '<span class="help-block">' . gettext("Subnets are specified in CIDR format. " .
+ "Select the CIDR mask that pertains to each entry. " .
"/128 specifies a single IPv6 host; /64 specifies a normal IPv6 network; etc. " .
- "If no subnets are specified here, the Router Advertisement (RA) Daemon will advertise to the subnet to which the router's interface is assigned.");
+ "If no subnets are specified here, the Router Advertisement (RA) Daemon will advertise to the subnet to which the router's interface is assigned." .
+ '</span>');
if ($_POST) {
unset($input_errors);
@@ -210,271 +233,346 @@ $pgtitle = array(gettext("Services"), gettext("Router advertisements"));
include("head.inc");
-?>
-
-<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
-<?php include("fbegin.inc"); ?>
+if ($input_errors)
+ print_input_errors($input_errors);
+
+if ($savemsg)
+ print_info_box($savemsg, 'success');
+
+/* active tabs */
+$tab_array = array();
+$tabscounter = 0;
+$i = 0;
+foreach ($iflist as $ifent => $ifname) {
+ $oc = $config['interfaces'][$ifent];
+ // We need at least one interface configured with a NON-LOCAL IPv6 static address. fd80:8dba:82e1::/64 fits the bill
+ if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
+ (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
+ continue;
+ }
-<script type="text/javascript" src="/javascript/row_helper.js">
-</script>
-<script type="text/javascript" src="/javascript/autosuggest.js?rev=1">
-</script>
-<script type="text/javascript" src="/javascript/suggestions.js">
-</script>
-<script type="text/javascript">
-//<![CDATA[
- rowname[0] = "subnet_address";
- rowtype[0] = "textbox";
- rowsize[0] = "30";
- rowname[1] = "subnet_bits";
- rowtype[1] = "select";
- rowsize[1] = "1";
- function add_alias_control() {
- var name = "subnet_address" + (totalrows - 1);
- obj = document.getElementById(name);
- obj.setAttribute('class', 'formfldalias');
- obj.setAttribute('autocomplete', 'off');
- objAlias[totalrows - 1] = new AutoSuggestControl(obj, new StateSuggestions(addressarray));
+ if ($ifent == $if) {
+ $active = true;
+ } else {
+ $active = false;
}
-//]]>
-</script>
-<form action="services_router_advertisements.php" method="post" name="iform" id="iform">
-<?php if ($input_errors) print_input_errors($input_errors); ?>
-<?php if ($savemsg) print_info_box($savemsg); ?>
-<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="router advert">
- <tr>
- <td>
-<?php
- /* active tabs */
- $tab_array = array();
- $tabscounter = 0;
- $i = 0;
- foreach ($iflist as $ifent => $ifname) {
- $oc = $config['interfaces'][$ifent];
- if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
- (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
- continue;
- }
- if ($ifent == $if) {
- $active = true;
- } else {
- $active = false;
+ $tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}");
+ $tabscounter++;
+}
+
+if ($tabscounter == 0) {
+ include("foot.inc");
+ exit;
+}
+
+display_top_tabs($tab_array);
+
+$tab_array = array();
+$tab_array[] = array(gettext("DHCPv6 Server"), false, "services_dhcpv6.php?if={$if}");
+$tab_array[] = array(gettext("Router Advertisements"), true, "services_router_advertisements.php?if={$if}");
+display_top_tabs($tab_array);
+
+require_once('classes/Form.class.php');
+
+$form = new Form(new Form_Button(
+ 'Submit',
+ gettext("Save")
+));
+
+$section = new Form_Section('Advertisements');
+
+$section->addInput(new Form_Select(
+ 'ramode',
+ 'Router mode',
+ $pconfig['ramode'],
+ $advertise_modes
+))->setHelp('Select the Operating Mode for the Router Advertisement (RA) Daemon. Use:' . '<br />' .
+ '&nbsp;<strong>Router Only</strong> to only advertise this router' . '<br />' .
+ '&nbsp;<strong>Unmanaged</strong> for Router Advertising with Stateless Autoconfig' . '<br />' .
+ '&nbsp;<strong>Managed</strong> for assignment through a DHCPv6 Server' . '<br />' .
+ '&nbsp;<strong>Assisted</strong> for DHCPv6 Server assignment combined with Stateless Autoconfig.' .
+ 'It is not required to activate this DHCPv6 server when set to "Managed", this can be another host on the network');
+
+$section->addInput(new Form_Select(
+ 'rapriority',
+ 'Router priority',
+ $pconfig['rapriority'],
+ $priority_modes
+))->setHelp('Select the Priority for the Router Advertisement (RA) Daemon.');
+
+$carplistif = array();
+if (count($carplist) > 0) {
+ foreach ($carplist as $ifname => $vip) {
+ if ((preg_match("/^{$if}_/", $ifname)) && (is_ipaddrv6($vip))) {
+ $carplistif[$ifname] = $vip;
}
- $tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}");
- $tabscounter++;
}
- if ($tabscounter == 0) {
- echo "</td></tr></table></form>";
- include("fend.inc");
- echo "</body>";
- echo "</html>";
- exit;
+}
+
+if (count($carplistif) > 0) {
+ $list = array();
+
+ foreach ($carplistif as $ifname => $vip) {
+ $list['interface'] = strtoupper($if);
+ $list[$ifname] = $ifname . ' - ' . $vip;
}
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("DHCPv6 Server"), false, "services_dhcpv6.php?if={$if}");
- $tab_array[] = array(gettext("Router Advertisements"), true, "services_router_advertisements.php?if={$if}");
- display_top_tabs($tab_array);
+
+ $section->addInput(new Form_Select(
+ 'rainterface',
+ 'RA Interface',
+ $pconfig['rainterface'],
+ $list
+ ))->setHelp('Select the Interface for the Router Advertisement (RA) Daemon.');
+}
+
+$section->addInput(new Form_StaticText(
+ 'RA Subnets',
+ $subnets_help
+));
+
+
+if(empty($pconfig['subnets']))
+ $pconfig['subnets'] = array('0' => '/128');
+
+$counter = 0;
+$numrows = count($pconfig['subnets']) - 1;
+
+foreach ($pconfig['subnets'] as $subnet) {
+ $address_name = "subnet_address" . $counter;
+ $bits_name = "subnet_bits" . $counter;
+ list($address, $subnet) = explode("/", $subnet);
+
+ $group = new Form_Group($counter == 0 ? 'Subnets':'');
+
+ $group->add(new Form_IpAddress(
+ $address_name,
+ null,
+ $address
+ ))->addMask($bits_name, $subnet);
+
+ $group->add(new Form_Button(
+ 'deleterow' . $counter,
+ 'Delete'
+ ))->removeClass('btn-primary')->addClass('btn-warning');
+
+ $group->addClass('repeatable');
+
+ $section->add($group);
+
+ $counter++;
+}
+
+$section->addInput(new Form_Button(
+ 'addrow',
+ 'Add'
+))->removeClass('btn-primary')->addClass('btn-success');
+
+$form->add($section);
+
+$section = new Form_Section('DNS Configuration');
+
+for($idx=0; $idx<4; $idx++) {
+ $section->addInput(new Form_IpAddress(
+ 'radns' . $idx,
+ 'Server ' . ($idx + 1),
+ $pconfig['radns' . $idx]
+ ))->setHelp($idx < 3 ? '':'Leave blank to use the system default DNS servers - this interface\'s IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the General page');
+}
+
+$section->addInput(new Form_Input(
+ 'radomainsearchlist',
+ 'Domain search list',
+ 'text',
+ $pconfig['radomainsearchlist']
+))->setHelp('The RA server can optionally provide a domain search list. Use the semicolon character as separator ');
+
+$section->addInput(new Form_Checkbox(
+ 'rasamednsasdhcp6e',
+ 'Settings',
+ 'Use same settings as DHCPv6 server',
+ $pconfig['rasamednsasdhcp6']
+));
+
+$section->addInput(new Form_Input(
+ 'if',
+ null,
+ 'hidden',
+ $if
+));
+
+
+$form->add($section);
+print($form);
?>
- </td>
- </tr>
- <tr>
- <td>
- <div id="mainarea">
- <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Router Advertisements");?></td>
- <td width="78%" class="vtable">
- <select name="ramode" id="ramode">
- <?php foreach ($advertise_modes as $name => $value) { ?>
- <option value="<?=$name ?>" <?php if ($pconfig['ramode'] == $name) echo "selected=\"selected\""; ?> > <?=$value ?></option>
- <?php } ?>
- </select>
- <br />
- <strong><?php printf(gettext("Select the Operating Mode for the Router Advertisement (RA) Daemon."))?></strong>
- <?php printf(gettext("Use \"Router Only\" to only advertise this router, \"Unmanaged\" for Router Advertising with Stateless Autoconfig, \"Managed\" for assignment through (a) DHCPv6 Server, \"Assisted\" for DHCPv6 Server assignment combined with Stateless Autoconfig"));?>
- <?php printf(gettext("It is not required to activate this DHCPv6 server when set to \"Managed\", this can be another host on the network")); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Router Priority");?></td>
- <td width="78%" class="vtable">
- <select name="rapriority" id="rapriority">
- <?php foreach ($priority_modes as $name => $value) { ?>
- <option value="<?=$name ?>" <?php if ($pconfig['rapriority'] == $name) echo "selected=\"selected\""; ?> > <?=$value ?></option>
- <?php } ?>
- </select>
- <br />
- <strong><?php printf(gettext("Select the Priority for the Router Advertisement (RA) Daemon."))?></strong>
- </td>
- </tr>
-<?php
- $carplistif = array();
- if (count($carplist) > 0) {
- foreach ($carplist as $ifname => $vip) {
- if ((preg_match("/^{$if}_/", $ifname)) && (is_ipaddrv6($vip))) {
- $carplistif[$ifname] = $vip;
+
+<script>
+//<![CDATA[
+events.push(function(){
+
+ function setMasks() {
+ // Find all ipaddress masks and make dynamic based on address family of input
+ $('span.pfIpMask + select').each(function (idx, select){
+ var input = $(select).prevAll('input[type=text]');
+
+ input.on('change', function(e){
+ var isV6 = (input.val().indexOf(':') != -1), min = 0, max = 128;
+ if (!isV6)
+ max = 32;
+
+ if (input.val() == "")
+ return;
+
+ while (select.options.length > max)
+ select.remove(0);
+
+ if (select.options.length < max)
+ {
+ for (var i=select.options.length; i<=max; i++)
+ select.options.add(new Option(i, i), 0);
+ }
+ });
+
+ // Fire immediately
+ input.change();
+ });
+ }
+
+ // Complicated function to move all help text associated with this input id to the same id
+ // on the row above. That way if you delete the last row, you don't lose the help
+ function moveHelpText(id) {
+ $('#' + id).parent('div').parent('div').find('input').each(function() { // For each <span></span>
+ var fromId = this.id;
+ var toId = decrStringInt(fromId);
+ var helpSpan;
+
+ if(!$(this).hasClass('pfIpMask') && !$(this).hasClass('btn')) {
+
+ helpSpan = $('#' + fromId).parent('div').parent('div').find('span:last').clone();
+ if($(helpSpan).hasClass('help-block')) {
+ if($('#' + decrStringInt(fromId)).parent('div').hasClass('input-group'))
+ $('#' + decrStringInt(fromId)).parent('div').after(helpSpan);
+ else
+ $('#' + decrStringInt(fromId)).after(helpSpan);
+ }
}
- }
+ });
}
- if (count($carplistif) > 0) {
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RA Interface");?></td>
- <td width="78%" class="vtable">
- <select name="rainterface" id="rainterface">
- <?php foreach ($carplistif as $ifname => $vip) { ?>
- <option value="interface" <?php if ($pconfig['rainterface'] == "interface") echo "selected=\"selected\""; ?> > <?=strtoupper($if); ?></option>
- <option value="<?=$ifname ?>" <?php if ($pconfig['rainterface'] == $ifname) echo "selected=\"selected\""; ?> > <?="$ifname - $vip"; ?></option>
- <?php } ?>
- </select>
- <br />
- <strong><?php printf(gettext("Select the Interface for the Router Advertisement (RA) Daemon."))?></strong>
- </td>
- </tr>
-<?php
+
+ // Increment the number at the end of the string
+ function bumpStringInt( str ) {
+ var data = str.match(/(\D*)(\d+)(\D*)/), newStr = "";
+
+ if( data )
+ newStr = data[ 1 ] + ( Number( data[ 2 ] ) + 1 ) + data[ 3 ];
+
+ return newStr || str;
}
-?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("RA Subnet(s)");?></td>
- <td width="78%" class="vtable">
- <div><?= htmlentities($subnets_help) ?></div>
- <table id="maintable" summary="subnets">
- <tbody>
-<?php
- $counter = 0;
- foreach ($pconfig['subnets'] as $subnet) {
- $address_name = "subnet_address" . $counter;
- $bits_name = "subnet_bits" . $counter;
- list($address, $subnet) = explode("/", $subnet);
-?>
- <tr>
- <td>
- <input autocomplete="off" name="<?= $address_name ?>" type="text" class="formfldalias" id="<?= $address_name ?>" size="30" value="<?= htmlentities($address) ?>" />
- </td>
- <td>
- <select name="<?= $bits_name ?>" class="formselect" id="<?= $bits_name ?>">
- <option value="">
- <?php for ($i = 128; $i >= 0; $i -= 1) { ?>
- <option value="<?= $i ?>" <?= ("$subnet" === "$i") ? "selected='selected'" : "" ?>><?= $i ?></option>
- <?php } ?>
- </select>
- </td>
- <td>
- <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" /></a>
- </td>
- </tr>
-<?php
- $counter += 1;
+
+ // Decrement the number at the end of the string
+ function decrStringInt( str ) {
+ var data = str.match(/(\D*)(\d+)(\D*)/), newStr = "";
+
+ if( data )
+ newStr = data[ 1 ] + ( Number( data[ 2 ] ) - 1 ) + data[ 3 ];
+
+ return newStr || str;
}
-?>
- <tr style="display:none">
- <td></td>
- </tr>
- </tbody>
- </table>
- <script type="text/javascript">
- //<![CDATA[
- field_counter_js = 2;
- totalrows = <?= $counter ?>;
- //]]>
- </script>
- <div id="addrowbutton">
- <a onclick="javascript:addRowTo('maintable'); add_alias_control(); return false;" href="#"><!--
- --><img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry"); ?>" /></a>
- </div>
- </td>
- </tr>
-
- <tr>
- <td colspan="2" class="list" height="12">&nbsp;</td>
- </tr>
-
- <tr>
- <td colspan="2" valign="top" class="listtopic">DNS</td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers");?></td>
- <td width="78%" class="vtable">
- <input name="radns1" type="text" class="formfld unknown" id="radns1" size="28" value="<?=htmlspecialchars($pconfig['radns1']);?>" /><br />
- <input name="radns2" type="text" class="formfld unknown" id="radns2" size="28" value="<?=htmlspecialchars($pconfig['radns2']);?>" /><br />
- <input name="radns3" type="text" class="formfld unknown" id="radns3" size="28" value="<?=htmlspecialchars($pconfig['radns3']);?>" /><br />
- <input name="radns4" type="text" class="formfld unknown" id="radns4" size="28" value="<?=htmlspecialchars($pconfig['radns4']);?>" /><br />
- <?=gettext("NOTE: leave blank to use the system default DNS servers - this interface's IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the General page.");?>
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Domain search list");?></td>
- <td width="78%" class="vtable">
- <input name="radomainsearchlist" type="text" class="formfld unknown" id="radomainsearchlist" size="28" value="<?=htmlspecialchars($pconfig['radomainsearchlist']);?>" /><br />
- <?=gettext("The RA server can optionally provide a domain search list. Use the semicolon character as separator");?>
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top" class="vncell">&nbsp;</td>
- <td width="78%" class="vtable">
- <input id="rasamednsasdhcp6" name="rasamednsasdhcp6" type="checkbox" value="yes" <?php if ($pconfig['rasamednsasdhcp6']) { echo "checked='checked'"; } ?> />
- <strong><?= gettext("Use same settings as DHCPv6 server"); ?></strong>
- </td>
- </tr>
-
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="if" type="hidden" value="<?=$if;?>" />
- <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
-</table>
-</form>
-
-<script type="text/javascript">
-//<![CDATA[
- jQuery(function ($) {
- var $rasamednsasdhcp6 = $("#rasamednsasdhcp6");
- var $triggered_checkboxes = $("#radns1, #radns2, #radns3, #radns4, #radomainsearchlist");
- if ($rasamednsasdhcp6.length !== 1) { return; }
- var onchange = function () {
- var checked = $rasamednsasdhcp6.is(":checked");
- if (checked) {
- $triggered_checkboxes.each(function () { this.disabled = true; });
- } else {
- $triggered_checkboxes.each(function () { this.disabled = false; });
+
+ // Called after a delete so that there are no gaps in the numbering. Most of the time the config system doesn't care about
+ // gaps, but I do :)
+ function renumber() {
+ var idx = 0;
+
+ $('.repeatable').each(function() {
+
+ $(this).find('input').each(function() {
+ $(this).prop("id", this.id.replace(/\d+$/, "") + idx);
+ $(this).prop("name", this.name.replace(/\d+$/, "") + idx);
+ });
+
+ $(this).find('select').each(function() {
+ $(this).prop("id", this.id.replace(/\d+$/, "") + idx);
+ $(this).prop("name", this.name.replace(/\d+$/, "") + idx);
+ });
+
+ $(this).find('label').attr('for', $(this).find('label').attr('for').replace(/\d+$/, "") + idx);
+
+ idx++;
+ });
+ }
+
+ function delete_row(row) {
+ $('#' + row).parent('div').parent('div').remove();
+ renumber();
+ }
+
+ function add_row() {
+ // Find the lst repeatable group
+ var lastRepeatableGroup = $('.repeatable:last');
+
+ // Clone it
+ var newGroup = lastRepeatableGroup.clone(true);
+
+ // Increment the suffix number for each input elemnt in the new group
+ $(newGroup).find('input').each(function() {
+ $(this).prop("id", bumpStringInt(this.id));
+ $(this).prop("name", bumpStringInt(this.name));
+ if(!$(this).is('[id^=delete]'))
+ $(this).val('');
+ });
+
+ // Do the same for selectors
+ $(newGroup).find('select').each(function() {
+ $(this).prop("id", bumpStringInt(this.id));
+ $(this).prop("name", bumpStringInt(this.name));
+ // If this selector lists mask bits, we need it to be reset to all 128 options
+ // and no items selected, so that automatic v4/v6 selection still works
+ if($(this).is('[id^=address_subnet]')) {
+ $(this).empty();
+ for(idx=128; idx>0; idx--) {
+ $(this).append($('<option>', {
+ value: idx,
+ text: idx
+ }));
+ }
}
- };
- $rasamednsasdhcp6.bind("change", onchange);
- onchange();
- });
+ });
+
+ // And for "for" tags
+ $(newGroup).find('label').attr('for', bumpStringInt($(newGroup).find('label').attr('for')));
+ $(newGroup).find('label').text(""); // Clear the label. We only want it on the very first row
+
+ // Insert the updated/cloned row
+ $(lastRepeatableGroup).after(newGroup);
- var addressarray = <?= json_encode(get_alias_list("host", "network", "openvpn", "urltable")); ?>;
- var objAlias = [];
- function createAutoSuggest () {
- <?php for ($i = 0; $i < $counter; $i += 1) { ?>
- objAlias.push(new AutoSuggestControl(document.getElementById('subnet_address<?= $i ?>'), new StateSuggestions(addressarray)));
- <?php } ?>
- new AutoSuggestControl(document.getElementById('radns1'), new StateSuggestions(addressarray));
- new AutoSuggestControl(document.getElementById('radns2'), new StateSuggestions(addressarray));
- new AutoSuggestControl(document.getElementById('radns3'), new StateSuggestions(addressarray));
- new AutoSuggestControl(document.getElementById('radns4'), new StateSuggestions(addressarray));
+ // Delete any help text from the group we have cloned
+ $(lastRepeatableGroup).find('.help-block').each(function() {
+ $(this).remove();
+ });
+
+ setMasks();
}
- setTimeout(createAutoSuggest, 500);
+
+ // These are action buttons, not submit buttons
+ $('[id^=addrow]').prop('type','button');
+ $('[id^=delete]').prop('type','button');
+
+ // on click . .
+ $('[id^=addrow]').click(function() {
+ add_row();
+ });
+
+ $('[id^=delete]').click(function(event) {
+ if($('.repeatable').length > 1) {
+ moveHelpText(event.target.id);
+ delete_row(event.target.id);
+ }
+ else
+ alert('<?php echo gettext("You may not delete the last one!")?>');
+ });
+});
//]]>
</script>
-<?php include("fend.inc"); ?>
-</body>
-</html>
+<?php include("foot.inc"); \ No newline at end of file
diff --git a/src/usr/local/www/services_wol.php b/src/usr/local/www/services_wol.php
index 8e3ed2d..37b46b6 100644
--- a/src/usr/local/www/services_wol.php
+++ b/src/usr/local/www/services_wol.php
@@ -122,9 +122,10 @@ if ($_GET['act'] == "del") {
$pgtitle = array(gettext("Services"), gettext("Wake on LAN"));
include("head.inc");
-?>
+print_info_box(gettext('This service can be used to wake up (power on) computers by sending special') . ' "' . gettext('Magic Packets') . '"<br />' .
+ gettext('The NIC in the computer that is to be woken up must support Wake on LAN and must be properly configured (WOL cable, BIOS settings).'));
-<p><?=gettext("This service can be used to wake up (power on) computers by sending special") . '\'' . gettext("Magic Packets") . '\'' . gettext("The NIC in the computer that is to be woken up must support Wake on LAN and has to be configured properly (WOL cable, BIOS settings). ")?></p>
+?>
<?php
diff --git a/src/usr/local/www/vpn_openvpn_client.php b/src/usr/local/www/vpn_openvpn_client.php
index 241e379..03f27d7 100644
--- a/src/usr/local/www/vpn_openvpn_client.php
+++ b/src/usr/local/www/vpn_openvpn_client.php
@@ -613,20 +613,39 @@ if($act=="new" || $act=="edit") :
$pconfig['tls']
))->setHelp('Paste your shared key here');
- $section->addInput(new Form_Select(
- 'caref',
- 'Peer Certifiacte Authority',
- $pconfig['caref'],
- count($a_ca) ? array_combine($a_ca, $a_ca) : ['' => 'None']
- ))->setHelp(count($a_ca) ? '':sprintf('No Certificate Authorities defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
-
- $section->addInput(new Form_Select(
- 'certref',
- 'Peer Certifiacte Authority',
- $pconfig['certref'],
- build_cert_list()
- ))->setHelp(count($a_cert) ? '':sprintf('No Certificates defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
-
+ if (count($a_ca)) {
+
+ $list = array();
+ foreach ($a_ca as $ca)
+ $list[$ca['refid']] = $ca['descr'];
+
+ $section->addInput(new Form_Select(
+ 'caref',
+ 'Peer Certifiacte Authority',
+ $pconfig['caref'],
+ $list
+ ));
+ } else {
+ $section->addInput(new Form_StaticText(
+ 'Peer Certifiacte Authority',
+ sprintf('No Certificate Authorities defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>')
+ ));
+ }
+
+ if (count($a_crl)) {
+ $section->addInput(new Form_Select(
+ 'crlref',
+ 'Peer Certificate Revocation list',
+ $pconfig['crlref'],
+ build_crl_list()
+ ));
+ } else {
+ $section->addInput(new Form_StaticText(
+ 'Peer Certificate Revocation list',
+ sprintf('No Certificate Revocation Lists defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>')
+ ));
+ }
+
if (!$pconfig['shared_key']) {
$section->addInput(new Form_checkbox(
'autokey_enable',
diff --git a/src/usr/local/www/vpn_openvpn_server.php b/src/usr/local/www/vpn_openvpn_server.php
index e125d65..23660dc 100644
--- a/src/usr/local/www/vpn_openvpn_server.php
+++ b/src/usr/local/www/vpn_openvpn_server.php
@@ -697,6 +697,8 @@ require_once('classes/Form.class.php');
$form = new Form();
if($act=="new" || $act=="edit") :
+
+
$section = new Form_Section('General Information');
$section->addInput(new Form_checkbox(
@@ -767,19 +769,38 @@ if($act=="new" || $act=="edit") :
$pconfig['tls']
))->setHelp('Paste your shared key here');
- $section->addInput(new Form_Select(
- 'caref',
- 'Peer Certifiacte Authority',
- $pconfig['caref'],
- count($a_ca) ? array_combine($a_ca, $a_ca) : ['' => 'None']
- ))->setHelp(count($a_ca) ? '':sprintf('No Certificate Authorities defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
-
- $section->addInput(new Form_Select(
- 'crlref',
- 'Peer Certifiacte Revocation list',
- $pconfig['crlref'],
- build_crl_list()
- ))->setHelp(count($a_crl) ? '':sprintf('No Certificate Revocation Lists defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>'));
+ if (count($a_ca)) {
+
+ $list = array();
+ foreach ($a_ca as $ca)
+ $list[$ca['refid']] = $ca['descr'];
+
+ $section->addInput(new Form_Select(
+ 'caref',
+ 'Peer Certifiacte Authority',
+ $pconfig['caref'],
+ $list
+ ));
+ } else {
+ $section->addInput(new Form_StaticText(
+ 'Peer Certifiacte Authority',
+ sprintf('No Certificate Authorities defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>')
+ ));
+ }
+
+ if (count($a_crl)) {
+ $section->addInput(new Form_Select(
+ 'crlref',
+ 'Peer Certificate Revocation list',
+ $pconfig['crlref'],
+ build_crl_list()
+ ));
+ } else {
+ $section->addInput(new Form_StaticText(
+ 'Peer Certificate Revocation list',
+ sprintf('No Certificate Revocation Lists defined. You may create one here: %s', '<a href="system_camanager.php">System &gt; Cert Manager</a>')
+ ));
+ }
$section->addInput(new Form_Select(
'certref',
@@ -1256,7 +1277,7 @@ endif;
// Note:
// The following *_change() functions were converted from Javascript/DOM to JQuery but otherwise
-// mostly left unchanged. The logic on this form is complex andthis works!
+// mostly left unchanged. The logic on this form is complex and this works!
?>
<script type="text/javascript">
OpenPOWER on IntegriCloud