From 438b0ccf0e9a60051985a16bb89d572f975cbcef Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 1 Oct 2019 16:55:33 -0400 Subject: [PATCH] Initial --- README.md | 9 + bastille-init | 637 ++++++++++++++++++++++++++++++++++ gui/bastille-gui.php | 229 ++++++++++++ gui/ext/bastille-gui/menu.inc | 1 + release_notes | 7 + version | 1 + 6 files changed, 884 insertions(+) create mode 100644 README.md create mode 100755 bastille-init create mode 100644 gui/bastille-gui.php create mode 100644 gui/ext/bastille-gui/menu.inc create mode 100644 release_notes create mode 100644 version diff --git a/README.md b/README.md new file mode 100644 index 0000000..7ccf5da --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +**Description:** + + This is the XigmaNAS Bastille Extension for quickly create and manage FreeBSD Jails/Containers. + +**Credits:** + + Christer Edwards (cedwards) Bastille, J.M. Rivera (JRGTH) XigmaNAS Add-on. + +Additional information on Bastille: http://bastillebsd.org/ diff --git a/bastille-init b/bastille-init new file mode 100755 index 0000000..9162033 --- /dev/null +++ b/bastille-init @@ -0,0 +1,637 @@ +#!/bin/sh +# bastille-init +# Bastille Extension for XigmaNAS x64 11.x and later. +# Bastille Homepage: http://bastillebsd.org/ +# +# ***(For Preview/Testing)*** +# Debug script +#set -x + +# Copyright (c) 2019 José Rivera (JoseMR) +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS 'AS IS' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. + +# Set environment. +PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin + +# Determine full working directory. +CWDIR=$(dirname $(realpath $0)) + +# Global variables. +PLATFORM=$(uname -m) +PRODUCT=$(uname -i) +PRDVERSION=$(uname -r | cut -d '-' -f1 | tr -d '.') +PRDPLATFORM=$(cat /etc/platform) +SCRIPTNAME=$(basename $0) +CONFIG="/cf/conf/config.xml" +PRDNAME="Bastille" +APPNAME="bastille" +EXTLOGFILE="${CWDIR}/log/bastille_ext.log" +FULLAPPNAME="${APPNAME}-addon" +PKGCONF="/etc/pkg/FreeBSD.conf" +WWWPATH="/usr/local/www" +PKGCACHE="/var/cache/pkg" +USRLOCAL="/usr/local" +VARLOG="/var/log" +EXTCONF="/conf/${APPNAME}_config" +EXTCONFLINK="/var/etc/${APPNAME}_conf" +BASTILLERCD="/usr/local/etc/rc.d/${APPNAME}" +BASTILLEPATH="${USRLOCAL}/bin" +BASTILLECONF="${USRLOCAL}/etc/${APPNAME}/${APPNAME}.conf" +BASTILLECONFLINK="/var/etc/bastilleconf" +INSTALLPATH="${CWDIR}/${FULLAPPNAME}" +BRANCH="master" +BATSILLE_URL="https://github.com/BastilleBSD/${APPNAME}/archive/${BRANCH}.zip" +BASTILE_VERSION="https://raw.githubusercontent.com/BastilleBSD/${APPNAME}/${BRANCH}/usr/local/bin/${APPNAME}" +GITURL="https://github.com/JRGTH/xigmanas-${APPNAME}-extension/archive/${BRANCH}.zip" +VERFILE="https://raw.githubusercontent.com/JRGTH/xigmanas-${APPNAME}-extension/${BRANCH}/version" + +error_notify() +{ + # Log/notify message on error and exit. + MSG="$*" + logger -t "${SCRIPTNAME}" "${MSG}" + echo -e "$*" >&2; exit 1 +} + +runtime_config() +{ + # Run-time configuration and checks. + if [ -f "${INSTALLPATH}/${BASTILLECONF}" ]; then + if ! sysrc -f ${BASTILLECONF} -qn bastille_prefix | grep -q "${CWDIR}"; then + sysrc -f ${INSTALLPATH}/${BASTILLECONF} bastille_prefix="${CWDIR}" >/dev/null 2>&1 + fi + fi + if [ ! -d ${CWDIR}/conf ]; then + mkdir -p ${CWDIR}/conf + fi + if [ ! -d ${CWDIR}/log ]; then + mkdir -p ${CWDIR}/log + fi + if [ ! -d ${CWDIR}/locale-bastille ]; then + mkdir -p ${CWDIR}/locale-bastille + fi +} + +bastille_initial_download() +{ + # Check if bastille already exist. + if [ ! -f ${CWDIR}/${FULLAPPNAME}/${BASTILLEPATH}/${APPNAME} ]; then + # Fetch latest bastille package. + echo "Fetching ${APPNAME} files..." + fetch -ao ${CWDIR}/${BRANCH}.zip --no-verify-peer --timeout=30 ${BATSILLE_URL} || \ + error_notify "Error: A problem has occurred while fetching ${APPNAME}." + bastille_pkg_extract + fi +} + +bastille_pkg_extract() +{ + # Extract bastille files from package. + if [ -f ${CWDIR}/${BRANCH}.zip ]; then + if [ ! -f ${CWDIR}/${FULLAPPNAME}${BASTILLEPATH}/${APPNAME} ]; then + echo "Extracting ${APPNAME}..." + tar -xf ${CWDIR}/${BRANCH}.zip --exclude='.git*' --strip-components 1 -C ${CWDIR}/${FULLAPPNAME} || \ + error_notify "Error: A problem has occurred while extractig ${APPNAME} files." + chmod 555 ${CWDIR}/${FULLAPPNAME}${BASTILLEPATH}/${APPNAME} + rm -f ${CWDIR}/${BRANCH}.zip + echo "Done!" + fi + fi +} + +bastille_upgrade() +{ + # Perform an online bastille upgrade. + DATE=$(date +"%a %b %d %T %Y") + echo "Looking for new ${APPNAME} package!" + mkdir -p ${CWDIR}/update + fetch -ao ${CWDIR}/update --no-verify-peer --timeout=30 ${BASTILE_VERSION} || \ + error_notify "Error: A problem has occurred while fetching version file." + + # Compare version files and fetch latest package if available. + if [ -f ${CWDIR}/update/${APPNAME} ]; then + UPDATEVER=$(cat ${CWDIR}/update/${APPNAME} | grep BASTILLE_VERSION= | egrep -o "([0-9]{1,}\.)+[0-9]{1,}" | tr -d '.') + CURRENTVER=$(cat ${BASTILLEPATH}/${APPNAME} | grep BASTILLE_VERSION= | egrep -o "([0-9]{1,}\.)+[0-9]{1,}" | tr -d '.') + if [ "${UPDATEVER}" -gt "${CURRENTVER}" ]; then + echo "New ${APPNAME} package found, performing upgrade..." + fetch -ao ${CWDIR}/update --no-verify-peer --timeout=30 ${BATSILLE_URL} || \ + 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 + rm -f ${CWDIR}/update/${BRANCH}.zip + rm -f ${CWDIR}/update/${APPNAME} + chmod 555 ${CWDIR}/update/${BASTILLEPATH}/${APPNAME} + cp -Rf ${CWDIR}/update/* ${CWDIR}/${FULLAPPNAME}/ + rm -R ${CWDIR}/update + + # Logging the update event. + UPDATEVERSION=$(cat ${BASTILLEPATH}/${APPNAME} | grep BASTILLE_VERSION= | cut -d"=" -f2) + echo "${DATE}: ${APPNAME} upgraded to ${UPDATEVERSION}" >> ${EXTLOGFILE} + echo "${APPNAME} upgraded to version ${UPDATEVERSION}" + echo "${APPNAME} package upgrade completed!" + else + echo "${APPNAME} is on the latest version!" + rm -R ${CWDIR}/update + fi + fi +} + +ext_initial_download() +{ + # Always ensure the version file is present, otherwise update the extension files on startup. + if [ ! -f ${CWDIR}/version ]; then + echo "Fetching and extracting extension files..." + mkdir -p ${CWDIR}/update + fetch -ao ${CWDIR}/update --no-verify-peer --timeout=30 ${GITURL} || \ + error_notify "Error: A problem has occurred while fetching extension package." + tar -xf ${CWDIR}/update/${BRANCH}.zip --exclude='.git*' --strip-components 1 -C ${CWDIR}/update + chmod +x ${CWDIR}/update/${SCRIPTNAME} + rm -f ${CWDIR}/update/${BRANCH}.zip + cp -Rf ${CWDIR}/update/* ${CWDIR}/ + rm -R ${CWDIR}/update + echo "Done!" + fi +} + +extension_upgrade() +{ + # Perform an online extension upgrade. + DATE=$(date +"%a %b %d %T %Y") + echo "Looking for new ${FULLAPPNAME} package!" + mkdir -p ${CWDIR}/update + fetch -ao ${CWDIR}/update --no-verify-peer --timeout=30 ${VERFILE} || \ + error_notify "Error: A problem has occurred while fetching version file." + + # Compare version files and fetch latest package if available. + if [ -f ${CWDIR}/update/version ]; then + UPDATEVER=$(cat ${CWDIR}/update/version | tr -d .) + CURRENTVER=$(cat ${CWDIR}/version | tr -d .) + if [ "${UPDATEVER}" -gt "${CURRENTVER}" ]; then + echo "New ${FULLAPPNAME} package found, performing upgrade..." + fetch -ao ${CWDIR}/update --no-verify-peer --timeout=30 ${GITURL} || \ + error_notify "Error: A problem has occurred while fetching extension package." + tar -xf ${CWDIR}/update/${BRANCH}.zip --exclude='.git*' --strip-components 1 -C ${CWDIR}/update + chmod +x ${CWDIR}/update/${SCRIPTNAME} + rm -f ${CWDIR}/update/${BRANCH}.zip + cp -Rf ${CWDIR}/update/* ${CWDIR}/ + rm -R ${CWDIR}/update + + # Logging the update event. + UPDATEVERSION=$(cat ${CWDIR}/version) + echo "${DATE}: ${FULLAPPNAME} upgraded to ${UPDATEVERSION}" >> ${EXTLOGFILE} + echo "${FULLAPPNAME} package upgrade completed!" + else + echo "${FULLAPPNAME} is on the latest version!" + rm -R ${CWDIR}/update + fi + fi +} + +create_addon_env() +{ + # Set bastile dir proper permissions. + chmod 0750 ${CWDIR} + + # Create required directories. + if [ ! -d "${CWDIR}/log" ]; then + mkdir -p ${CWDIR}/log + fi + if [ ! -d "${CWDIR}/${FULLAPPNAME}" ]; then + mkdir -p ${CWDIR}/${FULLAPPNAME} + fi + if [ ! -d "${CWDIR}/${FULLAPPNAME}/${BASTILLEPATH}" ]; then + mkdir -p ${CWDIR}/${FULLAPPNAME}/${BASTILLEPATH} + fi + + # Link bastille-init to /usr/local/sbin. + if [ ! -f "${USRLOCAL}/sbin/${SCRIPTNAME}" ]; then + ln -fs ${CWDIR}/${SCRIPTNAME} ${USRLOCAL}/sbin/${SCRIPTNAME} + fi +} + +platform_check() +{ + # Check for working platform. + if [ "${PRDPLATFORM}" = "x64-embedded" ]; then + create_addon_env + #ext_initial_download + bastille_initial_download + sys_symlinkdir + elif [ "${PRDPLATFORM}" = "x64-full" ]; then + create_addon_env + #ext_initial_download + bastille_initial_download + sys_symlinkdir + fi +} + +bin_symlinks() +{ + # Main bastille symlinks. + if [ -d ${INSTALLPATH}/${BASTILLEPATH} ]; then + cd ${INSTALLPATH}/${BASTILLEPATH} + for file in * + do + ln -Ffhs ${INSTALLPATH}/${BASTILLEPATH}/${file} ${USRLOCAL}/bin/${file} + done + fi +} + +sys_symlinkdir() +{ + # Check and create/relink required symlinks/dirs for bastille. + # This environment will be checked each time the script is started for consistency. + + # Required directories for bastille. + if [ ! -d "${USRLOCAL}/share/licenses" ]; then + mkdir -p ${USRLOCAL}/share/licenses + fi + + # Link required binaries. + bin_symlinks + + # Required symlinks for bastille. + if [ -d "${INSTALLPATH}/${USRLOCAL}/share/licenses" ]; then + cd ${INSTALLPATH}/${USRLOCAL}/share/licenses + for file in * + do + ln -Ffhs ${INSTALLPATH}/${USRLOCAL}/share/licenses/${file} ${USRLOCAL}/share/licenses/${file} + done + fi + + # Link bastile config file directory. + if [ -d "${INSTALLPATH}/${USRLOCAL}/etc/${APPNAME}" ]; then + ln -Ffhs ${INSTALLPATH}/${USRLOCAL}/etc/${APPNAME} ${USRLOCAL}/etc/${APPNAME} + fi + + # Link bastile config file. + if [ -f "${INSTALLPATH}/${USRLOCAL}/etc/${APPNAME}/${APPNAME}.conf.sample" ]; then + cd ${INSTALLPATH}/${USRLOCAL}/etc/${APPNAME} + if [ ! -f "${APPNAME}.conf" ]; then + cp ${APPNAME}.conf.sample ${APPNAME}.conf + fi + fi + + # Copy bastille shared. + if [ -d "${INSTALLPATH}/${USRLOCAL}/share/${APPNAME}" ]; then + ln -Ffhs ${INSTALLPATH}/${USRLOCAL}/share/${APPNAME} ${USRLOCAL}/share/${APPNAME} + fi + + # Copy bastille rc. + if [ -f "${INSTALLPATH}/${USRLOCAL}/etc/rc.d/${APPNAME}" ]; then + cp ${INSTALLPATH}/${USRLOCAL}/etc/rc.d/${APPNAME} ${USRLOCAL}/etc/rc.d/${APPNAME} + fi +} + +postinit_cmd() +{ + # Check and generate temporary php script for postinit command. + if ! grep -qw ${CWDIR}/${SCRIPTNAME} ${CONFIG}; then + touch ${CWDIR}/postinit || error_notify "Error: A problem has occurred while creating the postinit file." + chmod +x ${CWDIR}/postinit + if [ ! "${PRDVERSION}" -ge "110" ]; then + # Generate php script for NAS4Free 10.3 versions. + cat << EOF > ${CWDIR}/postinit + +EOF + else + # Generate php script for NAS4Free/XigmaNAS 11.x versions. + cat << EOF > ${CWDIR}/postinit + +EOF + fi + + # Execute temporary php script. + if [ "${OBI_INSTALL}" != "ON" ]; then + echo "Creating postinit command..." + php-cgi -f ${CWDIR}/postinit && rm ${CWDIR}/postinit || \ + error_notify "Error: A problem has occurred while executing postinit file." + echo "Done!" + fi + + # Set extension to disable by default. + sysrc -f ${CWDIR}${EXTCONF} GUI_ENABLE=YES INSTALL_DIR=${CWDIR} >/dev/null 2>&1 + fi +} + +gui_start() +{ + # Initialize the extension gui. + if [ -d "${CWDIR}/gui" ]; then + # Always ensure the config directory/file exist. + if [ ! -f "${CWDIR}${EXTCONF}" ]; then + # Try to restore default configuration. + runtime_config + # Set default config. + sysrc -f ${CWDIR}${EXTCONF} GUI_ENABLE=YES INSTALL_DIR=${CWDIR} >/dev/null 2>&1 + fi + GUI_STATUS=$(sysrc -f ${CWDIR}${EXTCONF} -qn GUI_ENABLE) + if [ "${GUI_STATUS}" = "YES" ]; then + # Store the installation path and link conf. + if ! sysrc -f ${CWDIR}${EXTCONF} -n INSTALL_DIR | grep -q "${CWDIR}"; then + sysrc -f ${CWDIR}${EXTCONF} INSTALL_DIR=${CWDIR} >/dev/null 2>&1 + fi + mkdir -p ${BASTILLECONFLINK} + ln -Ffhs ${CWDIR}/conf ${BASTILLECONFLINK}/conf + # Copy the gui files. + cp -R ${CWDIR}/gui/* ${WWWPATH}/ || error_notify "Error: A problem has occurred while copying extension gui files." + fi + fi +} + +gui_enable() +{ + # Relink conf and copy the gui files. + if [ -d "${CWDIR}/gui" ]; then + mkdir -p ${BASTILLECONFLINK} + ln -Ffhs ${CWDIR}/conf ${BASTILLECONFLINK}/conf + 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." + exit 0 + else + error_notify "Error: Extension gui files not found." + fi +} + +gui_disable() +{ + # Disable gui if -t option specified. + if [ -d "${CWDIR}/gui" ]; then + rm -f ${WWWPATH}bastille-gui.php + rm -Rf ${WWWPATH}/ext/bastille-gui + rm -f ${LOCALSHAREPATH}/locale-bastille + rm -Rf ${BASTILLECONFLINK} + sysrc -f ${CWDIR}${EXTCONF} GUI_ENABLE=NO >/dev/null 2>&1 || error_notify "Error: A problem while removing extension gui files." + exit 0 + else + error_notify "Error: Extension gui files not found." + fi + + # Remove empty ext folder to prevent empty "Extensions" tab. + if [ -d "${WWWPATH}/ext" ]; then + if [ ! "$(ls -A ${WWWPATH}/ext)" ]; then + rm -R ${WWWPATH}/ext + fi + fi +} + +pkg_upgrade() +{ + # Re-fetch bastille package and extract. + if [ -f "${CWDIR}/${FULLAPPNAME}/${BASTILLEPATH}/${APPNAME}" ]; then + bastille_upgrade + else + bastille_initial_download + fi + + # Check for extension updates. + #extension_upgrade +} + +reset_install() +{ + # Reset the extension environment. + echo "Removing extension files..." + if [ -d ${CWDIR}/conf ]; then + rm -rf ${CWDIR}/conf + fi + if [ -d ${CWDIR}/${FULLAPPNAME} ]; then + rm -rf ${CWDIR}/${FULLAPPNAME} + fi + if [ -d ${CWDIR}/download ]; then + rm -rf ${CWDIR}/download + fi + if [ -f ${CWDIR}/version ]; then + rm -f ${CWDIR}/version + fi +} + +remove_addon() +{ + # Confirm for addon removal. + while : + do + read -p "Do you wish to proceed with the ${FULLAPPNAME} removal? [y/N]:" yn + case ${yn} in + [Yy]) break;; + [Nn]) exit 0;; + esac + done + echo "Proceeding..." + + # Check for working platform and remove symlinks. + if [ "${PRDPLATFORM}" = "x64-embedded" ]; then + if [ -d "${USRLOCAL}/share/licenses/${APPNAME}-*" ]; then + rm -rf ${USRLOCAL}/share/licenses/${APPNAME}-* + fi + if [ -d ${USRLOCAL}/share/locale-bastille ]; then + rm -rf ${USRLOCAL}/share/locale-bastille + fi + if [ -f "${USRLOCAL}/etc/rc.d/${APPNAME}" ]; then + rm -f ${USRLOCAL}/etc/rc.d/${APPNAME} + fi + if [ -f "${USRLOCAL}/etc/${APPNAME}.conf" ]; then + rm -f ${USRLOCAL}/etc/${APPNAME}.conf + fi + if [ -f "${USRLOCAL}/sbin/${APPNAME}-init" ]; then + rm -rf ${USRLOCAL}/sbin/${APPNAME}-init + fi + if [ -d "${VARLOG}/${APPNAME}" ]; then + rm -rf ${VARLOG}/${APPNAME} + fi + elif [ "${PRDPLATFORM}" = "x64-full" ]; then + pkg delete -y ${APPNAME} + fi + + # Remove extension and GUI components. + if [ -f "${WWWPATH}/${APPNAME}-gui.php" ]; then + rm -f ${WWWPATH}/${APPNAME}-gui.php + fi + if [ -d "${WWWPATH}/ext/bastille-gui" ]; then + rm -rf ${WWWPATH}/ext/bastille-gui + fi + if [ -f ${USRLOCAL}/bin/${APPNAME} ]; then + rm -rf ${USRLOCAL}/bin/${APPNAME} + fi + if [ -d ${VARLOG}/${APPNAME} ]; then + rm -rf ${VARLOG}/${APPNAME} + fi + + # Remove empty ext folder to prevent empty "Extensions" tab. + if [ -d "${WWWPATH}/ext" ]; then + if [ ! "$(ls -A ${WWWPATH}/ext)" ]; then + rm -R ${WWWPATH}/ext + fi + fi + + # Remove addon related files and folders only- + # to protect any user-created custom files. + FILES="conf download gui locale-bastille log bastille-addon README.md postinit release_notes version bastille-init" + for file in ${FILES}; do + if [ -f ${CWDIR}/${file} ] || [ -d ${CWDIR}/${file} ]; then + rm -rf ${CWDIR}/${file} + fi + done + + echo "Done!" + echo "Please manually remove the Bastile Extension Command Script from the WebGUI." + exit 0 +} + +get_versions() +{ + # Get bastille-addon extension version. + if [ -f "${CWDIR}/version" ]; then + APPVERSION=$(cat ${CWDIR}/version) + else + APPVERSION="version file not found!" + fi + + # Display product versions. + BASTILLEVER=$(${USRLOCAL}/bin/bastille --version) + echo "Bastille version: ${BASTILLEVER}" + + echo "Extension version: ${APPVERSION}" + exit 0 +} + +ext_start() +{ + # Start bastille jails. + JAIL_AUTO_START=$(sysrc -qn bastille_enable) + if [ "${JAIL_AUTO_START}" = "YES" ]; then + service bastille start + fi + + if [ $? -eq 0 ]; then + MSG="script has been started successfully!" + logger -t ${SCRIPTNAME} ${MSG} + exit 0 + else + MSG="script started with faults!" + logger -t ${SCRIPTNAME} ${MSG} + exit 1 + fi +} + +rc_params() +{ + # Bastille rc parameters. + if ! sysrc -f ${BASTILLECONF} -qn bastille_prefix | grep -q "${CWDIR}"; then + sysrc -f ${BASTILLECONF} bastille_prefix="${CWDIR}" >/dev/null 2>&1 + fi + + # Default network interface. + ACTIVE_NETIF=$(ifconfig | grep "UP,BROADCAST" | awk -F":" '{print $1}') + if ! sysrc -f ${BASTILLECONF} -qn bastille_jail_external >/dev/null 2>&1; then + echo "" >> ${BASTILLECONF} && echo "## default network interface" >> ${BASTILLECONF} + sysrc -f ${BASTILLECONF} bastille_jail_external="${ACTIVE_NETIF}" >/dev/null 2>&1 + else + BLANK_NETIF=$(sysrc -f ${BASTILLECONF} -qn bastille_jail_external) + if [ -z "${BLANK_NETIF}" ]; then + echo "" >> ${BASTILLECONF} && echo "## default network interface" >> ${BASTILLECONF} + sysrc -f ${BASTILLECONF} bastille_jail_external="${ACTIVE_NETIF}" >/dev/null 2>&1 + fi + fi + + # Start all jails by default. + if ! sysrc -qn bastille_enable >/dev/null 2>&1; then + sysrc bastille_enable="YES" >/dev/null 2>&1 + fi +} + +bastille_init() +{ + # Check for system compatibility. + if [ ! "${PLATFORM}" = "amd64" ]; then + echo "Unsupported platform!"; exit 1 + fi + # Check for product compatibility. + if [ ! "${PRDVERSION}" -ge "110" ]; then + echo "Unsupported version!"; exit 1 + fi + + echo "Initializing ${APPNAME}..." + + # Function calls. + platform_check + postinit_cmd + gui_start + rc_params + ext_start + +} + +# Run-time configuration. +runtime_config + +while getopts ":ouxRvgth" option; do + case ${option} in + [h]) echo "Usage: ${SCRIPTNAME} -[option]"; + echo "Options:" + echo " -u Upgrade ${PRDNAME}/Extension packages." + echo " -v Display product versions." + echo " -g Enables the addon GUI." + echo " -t Disable the addon GUI." + echo " -x Reset ${PRDNAME}/Extension config." + echo " -R Remove ${PRDNAME}." + echo " -h Display this help message."; exit 0;; + [o]) OBI_INSTALL="ON";; # To prevent nested PHP-CGI call for installation with OBI. + [u]) pkg_upgrade;; + [x]) reset_install;; + [R]) remove_addon;; + [v]) get_versions;; + [g]) gui_enable; exit 0 ;; # For enable the addon gui. + [t]) gui_disable; exit 0 ;; # For disable the addon gui. + [?]) echo "Invalid option, -h for usage."; exit 1;; + esac +done +bastille_init diff --git a/gui/bastille-gui.php b/gui/bastille-gui.php new file mode 100644 index 0000000..a07688e --- /dev/null +++ b/gui/bastille-gui.php @@ -0,0 +1,229 @@ +. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. + + 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("guiconfig.inc"); + +$application = "Bastille"; +$pgtitle = array(gtext("Extensions"), "Bastille"); + +// For NAS4Free 10.x versions. +$return_val = mwexec("/bin/cat /etc/prd.version | cut -d'.' -f1 | /usr/bin/grep '10'", true); +if ($return_val == 0) { + if (is_array($config['rc']['postinit'] ) && is_array( $config['rc']['postinit']['cmd'] ) ) { + for ($i = 0; $i < count($config['rc']['postinit']['cmd']);) { if (preg_match('/bastille-init/', $config['rc']['postinit']['cmd'][$i])) break; ++$i; } + } +} + +// Initialize some variables. +//$rootfolder = dirname($config['rc']['postinit']['cmd'][$i]); +$confdir = "/var/etc/bastilleconf"; +$cwdir = exec("/usr/bin/grep 'INSTALL_DIR=' {$confdir}/conf/bastille_config | 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"; +$prdname = "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(isset($_POST['upgrade']) && $_POST['upgrade']): + $cmd = sprintf('%1$s/bastille-init -u > %2$s',$rootfolder,$logevent); + $return_val = 0; + $output = []; + exec($cmd,$output,$return_val); + if($return_val == 0): + ob_start(); + include("{$logevent}"); + $ausgabe = ob_get_contents(); + ob_end_clean(); + $savemsg .= str_replace("\n", "
", $ausgabe)."
"; + else: + $input_errors[] = gtext('An error has occurred during upgrade process.'); + $cmd = sprintf('echo %s: %s An error has occurred during upgrade process. >> %s',$date,$application,$logfile); + exec($cmd); + endif; + endif; + + // Remove only extension related files during cleanup. + if (isset($_POST['uninstall']) && $_POST['uninstall']) { + bindtextdomain("xigmanas", $textdomain); + if (is_link($textdomain_bastille)) mwexec("rm -f {$textdomain_bastille}", true); + if (is_dir($confdir)) mwexec("rm -Rf {$confdir}", true); + mwexec("rm /usr/local/www/bastille-gui.php && rm -R /usr/local/www/ext/bastille-gui", true); + mwexec("{$rootfolder}/bastille-init -t", true); + $uninstall_cmd = "echo 'y' | bastille-init -R"; + mwexec($uninstall_cmd, true); + if (is_link("/usr/local/share/{$prdname}")) mwexec("rm /usr/local/share/{$prdname}", 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); + + // Remove postinit cmd in NAS4Free 10.x versions. + $return_val = mwexec("/bin/cat /etc/prd.version | cut -d'.' -f1 | /usr/bin/grep '10'", true); + if ($return_val == 0) { + if (is_array($config['rc']['postinit']) && is_array($config['rc']['postinit']['cmd'])) { + for ($i = 0; $i < count($config['rc']['postinit']['cmd']);) { + if (preg_match('/bastille-init/', $config['rc']['postinit']['cmd'][$i])) { unset($config['rc']['postinit']['cmd'][$i]); } + ++$i; + } + } + write_config(); + } + + // Remove postinit cmd in NAS4Free later versions. + if (is_array($config['rc']) && is_array($config['rc']['param'])) { + $postinit_cmd = "{$rootfolder}/bastille-init"; + $value = $postinit_cmd; + $sphere_array = &$config['rc']['param']; + $updateconfigfile = false; + if (false !== ($index = array_search_ex($value, $sphere_array, 'value'))) { + unset($sphere_array[$index]); + $updateconfigfile = true; + } + if ($updateconfigfile) { + write_config(); + $updateconfigfile = false; + } + } + header("Location:index.php"); +} + +} + +function get_version_bastille() { + global $tarballversion, $prdname; + if (is_file("{$tarballversion}")) { + //exec("/bin/cat {$tarballversion}", $result); + exec("/usr/bin/grep 'BASTILLE_VERSION=' {$tarballversion} | cut -d'\"' -f2", $result); + return ($result[0]); + } + else { + exec("/usr/local/bin/{$prdname} version | awk 'NR==1'", $result); + return ($result[0]); + } +} + +function get_version_ext() { + global $versionfile; + exec("/bin/cat {$versionfile}", $result); + return ($result[0]); +} + +if (is_ajax()) { + $getinfo['bastille'] = get_version_bastille(); + $getinfo['ext'] = get_version_ext(); + render_ajax($getinfo); +} + +bindtextdomain("xigmanas", $textdomain); +include("fbegin.inc"); +bindtextdomain("xigmanas", $textdomain_bastille); +?> + + + + + +
+ + +
+ + + + + + + + + + + + + +
+
+ " value="" /> +
+ + + + + +
+
+ " value="" onclick="return confirm('')" /> +
+
+ +
+ + diff --git a/gui/ext/bastille-gui/menu.inc b/gui/ext/bastille-gui/menu.inc new file mode 100644 index 0000000..f98b809 --- /dev/null +++ b/gui/ext/bastille-gui/menu.inc @@ -0,0 +1 @@ +Bastille \ No newline at end of file diff --git a/release_notes b/release_notes new file mode 100644 index 0000000..21faf0d --- /dev/null +++ b/release_notes @@ -0,0 +1,7 @@ +====================== += Extension Bastille = +====================== +Version Description + +0.0.2......Added addon preview page. +0.0.1......First Release. diff --git a/version b/version new file mode 100644 index 0000000..7bcd0e3 --- /dev/null +++ b/version @@ -0,0 +1 @@ +0.0.2 \ No newline at end of file