Added WebGUI feature set

This commit is contained in:
Jose
2019-10-30 11:46:50 -04:00
parent 5c28404999
commit 94861b7cd2
21 changed files with 2172 additions and 153 deletions

6
CHANGELOG Normal file
View File

@@ -0,0 +1,6 @@
======================
= Extension Bastille =
======================
Version Description
1.0.0......First Public Release.

28
LICENSE Normal file
View File

@@ -0,0 +1,28 @@
---------------------------------------------------------
Copyright (c) 2019, José Rivera
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. Neither the name of the developer nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``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 DEVELOPER OR 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.
---------------------------------------------------------

View File

@@ -1,33 +1,40 @@
#!/bin/sh #!/bin/sh
# bastille-init # bastille-init
# Bastille Extension for XigmaNAS x64 11.x and later. # Bastille Extension for XigmaNAS x64 11.x and later.
# Bastille Homepage: http://bastillebsd.org/ # Bastille Extension Forum: https://www.xigmanas.com/forums/viewtopic.php?f=71&t=14848
# Bastille Extension GitHub: https://github.com/JRGTH/xigmanas-bastille-extension
# Bastille Homepage: http://bastillebsd.org/
# Bastille GitHub: https://github.com/BastilleBSD/bastille
# #
# ***(For Preview/Testing)***
# Debug script # Debug script
#set -x #set -x
# Copyright (c) 2019 José Rivera (JoseMR) # Copyright (c) 2019, José Rivera (joserprg@gmail.com).
# All rights reserved. # All rights reserved.
#
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that following conditions are met: # modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright # 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer. # notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the # notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# # 3. Neither the name of the developer nor the names of contributors
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS 'AS IS' AND ANY # may be used to endorse or promote products derived from this software
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # without specific prior written permission.
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY # THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ARE DISCLAIMED. IN NO EVENT SHALL THE DEVELOPER OR CONTRIBUTORS BE LIABLE
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # 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.
# Set environment. # Set environment.
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
@@ -45,8 +52,7 @@ CONFIG="/cf/conf/config.xml"
PRDNAME="Bastille" PRDNAME="Bastille"
APPNAME="bastille" APPNAME="bastille"
EXTLOGFILE="${CWDIR}/log/bastille_ext.log" EXTLOGFILE="${CWDIR}/log/bastille_ext.log"
FULLAPPNAME="${APPNAME}-addon" FULLAPPNAME="${APPNAME}-main"
PKGCONF="/etc/pkg/FreeBSD.conf"
WWWPATH="/usr/local/www" WWWPATH="/usr/local/www"
PKGCACHE="/var/cache/pkg" PKGCACHE="/var/cache/pkg"
USRLOCAL="/usr/local" USRLOCAL="/usr/local"
@@ -56,11 +62,12 @@ EXTCONFLINK="/var/etc/${APPNAME}_conf"
BASTILLERCD="/usr/local/etc/rc.d/${APPNAME}" BASTILLERCD="/usr/local/etc/rc.d/${APPNAME}"
BASTILLEPATH="${USRLOCAL}/bin" BASTILLEPATH="${USRLOCAL}/bin"
BASTILLECONF="${USRLOCAL}/etc/${APPNAME}/${APPNAME}.conf" BASTILLECONF="${USRLOCAL}/etc/${APPNAME}/${APPNAME}.conf"
BASTILLECONFLINK="/var/etc/bastilleconf" BASTILLECONFLINK="/var/etc/bastille_conf"
BASTILLECONF_EXT="${CWDIR}/conf/bastille.conf.ext"
INSTALLPATH="${CWDIR}/${FULLAPPNAME}" INSTALLPATH="${CWDIR}/${FULLAPPNAME}"
BRANCH="master" BRANCH="master"
#BATSILLE_URL="https://github.com/BastilleBSD/${APPNAME}/archive/${BRANCH}.zip" # Official Bastille repository(Pending some updates/fixes) BATSILLE_URL="https://github.com/BastilleBSD/${APPNAME}/archive/${BRANCH}.zip" # Official Bastille Repository)
BATSILLE_URL="https://github.com/JRGTH/${APPNAME}/archive/${BRANCH}.zip" # Alternate Bastille repository(Updated, supports 11.3-RELEASE base) #BATSILLE_URL="https://github.com/JRGTH/${APPNAME}/archive/${BRANCH}.zip" # Alternate Bastille Repository)
BASTILE_VERSION="https://raw.githubusercontent.com/BastilleBSD/${APPNAME}/${BRANCH}/usr/local/bin/${APPNAME}" BASTILE_VERSION="https://raw.githubusercontent.com/BastilleBSD/${APPNAME}/${BRANCH}/usr/local/bin/${APPNAME}"
GITURL="https://github.com/JRGTH/xigmanas-${APPNAME}-extension/archive/${BRANCH}.zip" GITURL="https://github.com/JRGTH/xigmanas-${APPNAME}-extension/archive/${BRANCH}.zip"
VERFILE="https://raw.githubusercontent.com/JRGTH/xigmanas-${APPNAME}-extension/${BRANCH}/version" VERFILE="https://raw.githubusercontent.com/JRGTH/xigmanas-${APPNAME}-extension/${BRANCH}/version"
@@ -81,6 +88,9 @@ runtime_config()
sysrc -f ${INSTALLPATH}/${BASTILLECONF} bastille_prefix="${CWDIR}" >/dev/null 2>&1 sysrc -f ${INSTALLPATH}/${BASTILLECONF} bastille_prefix="${CWDIR}" >/dev/null 2>&1
fi fi
fi fi
if [ ! -d ${CWDIR}/backups ]; then
mkdir -p ${CWDIR}/backups
fi
if [ ! -d ${CWDIR}/conf ]; then if [ ! -d ${CWDIR}/conf ]; then
mkdir -p ${CWDIR}/conf mkdir -p ${CWDIR}/conf
fi fi
@@ -110,9 +120,10 @@ bastille_pkg_extract()
if [ -f ${CWDIR}/${BRANCH}.zip ]; then if [ -f ${CWDIR}/${BRANCH}.zip ]; then
if [ ! -f ${CWDIR}/${FULLAPPNAME}${BASTILLEPATH}/${APPNAME} ]; then if [ ! -f ${CWDIR}/${FULLAPPNAME}${BASTILLEPATH}/${APPNAME} ]; then
echo "Extracting ${APPNAME}..." echo "Extracting ${APPNAME}..."
tar -xf ${CWDIR}/${BRANCH}.zip --exclude='.git*' --strip-components 1 -C ${CWDIR}/${FULLAPPNAME} || \ tar -xf ${CWDIR}/${BRANCH}.zip --exclude='.git*' --exclude='docs' --exclude='bastille.conf' --strip-components 1 -C ${CWDIR}/${FULLAPPNAME} || \
error_notify "Error: A problem has occurred while extractig ${APPNAME} files." error_notify "Error: A problem has occurred while extractig ${APPNAME} files."
chmod 555 ${CWDIR}/${FULLAPPNAME}${BASTILLEPATH}/${APPNAME} chmod 555 ${CWDIR}/${FULLAPPNAME}${BASTILLEPATH}/${APPNAME}
chmod 555 ${CWDIR}/${FULLAPPNAME}${BASTILLERCD}
rm -f ${CWDIR}/${BRANCH}.zip rm -f ${CWDIR}/${BRANCH}.zip
echo "Done!" echo "Done!"
fi fi
@@ -123,7 +134,7 @@ bastille_upgrade()
{ {
# Perform an online bastille upgrade. # Perform an online bastille upgrade.
DATE=$(date +"%a %b %d %T %Y") DATE=$(date +"%a %b %d %T %Y")
echo "Looking for new ${APPNAME} package!" echo "Looking for new ${PRDNAME} package!"
mkdir -p ${CWDIR}/update mkdir -p ${CWDIR}/update
fetch -ao ${CWDIR}/update --no-verify-peer --timeout=30 ${BASTILE_VERSION} || \ fetch -ao ${CWDIR}/update --no-verify-peer --timeout=30 ${BASTILE_VERSION} || \
error_notify "Error: A problem has occurred while fetching version file." error_notify "Error: A problem has occurred while fetching version file."
@@ -136,10 +147,11 @@ bastille_upgrade()
echo "New ${APPNAME} package found, performing upgrade..." echo "New ${APPNAME} package found, performing upgrade..."
fetch -ao ${CWDIR}/update --no-verify-peer --timeout=30 ${BATSILLE_URL} || \ fetch -ao ${CWDIR}/update --no-verify-peer --timeout=30 ${BATSILLE_URL} || \
error_notify "Error: A problem has occurred while fetching ${APPNAME} package." error_notify "Error: A problem has occurred while fetching ${APPNAME} package."
tar -xf ${CWDIR}/update/${BRANCH}.zip --exclude='.git*' --strip-components 1 -C ${CWDIR}/update tar -xf ${CWDIR}/update/${BRANCH}.zip --exclude='.git*' --exclude='docs' --exclude='bastille.conf' --strip-components 1 -C ${CWDIR}/update
rm -f ${CWDIR}/update/${BRANCH}.zip rm -f ${CWDIR}/update/${BRANCH}.zip
rm -f ${CWDIR}/update/${APPNAME} rm -f ${CWDIR}/update/${APPNAME}
chmod 555 ${CWDIR}/update/${BASTILLEPATH}/${APPNAME} chmod 555 ${CWDIR}/update/${BASTILLEPATH}/${APPNAME}
chmod 555 ${CWDIR}/${FULLAPPNAME}${BASTILLERCD}
cp -Rf ${CWDIR}/update/* ${CWDIR}/${FULLAPPNAME}/ cp -Rf ${CWDIR}/update/* ${CWDIR}/${FULLAPPNAME}/
rm -R ${CWDIR}/update rm -R ${CWDIR}/update
@@ -209,10 +221,13 @@ extension_upgrade()
create_addon_env() create_addon_env()
{ {
# Set bastile dir proper permissions. # Set bastille dir required permissions.
chmod 0750 ${CWDIR} chmod 0750 ${CWDIR}
# Create required directories. # Create required directories.
if [ ! -d "${CWDIR}/backups" ]; then
mkdir -p ${CWDIR}/backups
fi
if [ ! -d "${CWDIR}/log" ]; then if [ ! -d "${CWDIR}/log" ]; then
mkdir -p ${CWDIR}/log mkdir -p ${CWDIR}/log
fi fi
@@ -252,7 +267,7 @@ bin_symlinks()
cd ${INSTALLPATH}/${BASTILLEPATH} cd ${INSTALLPATH}/${BASTILLEPATH}
for file in * for file in *
do do
ln -Ffhs ${INSTALLPATH}/${BASTILLEPATH}/${file} ${USRLOCAL}/bin/${file} ln -fhs ${INSTALLPATH}/${BASTILLEPATH}/${file} ${USRLOCAL}/bin/${file}
done done
fi fi
} }
@@ -262,26 +277,26 @@ sys_symlinkdir()
# Check and create/relink required symlinks/dirs for bastille. # Check and create/relink required symlinks/dirs for bastille.
# This environment will be checked each time the script is started for consistency. # This environment will be checked each time the script is started for consistency.
# Link required binaries.
bin_symlinks
# Required directories for bastille. # Required directories for bastille.
if [ ! -d "${USRLOCAL}/share/licenses" ]; then if [ ! -d "${USRLOCAL}/share/licenses" ]; then
mkdir -p ${USRLOCAL}/share/licenses mkdir -p ${USRLOCAL}/share/licenses
fi fi
# Link required binaries.
bin_symlinks
# Required symlinks for bastille. # Required symlinks for bastille.
if [ -d "${INSTALLPATH}/${USRLOCAL}/share/licenses" ]; then if [ -d "${INSTALLPATH}/${USRLOCAL}/share/licenses" ]; then
cd ${INSTALLPATH}/${USRLOCAL}/share/licenses cd ${INSTALLPATH}/${USRLOCAL}/share/licenses
for file in * for file in *
do do
ln -Ffhs ${INSTALLPATH}/${USRLOCAL}/share/licenses/${file} ${USRLOCAL}/share/licenses/${file} ln -fhs ${INSTALLPATH}/${USRLOCAL}/share/licenses/${file} ${USRLOCAL}/share/licenses/${file}
done done
fi fi
# Link bastile config file directory. # Link bastile config file directory.
if [ -d "${INSTALLPATH}/${USRLOCAL}/etc/${APPNAME}" ]; then if [ -d "${INSTALLPATH}/${USRLOCAL}/etc/${APPNAME}" ]; then
ln -Ffhs ${INSTALLPATH}/${USRLOCAL}/etc/${APPNAME} ${USRLOCAL}/etc/${APPNAME} ln -fhs ${INSTALLPATH}/${USRLOCAL}/etc/${APPNAME} ${USRLOCAL}/etc/${APPNAME}
fi fi
# Link bastile config file. # Link bastile config file.
@@ -290,11 +305,15 @@ sys_symlinkdir()
if [ ! -f "${APPNAME}.conf" ]; then if [ ! -f "${APPNAME}.conf" ]; then
cp ${APPNAME}.conf.sample ${APPNAME}.conf cp ${APPNAME}.conf.sample ${APPNAME}.conf
fi fi
else
if [ -f "${BASTILLECONF_EXT}" ]; then
cp ${BASTILLECONF_EXT} ${INSTALLPATH}/${USRLOCAL}/etc/${APPNAME}/${APPNAME}.conf
fi
fi fi
# Copy bastille shared. # Copy bastille shared.
if [ -d "${INSTALLPATH}/${USRLOCAL}/share/${APPNAME}" ]; then if [ -d "${INSTALLPATH}/${USRLOCAL}/share/${APPNAME}" ]; then
ln -Ffhs ${INSTALLPATH}/${USRLOCAL}/share/${APPNAME} ${USRLOCAL}/share/${APPNAME} ln -fhs ${INSTALLPATH}/${USRLOCAL}/share/${APPNAME} ${USRLOCAL}/share/${APPNAME}
fi fi
# Copy bastille rc. # Copy bastille rc.
@@ -309,8 +328,8 @@ postinit_cmd()
if ! grep -qw ${CWDIR}/${SCRIPTNAME} ${CONFIG}; then if ! grep -qw ${CWDIR}/${SCRIPTNAME} ${CONFIG}; then
touch ${CWDIR}/postinit || error_notify "Error: A problem has occurred while creating the postinit file." touch ${CWDIR}/postinit || error_notify "Error: A problem has occurred while creating the postinit file."
chmod +x ${CWDIR}/postinit chmod +x ${CWDIR}/postinit
if [ ! "${PRDVERSION}" -ge "110" ]; then if [ ! "${PRDVERSION}" -ge "112" ]; then
# Generate php script for NAS4Free 10.3 versions. # Generate php script for previous product versions.
cat << EOF > ${CWDIR}/postinit cat << EOF > ${CWDIR}/postinit
<?php <?php
require_once("config.inc"); require_once("config.inc");
@@ -323,19 +342,29 @@ require_once("functions.inc");
} }
\$config['rc']['postinit']['cmd'][\$i] = \$config['cmd']."\$cmd"; \$config['rc']['postinit']['cmd'][\$i] = \$config['cmd']."\$cmd";
write_config(); write_config();
\$i =0;
if ( is_array(\$config['rc']['shutdown'] ) && is_array( \$config['rc']['shutdown']['cmd'] ) ) {
for (\$i; \$i < count(\$config['rc']['shutdown']['cmd']);) {
if (preg_match('/${SCRIPTNAME}/', \$config['rc']['shutdown']['cmd'][\$i])) break; ++\$i; }
}
\$config['rc']['shutdown']['cmd'][\$i] = \$config['cmd']."\$cmd";
write_config();
?> ?>
EOF EOF
else else
# Generate php script for NAS4Free/XigmaNAS 11.x versions. # Generate php script for later product versions.
cat << EOF > ${CWDIR}/postinit cat << EOF > ${CWDIR}/postinit
<?php <?php
require_once("config.inc"); require_once("config.inc");
require_once("functions.inc"); require_once("functions.inc");
\$cmd = dirname(__FILE__)."/${SCRIPTNAME}"; \$cmd = dirname(__FILE__)."/${SCRIPTNAME}";
\$cmd2 = dirname(__FILE__)."/${SCRIPTNAME} -p";
\$name = "${PRDNAME} Extension"; \$name = "${PRDNAME} Extension";
\$comment = "Start ${PRDNAME} jail manager"; \$comment = "Start ${PRDNAME} Container Manager";
\$comment2 = "Stop ${PRDNAME} Container Manager";
\$rc = &array_make_branch(\$config,'rc','param'); \$rc = &array_make_branch(\$config,'rc','param');
if(false === array_search_ex(\$name,\$rc,'name')): if(false === array_search_ex(\$cmd,\$rc,'cmd')):
\$rc_param = []; \$rc_param = [];
\$rc_param['uuid'] = uuid(); \$rc_param['uuid'] = uuid();
\$rc_param['name'] = \$name; \$rc_param['name'] = \$name;
@@ -347,6 +376,20 @@ if(false === array_search_ex(\$name,\$rc,'name')):
write_config(); write_config();
endif; endif;
unset(\$rc); unset(\$rc);
\$rc = &array_make_branch(\$config,'rc','param');
if(false === array_search_ex(\$cmd2,\$rc,'cmd2')):
\$rc_param = [];
\$rc_param['uuid'] = uuid();
\$rc_param['name'] = \$name;
\$rc_param['value'] = \$cmd2;
\$rc_param['comment2'] = \$comment2;
\$rc_param['typeid'] = '3';
\$rc_param['enable'] = true;
\$rc[] = \$rc_param;
write_config();
endif;
unset(\$rc);
?> ?>
EOF EOF
fi fi
@@ -359,7 +402,7 @@ EOF
echo "Done!" echo "Done!"
fi fi
# Set extension to disable by default. # Set extension to enable by default.
sysrc -f ${CWDIR}${EXTCONF} GUI_ENABLE=YES INSTALL_DIR=${CWDIR} >/dev/null 2>&1 sysrc -f ${CWDIR}${EXTCONF} GUI_ENABLE=YES INSTALL_DIR=${CWDIR} >/dev/null 2>&1
fi fi
} }
@@ -382,21 +425,31 @@ gui_start()
sysrc -f ${CWDIR}${EXTCONF} INSTALL_DIR=${CWDIR} >/dev/null 2>&1 sysrc -f ${CWDIR}${EXTCONF} INSTALL_DIR=${CWDIR} >/dev/null 2>&1
fi fi
mkdir -p ${BASTILLECONFLINK} mkdir -p ${BASTILLECONFLINK}
ln -Ffhs ${CWDIR}/conf ${BASTILLECONFLINK}/conf ln -fhs ${CWDIR}/conf ${BASTILLECONFLINK}/conf
# Copy the gui files. # Link the gui files.
cp -R ${CWDIR}/gui/* ${WWWPATH}/ || error_notify "Error: A problem has occurred while copying extension gui files." if [ ! -d "${WWWPATH}/ext" ]; then
mkdir -p ${WWWPATH}/ext
fi
ln -fhs ${CWDIR}/gui/ext/bastille ${WWWPATH}/ext/ || error_notify "Error: A problem has occurred while copying extension gui files."
ln -fhs ${CWDIR}/gui/images ${WWWPATH}/ext/bastille/ || error_notify "Error: A problem has occurred while copying extension gui files."
ln -fhs ${CWDIR}/gui/bastille_manager_*.php ${WWWPATH}/ || error_notify "Error: A problem has occurred while linking extension gui files."
fi fi
fi fi
} }
gui_enable() gui_enable()
{ {
# Relink conf and copy the gui files. # Relink conf and gui files.
if [ -d "${CWDIR}/gui" ]; then if [ -d "${CWDIR}/gui" ]; then
mkdir -p ${BASTILLECONFLINK} mkdir -p ${BASTILLECONFLINK}
ln -Ffhs ${CWDIR}/conf ${BASTILLECONFLINK}/conf ln -fhs ${CWDIR}/conf ${BASTILLECONFLINK}/conf
sysrc -f ${CWDIR}${EXTCONF} GUI_ENABLE=YES >/dev/null 2>&1 sysrc -f ${CWDIR}${EXTCONF} GUI_ENABLE=YES >/dev/null 2>&1
cp -R ${CWDIR}/gui/* ${WWWPATH}/ || error_notify "Error: A problem has occurred while copying extension gui files." if [ ! -d "${WWWPATH}/ext" ]; then
mkdir -p ${WWWPATH}/ext
fi
ln -fhs ${CWDIR}/gui/ext/bastille ${WWWPATH}/ext/ || error_notify "Error: A problem has occurred while copying extension gui files."
ln -fhs ${CWDIR}/gui/images ${WWWPATH}/ext/bastille/ || error_notify "Error: A problem has occurred while copying extension gui files."
ln -fhs ${CWDIR}/gui/bastille_manager_*.php ${WWWPATH}/ || error_notify "Error: A problem has occurred while copying extension gui files."
exit 0 exit 0
else else
error_notify "Error: Extension gui files not found." error_notify "Error: Extension gui files not found."
@@ -407,10 +460,11 @@ gui_disable()
{ {
# Disable gui if -t option specified. # Disable gui if -t option specified.
if [ -d "${CWDIR}/gui" ]; then if [ -d "${CWDIR}/gui" ]; then
rm -f ${WWWPATH}bastille-gui.php rm -f ${WWWPATH}bastille_manager_*.php
rm -Rf ${WWWPATH}/ext/bastille-gui rm -rf ${WWWPATH}/ext/bastille
rm -rf ${WWWPATH}/ext/bastille/images
rm -f ${LOCALSHAREPATH}/locale-bastille rm -f ${LOCALSHAREPATH}/locale-bastille
rm -Rf ${BASTILLECONFLINK} rm -rf ${BASTILLECONFLINK}
sysrc -f ${CWDIR}${EXTCONF} GUI_ENABLE=NO >/dev/null 2>&1 || error_notify "Error: A problem while removing extension gui files." sysrc -f ${CWDIR}${EXTCONF} GUI_ENABLE=NO >/dev/null 2>&1 || error_notify "Error: A problem while removing extension gui files."
exit 0 exit 0
else else
@@ -420,7 +474,7 @@ gui_disable()
# Remove empty ext folder to prevent empty "Extensions" tab. # Remove empty ext folder to prevent empty "Extensions" tab.
if [ -d "${WWWPATH}/ext" ]; then if [ -d "${WWWPATH}/ext" ]; then
if [ ! "$(ls -A ${WWWPATH}/ext)" ]; then if [ ! "$(ls -A ${WWWPATH}/ext)" ]; then
rm -R ${WWWPATH}/ext rm -r ${WWWPATH}/ext
fi fi
fi fi
} }
@@ -442,8 +496,8 @@ reset_install()
{ {
# Reset the extension environment. # Reset the extension environment.
echo "Removing extension files..." echo "Removing extension files..."
if [ -d ${CWDIR}/conf ]; then if [ -f ${CWDIR}/conf/bastille_config ]; then
rm -rf ${CWDIR}/conf rm -rf ${CWDIR}/conf/bastille_config
fi fi
if [ -d ${CWDIR}/${FULLAPPNAME} ]; then if [ -d ${CWDIR}/${FULLAPPNAME} ]; then
rm -rf ${CWDIR}/${FULLAPPNAME} rm -rf ${CWDIR}/${FULLAPPNAME}
@@ -470,11 +524,11 @@ remove_addon()
echo "Proceeding..." echo "Proceeding..."
# Check for working platform and remove symlinks. # Check for working platform and remove symlinks.
if [ "${PRDPLATFORM}" = "x64-embedded" ]; then if [ "${PRDPLATFORM}" = "x64-embedded" ] || [ "${PRDPLATFORM}" = "x64-full" ]; then
if [ -d "${USRLOCAL}/share/licenses/${APPNAME}-*" ]; then if [ -d "${USRLOCAL}/share/licenses/${APPNAME}-*" ]; then
rm -rf ${USRLOCAL}/share/licenses/${APPNAME}-* rm -rf ${USRLOCAL}/share/licenses/${APPNAME}-*
fi fi
if [ -d ${USRLOCAL}/share/locale-bastille ]; then if [ -d $"{USRLOCAL}/share/locale-bastille" ]; then
rm -rf ${USRLOCAL}/share/locale-bastille rm -rf ${USRLOCAL}/share/locale-bastille
fi fi
if [ -f "${USRLOCAL}/etc/rc.d/${APPNAME}" ]; then if [ -f "${USRLOCAL}/etc/rc.d/${APPNAME}" ]; then
@@ -489,21 +543,19 @@ remove_addon()
if [ -d "${VARLOG}/${APPNAME}" ]; then if [ -d "${VARLOG}/${APPNAME}" ]; then
rm -rf ${VARLOG}/${APPNAME} rm -rf ${VARLOG}/${APPNAME}
fi fi
elif [ "${PRDPLATFORM}" = "x64-full" ]; then
pkg delete -y ${APPNAME}
fi fi
# Remove extension and GUI components. # Remove extension and GUI components.
if [ -f "${WWWPATH}/${APPNAME}-gui.php" ]; then if [ -f "${WWWPATH}/bastille_manager_gui.php" ]; then
rm -f ${WWWPATH}/${APPNAME}-gui.php rm -f ${WWWPATH}/bastille_manager_*.php
fi fi
if [ -d "${WWWPATH}/ext/bastille-gui" ]; then if [ -d "${WWWPATH}/ext/bastille" ]; then
rm -rf ${WWWPATH}/ext/bastille-gui rm -rf ${WWWPATH}/ext/bastille
fi fi
if [ -f ${USRLOCAL}/bin/${APPNAME} ]; then if [ -f "${USRLOCAL}/bin/${APPNAME}" ]; then
rm -rf ${USRLOCAL}/bin/${APPNAME} rm -rf ${USRLOCAL}/bin/${APPNAME}
fi fi
if [ -d ${VARLOG}/${APPNAME} ]; then if [ -d "${VARLOG}/${APPNAME}" ]; then
rm -rf ${VARLOG}/${APPNAME} rm -rf ${VARLOG}/${APPNAME}
fi fi
@@ -515,11 +567,12 @@ remove_addon()
fi fi
# Remove addon related files and folders only- # Remove addon related files and folders only-
# to protect any user-created custom files. # to protect any user-created custom files-
FILES="conf download gui locale-bastille log bastille-addon README.md postinit release_notes version bastille-init" # as well as for the containers dirs/files.
for file in ${FILES}; do FILES="conf download gui locale-bastille log bastille-main LICENSE README.md postinit release_notes version bastille-init"
if [ -f ${CWDIR}/${file} ] || [ -d ${CWDIR}/${file} ]; then for FILE in ${FILES}; do
rm -rf ${CWDIR}/${file} if [ -f "${CWDIR}/${file}" ] || [ -d "${CWDIR}/${file}" ]; then
rm -rf ${CWDIR}/${FILE}
fi fi
done done
@@ -530,7 +583,7 @@ remove_addon()
get_versions() get_versions()
{ {
# Get bastille-addon extension version. # Get product versions.
if [ -f "${CWDIR}/version" ]; then if [ -f "${CWDIR}/version" ]; then
APPVERSION=$(cat ${CWDIR}/version) APPVERSION=$(cat ${CWDIR}/version)
else else
@@ -540,7 +593,6 @@ get_versions()
# Display product versions. # Display product versions.
BASTILLEVER=$(${USRLOCAL}/bin/bastille --version) BASTILLEVER=$(${USRLOCAL}/bin/bastille --version)
echo "Bastille version: ${BASTILLEVER}" echo "Bastille version: ${BASTILLEVER}"
echo "Extension version: ${APPVERSION}" echo "Extension version: ${APPVERSION}"
exit 0 exit 0
} }
@@ -548,15 +600,15 @@ get_versions()
ext_start() ext_start()
{ {
# Start bastille jails. # Start bastille jails.
if [ "${PRDPLATFORM}" = "x64-embedded" ]; then if [ -d "${CWDIR}/jails" ]; then
if [ -d "${CWDIR}/jails" ]; then JAIL_LIST=$(bastille list jail)
if [ "$(ls -A ${CWDIR}/jails)" ]; then for jail in ${JAIL_LIST}; do
JAIL_AUTO_START=$(sysrc -qn bastille_enable) if sysrc -f ${CWDIR}${EXTCONF} -qn ${jail}_AUTO_START | grep -w "YES" >/dev/null; then
if [ "${JAIL_AUTO_START}" = "YES" ]; then if ! jls | sed "1 d" | awk '{print $3}' | grep -qw ${jail}; then
service bastille start bastille start ${jail}
fi fi
fi fi
fi done
fi fi
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
@@ -572,27 +624,70 @@ ext_start()
rc_params() rc_params()
{ {
# Bastille rc parameters. # Bastille required parameters.
# Set bastille prefix.
if ! sysrc -f ${BASTILLECONF} -qn bastille_prefix | grep -q "${CWDIR}"; then if ! sysrc -f ${BASTILLECONF} -qn bastille_prefix | grep -q "${CWDIR}"; then
sysrc -f ${BASTILLECONF} bastille_prefix="${CWDIR}" >/dev/null 2>&1 sysrc -f ${BASTILLECONF} bastille_prefix="${CWDIR}" >/dev/null 2>&1
fi fi
# Default network interface. # Set bastille.conf location.
ACTIVE_NETIF=$(ifconfig | grep "UP,BROADCAST" | awk -F":" '{print $1}') if ! sysrc -f ${CWDIR}${EXTCONF} -n BASTILLE_CONFIG 2>/dev/null | grep -q "${CWDIR}/${FULLAPPNAME}${BASTILLECONF}"; then
if ! sysrc -f ${BASTILLECONF} -qn bastille_jail_external >/dev/null 2>&1; then sysrc -f ${CWDIR}${EXTCONF} BASTILLE_CONFIG="${CWDIR}/${FULLAPPNAME}${BASTILLECONF}" >/dev/null 2>&1
echo "" >> ${BASTILLECONF} && echo "## default network interface" >> ${BASTILLECONF} fi
# Default first network interface.
ACTIVE_NETIF=$(ifconfig | grep "UP,BROADCAST" | awk -F":" '{print $1}' | sed 1q)
if ! sysrc -f ${BASTILLECONF} -qn bastille_jail_external | grep -q "${ACTIVE_NETIF}" >/dev/null 2>&1; then
#echo "" >> ${BASTILLECONF} && echo "## default network interface" >> ${BASTILLECONF}
sysrc -f ${BASTILLECONF} bastille_jail_external="${ACTIVE_NETIF}" >/dev/null 2>&1 sysrc -f ${BASTILLECONF} bastille_jail_external="${ACTIVE_NETIF}" >/dev/null 2>&1
else else
BLANK_NETIF=$(sysrc -f ${BASTILLECONF} -qn bastille_jail_external) EXT_NETIF=$(sysrc -f ${BASTILLECONF} -qn bastille_jail_external)
if [ -z "${BLANK_NETIF}" ]; then if [ -z "${EXT_NETIF}" ]; then
echo "" >> ${BASTILLECONF} && echo "## default network interface" >> ${BASTILLECONF} #echo "" >> ${BASTILLECONF} && echo "## default network interface" >> ${BASTILLECONF}
sysrc -f ${BASTILLECONF} bastille_jail_external="${ACTIVE_NETIF}" >/dev/null 2>&1 sysrc -f ${BASTILLECONF} bastille_jail_external="${ACTIVE_NETIF}" >/dev/null 2>&1
fi fi
fi fi
# Start all jails by default. # Do't start containers by default.
if ! sysrc -qn bastille_enable >/dev/null 2>&1; then if ! sysrc -qn bastille_enable >/dev/null 2>&1; then
sysrc bastille_enable="YES" >/dev/null 2>&1 sysrc bastille_enable="NO" >/dev/null 2>&1
fi
}
bastille_start()
{
# Start all bastille containers.
echo "${PRDNAME} Extension: Starting all containers..."
bastille start ALL
if [ $? -eq 0 ]; then
exit 0
else
exit 1
fi
}
bastille_stop()
{
# Stop all bastille containers.
echo "${PRDNAME} Extension: Stopping all containers..."
bastille stop ALL
if [ $? -eq 0 ]; then
exit 0
else
exit 1
fi
}
bastille_restart()
{
# Restart all bastille containers.
echo "${PRDNAME} Extension: Restarting all containers..."
bastille restart ALL
if [ $? -eq 0 ]; then
exit 0
else
exit 1
fi fi
} }
@@ -603,7 +698,7 @@ bastille_init()
echo "Unsupported platform!"; exit 1 echo "Unsupported platform!"; exit 1
fi fi
# Check for product compatibility. # Check for product compatibility.
if [ ! "${PRDVERSION}" -ge "110" ]; then if [ ! "${PRDVERSION}" -ge "112" ]; then
echo "Unsupported version!"; exit 1 echo "Unsupported version!"; exit 1
fi fi
@@ -621,18 +716,24 @@ bastille_init()
# Run-time configuration. # Run-time configuration.
runtime_config runtime_config
while getopts ":ouxRvgth" option; do while getopts ":ospruxRvgth" option; do
case ${option} in case ${option} in
[h]) echo "Usage: ${SCRIPTNAME} -[option]"; [h]) echo "Usage: ${SCRIPTNAME} -[option]";
echo "Options:" echo "Options:"
echo " -s Start All ${PRDNAME} Containers."
echo " -p Stop All ${PRDNAME} Containers."
echo " -r Restart All ${PRDNAME} Containers."
echo " -u Upgrade ${PRDNAME}/Extension packages." echo " -u Upgrade ${PRDNAME}/Extension packages."
echo " -v Display product versions." echo " -v Display product versions."
echo " -g Enables the addon GUI." echo " -g Enables the addon GUI."
echo " -t Disable the addon GUI." echo " -t Disable the addon GUI."
echo " -x Reset ${PRDNAME}/Extension config." echo " -x Reset ${PRDNAME}/Extension config."
echo " -R Remove ${PRDNAME}." echo " -R Remove ${PRDNAME} (Extension files only)."
echo " -h Display this help message."; exit 0;; echo " -h Display this help message."; exit 0;;
[o]) OBI_INSTALL="ON";; # To prevent nested PHP-CGI call for installation with OBI. [o]) OBI_INSTALL="ON";; # To prevent nested PHP-CGI call for installation with OBI.
[s]) bastille_start;;
[p]) bastille_stop;;
[r]) bastille_restart;;
[u]) pkg_upgrade;; [u]) pkg_upgrade;;
[x]) reset_install;; [x]) reset_install;;
[R]) remove_addon;; [R]) remove_addon;;

20
conf/bastille.conf.ext Normal file
View File

@@ -0,0 +1,20 @@
bastille_prefix="/usr/local/bastille"
bastille_cachedir="${bastille_prefix}/cache"
bastille_jailsdir="${bastille_prefix}/jails"
bastille_logsdir="${bastille_prefix}/logs"
bastille_releasesdir="${bastille_prefix}/releases"
bastille_templatesdir="${bastille_prefix}/templates"
bastille_sharedir="/usr/local/share/bastille"
bastille_bootstrap_archives="base"
bastille_tzdata="etc/UTC"
bastille_resolv_conf="/etc/resolv.conf"
bastille_zfs_enable=""
bastille_zfs_zpool=""
bastille_zfs_prefix="bastille"
bastille_zfs_mountpoint="${bastille_prefix}"
bastille_zfs_options="-o compress=lz4 -o atime=off"
bastille_jail_loopback=""
bastille_jail_interface=""
bastille_jail_external=""
bastille_jail_addr=""
bastille_jail_gateway=""

37
conf/bastille.conf.sample Normal file
View File

@@ -0,0 +1,37 @@
#####################
## [ BastilleBSD ] ##
#####################
## default paths
bastille_prefix="/usr/local/bastille" ## default: "/usr/local/bastille"
bastille_cachedir="${bastille_prefix}/cache" ## default: ${bastille_prefix}/cache
bastille_jailsdir="${bastille_prefix}/jails" ## default: ${bastille_prefix}/jails
bastille_logsdir="${bastille_prefix}/logs" ## default: ${bastille_prefix}/logs
bastille_releasesdir="${bastille_prefix}/releases" ## default: ${bastille_prefix}/releases
bastille_templatesdir="${bastille_prefix}/templates" ## default: ${bastille_prefix}/templates
## bastille scripts directory (assumed by bastille pkg)
bastille_sharedir="/usr/local/share/bastille" ## default: "/usr/local/share/bastille"
## bootstrap archives (base, lib32, ports, src, test)
bastille_bootstrap_archives="base" ## default: "base"
## default timezone
bastille_tzdata="etc/UTC" ## default: "etc/UTC"
## default jail resolv.conf
bastille_resolv_conf="/etc/resolv.conf" ## default: "/etc/resolv.conf"
## ZFS options
bastille_zfs_enable="" ## default: ""
bastille_zfs_zpool="" ## default: ""
bastille_zfs_prefix="bastille" ## default: "${bastille_zfs_zpool}/bastille"
bastille_zfs_mountpoint=${bastille_prefix} ## default: "${bastille_prefix}"
bastille_zfs_options="-o compress=lz4 -o atime=off" ## default: "-o compress=lz4 -o atime=off"
## Networking
bastille_jail_loopback="lo1" ## default: "lo1"
bastille_jail_interface="bastille0" ## default: "bastille0"
bastille_jail_external="" ## default: ""
bastille_jail_addr="10.17.89.10" ## default: "10.17.89.10"
bastille_jail_gateway="" ## default: ""

187
gui/bastille_manager-lib.inc Executable file
View File

@@ -0,0 +1,187 @@
<?php
/*
bastille_manager-lib.inc
Copyright (c) 2019 José Rivera (joserprg@gmail.com).
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
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. Neither the name of the developer nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``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 DEVELOPER OR 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.
*/
require_once 'super_fun.inc';
require_once 'globals.inc';
require_once 'array.inc';
require_once 'system.inc';
// Initialize some variables.
// TODO: Some infos can be gathered with-
// internal PHP functions rather than external shell commands.
//$rootfolder = dirname($config['rc']['postinit']['cmd'][$i]);
$restore_name = "restore";
$confdir = "/var/etc/bastille_conf";
$cwdir = exec("/usr/bin/grep 'INSTALL_DIR=' {$confdir}/conf/bastille_config | /usr/bin/cut -d'\"' -f2");
$rootfolder = $cwdir;
$configfile = "{$rootfolder}/conf/bastille_config";
$versionfile = "{$rootfolder}/version";
$date = strftime('%c');
$logfile = "{$rootfolder}/log/bastille_ext.log";
$logevent = "{$rootfolder}/log/bastille_last_event.log";
$backup_path = exec("/bin/cat {$configfile} | /usr/bin/grep 'BACKUP_DIR=' | /usr/bin/cut -d'\"' -f2");
$bastille_config = "{$rootfolder}/conf/bastille_config";
$jail_dir = "{$rootfolder}/jails";
$image_dir = "ext/bastille/images";
$avail_releases = exec("/bin/echo $(/bin/ls {$rootfolder}/releases 2>/dev/null)");
if ($avail_releases == ''):
$empty_releases = "YES";
$avail_releases = "No base releases detected!";
endif;
// Ensure the root directory is configured.
if ($rootfolder == "")
$input_errors[] = gtext("Extension installed with fault");
else {
// Initialize locales.
$textdomain = "/usr/local/share/locale";
$textdomain_bastille = "/usr/local/share/locale-bastille";
if (!is_link($textdomain_bastille)) { mwexec("ln -s {$rootfolder}/locale-bastille {$textdomain_bastille}", true); }
bindtextdomain("xigmanas", $textdomain_bastille);
}
if (is_file("{$rootfolder}/postinit")) unlink("{$rootfolder}/postinit");
// Get all base releases list.
function get_all_release_list() {
global $rootfolder;
global $g;
exec("/bin/echo; /bin/ls {$rootfolder}/releases 2>/dev/null | /usr/bin/tr -s ' ' '\n'",$relinfo);
array_shift($relinfo);
$rellist = [];
foreach($relinfo as $rel):
$arel = preg_split("/\s+/",ltrim($rel));
$relname = chop($arel[0]);
if(substr($relname,-1) === '*'):
$relname = substr($relname,0,strlen($relname) - 1);
endif;
$rellist[$relname] = [];
endforeach;
return $rellist;
}
// Get all interface list.
function get_all_interface_list() {
global $g;
exec("/bin/echo; /sbin/ifconfig -l | /usr/bin/tr -s ' ' '\n'; /bin/echo 'NONE'",$linkinfo);
array_shift($linkinfo);
$iflist = [];
foreach($linkinfo as $link):
$alink = preg_split("/\s+/",ltrim($link));
$ifname = chop($alink[0]);
if(substr($ifname,-1) === '*'):
$ifname = substr($ifname,0,strlen($ifname) - 1);
endif;
$iflist[$ifname] = [];
endforeach;
return $iflist;
}
// Get jail infos.
function get_jail_infos() {
global $img_path;
global $image_dir;
global $configfile;
global $jail_dir;
$result = [];
if(is_dir($jail_dir)):
$cmd = '/usr/local/bin/bastille list jail 2>&1';
else:
$cmd = ":";
endif;
mwexec2($cmd,$rawdata);
foreach($rawdata as $line):
$a = preg_split('/\t/',$line);
$r = [];
$name = $a[0];
if(preg_match('/(.*)/', $name, $m)):
$r['name'] = $m[1];
else:
$r['name'] = '-';
endif;
$r['jailname'] = $r['name'];
// Set the JID on the running jails.
$item = $r['jailname'];
$r['id'] = exec("/usr/sbin/jls | /usr/bin/grep {$item} | /usr/bin/awk '{print $1}'");
if (!$r['id']):
$r['id'] = "-";
endif;
// Set the IPv4 on the running jails.
//$r['ip'] = exec("/usr/sbin/jls | /usr/bin/grep {$item} | /usr/bin/awk '{print $2}'");
$r['ip'] = exec("/usr/bin/grep -w 'ip4.addr' {$jail_dir}/{$item}/jail.conf | /usr/bin/awk '{print $3}' | /usr/bin/tr -d ';'");
if (!$r['ip']):
$r['ip'] = "-";
endif;
// Display interfaces.
$r['nic'] = exec("/usr/bin/grep -w 'interface' {$jail_dir}/{$item}/jail.conf | /usr/bin/awk '{print $3}' | /usr/bin/tr -d ';'");
if (!$r['nic']):
$r['nic'] = "-";
endif;
// Display path.
$r['path'] = exec("/usr/bin/grep -w 'path' {$jail_dir}/{$item}/jail.conf | /usr/bin/awk '{print $3}' | /usr/bin/tr -d ';'");
if (!$r['path']):
$r['path'] = "-";
endif;
// Display auto-start settings.
$jail_autostart = exec("/usr/sbin/sysrc -qn -f {$configfile} {$item}_AUTO_START");
if ($jail_autostart == 'YES') {
$r['boot'] = $img_path['ena'];
} elseif ($jail_autostart == 'NO') {
$r['boot'] = $img_path['dis'];
} else {
$r['boot'] = $img_path['dis'];
}
// Display running status icons.
$jail_running = exec("/usr/sbin/jls | /usr/bin/grep -w {$item}");
if ($jail_running):
$r['stat'] = $img_path['ena'];
else:
$r['stat'] = $img_path['dis'];
endif;
// Display custom template icons if available.
$item = $item;
$template_icon = "{$image_dir}/{$item}_icon.png";
if(file_exists($template_icon)):
$r['logo'] = "{$image_dir}/{$item}_icon.png";
else:
// Display standard FreeBSD icon.
$r['logo'] = "{$image_dir}/bsd_icon.png";
endif;
$result[] = $r;
endforeach;
return $result;
}
?>

View File

@@ -0,0 +1,188 @@
<?php
/*
bastille_manager_add.php
Copyright (c) 2019 José Rivera (joserprg@gmail.com).
All rights reserved.
Portions of XigmaNAS® (https://www.xigmanas.com).
Copyright (c) 2018 XigmaNAS® <info@xigmanas.com>.
XigmaNAS® is a registered trademark of Michael Zoon (zoon01@xigmanas.com).
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
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. Neither the name of the developer nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``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 DEVELOPER OR 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.
*/
require_once 'auth.inc';
require_once 'guiconfig.inc';
require_once("bastille_manager-lib.inc");
$pgtitle = array(gtext("Extensions"), "Bastille", "Create");
if(!$pconfig['jailname']):
$pconfig['jailname'] = 'jail1';
endif;
if(!$pconfig['ipaddress']):
$pconfig['ipaddress'] = '';
endif;
// list of configured interfaces
$a_interface = get_all_interface_list();
$l_interfaces = [];
foreach($a_interface as $k_interface => $ifinfo):
$l_interfaces[$k_interface] = $k_interface;
endforeach;
// list base releases
$a_release = get_all_release_list();
$l_release = [];
foreach($a_release as $k_release => $release):
$l_release[$k_release] = $k_release;
endforeach;
if(!is_dir($jail_dir)):
$errormsg = gtext('No base releases extracted yet.')
. ' '
. '<a href="' . 'bastille_manager_tarballs.php' . '">'
. gtext('Please download a base release first.')
. '</a>';
$prerequisites_ok = false;
endif;
if($_POST):
global $empty_releases;
global $configfile;
unset($input_errors);
$pconfig = $_POST;
if(isset($_POST['Cancel']) && $_POST['Cancel']):
header('Location: bastille_manager_gui.php');
exit;
endif;
if(isset($_POST['Create']) && $_POST['Create']):
$jname = $pconfig['jailname'];
$ipaddr = $pconfig['ipaddress'];
$release = $pconfig['release'];
if ($_POST['interface'] == 'NONE'):
$interface = "";
else:
$interface = $pconfig['interface'];
endif;
if($empty_releases !== "YES"):
if ($_POST['nowstart']):
$cmd = ("/usr/local/bin/bastille create {$jname} {$release} {$ipaddr} {$interface} && /usr/local/bin/bastille start {$jname}");
else:
$cmd = ("/usr/local/bin/bastille create {$jname} {$release} {$ipaddr} {$interface}");
endif;
else:
$cmd = "";
endif;
if ($_POST['Create']):
if ($_POST['autostart']):
exec("/usr/sbin/sysrc -f {$configfile} {$jname}_AUTO_START=\"YES\"");
endif;
unset($output,$retval);mwexec2($cmd,$output,$retval);
if($retval == 0):
//$savemsg .= gtext("Boot Environment created and activated successfully.");
header('Location: bastille_manager_gui.php');
exit;
else:
$errormsg .= gtext("Failed to create container.");
endif;
endif;
endif;
endif;
include 'fbegin.inc';
?>
<script type="text/javascript">
//<![CDATA[
$(window).on("load",function() {
$("#iform").submit(function() { spinner(); });
$(".spin").click(function() { spinner(); });
});
//]]>
</script>
<?php
$document = new co_DOMDocument();
$document->
add_area_tabnav()->
push()->
add_tabnav_upper()->
ins_tabnav_record('bastille_manager_gui.php',gettext('Containers'),gettext('Reload page'),true)->
ins_tabnav_record('bastille_manager_info.php',gettext('Information'),gettext('Reload page'),true)->
ins_tabnav_record('bastille_manager_maintenance.php',gettext('Maintenance'),gettext('Reload page'),true);
$document->render();
?>
<form action="bastille_manager_add.php" method="post" name="iform" id="iform"><table id="area_data"><tbody><tr><td id="area_data_frame">
<?php
if(!empty($errormsg)):
print_error_box($errormsg);
endif;
if(!empty($savemsg)):
print_info_box($savemsg);
endif;
if(!empty($input_errors)):
print_input_errors($input_errors);
endif;
if(file_exists($d_sysrebootreqd_path)):
print_info_box(get_std_save_message(0));
endif;
?>
<table class="area_data_settings">
<colgroup>
<col class="area_data_settings_col_tag">
<col class="area_data_settings_col_data">
</colgroup>
<thead>
<?php
html_titleline2(gettext('Create new Container'));
?>
</thead>
<tbody>
<?php
html_inputbox2('jailname',gettext('Friendly name'),$pconfig['jailname'],'',true,20);
html_inputbox2('ipaddress',gettext('IPv4 Address'),$pconfig['ipaddress'],'',true,20);
$a_action = $l_interfaces;
$b_action = $l_release;
html_combobox2('interface',gettext('Network interface'),$pconfig['interface'],$a_action,'',true,false,'action_change()');
html_combobox2('release',gettext('Base release'),$pconfig['release'],$b_action,'',true,false,'action_change()');
html_checkbox2('nowstart',gettext('Start after creation'),!empty($pconfig['nowstart']) ? true : false,gettext('Start the container after creation.'),'',false);
html_checkbox2('autostart',gettext('Auto start on boot'),!empty($pconfig['autostart']) ? true : false,gettext('Automatically start the container at boot time.'),'',false);
?>
</tbody>
</table>
<div id="submit">
<input name="Create" type="submit" class="formbtn" value="<?=gtext('Create');?>"/>
<input name="Cancel" type="submit" class="formbtn" value="<?=gtext('Cancel');?>" />
</div>
<?php
include 'formend.inc';
?>
</td></tr></tbody></table></form>
<?php
include 'fend.inc';
?>

View File

@@ -0,0 +1,177 @@
<?php
/*
bastille_manager_config.php
Copyright (c) 2019 José Rivera (joserprg@gmail.com).
All rights reserved.
Copyright (c) 2018 Andreas Schmidhuber
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. Neither the name of the developer nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``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 DEVELOPER OR 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.
*/
require("auth.inc");
require("guiconfig.inc");
require_once("bastille_manager-lib.inc");
$configAddon = "{$bastille_config}";
$textdomain = "/usr/local/share/locale";
$textdomain_bastille = "/usr/local/share/locale-bastille";
if (!is_link($textdomain_bastille)) { mwexec("ln -s {$rootfolder}/locale-bastille {$textdomain_bastille}", true); }
bindtextdomain("xigmanas", $textdomain_bastille);
$pgtitle = array(gtext("Extensions"), gtext("Bastille"), gtext("Configuration"));
$wSpace = "&nbsp;&nbsp;";
$wSpaceEqual = "&nbsp;&nbsp;=&nbsp;&nbsp;";
$paramNameSize = 30; //length of parameter name input field, default for parameter value input field is '80'
function htmlInput($name, $title, $value="", $size=80) {
$result = "<input name='{$name}' size='{$size}' title='{$title}' placeholder='{$title}' value='{$value}' />";
return $result;
}
function htmlButton($name, $text, $value="", $title="", $confirm="", $buttonImage="") {
$onClick = ($confirm == "") ? "" : "onclick='return confirm(\"{$confirm}\")'";
switch ($buttonImage) {
case "save": $buttonImage = "<img src='images/status_enabled.png' height='10' width='10'>"; break;
default: $buttonImage = "";
}
$result = "<button name='{$name}' type='submit' class='formbtn' title='{$title}' value='{$value}' {$onClick}>{$buttonImage}{$text}</button>";
return $result;
}
function parseConfigFile($configFile) {
$fileArray = file($configFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // load config file content to array
$configArray = array();
foreach($fileArray as $line) { // create array from config
$line = trim($line); // remove leading/trailing space
if ($line[0] == "#") continue; // skip if comment line
if ($line[0] == "[") { // add as section
$configArray[$line] = [];
$section = $line; // remember section name for params
} else { // process params
$parameter = explode("=", $line, 2); // seperate key and value, (Split at the first occurrence only)
$key = trim($parameter[0]); // set key
$val = explode("#", trim($parameter[1])); // get value, remove trailing comments
$value = $val[0]; // set value
$configArray[$section][$key] = $value; // add param to section
}
}
return $configArray;
}
function saveConfigFile($configFile, $configArray, $hashTag="", $prettyPrint=true) {
//$printTab = ($prettyPrint) ? "\t" : ""; // Print leading tab.
//$printSpace = ($prettyPrint) ? " " : ""; // Print spaces.
$printTab = ($prettyPrint) ? "" : ""; // Do not print leading tab.
$printSpace = ($prettyPrint) ? "" : ""; // Do not print spaces.
$cFile = fopen($configFile, "w");
foreach($configArray as $key => $line) { // traverse array, key = section
if (is_array($line)) {
if ($key != '') fwrite($cFile, $key.PHP_EOL); // write section if not "['']" => NO section
foreach($line as $pName => $pValue) fwrite($cFile, $printTab.$pName.$printSpace."=".$printSpace.$pValue.PHP_EOL); // "\t".$pName = add TAB for output formatting
fwrite($cFile, PHP_EOL);
} else fwrite($cFile, $key.$printSpace."=".$printSpace.$line.PHP_EOL);
} // end foreach
fclose($cFile);
if (!empty($hashTag)) header("Location:#{$hashTag}");
}
// load addon config - use selected config from Bastille tab or alternative if exist
$configAddonArray = parseConfigFile($configAddon); // read addon config file
if (empty($configAddonArray['']['ALTERNATIVE_CONFIG'])) $configFile = str_replace('"', "", $configAddonArray['']['BASTILLE_CONFIG']); // get Bastille config file path and name
else $configFile = str_replace('"', "", $configAddonArray['']['ALTERNATIVE_CONFIG']); // get Bastille config file path and name
// load Bastille config
if (!is_file($configFile)) $input_errors[] = sprintf(gtext("%s not found!"), gettext("Configuration File")." {$configFile}");
else {
$configArray = parseConfigFile($configFile); // parse Bastille config file
//$savemsg = gtext("Loaded config file").": <b>".basename($configFile)."</b>";
}
if ($_POST) {
unset($input_errors);
if (isset($_POST['saveParam']) && $_POST['saveParam']) { // saveParam s/n/v: [[outputs.influxdb]]#urls outputsinfluxdburls ["http://192.168.1.XYZ:8086"]
$buttonTag = explode("#", $_POST['saveParam']); // buttonTag[0] = section, buttonTag[1] = paramName
$hashTag = str_replace(["[", "]", ".", "#"], "", $buttonTag[0]); // create destination to jump to after post
$nameTag = str_replace(["[", "]", ".", "#"], "", $_POST['saveParam']); // nameTag = <input title='$nameTag + addParam' ... />
$configArray[$buttonTag[0]][$buttonTag[1]] = $_POST[$nameTag]; // save param to section
# $savemsg .= "saveParam s/n/v: ".$_POST['saveParam']." ".$nameTag." ".$_POST[$nameTag];
}
if (empty($input_errors) && !isset($_POST['loadConfig'])) saveConfigFile($configFile, $configArray, $hashTag);
}
bindtextdomain("xigmanas", $textdomain);
include("fbegin.inc");
bindtextdomain("xigmanas", $textdomain_bastille);
?>
<form action="bastille_manager_config.php" method="post" name="iform" id="iform" onsubmit="spinner()">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td class="tabnavtbl">
<ul id="tabnav">
<li class="tabinact"><a href="bastille_manager_gui.php"><span><?=gettext("Bastille");?></span></a></li>
<li class="tabact"><a href="bastille_manager_config.php"><span><?=gettext("Configuration");?></span></a></li>
</ul>
</td></tr>
<tr><td class="tabcont">
<table width="100%" border="0" cellpadding="6" cellspacing="0">
<?php // create table from configuration
echo "<tr><td colspan='2' style='padding-left:0px; padding-right:0px;'>";
if (!empty($input_errors)) print_input_errors($input_errors);
if (!empty($savemsg)) print_info_box($savemsg);
echo "</td></tr>";
// loop through configuration
$firstSection = true; // prevent first html_separator in loop
if (is_array($configArray) && !empty($configArray))
foreach($configArray as $key => $line) { // traverse array, key = section
$nameTag = str_replace(["[", "]", "."], "", $key); // create tag for post jump address and config changes
if (is_array($line)) {
if ($firstSection === true) $firstSection = false;
else html_separator();
html_titleline(gtext("Variable Name").": ".$key, 2, $nameTag); // section title bar
foreach($line as $pName => $pValue) // traverse params within section, pName = param name, pValue = param value
html_text($pName, $pName, // create param entry
htmlInput($nameTag.$pName, gtext("Parameter Value"), $pValue).$wSpace.
htmlButton("saveParam", "", $key."#".$pName, gtext("Save"), "", "save").$wSpace. "",
);
}
echo "<tr><td style='padding-left:0px;'>";
echo "</td></tr>";
}
echo "<tr><td colspan='2' style='padding-left:0px;'>";
html_remark("noteAddSection", gtext("Note"), gtext("Please be careful, as no validation will be performed on your input!"));
echo "</td></tr>";
?>
</table><?php include("formend.inc");?>
</td></tr>
</table>
</form>
<?php include("fend.inc");?>

View File

@@ -0,0 +1,162 @@
<?php
/*
bastille_manager_editor.php
Copyright (c) 2019 José Rivera (joserprg@gmail.com).
All rights reserved.
Portions of XigmaNAS® (https://www.xigmanas.com).
Copyright (c) 2018 XigmaNAS® <info@xigmanas.com>.
XigmaNAS® is a registered trademark of Michael Zoon (zoon01@xigmanas.com).
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
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. Neither the name of the developer nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``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 DEVELOPER OR 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.
*/
require_once 'auth.inc';
require_once 'guiconfig.inc';
require_once("bastille_manager-lib.inc");
$savetopath = "{$rootfolder}/jails/";
if (isset($_POST['savetopath'])) {
$savetopath = htmlspecialchars($_POST['savetopath']);
}
if(isset($_POST['submit'])) {
switch($_POST['submit']) {
case 'edit':
if(preg_match('/\S/', $savetopath)) {
if(file_exists($savetopath) && is_file($savetopath)) {
$content = file_get_contents($savetopath);
$edit_area = "";
if (stristr($savetopath, ".php") == true) $language = "php";
else if (stristr($savetopath, ".inc") == true) $language = "php";
else if (stristr($savetopath, ".sh") == true) $language = "core";
else if (stristr($savetopath, ".xml") == true) $language = "xml";
else if (stristr($savetopath, ".js") == true) $language = "js";
else if (stristr($savetopath, ".css") == true) $language = "css";
} else {
$savemsg = sprintf('%s %s', gtext('File not found'), $savetopath);
$content = '';
$savetopath = '';
}
}
break;
case 'save':
if(preg_match('/\S/', $savetopath)) {
conf_mount_rw();
$content = preg_replace("/\r/","",$_POST['code']) ;
file_put_contents($savetopath, $content);
$edit_area = "";
$savemsg = sprintf('%s %s', gtext('Saved file to'), $savetopath);
if ($savetopath === "{$g['cf_conf_path']}/config.xml") {
unlink_if_exists("{$g['tmp_path']}/config.cache");
}
conf_mount_ro();
}
break;
case 'bastille':
// Return to Bastille index.
header('Location: bastille_manager_gui.php');
break;
}
}
if(isset($_POST['rows']) && !empty($_POST['rows'])) {
$rows = $_POST['rows'];
} else {
$rows = 30;
}
if(isset($_POST['cols']) && !empty($_POST['cols'])) {
$cols = $_POST['cols'];
} else {
$cols = 66;
}
$pgtitle = [gtext('Bastille'), gtext('File Editor')];
include 'fbegin.inc';
?>
<script type="text/javascript">
//<![CDATA[
$(window).on("load", function() {
<?php // Init spinner onsubmit()?>
$("#iform").submit(function() { spinner(); });
});
//]]>
</script>
<table id="area_data"><tbody><tr><td id="area_data_frame"><form action="bastille_manager_editor.php" method="post" name="iform" id="iform">
<?php
if(!empty($savemsg)):
print_info_box($savemsg);
endif;
?>
<table class="area_data_settings">
<colgroup>
<col style="width:100%">
</colgroup>
<thead>
<?php
html_titleline2(gettext('File Editor'),1);
html_separator2(1);
?>
<tr>
<td>
<span class="label"><?=gtext('File Path');?></span>
<input size="42" id="savetopath" name="savetopath" value="<?=$savetopath;?>" />
<input name="browse" type="button" class="formbtn" id="Browse" onclick='ifield = form.savetopath; filechooser = window.open("filechooser.php?p="+encodeURIComponent(ifield.value), "filechooser", "scrollbars=yes,toolbar=no,menubar=no,statusbar=no,width=550,height=300"); filechooser.ifield = ifield; window.ifield = ifield;' value="..." />
<button name="submit" type="submit" class="formbtn" id="Edit" value="edit"><?=gtext('Edit');?></button>
<button name="submit" type="submit" class="formbtn" id="Save" value="save"><?=gtext('Save');?></button>
<button name="submit" type="submit" class="formbtn" id="Return" value="bastille"><?=gtext('Return to Bastille');?></button>
<hr noshade="noshade" />
</td>
</tr>
<?php
html_separator2(1);
?>
</thead>
<tbody>
<tr>
<td valign="top" class="label">
<div style="background: #eeeeee;" id="textareaitem">
<?php
// NOTE: The opening *and* the closing textarea tag must be on the same line.
?>
<textarea style="width:100%; margin:0;" class="<?=$language;?>:showcolumns" rows="<?=$rows;?>" cols="<?=$cols;?>" name="code"><?=htmlspecialchars(!empty($content) ? $content : '');?></textarea>
</div>
</td>
</tr>
</tbody>
</table>
<?php
include 'formend.inc';
?>
</form></td></tr></tbody></table>
<script type="text/javascript">
//<![CDATA[
// Set focus.
document.forms[0].savetopath.focus();
//]]>
</script>
<?php
include 'fend.inc';

View File

@@ -0,0 +1,351 @@
<?php
/*
bastille_manager_gui.php
Copyright (c) 2019 José Rivera (joserprg@gmail.com).
All rights reserved.
Portions of XigmaNAS® (https://www.xigmanas.com).
Copyright (c) 2018 XigmaNAS® <info@xigmanas.com>.
XigmaNAS® is a registered trademark of Michael Zoon (zoon01@xigmanas.com).
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
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. Neither the name of the developer nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``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 DEVELOPER OR 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.
*/
require_once 'auth.inc';
require_once 'guiconfig.inc';
require_once 'bastille_manager-lib.inc';
$sphere_scriptname = basename(__FILE__);
$sphere_scriptname_child = 'bastille_manager_util.php';
$sphere_header = 'Location: '.$sphere_scriptname;
$sphere_header_parent = $sphere_header;
$sphere_array = [];
$sphere_record = [];
$checkbox_member_name = 'checkbox_member_array';
$checkbox_member_array = [];
$checkbox_member_record = [];
$gt_record_add = gtext('Create new jail');
$gt_record_mod = gtext('Utilities');
$gt_selection_start = gtext('Start Selected');
$gt_selection_stop = gtext('Stop Selected');
$gt_selection_restart = gtext('Restart Selected');
$gt_record_inf = gtext('Information');
$gt_selection_start_confirm = gtext('Do you really want to start selected jail(s)?');
$gt_selection_stop_confirm = gtext('Do you want to stop the selected jail(s)?');
$gt_selection_restart_confirm = gtext('Do you want to restart the selected jail(s)?');
$img_path = [
'add' => 'images/add.png',
'mod' => 'images/edit.png',
'del' => 'images/delete.png',
'loc' => 'images/locked.png',
'unl' => 'images/unlocked.png',
'mai' => 'images/maintain.png',
'inf' => 'images/info.png',
'ena' => 'images/status_enabled.png',
'dis' => 'images/status_disabled.png',
'mup' => 'images/up.png',
'mdn' => 'images/down.png'
];
$jls_list = get_jail_infos();
$sphere_array = $jls_list;
if($_POST):
if(isset($_POST['apply']) && $_POST['apply']):
$ret = array('output' => [], 'retval' => 0);
if(!file_exists($d_sysrebootreqd_path)):
// Process notifications
endif;
$savemsg = get_std_save_message($ret['retval']);
if($ret['retval'] == 0):
updatenotify_delete($sphere_notifier);
header($sphere_header);
exit;
endif;
updatenotify_delete($sphere_notifier);
$errormsg = implode("\n", $ret['output']);
endif;
if(isset($_POST['start_selected_jail']) && $_POST['start_selected_jail']):
$checkbox_member_array = isset($_POST[$checkbox_member_name]) ? $_POST[$checkbox_member_name] : [];
foreach($checkbox_member_array as $checkbox_member_record):
if(false !== ($index = array_search_ex($checkbox_member_record, $sphere_array, 'jailname'))):
if(!isset($sphere_array[$index]['protected'])):
$cmd = ("/usr/local/bin/bastille start {$checkbox_member_record}");
$return_val = mwexec($cmd);
if($return_val == 0):
//$savemsg .= gtext("Jail(s) started successfully.");
header($sphere_header);
else:
$errormsg .= gtext("Failed to start jail(s).");
endif;
endif;
endif;
endforeach;
endif;
if(isset($_POST['stop_selected_jail']) && $_POST['stop_selected_jail']):
$checkbox_member_array = isset($_POST[$checkbox_member_name]) ? $_POST[$checkbox_member_name] : [];
foreach($checkbox_member_array as $checkbox_member_record):
if(false !== ($index = array_search_ex($checkbox_member_record, $sphere_array, 'jailname'))):
if(!isset($sphere_array[$index]['protected'])):
$cmd = ("/usr/local/bin/bastille stop {$checkbox_member_record}");
$return_val = mwexec($cmd);
if($return_val == 0):
//$savemsg .= gtext("Jail(s) stopped successfully.");
header($sphere_header);
else:
$errormsg .= gtext("Failed to stop jail(s).");
endif;
endif;
endif;
endforeach;
endif;
if(isset($_POST['restart_selected_jail']) && $_POST['restart_selected_jail']):
$checkbox_member_array = isset($_POST[$checkbox_member_name]) ? $_POST[$checkbox_member_name] : [];
foreach($checkbox_member_array as $checkbox_member_record):
if(false !== ($index = array_search_ex($checkbox_member_record, $sphere_array, 'jailname'))):
if(!isset($sphere_array[$index]['protected'])):
$cmd = ("/usr/local/bin/bastille restart {$checkbox_member_record}");
$return_val = mwexec($cmd);
if($return_val == 0):
//$savemsg .= gtext("Jail(s) restarted successfully.");
header($sphere_header);
else:
$errormsg .= gtext("Failed to restart jail(s).");
endif;
endif;
endif;
endforeach;
endif;
endif;
$pgtitle = [gtext("Extensions"), gtext('Bastille')];
include 'fbegin.inc';
?>
<script type="text/javascript">
//<![CDATA[
$(window).on("load", function() {
// Init action buttons
$("#start_selected_jail").click(function () {
return confirm('<?=$gt_selection_start_confirm;?>');
});
$("#stop_selected_jail").click(function () {
return confirm('<?=$gt_selection_stop_confirm;?>');
});
$("#restart_selected_jail").click(function () {
return confirm('<?=$gt_selection_restart_confirm;?>');
});
// Disable action buttons.
disableactionbuttons(true);
// Init member checkboxes
$("input[name='<?=$checkbox_member_name;?>[]']").click(function() {
controlactionbuttons(this, '<?=$checkbox_member_name;?>[]');
});
// Init spinner onsubmit()
$("#iform").submit(function() { spinner(); });
$(".spin").click(function() { spinner(); });
});
function disableactionbuttons(ab_disable) {
$("#start_selected_jail").prop("disabled", ab_disable);
$("#stop_selected_jail").prop("disabled", ab_disable);
$("#restart_selected_jail").prop("disabled", ab_disable);
}
function controlactionbuttons(ego, triggerbyname) {
var a_trigger = document.getElementsByName(triggerbyname);
var n_trigger = a_trigger.length;
var ab_disable = true;
var i = 0;
for (; i < n_trigger; i++) {
if (a_trigger[i].type == 'checkbox') {
if (a_trigger[i].checked) {
ab_disable = false;
break;
}
}
}
disableactionbuttons(ab_disable);
}
//]]>
</script>
<?php
$document = new co_DOMDocument();
$document->
add_area_tabnav()->
push()->
add_tabnav_upper()->
ins_tabnav_record('bastille_manager_gui.php',gettext('Containers'))->
ins_tabnav_record('bastille_manager_info.php',gettext('Information'))->
ins_tabnav_record('bastille_manager_maintenance.php',gettext('Maintenance'));
$document->render();
?>
<form action="bastille_manager_gui.php" method="post" name="iform" id="iform"><table id="area_data"><tbody><tr><td id="area_data_frame">
<?php
if(!empty($errormsg)):
print_error_box($errormsg);
endif;
if(!empty($savemsg)):
print_info_box($savemsg);
endif;
if(!empty($input_errors)):
print_input_errors($input_errors);
endif;
if(updatenotify_exists($sphere_notifier)):
print_config_change_box();
endif;
?>
<table class="area_data_settings">
<colgroup>
<col class="area_data_settings_col_tag">
<col class="area_data_settings_col_data">
</colgroup>
<thead>
<?php
?>
</thead>
<tbody>
<?php
?>
</tbody>
</table>
<table class="area_data_selection">
<colgroup>
<col style="width:5%">
<col style="width:5%">
<col style="width:10%">
<col style="width:10%">
<col style="width:5%">
<col style="width:25%">
<col style="width:5%">
<col style="width:5%">
<col style="width:5%">
<col style="width:5%">
</colgroup>
<thead>
<?php
html_separator2();
html_titleline2(gettext('Overview'), 10);
?>
<tr>
<th class="lhelc"><?=gtext('Select');?></th>
<th class="lhell"><?=gtext('JID');?></th>
<th class="lhell"><?=gtext('IPv4 Address');?></th>
<th class="lhell"><?=gtext('Hostname');?></th>
<th class="lhell"><?=gtext('Interface');?></th>
<th class="lhell"><?=gtext('Path');?></th>
<th class="lhell"><?=gtext('Boot');?></th>
<th class="lhell"><?=gtext('Active');?></th>
<th class="lhell"><?=gtext('Template');?></th>
<th class="lhebl"><?=gtext('Toolbox');?></th>
</tr>
</thead>
<tbody>
<?php
foreach ($sphere_array as $sphere_record):
$notificationmode = updatenotify_get_mode($sphere_notifier, $identifier);
$notdirty = (UPDATENOTIFY_MODE_DIRTY != $notificationmode) && (UPDATENOTIFY_MODE_DIRTY_CONFIG != $notificationmode);
$notprotected = !isset($sphere_record['protected']);
?>
<tr>
<td class="lcelc">
<?php
if ($notdirty && $notprotected):
?>
<input type="checkbox" name="<?=$checkbox_member_name;?>[]" value="<?=$sphere_record['jailname'];?>" id="<?=$sphere_record['jailname'];?>"/>
<?php
else:
?>
<input type="checkbox" name="<?=$checkbox_member_name;?>[]" value="<?=$sphere_record['jailname'];?>" id="<?=$sphere_record['jailname'];?>" disabled="disabled"/>
<?php
endif;
?>
</td>
<td class="lcell"><?=htmlspecialchars($sphere_record['id']);?>&nbsp;</td>
<td class="lcell"><?=htmlspecialchars($sphere_record['ip']);?>&nbsp;</td>
<td class="lcell"><?=htmlspecialchars($sphere_record['name']);?>&nbsp;</td>
<td class="lcell"><?=htmlspecialchars($sphere_record['nic']);?>&nbsp;</td>
<td class="lcell"><?=htmlspecialchars($sphere_record['path']);?>&nbsp;</td>
<td class="lcell"><img src="<?=$sphere_record['boot'];?>"></td>
<td class="lcell"><img src="<?=$sphere_record['stat'];?>"></td>
<td class="lcell"><img src="<?=$sphere_record['logo'];?>"></td>
<td class="lcebld">
<table class="area_data_selection_toolbox"><tbody><tr>
<td>
<?php
if($notdirty && $notprotected):
?>
<a href="<?=$sphere_scriptname_child;?>?jailname=<?=urlencode($sphere_record['jailname']);?>"><img src="<?=$img_path['mai'];?>" title="<?=$gt_record_mod;?>" alt="<?=$gt_record_mod;?>" class="spin oneemhigh"/></a>
<?php
else:
if ($notprotected):
?>
<img src="<?=$img_path['del'];?>" title="<?=$gt_record_del;?>" alt="<?=$gt_record_del;?>"/>
<?php
else:
?>
<img src="<?=$img_path['loc'];?>" title="<?=$gt_record_loc;?>" alt="<?=$gt_record_loc;?>"/>
<?php
endif;
endif;
?>
</td>
<td></td>
<td>
</td>
<td>
<a href="bastille_manager_info.php?uuid=<?=urlencode($sphere_record['jailname']);?>"><img src="<?=$g_img['inf'];?>" title="<?=$gt_record_inf?>" alt="<?=$gt_record_inf?>"/></a>
</td>
</tr></tbody></table>
</td>
</tr>
<?php
endforeach;
?>
</tbody>
<tfoot>
<tr>
<td class="lcenl" colspan="9"></td>
<td class="lceadd">
<a href="bastille_manager_add.php"><img src="<?=$img_path['add'];?>" title="<?=$gt_record_add;?>" border="0" alt="<?=$gt_record_add;?>" class="spin oneemhigh"/></a>
</td>
</tr>
</tfoot>
</table>
<div id="submit">
<input name="start_selected_jail" id="start_selected_jail" type="submit" class="formbtn" value="<?=$gt_selection_start;?>"/>
<input name="stop_selected_jail" id="stop_selected_jail" type="submit" class="formbtn" value="<?=$gt_selection_stop;?>"/>
<input name="restart_selected_jail" id="restart_selected_jail" type="submit" class="formbtn" value="<?=$gt_selection_restart;?>"/>
</div>
<?php
include 'formend.inc';
?>
</td></tr></tbody></table></form>
<?php
include 'fend.inc';

View File

@@ -0,0 +1,148 @@
<?php
/*
bastille_manager_info.php
Copyright (c) 2019 José Rivera (joserprg@gmail.com).
All rights reserved.
Portions of XigmaNAS® (https://www.xigmanas.com).
Copyright (c) 2018 XigmaNAS® <info@xigmanas.com>.
XigmaNAS® is a registered trademark of Michael Zoon (zoon01@xigmanas.com).
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
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. Neither the name of the developer nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``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 DEVELOPER OR 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.
*/
require_once 'auth.inc';
require_once 'guiconfig.inc';
require_once("bastille_manager-lib.inc");
function jls_get_jail_list(string $entity_name = NULL) {
if(isset($entity_name)):
$cmd = "/usr/sbin/jls -v -j $entity_name 2>&1";
else:
$cmd = '/usr/sbin/jls -v 2>&1';
endif;
unset($output);
mwexec2($cmd,$output);
return implode(PHP_EOL,$output);
}
function jls_get_all(string $entity_name = NULL) {
if(isset($entity_name)):
$cmd = "/usr/sbin/jls -qn -j $entity_name | tr -s \" \" \"\n\" 2>&1";
else:
$cmd = ':';
endif;
unset($a_names);
mwexec2($cmd,$a_names);
if(is_array($a_names) && count($a_names) > 0):
$names = implode(' ',array_map('escapeshellarg',$a_names));
unset($output);
mwexec2($cmd,$output);
else:
$output = [gtext('Parameters information available for individual selection only.')];
endif;
return implode(PHP_EOL,$output);
}
$entity_name = NULL;
if(isset($_GET['uuid']) && is_string($_GET['uuid'])):
$entity_name = sprintf('%s',$_GET['uuid']);
endif;
$pgtitle = [gtext("Extensions"), gtext('Bastille'),gtext('Information')];
include 'fbegin.inc';
$document = new co_DOMDocument();
$document->
add_area_tabnav()->
push()->
add_tabnav_upper()->
ins_tabnav_record('bastille_manager_gui.php',gettext('Containers'),gettext('Reload page'),true)->
ins_tabnav_record('bastille_manager_info.php',gettext('Information'),gettext('Reload page'),true)->
ins_tabnav_record('bastille_manager_maintenance.php',gettext('Maintenance'),gettext('Reload page'),true);
$document->render();
?>
<?php
if(!empty($errormsg)):
print_error_box($errormsg);
endif;
if(!empty($input_errors)):
print_input_errors($input_errors);
endif;
if(file_exists($d_sysrebootreqd_path)):
print_info_box(get_std_save_message(0));
endif;
?>
<table id="area_data"><tbody><tr><td id="area_data_frame">
<table class="area_data_settings">
<colgroup>
<col class="area_data_settings_col_tag">
<col class="area_data_settings_col_data">
</colgroup>
<thead>
<?php
html_titleline2(gettext('Container Summary'));
?>
</thead>
<tbody>
<tr>
<td class="celltag"><?=gtext('Summary');?></td>
<td class="celldata">
<pre><span id="jls_jail_list"><?=jls_get_jail_list($entity_name);?></span></pre>
</td>
</tr>
</tbody>
<tfoot>
<?php
html_separator2();
?>
</tfoot>
</table>
<table class="area_data_settings">
<colgroup>
<col class="area_data_settings_col_tag">
<col class="area_data_settings_col_data">
</colgroup>
<thead>
<?php
html_titleline2(gettext('Container Parameters'));
?>
</thead>
<tbody>
<tr>
<td class="celltag"><?=gtext('Parameters');?></td>
<td class="celldata">
<pre><span id="jls_get_info"><?=jls_get_all($entity_name);?></span></pre>
</td>
</tr>
<tbody>
</table>
<tbody>
</td></tr></tbody></table>
<?php
include 'fend.inc';
?>

View File

@@ -1,48 +1,50 @@
<?php <?php
/* /*
bastille-gui.php bastille_manager_maintenance.php
WebGUI wrapper for the XigmaNAS "Bastille" add-on created by JoseMR. Copyright (c) 2019 José Rivera (joserprg@gmail.com).
(https://www.xigmanas.com/forums/viewtopic.php?f=71&t=11184) All rights reserved.
Copyright (c) 2016 Andreas Schmidhuber Copyright (c) 2016 Andreas Schmidhuber
All rights reserved. All rights reserved.
Portions of NAS4Free (http://www.nas4free.org). Portions of XigmaNAS (http://www.nas4free.org).
Copyright (c) 2012-2016 The NAS4Free Project <info@nas4free.org>. Copyright (c) 2012-2016 The NAS4Free Project <info@nas4free.org>.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: 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. Neither the name of the developer nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
1. Redistributions of source code must retain the above copyright notice, this THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND
list of conditions and the following disclaimer. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2. Redistributions in binary form must reproduce the above copyright notice, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
this list of conditions and the following disclaimer in the documentation ARE DISCLAIMED. IN NO EVENT SHALL THE DEVELOPER OR CONTRIBUTORS BE LIABLE
and/or other materials provided with the distribution. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES SUCH DAMAGE.
(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.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the NAS4Free Project.
*/ */
require("auth.inc"); require("auth.inc");
require("guiconfig.inc"); require("guiconfig.inc");
require_once("bastille_manager-lib.inc");
$application = "Bastille"; $application = "Bastille";
$pgtitle = array(gtext("Extensions"), "Bastille"); $pgtitle = array(gtext("Extensions"), "Bastille", "Maintenance");
// For NAS4Free 10.x versions. // For legacy product versions.
$return_val = mwexec("/bin/cat /etc/prd.version | cut -d'.' -f1 | /usr/bin/grep '10'", true); $return_val = mwexec("/bin/cat /etc/prd.version | cut -d'.' -f1 | /usr/bin/grep '10'", true);
if ($return_val == 0) { if ($return_val == 0) {
if (is_array($config['rc']['postinit'] ) && is_array( $config['rc']['postinit']['cmd'] ) ) { if (is_array($config['rc']['postinit'] ) && is_array( $config['rc']['postinit']['cmd'] ) ) {
@@ -50,29 +52,15 @@ if ($return_val == 0) {
} }
} }
// Initialize some variables. // Set default backup directory.
//$rootfolder = dirname($config['rc']['postinit']['cmd'][$i]); if (1 == mwexec("/bin/cat {$configfile} | /usr/bin/grep 'BACKUP_DIR='")) {
$confdir = "/var/etc/bastilleconf"; if (is_file("{$configfile}")) exec("/usr/sbin/sysrc -f {$configfile} BACKUP_DIR={$rootfolder}/backups");
$cwdir = exec("/usr/bin/grep 'INSTALL_DIR=' {$confdir}/conf/bastille_config | cut -d'\"' -f2"); }
$rootfolder = $cwdir; $backup_path = exec("/bin/cat {$configfile} | /usr/bin/grep 'BACKUP_DIR=' | cut -d'\"' -f2");
$configfile = "{$rootfolder}/conf/bastille_config";
$versionfile = "{$rootfolder}/version";
$date = strftime('%c');
$logfile = "{$rootfolder}/log/bastille_ext.log";
$logevent = "{$rootfolder}/log/bastille_last_event.log";
$prdname = "bastille"; $prdname = "bastille";
$tarballversion = "/usr/local/bin/bastille"; $tarballversion = "/usr/local/bin/bastille";
if ($rootfolder == "") $input_errors[] = gtext("Extension installed with fault");
else {
// Initialize locales.
$textdomain = "/usr/local/share/locale";
$textdomain_bastille = "/usr/local/share/locale-bastille";
if (!is_link($textdomain_bastille)) { mwexec("ln -s {$rootfolder}/locale-bastille {$textdomain_bastille}", true); }
bindtextdomain("xigmanas", $textdomain_bastille);
}
if (is_file("{$rootfolder}/postinit")) unlink("{$rootfolder}/postinit");
if ($_POST) { if ($_POST) {
if(isset($_POST['upgrade']) && $_POST['upgrade']): if(isset($_POST['upgrade']) && $_POST['upgrade']):
$cmd = sprintf('%1$s/bastille-init -u > %2$s',$rootfolder,$logevent); $cmd = sprintf('%1$s/bastille-init -u > %2$s',$rootfolder,$logevent);
@@ -105,7 +93,7 @@ if ($_POST) {
if (is_link("/var/cache/pkg")) mwexec("rm /var/cache/pkg", true); if (is_link("/var/cache/pkg")) mwexec("rm /var/cache/pkg", true);
if (is_link("/var/db/pkg")) mwexec("rm /var/db/pkg && mkdir /var/db/pkg", true); if (is_link("/var/db/pkg")) mwexec("rm /var/db/pkg && mkdir /var/db/pkg", true);
// Remove postinit cmd in NAS4Free 10.x versions. // Remove postinit cmd in legacy product versions.
$return_val = mwexec("/bin/cat /etc/prd.version | cut -d'.' -f1 | /usr/bin/grep '10'", true); $return_val = mwexec("/bin/cat /etc/prd.version | cut -d'.' -f1 | /usr/bin/grep '10'", true);
if ($return_val == 0) { if ($return_val == 0) {
if (is_array($config['rc']['postinit']) && is_array($config['rc']['postinit']['cmd'])) { if (is_array($config['rc']['postinit']) && is_array($config['rc']['postinit']['cmd'])) {
@@ -117,7 +105,7 @@ if ($_POST) {
write_config(); write_config();
} }
// Remove postinit cmd in NAS4Free later versions. // Remove postinit cmd in later product versions.
if (is_array($config['rc']) && is_array($config['rc']['param'])) { if (is_array($config['rc']) && is_array($config['rc']['param'])) {
$postinit_cmd = "{$rootfolder}/bastille-init"; $postinit_cmd = "{$rootfolder}/bastille-init";
$value = $postinit_cmd; $value = $postinit_cmd;
@@ -135,6 +123,29 @@ if ($_POST) {
header("Location:index.php"); header("Location:index.php");
} }
if (isset($_POST['save']) && $_POST['save']) {
// Ensure to have NO whitespace & trailing slash.
$backup_path = rtrim(trim($_POST['backup_path']),'/');
if ("{$backup_path}" == "") {
$backup_path = "{$rootfolder}/backups";
}
if (!is_file($backup_path)) {
$cmd = "/usr/sbin/sysrc -f {$configfile} BACKUP_DIR={$backup_path}";
unset($retval);mwexec($cmd,$retval);
if ($retval == 0) {
$savemsg .= gtext("Extension settings saved successfully.");
exec("echo '{$date}: {$application} Extension settings saved successfully' >> {$logfile}");
}
else {
$input_errors[] = gtext("Failed to save extension settings.");
exec("echo '{$date}: {$application} Failed to save extension settings' >> {$logfile}");
}
}
else {
$input_errors[] = gtext("Failed to save extension settings.");
exec("echo '{$date}: {$application} Failed to save extension settings' >> {$logfile}");
}
}
} }
function get_version_bastille() { function get_version_bastille() {
@@ -185,11 +196,33 @@ $(document).ready(function(){
} }
//--> //-->
</script> </script>
<form action="bastille-gui.php" method="post" name="iform" id="iform" onsubmit="spinner()"> <form action="bastille_manager_maintenance.php" method="post" name="iform" id="iform" onsubmit="spinner()">
<?php
if(!empty($errormsg)):
print_error_box($errormsg);
endif;
if(!empty($input_errors)):
print_input_errors($input_errors);
endif;
if(file_exists($d_sysrebootreqd_path)):
print_info_box(get_std_save_message(0));
endif;
?>
<table width="100%" border="0" cellpadding="0" cellspacing="0"> <table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td class="tabnavtbl">
<ul id="tabnav">
<li class="tabinact"><a href="bastille_manager_gui.php"><span><?=gettext("Containers");?></span></a></li>
<li class="tabact"><a href="bastille_manager_info.php"><span><?=gettext("Information");?></span></a></li>
<li class="tabact"><a href="bastille_manager_maintenance.php"><span><?=gettext("Maintenance");?></span></a></li>
</ul>
</td></tr>
<tr><td class="tabnavtbl">
<ul id="tabnav2">
<li class="tabact"><a href="bastille_manager_config.php"><span><?=gettext("Bastille Configuration");?></span></a></li>
<li class="tabact"><a href="bastille_manager_tarballs.php"><span><?=gettext("Base Releases");?></span></a></li>
</ul>
</td></tr>
<tr><td class="tabcont"> <tr><td class="tabcont">
<?php if (!empty($input_errors)) print_input_errors($input_errors);?>
<?php if (!empty($savemsg)) print_info_box($savemsg);?>
<table width="100%" border="0" cellpadding="6" cellspacing="0"> <table width="100%" border="0" cellpadding="6" cellspacing="0">
<?php html_titleline(gtext("Bastille"));?> <?php html_titleline(gtext("Bastille"));?>
<?php html_text("installation_directory", gtext("Installation directory"), sprintf(gtext("The extension is installed in %s"), $rootfolder));?> <?php html_text("installation_directory", gtext("Installation directory"), sprintf(gtext("The extension is installed in %s"), $rootfolder));?>
@@ -201,8 +234,10 @@ $(document).ready(function(){
<td class="vncellt"><?=gtext("Extension version");?></td> <td class="vncellt"><?=gtext("Extension version");?></td>
<td class="vtable"><span name="getinfo_ext" id="getinfo_ext"><?=get_version_ext()?></span></td> <td class="vtable"><span name="getinfo_ext" id="getinfo_ext"><?=get_version_ext()?></span></td>
</tr> </tr>
<?php html_filechooser("backup_path", gtext("Backup directory"), $backup_path, gtext("Directory to store containers .tar backup archives."), $backup_path, true, 60);?>
</table> </table>
<div id="submit"> <div id="submit">
<input id="save" name="save" type="submit" class="formbtn" title="<?=gtext("Save settings");?>" value="<?=gtext("Save");?>"/>
<input name="upgrade" type="submit" class="formbtn" title="<?=gtext("Upgrade Extension and Bastille Packages");?>" value="<?=gtext("Upgrade");?>" /> <input name="upgrade" type="submit" class="formbtn" title="<?=gtext("Upgrade Extension and Bastille Packages");?>" value="<?=gtext("Upgrade");?>" />
</div> </div>
<div id="remarks"> <div id="remarks">
@@ -215,7 +250,7 @@ $(document).ready(function(){
<?php html_separator();?> <?php html_separator();?>
</table> </table>
<div id="submit1"> <div id="submit1">
<input name="uninstall" type="submit" class="formbtn" title="<?=gtext("Uninstall Extension");?>" value="<?=gtext("Uninstall");?>" onclick="return confirm('<?=gtext("Bastille Extension and packages will be completely removed, ready to proceed?");?>')" /> <input name="uninstall" type="submit" class="formbtn" title="<?=gtext("Uninstall Extension");?>" value="<?=gtext("Uninstall");?>" onclick="return confirm('<?=gtext("Bastille Extension and packages will be completely removed, Bastille containers and child directories will not be touched, really to proceed?");?>')" />
</div> </div>
</td></tr> </td></tr>
</table> </table>

View File

@@ -0,0 +1,214 @@
<?php
/*
bastille_manager_tarballs.php
Copyright (c) 2019 José Rivera (joserprg@gmail.com).
All rights reserved.
Portions of XigmaNAS® (https://www.xigmanas.com).
Copyright (c) 2018 XigmaNAS® <info@xigmanas.com>.
XigmaNAS® is a registered trademark of Michael Zoon (zoon01@xigmanas.com).
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
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. Neither the name of the developer nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``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 DEVELOPER OR 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.
*/
require_once 'auth.inc';
require_once 'guiconfig.inc';
require_once("bastille_manager-lib.inc");
$gt_selection_delete_confirm = gtext('Do you really want to destroy this base release?');
$pgtitle = [gtext("Extensions"), gtext('Bastille'),gtext('Releases')];
$sphere_array = [];
$sphere_record = [];
function get_rel_list() {
global $rootfolder;
$result = [];
if (is_dir("{$rootfolder}/releases")):
$entries = preg_grep('/^([^.])/', scandir("{$rootfolder}/releases"));
foreach($entries as $entry):
$a = preg_split('/\t/',$entry);
$r = [];
$name = $a[0];
if(preg_match('/^[0-9]+\.[0-9]+\-RELEASE/', $name, $m)):
$r['name'] = $m[0];
else:
$r['name'] = 'unknown';
endif;
$r['relname'] = $r['name'];
$result[] = $r;
endforeach;
endif;
return $result;
}
$rel_list = get_rel_list();
$sphere_array = $rel_list;
if($_POST):
unset($input_errors);
unset($savemsg);
$pconfig = $_POST;
if(isset($_POST['Cancel']) && $_POST['Cancel']):
header('Location: bastille_manager_gui.php');
exit;
endif;
if (isset($_POST['Download']) && $_POST['Download']):
$get_release = $pconfig['release_item'];
$check_release = ("{$rootfolder}/releases/{$get_release}");
$cmd = ("/usr/local/bin/bastille bootstrap {$get_release}");
if(file_exists($check_release)):
// FreeBSD base release check.
$savemsg .= sprintf(gtext('%s base appears to be already extracted.'),$get_release);
else:
// Download a FreeBSD base release.
if ($_POST['Download']):
unset($output,$retval);mwexec2($cmd,$output,$retval);
if($retval == 0):
//$savemsg .= sprintf(gtext('%s base downloaded and extracted successfully.'),$get_release);
header('Location: bastille_manager_tarballs.php');
else:
$errormsg .= sprintf(gtext('%s Failed to download and/or extract release base.'),$get_release);
endif;
endif;
endif;
endif;
if (isset($_POST['Destroy']) && $_POST['Destroy']):
if ($_POST['Destroy']):
$get_release = $pconfig['release_item'];
$check_release = ("{$rootfolder}/releases/{$get_release}");
$cmd = ("/usr/local/bin/bastille destroy {$get_release}");
if(!file_exists($check_release)):
// FreeBSD base release check.
$savemsg .= sprintf(gtext('%s base does not exist, nothing to do.'),$get_release);
else:
// Delete the FreeBSD base release/directory.
if ($_POST['Destroy']):
unset($output,$retval);mwexec2($cmd,$output,$retval);
if($retval == 0):
//$savemsg .= sprintf(gtext('%s base deleted successfully.'),$get_release);
header('Location: bastille_manager_tarballs.php');
else:
$errormsg .= sprintf(gtext('%s failed to delete.'),$get_release);
endif;
endif;
endif;
endif;
endif;
endif;
include 'fbegin.inc';
?>
<script type="text/javascript">
//<![CDATA[
$(window).on("load",function() {
// Init action buttons
$("#Destroy").click(function () {
return confirm('<?=$gt_selection_delete_confirm;?>');
});
$("#iform").submit(function() { spinner(); });
$(".spin").click(function() { spinner(); });
});
function enable_change(enable_change) {
document.iform.name.disabled = !enable_change;
}
//]]>
</script>
<?php
$document = new co_DOMDocument();
$document->
add_area_tabnav()->
push()->
add_tabnav_upper()->
ins_tabnav_record('bastille_manager_gui.php',gettext('Containers'),gettext('Reload page'),true)->
ins_tabnav_record('bastille_manager_info.php',gettext('Information'),gettext('Reload page'),true)->
ins_tabnav_record('bastille_manager_maintenance.php',gettext('Maintenance'),gettext('Reload page'),true)->
pop()->add_tabnav_lower()->
ins_tabnav_record('bastille_manager_config.php',gettext('Bastille Configuration'),gettext('Reload page'),true)->
ins_tabnav_record('bastille_manager_tarballs.php',gettext('Base Releases'),gettext('Reload page'),true);
$document->render();
?>
<form action="bastille_manager_tarballs.php" method="post" name="iform" id="iform"><table id="area_data"><tbody><tr><td id="area_data_frame">
<?php
if(!empty($errormsg)):
print_error_box($errormsg);
endif;
if(!empty($savemsg)):
print_info_box($savemsg);
endif;
if(!empty($input_errors)):
print_input_errors($input_errors);
endif;
if(file_exists($d_sysrebootreqd_path)):
print_info_box(get_std_save_message(0));
endif;
?>
<table class="area_data_settings">
<colgroup>
<col class="area_data_settings_col_tag">
<col class="area_data_settings_col_data">
</colgroup>
<thead>
<?php
html_titleline2(gettext('FreeBSD Base Releases'));
?>
</thead>
<tbody>
<?php
foreach ($sphere_array as $sphere_record):
html_text2('releases',gettext('Installed Base:'),htmlspecialchars($sphere_record['relname']));
endforeach;
$a_action = [
//'12.1-RELEASE' => gettext('12.1-RELEASE'),
'12.0-RELEASE' => gettext('12.0-RELEASE'),
'11.3-RELEASE' => gettext('11.3-RELEASE'),
'11.2-RELEASE' => gettext('11.2-RELEASE'),
];
html_combobox2('release_item',gettext('Select Base Release'),$pconfig['release_item'],$a_action,'',true,false,'action_change()');
?>
</tbody>
</table>
<div id="submit">
<input name="Download" type="submit" class="formbtn" value="<?=gtext("Download");?>" onclick="enable_change(true)" />
<input name="Destroy" id="Destroy" type="submit" class="formbtn" value="<?=gtext("Destroy");?>"/>
<input name="Cancel" type="submit" class="formbtn" value="<?=gtext("Cancel");?>" />
</div>
<div id="remarks">
<?php html_remark("note", gtext("Note"), sprintf(gtext("Slow Internet connections may render the Web GUI unresponsive until download completes.")));?>
</div>
<?php
include 'formend.inc';
?>
</td></tr></tbody></table></form>
<?php
include 'fend.inc';
?>

View File

@@ -0,0 +1,376 @@
<?php
/*
bastille_manager_util.php
Copyright (c) 2019 José Rivera (joserprg@gmail.com).
All rights reserved.
Portions of XigmaNAS® (https://www.xigmanas.com).
Copyright (c) 2018 XigmaNAS® <info@xigmanas.com>.
XigmaNAS® is a registered trademark of Michael Zoon (zoon01@xigmanas.com).
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
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. Neither the name of the developer nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``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 DEVELOPER OR 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.
*/
require_once 'auth.inc';
require_once 'guiconfig.inc';
require_once("bastille_manager-lib.inc");
if(isset($_GET['uuid'])):
$uuid = $_GET['uuid'];
endif;
if(isset($_POST['uuid'])):
$uuid = $_POST['uuid'];
endif;
$pgtitle = [gtext("Extensions"), gtext('Bastille'),gtext('Utilities')];
if(isset($_GET['jailname'])):
$container = $_GET['jailname'];
endif;
if(isset($_POST['jailname'])):
$container = $_POST['jailname'];
endif;
$cnid = FALSE;
if(isset($container) && !empty($container)):
$pconfig['uuid'] = uuid();
$pconfig['jailname'] = $container;
if(preg_match('/^([^\/\@]+)(\/([^\@]+))?\@(.*)$/', $pconfig['jailname'], $m)):
$pconfig['name'] = $m[''];
else:
$pconfig['name'] = 'unknown';
endif;
$pconfig['newname'] = '';
$pconfig['recursive'] = false;
$pconfig['action'] = 'activate';
else:
// not supported
$pconfig = [];
endif;
if($_POST):
global $configfile;
global $backup_path;
global $rootfolder;
unset($input_errors);
$pconfig = $_POST;
if(isset($_POST['Cancel']) && $_POST['Cancel']):
header('Location: bastille_manager_gui.php');
exit;
endif;
if(isset($_POST['action'])):
$action = $_POST['action'];
endif;
if(empty($action)):
$input_errors[] = sprintf(gtext("The attribute '%s' is required."), gtext("Action"));
else:
switch($action):
case 'advanced':
// Input validation not required
if(empty($input_errors)):
$container = [];
$container['uuid'] = $_POST['uuid'];
$container['jailname'] = $_POST['jailname'];
$confirm_name = $pconfig['confirmname'];
$item = $container['jailname'];
if ($_POST['advanced']):
header('Location: bastille_manager_editor.php');
exit;
else:
$errormsg .= gtext("Failed to open editor, confirmation is required.");
endif;
endif;
break;
case 'backup':
// Input validation not required
if(empty($input_errors)):
$container = [];
$container['uuid'] = $_POST['uuid'];
$container['jailname'] = $_POST['jailname'];
$confirm_name = $pconfig['confirmname'];
$item = $container['jailname'];
$date = (strftime('%Y-%m-%d-%H%M%S'));
$cmd = ("cd {$rootfolder}/jails && /usr/bin/tar -cf {$item}-{$date}.tar --exclude=.bastille --exclude=.template {$item} && /bin/mv {$item}-{$date}.tar {$backup_path}");
unset($output,$retval);mwexec2($cmd,$output,$retval);
if($retval == 0):
$savemsg .= gtext("Container backup process completed successfully.");
//header('Location: bastille_manager_gui.php');
//exit;
else:
$errormsg .= gtext("Failed to backup container.");
endif;
endif;
break;
case 'autoboot':
// Input validation not required
if(empty($input_errors)):
$container = [];
$container['uuid'] = $_POST['uuid'];
$container['jailname'] = $_POST['jailname'];
$confirm_name = $pconfig['confirmname'];
$item = $container['jailname'];
$cmd = ("/usr/sbin/sysrc -f {$configfile} {$item}_AUTO_START=\"YES\"");
unset($output,$retval);mwexec2($cmd,$output,$retval);
if($retval == 0):
header('Location: bastille_manager_gui.php');
exit;
else:
$errormsg .= gtext("Failed to set auto-boot.");
endif;
endif;
break;
case 'noauto':
// Input validation not required
if(empty($input_errors)):
$container = [];
$container['uuid'] = $_POST['uuid'];
$container['jailname'] = $_POST['jailname'];
$confirm_name = $pconfig['confirmname'];
$item = $container['jailname'];
$cmd = ("/usr/sbin/sysrc -f {$configfile} {$item}_AUTO_START=\"NO\"");
unset($output,$retval);mwexec2($cmd,$output,$retval);
if($retval == 0):
header('Location: bastille_manager_gui.php');
exit;
else:
$errormsg .= gtext("Failed to set no-auto.");
endif;
endif;
break;
case 'fstab':
// Input validation not required
if(empty($input_errors)):
$container = [];
$container['uuid'] = $_POST['uuid'];
$container['jailname'] = $_POST['jailname'];
$confirm_name = $pconfig['confirmname'];
$item = $container['jailname'];
$sourcedir = $pconfig['source_path'];
$targetdir = $pconfig['target_path'];
if ($_POST['readonly']):
$dir_mode = "ro";
else:
$dir_mode = "rw";
endif;
$cmd = ("/bin/echo \"{$sourcedir} {$targetdir} nullfs {$dir_mode} 0 0\" >> {$rootfolder}/jails/{$item}/fstab");
unset($output,$retval);mwexec2($cmd,$output,$retval);
if($retval == 0):
if ($_POST['createdir']):
mkdir("$targetdir");
endif;
$savemsg .= gtext("Container backup process completed successfully.");
//header('Location: bastille_manager_gui.php');
//exit;
else:
$errormsg .= gtext("Failed to backup container.");
endif;
endif;
break;
case 'delete':
// Delete a contained
if(empty($input_errors)):
$container = [];
$container['uuid'] = $_POST['uuid'];
$container['jailname'] = $_POST['jailname'];
$confirm_name = $pconfig['confirmname'];
$item = $container['jailname'];
if(strcmp($confirm_name, $item) !== 0):
$errormsg .= gtext("Failed to destroy container, name confirmation is required.");
break;
else:
if ($_POST['nowstop']):
$cmd = ("/usr/local/bin/bastille stop {$item} && /usr/local/bin/bastille destroy {$item}");
else:
$cmd = ("/usr/local/bin/bastille destroy {$item}");
endif;
unset($output,$retval);mwexec2($cmd,$output,$retval);
if($retval == 0):
exec("/usr/sbin/sysrc -f {$configfile} -qx {$item}_AUTO_START");
header('Location: bastille_manager_gui.php');
exit;
else:
$errormsg .= gtext("Failed to destroy container, make sure this container is stopped.");
endif;
endif;
endif;
break;
default:
$input_errors[] = sprintf(gtext("The attribute '%s' is invalid."), 'action');
break;
endswitch;
endif;
endif;
include 'fbegin.inc';
?>
<script type="text/javascript">
//<![CDATA[
$(window).on("load",function() {
$("#iform").submit(function() { spinner(); });
$(".spin").click(function() { spinner(); });
});
function enable_change(enable_change) {
document.iform.name.disabled = !enable_change;
}
function action_change() {
showElementById('confirmname_tr','hide');
showElementById('nowstop_tr', 'hide');
showElementById('source_path_tr', 'hide');
showElementById('target_path_tr', 'hide');
showElementById('advanced_tr', 'hide');
showElementById('readonly_tr', 'hide');
showElementById('createdir_tr', 'hide');
//showElementById('dateadd_tr','hide');
var action = document.iform.action.value;
switch (action) {
case "backup":
showElementById('confirmname_tr','hide');
showElementById('nowstop_tr','hide');
break;
case "autoboot":
showElementById('confirmname_tr','hide');
showElementById('nowstop_tr','hide');
break;
case "noauto":
showElementById('confirmname_tr','hide');
showElementById('nowstop_tr','hide');
break;
case "fstab":
showElementById('confirmname_tr','hide');
showElementById('nowstop_tr','hide');
showElementById('source_path_tr','show');
showElementById('target_path_tr','show');
showElementById('readonly_tr','show');
showElementById('createdir_tr','show');
break;
case "delete":
showElementById('confirmname_tr','show');
showElementById('nowstop_tr','show');
break;
case "advanced":
showElementById('confirmname_tr','hide');
showElementById('nowstop_tr','hide');
showElementById('advanced_tr','show');
break;
default:
break;
}
}
//]]>
</script>
<?php
$document = new co_DOMDocument();
$document->
add_area_tabnav()->
push()->
add_tabnav_upper()->
ins_tabnav_record('bastille_manager_gui.php',gettext('Containers'),gettext('Reload page'),true)->
ins_tabnav_record('bastille_manager_info.php',gettext('Information'),gettext('Reload page'),true)->
ins_tabnav_record('bastille_manager_maintenance.php',gettext('Maintenance'),gettext('Reload page'),true);
$document->render();
?>
<form action="bastille_manager_util.php" method="post" name="iform" id="iform"><table id="area_data"><tbody><tr><td id="area_data_frame">
<?php
if(!empty($errormsg)):
print_error_box($errormsg);
endif;
if(!empty($savemsg)):
print_info_box($savemsg);
endif;
if(!empty($input_errors)):
print_input_errors($input_errors);
endif;
if(updatenotify_exists($sphere_notifier)):
print_config_change_box();
endif;
?>
<table class="area_data_settings">
<colgroup>
<col class="area_data_settings_col_tag">
<col class="area_data_settings_col_data">
</colgroup>
<thead>
<?php
html_titleline2(gettext('Utilities'));
?>
</thead>
<tbody>
<?php
$pconfig['source_path'] = "/mnt";
$pconfig['target_path'] = "{$rootfolder}/jails/{$pconfig['jailname']}/root/mnt/";
html_text2('jailname',gettext('Container name:'),htmlspecialchars($pconfig['jailname']));
$a_action = [
'backup' => gettext('Backup'),
'autoboot' => gettext('Autoboot'),
'noauto' => gettext('Noauto'),
'fstab' => gettext('Fstab'),
'delete' => gettext('Destroy'),
'advanced' => gettext('Advanced'),
];
html_combobox2('action',gettext('Action'),$pconfig['action'],$a_action,'',true,false,'action_change()');
html_inputbox2('confirmname',gettext('Enter name for confirmation'),$pconfig['confirmname'],'',true,30);
html_checkbox2('nowstop',gettext('Stop container'),!empty($pconfig['nowstop']) ? true : false,gettext('Stop the container if running before deletetion.'),'',false);
html_filechooser("source_path", gtext("Source Data Directory"), $pconfig['source_path'], gtext("Source data directory to be shared, full path here."), $source_path, true, 60);
html_filechooser("target_path", gtext("Target Data Directory"), $pconfig['target_path'], gtext("Target data directory to be mapped, path within the jail only."), $target_path, true, 60);
html_checkbox2('advanced',gettext('Advanced jail configuration Files'),!empty($pconfig['advanced']) ? true : false,gettext('I understand the risks, take me to the advanced jail config files.'),'',true);
html_checkbox2('readonly',gettext('Read-Only Mode'),!empty($pconfig['readonly']) ? true : false,gettext('Set target directory in Read-Only mode.'),'',false);
html_checkbox2('createdir',gettext('Create Target Directory'),!empty($pconfig['createdir']) ? true : true,gettext('Create target directory if missing (recommended).'),'',true);
//html_checkbox2('dateadd',gettext('Date'),!empty($pconfig['dateadd']) ? true : false,gettext('Append the date in the following format: ITEM-XXXX-XX-XX-XXXXXX.'),'',false);
?>
</tbody>
</table>
<div id="submit">
<input name="Submit" type="submit" class="formbtn" value="<?=gtext("Execute");?>" onclick="enable_change(true)" />
<input name="Cancel" type="submit" class="formbtn" value="<?=gtext("Cancel");?>" />
<input name="uuid" type="hidden" value="<?=$pconfig['uuid'];?>" />
<input name="jailname" type="hidden" value="<?=$pconfig['jailname'];?>" />
<input name="name" type="hidden" value="<?=$pconfig['name'];?>" />
</div>
<div id="remarks">
<?php html_remark("note", gtext("Note"), sprintf(gtext("Some tasks such as backups may render the WebGUI unresponsive until task completes.")));?>
</div>
<?php
include 'formend.inc';
?>
</td></tr></tbody></table></form>
<script type="text/javascript">
<!--
enable_change(true);
action_change();
//-->
</script>
<?php
include 'fend.inc';
?>

View File

@@ -1 +0,0 @@
<a href="bastille-gui.php">Bastille</a>

View File

@@ -0,0 +1 @@
<a href="bastille_manager_gui.php">Bastille</a>

BIN
gui/images/bsd_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 872 B

BIN
gui/images/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
gui/images/icon_small.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

View File

@@ -1,11 +0,0 @@
======================
= Extension Bastille =
======================
Version Description
0.0.6......Switch to alternate repository supporting 11.3-RELEASE base.
0.0.5......Start all jails once.
0.0.4......Start jails if directory not empty.
0.0.3......Minor code adjustment.
0.0.2......Added addon preview page.
0.0.1......First Release.

View File

@@ -1 +1 @@
0.0.6 1.0.0