diff --git a/.gitignore b/.gitignore index 723ef36..ef8482f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ -.idea \ No newline at end of file +.idea +/mock/ +/bin/ +/releases/ +/jails/ +/router.php +/debug_vars.php +/conf/bastille_config \ No newline at end of file diff --git a/gui/bastille_manager-lib.inc b/gui/bastille_manager-lib.inc index b15870d..d1345c2 100644 --- a/gui/bastille_manager-lib.inc +++ b/gui/bastille_manager-lib.inc @@ -46,8 +46,18 @@ $prdname = "bastille"; $application = "Bastille Manager"; $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; + +// Check for configuration file +$conf_file = "$confdir/conf/bastille_config"; +if (!file_exists($conf_file) && file_exists(__DIR__ . "/../conf/bastille_config")) { + $conf_file = __DIR__ . "/../conf/bastille_config"; +} + +$cwdir = exec("/usr/bin/grep 'INSTALL_DIR=' $conf_file | /usr/bin/cut -d'\"' -f2"); +if (!empty($cwdir)) { + $rootfolder = $cwdir; +} + $configfile = "$rootfolder/conf/bastille_config"; $configfile_bastille = "$rootfolder/bastille-dist/usr/local/etc/bastille/bastille.conf"; $versionfile = "$rootfolder/version"; @@ -55,20 +65,24 @@ $versionfile = "$rootfolder/version"; $date = date('D M d h:i:s Y', time()); // Equivalent date replacement for the previous strftime function. $logfile = "$rootfolder/log/bastille_ext.log"; $logevent = "$rootfolder/log/bastille_last_event.log"; -$backup_path = exec("/usr/bin/grep 'BACKUP_DIR=' $configfile | /usr/bin/cut -d'\"' -f2"); + +// Reuse $conf_file if it's our local one, otherwise use the standard greed +$grep_config = file_exists($configfile) ? $configfile : $conf_file; + +$backup_path = exec("/usr/bin/grep 'BACKUP_DIR=' $grep_config | /usr/bin/cut -d'\"' -f2"); $bastille_config = "$rootfolder/conf/bastille_config"; -$config_path = exec("/usr/bin/grep 'BASTILLE_CONFIG=' $configfile | /usr/bin/cut -d'\"' -f2"); +$config_path = exec("/usr/bin/grep 'BASTILLE_CONFIG=' $grep_config | /usr/bin/cut -d'\"' -f2"); $default_distfiles = exec("/usr/bin/grep 'bastille_bootstrap_archives=' $config_path | /usr/bin/cut -d'\"' -f2"); $jail_dir = "{$rootfolder}/jails"; $image_dir = "ext/bastille/images"; $reldir = "{$rootfolder}/releases"; $backup_path_bastille = exec("/usr/sbin/sysrc -f $rootfolder/bastille-dist/usr/local/etc/bastille/bastille.conf -qn bastille_backupsdir"); -$zfs_support = exec("/usr/bin/grep 'ZFS_SUPPORT=' $configfile | /usr/bin/cut -d'\"' -f2"); -$zfs_activated = exec("/usr/bin/grep 'ZFS_ACTIVATED=' $configfile | /usr/bin/cut -d'\"' -f2"); -$tarballversion = "/usr/local/bin/bastille"; +$zfs_support = exec("/usr/bin/grep 'ZFS_SUPPORT=' $grep_config | /usr/bin/cut -d'\"' -f2"); +$zfs_activated = exec("/usr/bin/grep 'ZFS_ACTIVATED=' $grep_config | /usr/bin/cut -d'\"' -f2"); +if (!isset($tarballversion)) $tarballversion = "/usr/local/bin/bastille"; $bastille_version_min = exec("grep 'BASTILLE_VERSION=' $tarballversion | cut -d '\"' -f2 | tr -d '.'"); $host_version = exec("/bin/cat /etc/prd.version | tr -d '.'"); -$linux_compat_support = exec("/usr/bin/grep 'LINUX_COMPAT_SUPPORT=' $configfile | /usr/bin/cut -d'\"' -f2"); +$linux_compat_support = exec("/usr/bin/grep 'LINUX_COMPAT_SUPPORT=' $grep_config | /usr/bin/cut -d'\"' -f2"); $jail_settings = "settings.conf"; // Ensure the root directory is configured. @@ -146,7 +160,7 @@ function get_state_zfs() { function get_all_release_list() { global $rootfolder; global $g; - exec("/bin/echo; /bin/ls {$rootfolder}/releases | grep RELEASE 2>/dev/null | /usr/bin/tr -s ' ' '\n'",$relinfo); + exec("/bin/echo; /bin/ls {$rootfolder}/releases | /usr/bin/tr -s ' ' '\n'",$relinfo); array_shift($relinfo); $rellist = []; foreach($relinfo as $rel): diff --git a/gui/bastille_manager_add.php b/gui/bastille_manager_add.php index cb11c48..db3c661 100644 --- a/gui/bastille_manager_add.php +++ b/gui/bastille_manager_add.php @@ -3,7 +3,7 @@ bastille_manager_add.php Copyright (c) 2019-2026 José Rivera (joserprg@gmail.com). - All rights reserved. + All rights reserved. Portions of XigmaNAS® (https://www.xigmanas.com). Copyright (c) 2018 XigmaNAS® . @@ -14,13 +14,13 @@ 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. + 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. + 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. + 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 @@ -42,118 +42,120 @@ require_once("bastille_manager-lib.inc"); $pgtitle = array(gtext("Extensions"), "Bastille", "Create"); $pconfig = []; +$errormsg = ""; -if(!(isset($pconfig['jailname']))): +if (!(isset($pconfig['jailname']))): $pconfig['jailname'] = 'jail1'; endif; -if(!(isset($pconfig['ipaddress']))): +if (!(isset($pconfig['ipaddress']))): $pconfig['ipaddress'] = ''; endif; -if(!get_all_release_list()): +if (!get_all_release_list()): $errormsg = gtext('No base releases extracted yet.') - . ' ' - . '' - . gtext('Please download a base release first.') - . ''; - $prerequisites_ok = false; + . ' ' + . '' + . gtext('Please download a base release first.') + . ''; + $prerequisites_ok = false; endif; $zfs_status = get_state_zfs(); -if($zfs_status == "Invalid ZFS configuration"): +if ($zfs_status == "Invalid ZFS configuration"): // Warning if invalid ZFS configuration. $input_errors[] = gtext("WARNING: Invalid ZFS configuration detected."); endif; -if($_POST): +if ($_POST): global $jail_dir; global $configfile; unset($input_errors); $pconfig = $_POST; - if(isset($_POST['Cancel']) && $_POST['Cancel']): + if (isset($_POST['Cancel']) && $_POST['Cancel']): header('Location: bastille_manager_gui.php'); exit; endif; - if(isset($_POST['Create']) && $_POST['Create']): + if (isset($_POST['Create']) && $_POST['Create']): $zfs_status = get_state_zfs(); - if($zfs_status == "Invalid ZFS configuration"): + if ($zfs_status == "Invalid ZFS configuration"): // Abort jail creation if invalid ZFS configuration. $input_errors[] = gtext("Cannot create jail with an invalid ZFS configuration."); else: - $jname = $pconfig['jailname']; - $ipaddr = $pconfig['ipaddress']; - $release = $pconfig['release']; - $resolv_conf = "{$jail_dir}/{$jname}/root/etc/resolv.conf"; - $resolv_host = "/var/etc/resolv.conf"; - $options = ""; - if ($_POST['interface'] == 'Config'): - $interface = ""; - else: - $interface = $pconfig['interface']; - endif; - - if($release == 'Ubuntu_1804'): - $release = "ubuntu-bionic"; - elseif($release == 'Ubuntu_2004'): - $release = "ubuntu-focal"; - elseif($release == 'Ubuntu_2204'): - $release = "ubuntu-jammy"; - elseif($release == 'Debian9'): - $release = "debian-stretch"; - elseif($release == 'Debian10'): - $release = "debian-buster"; - elseif($release == 'Debian12'): - $release = "debian-bookworm"; - endif; - - if(isset($_POST['thickjail']) && isset($_POST['vnetjail'])): - $options = "-T -V"; - elseif(isset($_POST['thickjail']) && isset($_POST['bridgejail'])): - $options = "-T -B"; - elseif(isset($_POST['thickjail'])): - $options = "-T"; - elseif(isset($_POST['vnetjail'])): - $options = "-V"; - elseif(isset($_POST['bridgejail'])): - $options = "-B"; - elseif(isset($_POST['linuxjail'])): - $options = "-L"; - endif; - - if(isset($_POST['emptyjail'])): - // Just create an empty container with minimal jail.conf. - $cmd = ("/usr/local/bin/bastille create -E {$jname}"); - else: - if (isset($_POST['autostart'])): - $cmd = ("/usr/local/bin/bastille create {$options} {$jname} {$release} {$ipaddr} {$interface}"); + $jname = $pconfig['jailname']; + $ipaddr = $pconfig['ipaddress']; + $release = $pconfig['release']; + $resolv_conf = "{$jail_dir}/{$jname}/root/etc/resolv.conf"; + $resolv_host = "/var/etc/resolv.conf"; + $options = ""; + if ($_POST['interface'] == 'Config'): + $interface = ""; else: - $cmd = ("/usr/local/bin/bastille create --no-boot {$options} {$jname} {$release} {$ipaddr} {$interface}"); + $interface = $pconfig['interface']; endif; - endif; - if ($_POST['Create']): - if(get_all_release_list()): - unset($output,$retval);mwexec2($cmd,$output,$retval); - if($retval == 0): - //if (isset($_POST['autostart'])): - // exec("/usr/sbin/sysrc -f {$configfile} {$jname}_AUTO_START=\"YES\""); - //endif; - if(is_link($resolv_conf)): - if(unlink($resolv_conf)): - //exec("/usr/local/bin/bastille cp $jname $resolv_host etc"); - copy($resolv_host, $resolv_conf); - endif; - endif; - header('Location: bastille_manager_gui.php'); - exit; + if ($release == 'Ubuntu_1804'): + $release = "ubuntu-bionic"; + elseif ($release == 'Ubuntu_2004'): + $release = "ubuntu-focal"; + elseif ($release == 'Ubuntu_2204'): + $release = "ubuntu-jammy"; + elseif ($release == 'Debian9'): + $release = "debian-stretch"; + elseif ($release == 'Debian10'): + $release = "debian-buster"; + elseif ($release == 'Debian12'): + $release = "debian-bookworm"; + endif; + + if (isset($_POST['thickjail']) && isset($_POST['vnetjail'])): + $options = "-T -V"; + elseif (isset($_POST['thickjail']) && isset($_POST['bridgejail'])): + $options = "-T -B"; + elseif (isset($_POST['thickjail'])): + $options = "-T"; + elseif (isset($_POST['vnetjail'])): + $options = "-V"; + elseif (isset($_POST['bridgejail'])): + $options = "-B"; + elseif (isset($_POST['linuxjail'])): + $options = "-L"; + endif; + + if (isset($_POST['emptyjail'])): + // Just create an empty container with minimal jail.conf. + $cmd = ("/usr/local/bin/bastille create -E {$jname}"); + else: + if (isset($_POST['autostart'])): + $cmd = ("/usr/local/bin/bastille create {$options} {$jname} {$release} {$ipaddr} {$interface}"); else: - $errormsg .= gtext("Failed to create container."); + $cmd = ("/usr/local/bin/bastille create --no-boot {$options} {$jname} {$release} {$ipaddr} {$interface}"); + endif; + endif; + + if ($_POST['Create']): + if (get_all_release_list()): + unset($output, $retval); + mwexec2($cmd, $output, $retval); + if ($retval == 0): + //if (isset($_POST['autostart'])): + // exec("/usr/sbin/sysrc -f {$configfile} {$jname}_AUTO_START=\"YES\""); + //endif; + if (is_link($resolv_conf)): + if (unlink($resolv_conf)): + //exec("/usr/local/bin/bastille cp $jname $resolv_host etc"); + copy($resolv_host, $resolv_conf); + endif; + endif; + header('Location: bastille_manager_gui.php'); + exit; + else: + $errormsg .= gtext("Failed to create container."); + endif; + else: + $errormsg .= gtext(" <<< Failed to create container."); endif; - else: - $errormsg .= gtext(" <<< Failed to create container."); endif; - endif; endif; endif; @@ -162,196 +164,204 @@ endif; include 'fbegin.inc'; ?> 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); + 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(); ?> -
- - - - - - - - - + +
- "0700000000"): - html_checkbox2('thickjail',gettext('Create a thick container'),!empty($pconfig['thickjail']) ? true : false,gettext('These containers consume more space, but are self contained and fully independent.'),'',false); - if($host_version > "12100"): - html_checkbox2('vnetjail',gettext('Enable VNET(VIMAGE)'),!empty($pconfig['vnetjail']) ? true : false,gettext('VNET-enabled containers are attached to a virtual bridge interface for connectivity(Only supported on 13.x and above).'),'',false,false,'vnetjail_change()'); - html_checkbox2('bridgejail',gettext('Enable Bridge VNET(VIMAGE)'),!empty($pconfig['bridgejail']) ? true : false,gettext('Bridge VNET-enabled containers are attached to a specified, already existing external bridge(Only supported on 13.x and above).'),'',false,false,'bridgejail_change()'); - endif; - html_checkbox2('emptyjail',gettext('Create an empty container'),!empty($pconfig['emptyjail']) ? true : false,gettext('This are ideal for custom builds, experimenting with unsupported RELEASES or Linux jails.'),'',false,false,'emptyjail_change()'); - if($linux_compat_support == "YES"): - //html_checkbox2('linuxjail',gettext('Create a Linux container'),!empty($pconfig['linuxjail']) ? true : false,gettext('This will create a Linux container, this is highly experimental and for testing purposes.'),'',false,false,'linuxjail_change()'); - endif; - endif; - //html_checkbox2('nowstart',gettext('Start after creation'),!empty($pconfig['nowstart']) ? true : false,gettext('Start the container after creation(May be overridden by later bastille releases).'),'',false); - html_checkbox2('autostart',gettext('Auto start on boot'),!empty($pconfig['autostart']) ? true : false,gettext('Automatically start the container at boot time.'),'',false); -?> + + +
+ + + + + + + + + + + "0700000000"): + html_checkbox2('thickjail', gettext('Create a thick container'), !empty($pconfig['thickjail']) ? true : false, gettext('These containers consume more space, but are self contained and fully independent.'), '', false); + if ($host_version > "12100"): + html_checkbox2('vnetjail', gettext('Enable VNET(VIMAGE)'), !empty($pconfig['vnetjail']) ? true : false, gettext('VNET-enabled containers are attached to a virtual bridge interface for connectivity(Only supported on 13.x and above).'), '', false, false, 'vnetjail_change()'); + html_checkbox2('bridgejail', gettext('Enable Bridge VNET(VIMAGE)'), !empty($pconfig['bridgejail']) ? true : false, gettext('Bridge VNET-enabled containers are attached to a specified, already existing external bridge(Only supported on 13.x and above).'), '', false, false, 'bridgejail_change()'); + endif; + html_checkbox2('emptyjail', gettext('Create an empty container'), !empty($pconfig['emptyjail']) ? true : false, gettext('This are ideal for custom builds, experimenting with unsupported RELEASES or Linux jails.'), '', false, false, 'emptyjail_change()'); + if ($linux_compat_support == "YES"): + html_checkbox2('linuxjail', gettext('Create a Linux container'), !empty($pconfig['linuxjail']) ? true : false, gettext('This will create a Linux container, this is highly experimental and for testing purposes.'), '', false, false, 'linuxjail_change()'); + endif; + endif; + //html_checkbox2('nowstart',gettext('Start after creation'),!empty($pconfig['nowstart']) ? true : false,gettext('Start the container after creation(May be overridden by later bastille releases).'),'',false); + html_checkbox2('autostart', gettext('Auto start on boot'), !empty($pconfig['autostart']) ? true : false, gettext('Automatically start the container at boot time.'), '', false); + ?> + +
+
+ + +
+ +
-
- - -
- -
+ +?> \ No newline at end of file