"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "lib/BackupPC/CGI/EditConfig.pm" between
BackupPC-4.3.2.tar.gz and BackupPC-4.4.0.tar.gz

About: BackupPC is a high-performance, enterprise-grade system for backing up Linux and WinXX PCs and laptops to a server’s disk (http/cgi user interface).

EditConfig.pm  (BackupPC-4.3.2):EditConfig.pm  (BackupPC-4.4.0)
skipping to change at line 30 skipping to change at line 30
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
#======================================================================== #========================================================================
# #
# Version 4.3.2, released 17 Feb 2020. # Version 4.4.0, released 20 Jun 2020.
# #
# See http://backuppc.sourceforge.net. # See http://backuppc.sourceforge.net.
# #
#======================================================================== #========================================================================
package BackupPC::CGI::EditConfig; package BackupPC::CGI::EditConfig;
use strict; use strict;
use BackupPC::CGI::Lib qw(:all); use BackupPC::CGI::Lib qw(:all);
use BackupPC::Config::Meta qw(:all); use BackupPC::Config::Meta qw(:all);
skipping to change at line 68 skipping to change at line 68
{text => "CfgEdit_Title_Wakeup_Schedule"}, {text => "CfgEdit_Title_Wakeup_Schedule"},
{name => "WakeupSchedule"}, {name => "WakeupSchedule"},
{text => "CfgEdit_Title_Concurrent_Jobs"}, {text => "CfgEdit_Title_Concurrent_Jobs"},
{name => "MaxBackups"}, {name => "MaxBackups"},
{name => "MaxUserBackups"}, {name => "MaxUserBackups"},
{name => "MaxPendingCmds"}, {name => "MaxPendingCmds"},
{name => "MaxBackupPCNightlyJobs"}, {name => "MaxBackupPCNightlyJobs"},
{name => "BackupPCNightlyPeriod"}, {name => "BackupPCNightlyPeriod"},
{name => "PoolSizeNightlyUpdatePeriod"}, {name => "PoolSizeNightlyUpdatePeriod"},
{name => "PoolNightlyDigestCheckPercent"},
{text => "CfgEdit_Title_Pool_Filesystem_Limits"}, {text => "CfgEdit_Title_Pool_Filesystem_Limits"},
{name => "DfCmd"}, {name => "DfCmd"},
{name => "DfMaxUsagePct"}, {name => "DfMaxUsagePct"},
{name => "DfInodeUsageCmd"}, {name => "DfInodeUsageCmd"},
{name => "DfMaxInodeUsagePct"}, {name => "DfMaxInodeUsagePct"},
{name => "HardLinkMax"}, {name => "HardLinkMax"},
{text => "CfgEdit_Title_Other_Parameters"}, {text => "CfgEdit_Title_Other_Parameters"},
{name => "UmaskMode"}, {name => "UmaskMode"},
{name => "MyPath"}, {name => "MyPath"},
{name => "DHCPAddressRanges"}, {name => "DHCPAddressRanges"},
{name => "CmdQueueNice"}, {name => "CmdQueueNice"},
{name => "PerlModuleLoad"}, {name => "PerlModuleLoad"},
{name => "ServerInitdPath"}, {name => "ServerInitdPath"},
{name => "ServerInitdStartCmd"}, {name => "ServerInitdStartCmd"},
{text => "CfgEdit_Title_Remote_Apache_Settings"}, {text => "CfgEdit_Title_Remote_Apache_Settings"},
{name => "ServerPort"}, {name => "ServerPort"},
{name => "ServerMesgSecret"}, {name => "ServerMesgSecret"},
{text => "CfgEdit_Title_Program_Paths"}, {text => "CfgEdit_Title_Program_Paths"},
{name => "SshPath"}, {name => "SshPath"},
{name => "NmbLookupPath"}, {name => "NmbLookupPath"},
{name => "PingPath"}, {name => "PingPath"},
{name => "Ping6Path"}, {name => "Ping6Path"},
{name => "DfPath"}, {name => "DfPath"},
{name => "SplitPath"}, {name => "SplitPath"},
{name => "ParPath"}, {name => "ParPath"},
{name => "CatPath"}, {name => "CatPath"},
{name => "GzipPath"}, {name => "GzipPath"},
{name => "Bzip2Path"}, {name => "Bzip2Path"},
{name => "RrdToolPath"}, {name => "RrdToolPath"},
{text => "CfgEdit_Title_Install_Paths"}, {text => "CfgEdit_Title_Install_Paths"},
# #
# Can only edit TopDir and LogDir if we are in FHS mode. # Can only edit TopDir and LogDir if we are in FHS mode.
# Otherwise they are hardcoded in lib/BackupPC/Lib.pm. # Otherwise they are hardcoded in lib/BackupPC/Lib.pm.
# #
{name => "TopDir", {
visible => sub { return $_[1]->useFHS(); } }, name => "TopDir",
{name => "LogDir", visible => sub { return $_[1]->useFHS(); }
visible => sub { return $_[1]->useFHS(); } }, },
{name => "RunDir", {
visible => sub { return $_[1]->useFHS(); } }, name => "LogDir",
{name => "CgiDir"}, visible => sub { return $_[1]->useFHS(); }
},
{
name => "RunDir",
visible => sub { return $_[1]->useFHS(); }
},
{name => "CgiDir"},
# #
# Cannot edit ConfDir or InstallDir, since the real value is hardcod ed in # Cannot edit ConfDir or InstallDir, since the real value is hardcod ed in
# lib/BackupPC/Lib.pm. # lib/BackupPC/Lib.pm.
# {name => "ConfDir"}, # {name => "ConfDir"},
# {name => "InstallDir"}, # {name => "InstallDir"},
# #
], ],
}, },
email => { email => {
text => "CfgEdit_Title_Email", text => "CfgEdit_Title_Email",
param => [ param => [
{text => "CfgEdit_Title_Email_settings"}, {text => "CfgEdit_Title_Email_settings"},
{name => "SendmailPath"}, {name => "SendmailPath"},
{name => "EMailNotifyMinDays"}, {name => "EMailNotifyMinDays"},
{name => "EMailFromUserName"}, {name => "EMailFromUserName"},
{name => "EMailAdminUserName"}, {name => "EMailAdminUserName"},
{name => "EMailAdminSubject"}, {name => "EMailAdminSubject"},
{name => "EMailUserDestDomain"}, {name => "EMailUserDestDomain"},
{text => "CfgEdit_Title_Email_User_Messages"}, {text => "CfgEdit_Title_Email_User_Messages"},
{name => "EMailNoBackupEverSubj"}, {name => "EMailNoBackupEverSubj"},
{name => "EMailNoBackupEverMesg"}, {name => "EMailNoBackupEverMesg"},
{name => "EMailNotifyOldBackupDays"}, {name => "EMailNotifyOldBackupDays"},
{name => "EMailNoBackupRecentSubj"}, {name => "EMailNoBackupRecentSubj"},
{name => "EMailNoBackupRecentMesg"}, {name => "EMailNoBackupRecentMesg"},
{name => "EMailNotifyOldOutlookDays"}, {name => "EMailNotifyOldOutlookDays"},
{name => "EMailOutlookBackupSubj"}, {name => "EMailOutlookBackupSubj"},
{name => "EMailOutlookBackupMesg"}, {name => "EMailOutlookBackupMesg"},
{name => "EMailHeaders"}, {name => "EMailHeaders"},
], ],
}, },
cgi => { cgi => {
text => "CfgEdit_Title_CGI", text => "CfgEdit_Title_CGI",
param => [ param => [
{text => "CfgEdit_Title_Admin_Privileges"}, {text => "CfgEdit_Title_Admin_Privileges"},
{name => "CgiAdminUserGroup"}, {name => "CgiAdminUserGroup"},
{name => "CgiAdminUsers"}, {name => "CgiAdminUsers"},
{text => "CfgEdit_Title_Page_Rendering"}, {text => "CfgEdit_Title_Page_Rendering"},
{name => "Language"}, {name => "Language"},
{name => "CgiNavBarAdminAllHosts"}, {name => "CgiNavBarAdminAllHosts"},
{name => "CgiSearchBoxEnable"}, {name => "CgiSearchBoxEnable"},
{name => "CgiNavBarLinks"}, {name => "CgiNavBarLinks"},
{name => "CgiStatusHilightColor"}, {name => "CgiStatusHilightColor"},
{name => "CgiDateFormatMMDD"}, {name => "CgiDateFormatMMDD"},
{name => "CgiHeaders"}, {name => "CgiHeaders"},
{name => "CgiExt2ContentType"}, {name => "CgiExt2ContentType"},
{name => "CgiCSSFile"}, {name => "CgiCSSFile"},
{text => "CfgEdit_Title_Paths"}, {text => "CfgEdit_Title_Paths"},
{name => "SCGIServerPort"}, {name => "SCGIServerPort"},
{name => "CgiURL"}, {name => "CgiURL"},
{name => "CgiImageDir"}, {name => "CgiImageDir"},
{name => "CgiImageDirURL"}, {name => "CgiImageDirURL"},
{text => "CfgEdit_Title_User_URLs"}, {text => "CfgEdit_Title_User_URLs"},
{name => "CgiUserHomePageCheck"}, {name => "CgiUserHomePageCheck"},
{name => "CgiUserUrlCreate"}, {name => "CgiUserUrlCreate"},
{text => "CfgEdit_Title_User_Config_Editing"}, {text => "CfgEdit_Title_User_Config_Editing"},
{name => "CgiUserDeleteBackupEnable"}, {name => "CgiUserDeleteBackupEnable"},
{name => "CgiUserConfigEditEnable"}, {name => "CgiUserConfigEditEnable"},
{name => "CgiUserConfigEdit"}, {name => "CgiUserConfigEdit"},
], ],
}, },
xfer => { xfer => {
text => "CfgEdit_Title_Xfer", text => "CfgEdit_Title_Xfer",
param => [ param => [
{text => "CfgEdit_Title_Xfer_Settings"}, {text => "CfgEdit_Title_Xfer_Settings"},
{name => "XferMethod", onchangeSubmit => 1}, {name => "XferMethod", onchangeSubmit => 1},
{name => "XferLogLevel"}, {name => "XferLogLevel"},
{name => "ClientCharset"}, {name => "ClientCharset"},
{name => "ClientCharsetLegacy"}, {name => "ClientCharsetLegacy"},
{name => "ClientShareName2Path"}, {name => "ClientShareName2Path"},
{name => "RefCntFsck"}, {name => "RefCntFsck"},
### Smb Settings ### Smb Settings
{text => "CfgEdit_Title_Smb_Settings", {
visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, text => "CfgEdit_Title_Smb_Settings",
{name => "SmbShareName", visible => sub { return $_[0]->{XferMethod} eq "smb"; }
visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, },
{name => "SmbShareUserName", {
visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, name => "SmbShareName",
{name => "SmbSharePasswd", visible => sub { return $_[0]->{XferMethod} eq "smb"; }
visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, },
{
name => "SmbShareUserName",
visible => sub { return $_[0]->{XferMethod} eq "smb"; }
},
{
name => "SmbSharePasswd",
visible => sub { return $_[0]->{XferMethod} eq "smb"; }
},
### Tar Settings ### Tar Settings
{text => "CfgEdit_Title_Tar_Settings", {
visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, text => "CfgEdit_Title_Tar_Settings",
{name => "TarShareName", visible => sub { return $_[0]->{XferMethod} eq "tar"; }
visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, },
{
name => "TarShareName",
visible => sub { return $_[0]->{XferMethod} eq "tar"; }
},
### Rsync Settings ### Rsync Settings
{text => "CfgEdit_Title_Rsync_Settings", {
visible => sub { return $_[0]->{XferMethod} eq "rsync"; } }, text => "CfgEdit_Title_Rsync_Settings",
{text => "CfgEdit_Title_Rsyncd_Settings", visible => sub { return $_[0]->{XferMethod} eq "rsync"; }
visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; } }, },
{name => "RsyncShareName", {
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, text => "CfgEdit_Title_Rsyncd_Settings",
{name => "RsyncdUserName", visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; }
visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; } }, },
{name => "RsyncdPasswd", {
visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; } }, name => "RsyncShareName",
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; }
},
{
name => "RsyncdUserName",
visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; }
},
{
name => "RsyncdPasswd",
visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; }
},
### Ftp Settings ### Ftp Settings
{text => "CfgEdit_Title_Ftp_Settings", {
visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, text => "CfgEdit_Title_Ftp_Settings",
{name => "FtpShareName", visible => sub { return $_[0]->{XferMethod} eq "ftp"; }
visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, },
{name => "FtpUserName", {
visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, name => "FtpShareName",
{name => "FtpPasswd", visible => sub { return $_[0]->{XferMethod} eq "ftp"; }
visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, },
{name => "FtpPassive", {
visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, name => "FtpUserName",
{name => "FtpBlockSize", visible => sub { return $_[0]->{XferMethod} eq "ftp"; }
visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, },
{name => "FtpPort", {
visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, name => "FtpPasswd",
{name => "FtpTimeout", visible => sub { return $_[0]->{XferMethod} eq "ftp"; }
visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, },
{name => "FtpFollowSymlinks", {
visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, name => "FtpPassive",
visible => sub { return $_[0]->{XferMethod} eq "ftp"; }
},
{
name => "FtpBlockSize",
visible => sub { return $_[0]->{XferMethod} eq "ftp"; }
},
{
name => "FtpPort",
visible => sub { return $_[0]->{XferMethod} eq "ftp"; }
},
{
name => "FtpTimeout",
visible => sub { return $_[0]->{XferMethod} eq "ftp"; }
},
{
name => "FtpFollowSymlinks",
visible => sub { return $_[0]->{XferMethod} eq "ftp"; }
},
### Archive Settings ### Archive Settings
{text => "CfgEdit_Title_Archive_Settings", {
visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, text => "CfgEdit_Title_Archive_Settings",
{name => "ArchiveDest", visible => sub { return $_[0]->{XferMethod} eq "archive"; }
visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, },
{name => "ArchiveComp", {
visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, name => "ArchiveDest",
{name => "ArchivePar", visible => sub { return $_[0]->{XferMethod} eq "archive"; }
visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, },
{name => "ArchiveSplit", {
visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, name => "ArchiveComp",
visible => sub { return $_[0]->{XferMethod} eq "archive"; }
},
{
name => "ArchivePar",
visible => sub { return $_[0]->{XferMethod} eq "archive"; }
},
{
name => "ArchiveSplit",
visible => sub { return $_[0]->{XferMethod} eq "archive"; }
},
### Include/Exclude Settings ### Include/Exclude Settings
{text => "CfgEdit_Title_Include_Exclude", {
visible => sub { return $_[0]->{XferMethod} ne "archive"; } }, text => "CfgEdit_Title_Include_Exclude",
{name => "BackupFilesOnly", visible => sub { return $_[0]->{XferMethod} ne "archive"; }
visible => sub { return $_[0]->{XferMethod} ne "archive"; } }, },
{name => "BackupFilesExclude", {
visible => sub { return $_[0]->{XferMethod} ne "archive"; } }, name => "BackupFilesOnly",
visible => sub { return $_[0]->{XferMethod} ne "archive"; }
},
{
name => "BackupFilesExclude",
visible => sub { return $_[0]->{XferMethod} ne "archive"; }
},
### Samba paths and commands ### Samba paths and commands
{text => "CfgEdit_Title_Smb_Paths_Commands", {
visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, text => "CfgEdit_Title_Smb_Paths_Commands",
{name => "SmbClientPath", visible => sub { return $_[0]->{XferMethod} eq "smb"; }
visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, },
{name => "SmbClientFullCmd", {
visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, name => "SmbClientPath",
{name => "SmbClientIncrCmd", visible => sub { return $_[0]->{XferMethod} eq "smb"; }
visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, },
{name => "SmbClientRestoreCmd", {
visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, name => "SmbClientFullCmd",
visible => sub { return $_[0]->{XferMethod} eq "smb"; }
},
{
name => "SmbClientIncrCmd",
visible => sub { return $_[0]->{XferMethod} eq "smb"; }
},
{
name => "SmbClientRestoreCmd",
visible => sub { return $_[0]->{XferMethod} eq "smb"; }
},
### Tar paths and commands ### Tar paths and commands
{text => "CfgEdit_Title_Tar_Paths_Commands", {
visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, text => "CfgEdit_Title_Tar_Paths_Commands",
{name => "TarClientPath", visible => sub { return $_[0]->{XferMethod} eq "tar"; }
visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, },
{name => "TarClientCmd", {
visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, name => "TarClientPath",
{name => "TarFullArgs", visible => sub { return $_[0]->{XferMethod} eq "tar"; }
visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, },
{name => "TarIncrArgs", {
visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, name => "TarClientCmd",
{name => "TarClientRestoreCmd", visible => sub { return $_[0]->{XferMethod} eq "tar"; }
visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, },
{
name => "TarFullArgs",
visible => sub { return $_[0]->{XferMethod} eq "tar"; }
},
{
name => "TarIncrArgs",
visible => sub { return $_[0]->{XferMethod} eq "tar"; }
},
{
name => "TarClientRestoreCmd",
visible => sub { return $_[0]->{XferMethod} eq "tar"; }
},
### Rsync paths and commands ### Rsync paths and commands
{text => "CfgEdit_Title_Rsync_Paths_Commands_Args", {
visible => sub { return $_[0]->{XferMethod} eq "rsync"; } }, text => "CfgEdit_Title_Rsync_Paths_Commands_Args",
{text => "CfgEdit_Title_Rsyncd_Port_Args", visible => sub { return $_[0]->{XferMethod} eq "rsync"; }
visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; } }, },
{name => "RsyncBackupPCPath", {
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, text => "CfgEdit_Title_Rsyncd_Port_Args",
{name => "RsyncClientPath", visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; }
visible => sub { return $_[0]->{XferMethod} eq "rsync"; } }, },
{name => "RsyncSshArgs", {
visible => sub { return $_[0]->{XferMethod} eq "rsync"; } }, name => "RsyncBackupPCPath",
{name => "RsyncdClientPort", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; }
visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; } }, },
{name => "RsyncArgs", {
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, name => "RsyncClientPath",
{name => "RsyncArgsExtra", visible => sub { return $_[0]->{XferMethod} eq "rsync"; }
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, },
{name => "RsyncFullArgsExtra", {
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, name => "RsyncSshArgs",
{name => "RsyncIncrArgsExtra", visible => sub { return $_[0]->{XferMethod} eq "rsync"; }
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, },
{name => "RsyncRestoreArgs", {
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, name => "RsyncdClientPort",
visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; }
},
{
name => "RsyncArgs",
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; }
},
{
name => "RsyncArgsExtra",
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; }
},
{
name => "RsyncFullArgsExtra",
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; }
},
{
name => "RsyncIncrArgsExtra",
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; }
},
{
name => "RsyncRestoreArgs",
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; }
},
{
name => "RsyncRestoreArgsExtra",
visible => sub { return $_[0]->{XferMethod} =~ /rsync/; }
},
### Archive paths and commands ### Archive paths and commands
{text => "CfgEdit_Title_Archive_Paths_Commands", {
visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, text => "CfgEdit_Title_Archive_Paths_Commands",
{name => "ArchiveClientCmd", visible => sub { return $_[0]->{XferMethod} eq "archive"; }
visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, },
{
name => "ArchiveClientCmd",
visible => sub { return $_[0]->{XferMethod} eq "archive"; }
},
], ],
}, },
schedule => { schedule => {
text => "CfgEdit_Title_Schedule", text => "CfgEdit_Title_Schedule",
param => [ param => [
{text => "CfgEdit_Title_Full_Backups"}, {text => "CfgEdit_Title_Full_Backups"},
{name => "FullPeriod"}, {name => "FullPeriod"},
{name => "FillCycle"}, {name => "FillCycle"},
{name => "FullKeepCnt"}, {name => "FullKeepCnt"},
{name => "FullKeepCntMin"}, {name => "FullKeepCntMin"},
{name => "FullAgeMax"}, {name => "FullAgeMax"},
{text => "CfgEdit_Title_Incremental_Backups"}, {text => "CfgEdit_Title_Incremental_Backups"},
{name => "IncrPeriod"}, {name => "IncrPeriod"},
{name => "IncrKeepCnt"}, {name => "IncrKeepCnt"},
{name => "IncrKeepCntMin"}, {name => "IncrKeepCntMin"},
{name => "IncrAgeMax"}, {name => "IncrAgeMax"},
{text => "CfgEdit_Title_Blackouts"}, {text => "CfgEdit_Title_Blackouts"},
{name => "BackupsDisable"}, {name => "BackupsDisable"},
{name => "BlackoutBadPingLimit"}, {name => "BlackoutBadPingLimit"},
{name => "BlackoutGoodCnt"}, {name => "BlackoutGoodCnt"},
{name => "BlackoutPeriods"}, {name => "BlackoutPeriods"},
{text => "CfgEdit_Title_Other"}, {text => "CfgEdit_Title_Other"},
{name => "RestoreInfoKeepCnt"}, {name => "RestoreInfoKeepCnt"},
{name => "ArchiveInfoKeepCnt"}, {name => "ArchiveInfoKeepCnt"},
{name => "BackupZeroFilesIsFatal"}, {name => "BackupZeroFilesIsFatal"},
], ],
}, },
backup => { backup => {
text => "CfgEdit_Title_Backup_Settings", text => "CfgEdit_Title_Backup_Settings",
param => [ param => [
{text => "CfgEdit_Title_Client_Lookup"}, {text => "CfgEdit_Title_Client_Lookup"},
{name => "ClientNameAlias"}, {name => "ClientNameAlias"},
{name => "NmbLookupCmd"}, {name => "NmbLookupCmd"},
{name => "NmbLookupFindHostCmd"}, {name => "NmbLookupFindHostCmd"},
{name => "FixedIPNetBiosNameCheck"}, {name => "FixedIPNetBiosNameCheck"},
{name => "PingCmd"}, {name => "PingCmd"},
{name => "PingMaxMsec"}, {name => "PingMaxMsec"},
{text => "CfgEdit_Title_Other"}, {text => "CfgEdit_Title_Other"},
{name => "ClientComment"}, {name => "ClientComment"},
{name => "ClientTimeout"}, {name => "ClientTimeout"},
{name => "MaxOldPerPCLogFiles"}, {name => "MaxOldPerPCLogFiles"},
{name => "CompressLevel"}, {name => "CompressLevel"},
{text => "CfgEdit_Title_User_Commands"}, {text => "CfgEdit_Title_User_Commands"},
{name => "DumpPreUserCmd"}, {name => "DumpPreUserCmd"},
{name => "DumpPostUserCmd"}, {name => "DumpPostUserCmd"},
{name => "DumpPreShareCmd"}, {name => "DumpPreShareCmd"},
{name => "DumpPostShareCmd"}, {name => "DumpPostShareCmd"},
{name => "RestorePreUserCmd"}, {name => "RestorePreUserCmd"},
{name => "RestorePostUserCmd"}, {name => "RestorePostUserCmd"},
{name => "ArchivePreUserCmd"}, {name => "ArchivePreUserCmd"},
{name => "ArchivePostUserCmd"}, {name => "ArchivePostUserCmd"},
{name => "UserCmdCheckStatus"}, {name => "UserCmdCheckStatus"},
], ],
}, },
hosts => { hosts => {
text => "CfgEdit_Title_Hosts", text => "CfgEdit_Title_Hosts",
param => [ param => [
{text => "CfgEdit_Title_Hosts"}, {text => "CfgEdit_Title_Hosts"},
{name => "Hosts", {
comment => "CfgEdit_Hosts_Comment"}, name => "Hosts",
comment => "CfgEdit_Hosts_Comment"
},
], ],
}, },
); );
sub action sub action
{ {
my $pc_dir = "$TopDir/pc"; my $pc_dir = "$TopDir/pc";
my($content, $contentHidden, $newConf, $override, $mainConf, $hostConf); my($content, $contentHidden, $newConf, $override, $mainConf, $hostConf);
my $errors = {}; my $errors = {};
my $host = $In{host}; my $host = $In{host};
my $menu = $In{menu} || "server"; my $menu = $In{menu} || "server";
my $hosts_path = $Hosts; my $hosts_path = $Hosts;
my $config_path = $host eq "" ? "$TopDir/conf/config.pl" my $config_path =
: "$TopDir/pc/$host/config.pl"; $host eq ""
? "$TopDir/conf/config.pl"
: "$TopDir/pc/$host/config.pl";
my $Privileged = CheckPermission($host) my $Privileged = CheckPermission($host)
&& ($PrivAdmin || $Conf{CgiUserConfigEditEnable}); && ($PrivAdmin || $Conf{CgiUserConfigEditEnable});
my $userHost = 1 if ( defined($host) ); my $userHost = 1 if ( defined($host) );
$debugText = ""; $debugText = "";
if ( !$Privileged ) { if ( !$Privileged ) {
ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_edit_config_files}} ")); ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_edit_config_files}} "));
} }
if ( defined($In{menu}) || $In{saveAction} eq "Save" ) { if ( defined($In{menu}) || $In{saveAction} eq "Save" ) {
$errors = errorCheck(); $errors = errorCheck();
if ( %$errors ) { if ( %$errors ) {
# #
# If there are errors, then go back to the same menu # If there are errors, then go back to the same menu
# #
$In{saveAction} = ""; $In{saveAction} = "";
#$In{newMenu} = ""; #$In{newMenu} = "";
} }
if ( (my $var = $In{overrideUncheck}) ne "" ) { if ( (my $var = $In{overrideUncheck}) ne "" ) {
# #
# a compound variable was unchecked; delete or # a compound variable was unchecked; delete or
# add extra variables to make the shape the same. # add extra variables to make the shape the same.
# #
#print STDERR Dumper(\%In); #print STDERR Dumper(\%In);
foreach my $v ( sort(keys(%In)) ) { foreach my $v ( sort(keys(%In)) ) {
if ( $v =~ /^v_((zZ_|flds_)\Q$var\E(_zZ_.*|$))/ ) { if ( $v =~ /^v_((zZ_|flds_)\Q$var\E(_zZ_.*|$))/ ) {
delete($In{$v}) if ( !defined($In{"orig_$1"}) ); delete($In{$v}) if ( !defined($In{"orig_$1"}) );
} }
if ( $v =~ /^orig_((zZ_|flds_)\Q$var\E(_zZ_.*|$))/ ) { if ( $v =~ /^orig_((zZ_|flds_)\Q$var\E(_zZ_.*|$))/ ) {
$In{"v_$1"} = $In{$v}; $In{"v_$1"} = $In{$v};
} }
} }
#delete($In{"v_flds_$var"}); #delete($In{"v_flds_$var"});
} }
($newConf, $override) = inputParse($bpc, $userHost); ($newConf, $override) = inputParse($bpc, $userHost);
$override = undef if ( $host eq "" ); $override = undef if ( $host eq "" );
} else { } else {
# #
# First time: pick up the current config settings # First time: pick up the current config settings
# #
$mainConf = $bpc->ConfigDataRead(); $mainConf = $bpc->ConfigDataRead();
if ( $host ne "" ) { if ( $host ne "" ) {
$hostConf = $bpc->ConfigDataRead($host); $hostConf = $bpc->ConfigDataRead($host);
$override = {}; $override = {};
foreach my $param ( sort(keys(%$hostConf)) ) { foreach my $param ( sort(keys(%$hostConf)) ) {
$override->{$param} = 1; $override->{$param} = 1;
} }
} else { } else {
my $hostInfo = $bpc->HostInfoRead(); my $hostInfo = $bpc->HostInfoRead();
$hostConf = {}; $hostConf = {};
$mainConf->{Hosts} = [map($hostInfo->{$_}, sort(keys(%$hostInfo)))]; $mainConf->{Hosts} = [map($hostInfo->{$_}, sort(keys(%$hostInfo)))];
} }
$newConf = { %$mainConf, %$hostConf }; $newConf = {%$mainConf, %$hostConf};
} }
if ( $In{saveAction} ne "Save" && $In{newMenu} ne "" if ( $In{saveAction} ne "Save" && $In{newMenu} ne "" && defined($ConfigMenu{
&& defined($ConfigMenu{$In{newMenu}}) ) { $In{newMenu}}) ) {
$menu = $In{newMenu}; $menu = $In{newMenu};
} }
my %menuDisable; my %menuDisable;
if ( $userHost ) { if ( $userHost ) {
# #
# For a non-admin user editing the host config, we need to # For a non-admin user editing the host config, we need to
# figure out which subsets of the menu tree will be visible, # figure out which subsets of the menu tree will be visible,
# based on what is enabled. Admin users can edit all the # based on what is enabled. Admin users can edit all the
# available per-host settings. # available per-host settings.
# #
foreach my $m ( sort(keys(%ConfigMenu)) ) { foreach my $m ( sort(keys(%ConfigMenu)) ) {
my $enabled = 0; my $enabled = 0;
my $text = -1; my $text = -1;
my $n = 0; my $n = 0;
my @mask = (); my @mask = ();
foreach my $paramInfo ( @{$ConfigMenu{$m}{param}} ) { foreach my $paramInfo ( @{$ConfigMenu{$m}{param}} ) {
my $param = $paramInfo->{name}; my $param = $paramInfo->{name};
if ( defined($paramInfo->{text}) ) { if ( defined($paramInfo->{text}) ) {
$mask[$n] = 1; $mask[$n] = 1;
if ( ref($paramInfo->{visible}) ne "CODE" if ( ref($paramInfo->{visible}) ne "CODE" || &{$paramInfo->{
|| &{$paramInfo->{visible}}($newConf, $bpc) ) { visible}}($newConf, $bpc) ) {
$text = $n; $text = $n;
} }
} else { } else {
if ( $bpc->{Conf}{CgiUserConfigEdit}{$param} if (
|| (defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) $bpc->{Conf}{CgiUserConfigEdit}{$param}
&& $PrivAdmin) ) { || (defined($bpc->{Conf}{CgiUserConfigEdit}{$param})
&& $PrivAdmin)
) {
$mask[$text] = 0 if ( $text >= 0 ); $mask[$text] = 0 if ( $text >= 0 );
$mask[$n] = 0; $mask[$n] = 0;
$enabled ||= 1; $enabled ||= 1;
} else { } else {
$mask[$n] = 1; $mask[$n] = 1;
} }
} }
$n++; $n++;
} }
$menuDisable{$m}{mask} = \@mask; $menuDisable{$m}{mask} = \@mask;
$menuDisable{$m}{top} = !$enabled; $menuDisable{$m}{top} = !$enabled;
} }
skipping to change at line 512 skipping to change at line 633
$menu = $m; $menu = $m;
last; last;
} }
} }
} }
} }
my $groupText; my $groupText;
foreach my $m ( sort(keys(%ConfigMenu)) ) { foreach my $m ( sort(keys(%ConfigMenu)) ) {
next if ( $menuDisable{$m}{top} ); next if ( $menuDisable{$m}{top} );
my $text = eval("qq($Lang->{$ConfigMenu{$m}{text}})"); my $text = eval("qq($Lang->{$ConfigMenu{$m}{text}})");
if ( $m eq $menu ) { if ( $m eq $menu ) {
$groupText .= <<EOF; $groupText .= <<EOF;
<td class="editTabSel"><a href="javascript:menuSubmit('$m')"><b>$text</b></a></t d> <td class="editTabSel"><a href="javascript:menuSubmit('$m')"><b>$text</b></a></t d>
EOF EOF
} else { } else {
$groupText .= <<EOF; $groupText .= <<EOF;
<td class="editTabNoSel"><a href="javascript:menuSubmit('$m')">$text</a></td> <td class="editTabNoSel"><a href="javascript:menuSubmit('$m')">$text</a></td>
EOF EOF
} }
} }
if ( $host eq "" ) { if ( $host eq "" ) {
$content .= eval("qq($Lang->{CfgEdit_Header_Main})"); $content .= eval("qq($Lang->{CfgEdit_Header_Main})");
} else { } else {
$content .= eval("qq($Lang->{CfgEdit_Header_Host})"); $content .= eval("qq($Lang->{CfgEdit_Header_Host})");
} }
my $saveStyle = ""; my $saveStyle = "";
my $saveColor = "#ff0000"; my $saveColor = "#ff0000";
if ( $In{modified} && $In{saveAction} ne "Save" && !%$errors ) { if ( $In{modified} && $In{saveAction} ne "Save" && !%$errors ) {
$saveStyle = "style=\"color:$saveColor\""; $saveStyle = "style=\"color:$saveColor\"";
} else { } else {
$In{modified} = 0; $In{modified} = 0;
} }
# #
# Add action and host to the URL so the nav bar link is # Add action and host to the URL so the nav bar link is
# highlighted # highlighted
# #
my $url = "$MyURL?action=editConfig"; my $url = "$MyURL?action=editConfig";
$url .= "&host=$host" if ( $host ne "" ); $url .= "&host=$host" if ( $host ne "" );
$content .= <<EOF; $content .= <<EOF;
<table border="0" cellpadding="2"> <table border="0" cellpadding="2">
<tr>$groupText</tr> <tr>$groupText</tr>
<tr> <tr>
<form method="post" name="editForm" action="$url"> <form method="post" name="editForm" action="$url">
<input type="hidden" name="host" value="$host"> <input type="hidden" name="host" value="$host">
<input type="hidden" name="menu" value="$menu"> <input type="hidden" name="menu" value="$menu">
<input type="hidden" name="newMenu" value=""> <input type="hidden" name="newMenu" value="">
<input type="hidden" name="modified" value="$In{modified}"> <input type="hidden" name="modified" value="$In{modified}">
<input type="hidden" name="deleteVar" value=""> <input type="hidden" name="deleteVar" value="">
skipping to change at line 733 skipping to change at line 854
last; last;
} }
} }
$errors = {} if ( $matchAll ); $errors = {} if ( $matchAll );
} }
my $isError = %$errors; my $isError = %$errors;
if ( !$isError && $In{saveAction} eq "Save" ) { if ( !$isError && $In{saveAction} eq "Save" ) {
my($mesg, $err); my($mesg, $err);
if ( $host ne "" ) { if ( $host ne "" ) {
$hostConf = $bpc->ConfigDataRead($host) if ( !defined($hostConf) ); $hostConf = $bpc->ConfigDataRead($host) if ( !defined($hostConf) );
my %hostConf2 = %$hostConf; my %hostConf2 = %$hostConf;
foreach my $param ( sort(keys(%$newConf)) ) { foreach my $param ( sort(keys(%$newConf)) ) {
if ( $override->{$param} ) { if ( $override->{$param} ) {
$hostConf->{$param} = $newConf->{$param} $hostConf->{$param} = $newConf->{$param};
} else { } else {
delete($hostConf->{$param}); delete($hostConf->{$param});
} }
} }
$mesg = configDiffMesg($host, \%hostConf2, $hostConf); $mesg = configDiffMesg($host, \%hostConf2, $hostConf);
$err .= $bpc->ConfigDataWrite($host, $hostConf); $err .= $bpc->ConfigDataWrite($host, $hostConf);
} else { } else {
$mainConf = $bpc->ConfigDataRead() if ( !defined($mainConf) ); $mainConf = $bpc->ConfigDataRead() if ( !defined($mainConf) );
my $hostsSave = []; my $hostsSave = [];
my($hostsNew, $allHosts, $copyConf); my($hostsNew, $allHosts, $copyConf);
foreach my $entry ( @{$newConf->{Hosts}} ) { foreach my $entry ( @{$newConf->{Hosts}} ) {
next if ( $entry->{host} eq "" ); next if ( $entry->{host} eq "" );
$allHosts->{$entry->{host}} = 1; $allHosts->{$entry->{host}} = 1;
$allHosts->{$1} = 1 if ( $entry->{host} =~ /(.+?)\s*=/ ); $allHosts->{$1} = 1 if ( $entry->{host} =~ /(.+?)\s*=/ );
} }
foreach my $entry ( @{$newConf->{Hosts}} ) { foreach my $entry ( @{$newConf->{Hosts}} ) {
next if ( $entry->{host} eq "" next if ( $entry->{host} eq "" || defined($hostsNew->{lc($entry-
|| defined($hostsNew->{lc($entry->{host})}) ); >{host})}) );
if ( $entry->{host} =~ /(.+?)\s*=\s*(.+)/ ) { if ( $entry->{host} =~ /(.+?)\s*=\s*(.+)/ ) {
if ( defined($allHosts->{$2}) ) { if ( defined($allHosts->{$2}) ) {
$entry->{host} = $1; $entry->{host} = $1;
$copyConf->{$1} = $2; $copyConf->{$1} = $2;
} else { } else {
my $fullHost = $entry->{host}; my $fullHost = $entry->{host};
my $copyHost = $2; my $copyHost = $2;
$err .= eval("qq($Lang->{CfgEdit_Error_Copy_host_does_no t_exist})"); $err .= eval("qq($Lang->{CfgEdit_Error_Copy_host_does_no t_exist})");
} }
} }
skipping to change at line 787 skipping to change at line 907
# to force the from and to hosts to lc. # to force the from and to hosts to lc.
# #
my $confData = $bpc->ConfigDataRead(lc($copyConf->{$host})); my $confData = $bpc->ConfigDataRead(lc($copyConf->{$host}));
my $fromHost = $copyConf->{$host}; my $fromHost = $copyConf->{$host};
$err .= $bpc->ConfigDataWrite(lc($host), $confData); $err .= $bpc->ConfigDataWrite(lc($host), $confData);
$mesg .= eval("qq($Lang->{CfgEdit_Log_Copy_host_config})"); $mesg .= eval("qq($Lang->{CfgEdit_Log_Copy_host_config})");
} }
delete($newConf->{Hosts}); delete($newConf->{Hosts});
$mesg .= configDiffMesg(undef, $mainConf, $newConf); $mesg .= configDiffMesg(undef, $mainConf, $newConf);
$mainConf = { %$mainConf, %$newConf }; $mainConf = {%$mainConf, %$newConf};
$err .= $bpc->ConfigDataWrite(undef, $mainConf); $err .= $bpc->ConfigDataWrite(undef, $mainConf);
$newConf->{Hosts} = $hostsSave; $newConf->{Hosts} = $hostsSave;
} }
if ( defined($err) ) { if ( defined($err) ) {
$tblContent .= <<EOF; $tblContent .= <<EOF;
<tr><td colspan="2" class="border"><span class="editError">$err</span></td></tr> <tr><td colspan="2" class="border"><span class="editError">$err</span></td></tr>
EOF EOF
} }
$bpc->ServerConnect(); $bpc->ServerConnect();
if ( $mesg ne "" ) { if ( $mesg ne "" ) {
(my $mesgBR = $mesg) =~ s/\n/<br>\n/g; (my $mesgBR = $mesg) =~ s/\n/<br>\n/g;
# uncomment this if you want the changes to be displayed
# $tblContent .= <<EOF; # uncomment this if you want the changes to be displayed
#<tr><td colspan="2" class="border"><span class="editComment">$mesgBR</span></td # $tblContent .= <<EOF;
></tr> #<tr><td colspan="2" class="border"><span class="editComment">$mesgB
#EOF R</span></td></tr>
#EOF
foreach my $str ( split(/\n/, $mesg) ) { foreach my $str ( split(/\n/, $mesg) ) {
$bpc->ServerMesg("log $str") if ( $str ne "" ); $bpc->ServerMesg("log $str") if ( $str ne "" );
} }
} }
# #
# Tell the server to reload, unless we only changed # Tell the server to reload, unless we only changed
# a client config # a client config
# #
$bpc->ServerMesg("server reload") if ( $host eq "" ); $bpc->ServerMesg("server reload") if ( $host eq "" );
} }
my @mask = @{$menuDisable{$menu}{mask} || []}; my @mask = @{$menuDisable{$menu}{mask} || []};
foreach my $paramInfo ( @{$ConfigMenu{$menu}{param}} ) { foreach my $paramInfo ( @{$ConfigMenu{$menu}{param}} ) {
my $param = $paramInfo->{name}; my $param = $paramInfo->{name};
my $disabled = shift(@mask); my $disabled = shift(@mask);
next if ( $disabled || $menuDisable{$menu}{top} ); next if ( $disabled || $menuDisable{$menu}{top} );
if ( ref($paramInfo->{visible}) eq "CODE" if ( ref($paramInfo->{visible}) eq "CODE" && !&{$paramInfo->{visible}}($
&& !&{$paramInfo->{visible}}($newConf, $bpc) ) { newConf, $bpc) ) {
next; next;
} }
if ( defined($paramInfo->{text}) ) { if ( defined($paramInfo->{text}) ) {
my $text = eval("qq($Lang->{$paramInfo->{text}})"); my $text = eval("qq($Lang->{$paramInfo->{text}})");
$tblContent .= <<EOF; $tblContent .= <<EOF;
<tr><td colspan="2" class="editHeader">$text</td></tr> <tr><td colspan="2" class="editHeader">$text</td></tr>
EOF EOF
next; next;
} }
# #
# TODO: get parameter documentation # TODO: get parameter documentation
# #
my $comment = ""; my $comment = "";
#$comment =~ s/\'//g;
#$comment =~ s/\"//g; #$comment =~ s/\'//g;
#$comment =~ s/\"//g;
#$comment =~ s/\n/ /g; #$comment =~ s/\n/ /g;
$doneParam->{$param} = 1; $doneParam->{$param} = 1;
$tblContent .= fieldEditBuild($ConfigMeta{$param}, $tblContent .= fieldEditBuild(
$param, $ConfigMeta{$param}, $param, $newConf->{$param}, $errors, 0, $commen
$newConf->{$param}, t, $isError,
$errors, $paramInfo->{onchangeSubmit},
0, defined($override) ? $param : undef,
$comment, defined($override) ? $override->{$param} : undef
$isError, );
$paramInfo->{onchangeSubmit},
defined($override) ? $param : undef,
defined($override) ? $override->{$param} : undef
);
if ( defined($paramInfo->{comment}) ) { if ( defined($paramInfo->{comment}) ) {
my $topDir = $bpc->TopDir; my $topDir = $bpc->TopDir;
my $text = eval("qq($Lang->{$paramInfo->{comment}})"); my $text = eval("qq($Lang->{$paramInfo->{comment}})");
$tblContent .= <<EOF; $tblContent .= <<EOF;
<tr><td colspan="2" class="editComment">$text</td></tr> <tr><td colspan="2" class="editComment">$text</td></tr>
EOF EOF
} }
} }
# #
# Emit a summary of all the errors # Emit a summary of all the errors
# #
my $errorTxt; my $errorTxt;
if ( %$errors ) { if ( %$errors ) {
$errorTxt .= <<EOF; $errorTxt .= <<EOF;
<tr><td colspan="2" class="border"><span class="editError">$Lang->{CfgEdit_Error _No_Save}</span></td></tr> <tr><td colspan="2" class="border"><span class="editError">$Lang->{CfgEdit_Error _No_Save}</span></td></tr>
EOF EOF
} }
foreach my $param ( sort(keys(%$errors)) ) { foreach my $param ( sort(keys(%$errors)) ) {
$errorTxt .= <<EOF; $errorTxt .= <<EOF;
<tr><td colspan="2" class="border"><span class="editError">$errors->{$param}</sp an></td></tr> <tr><td colspan="2" class="border"><span class="editError">$errors->{$param}</sp an></td></tr>
EOF EOF
} }
$content .= <<EOF; $content .= <<EOF;
$errorTxt $errorTxt
$tblContent $tblContent
</table> </table>
<span id="debug"><pre>$debugText</pre></span> <span id="debug"><pre>$debugText</pre></span>
EOF EOF
# #
# Emit all the remaining editable config settings as hidden values # Emit all the remaining editable config settings as hidden values
# #
foreach my $param ( sort(keys(%ConfigMeta)) ) { foreach my $param ( sort(keys(%ConfigMeta)) ) {
next if ( $doneParam->{$param} ); next if ( $doneParam->{$param} );
next if ( $userHost next
&& (!defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) if (
|| (!$PrivAdmin $userHost
&& !$bpc->{Conf}{CgiUserConfigEdit}{$param})) ); && (
$content .= fieldHiddenBuild($ConfigMeta{$param}, !defined($bpc->{Conf}{CgiUserConfigEdit}{$param})
$param, || ( !$PrivAdmin
$newConf->{$param}, && !$bpc->{Conf}{CgiUserConfigEdit}{$param})
"v" )
); );
$content .= fieldHiddenBuild($ConfigMeta{$param}, $param, $newConf->{$pa
ram}, "v");
if ( defined($override) ) { if ( defined($override) ) {
$content .= <<EOF; $content .= <<EOF;
<input type="hidden" name="override_$param" value="$override->{$param}"> <input type="hidden" name="override_$param" value="$override->{$param}">
EOF EOF
} }
$doneParam->{$param} = 1; $doneParam->{$param} = 1;
} }
if ( defined($In{menu}) || $In{saveAction} eq "Save" ) { if ( defined($In{menu}) || $In{saveAction} eq "Save" ) {
if ( $In{saveAction} eq "Save" && !$userHost ) { if ( $In{saveAction} eq "Save" && !$userHost ) {
# #
# Emit the new settings as orig_zZ_ parameters # Emit the new settings as orig_zZ_ parameters
# #
$doneParam = {}; $doneParam = {};
foreach my $param ( sort(keys(%ConfigMeta)) ) { foreach my $param ( sort(keys(%ConfigMeta)) ) {
next if ( $doneParam->{$param} ); next if ( $doneParam->{$param} );
next if ( $userHost next
&& (!defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) if (
|| (!$PrivAdmin $userHost
&& !$bpc->{Conf}{CgiUserConfigEdit}{$param})) ); && (
$contentHidden .= fieldHiddenBuild($ConfigMeta{$param}, !defined($bpc->{Conf}{CgiUserConfigEdit}{$param})
$param, || ( !$PrivAdmin
$newConf->{$param}, && !$bpc->{Conf}{CgiUserConfigEdit}{$param})
"orig", )
); );
$contentHidden .= fieldHiddenBuild($ConfigMeta{$param}, $param,
$newConf->{$param}, "orig");
$doneParam->{$param} = 1; $doneParam->{$param} = 1;
$In{modified} = 0; $In{modified} = 0;
} }
} else { } else {
# #
# Just switching menus: copy all the orig_zZ_ input parameters # Just switching menus: copy all the orig_zZ_ input parameters
# #
foreach my $var ( sort(keys(%In)) ) { foreach my $var ( sort(keys(%In)) ) {
if ( $var =~ /^orig_(zZ_|flds_)/ ) { if ( $var =~ /^orig_(zZ_|flds_)/ ) {
my $val = decode_utf8($In{$var}); my $val = decode_utf8($In{$var});
$contentHidden .= <<EOF; $contentHidden .= <<EOF;
<input type="hidden" name="$var" value="${EscHTML($val)}"> <input type="hidden" name="$var" value="${EscHTML($val)}">
EOF EOF
} }
} }
} }
} else { } else {
# #
# First time: emit all the original config settings # First time: emit all the original config settings
# #
$doneParam = {}; $doneParam = {};
foreach my $param ( sort(keys(%ConfigMeta)) ) { foreach my $param ( sort(keys(%ConfigMeta)) ) {
next if ( $doneParam->{$param} ); next if ( $doneParam->{$param} );
next if ( $userHost next
&& (!defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) if (
|| (!$PrivAdmin $userHost
&& !$bpc->{Conf}{CgiUserConfigEdit}{$param})) ); && (
$contentHidden .= fieldHiddenBuild($ConfigMeta{$param}, !defined($bpc->{Conf}{CgiUserConfigEdit}{$param})
$param, || ( !$PrivAdmin
$mainConf->{$param}, && !$bpc->{Conf}{CgiUserConfigEdit}{$param})
"orig", )
); );
$contentHidden .= fieldHiddenBuild($ConfigMeta{$param}, $param, $mai
nConf->{$param}, "orig");
$doneParam->{$param} = 1; $doneParam->{$param} = 1;
} }
} }
$content .= <<EOF; $content .= <<EOF;
$contentHidden $contentHidden
</form> </form>
</tr> </tr>
</table> </table>
EOF EOF
Header("Config Edit", $content); Header("Config Edit", $content);
Trailer(); Trailer();
} }
sub fieldHiddenBuild sub fieldHiddenBuild
{ {
my($type, $varName, $varValue, $prefix) = @_; my($type, $varName, $varValue, $prefix) = @_;
my $content; my $content;
$type = { type => $type } if ( ref($type) ne "HASH" ); $type = {type => $type} if ( ref($type) ne "HASH" );
if ( $type->{type} eq "list" ) { if ( $type->{type} eq "list" ) {
$varValue = [] if ( !defined($varValue) ); $varValue = [] if ( !defined($varValue) );
$varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" );
for ( my $i = 0 ; $i < @$varValue ; $i++ ) { for ( my $i = 0 ; $i < @$varValue ; $i++ ) {
$content .= fieldHiddenBuild($type->{child}, "${varName}_zZ_$i", $content .= fieldHiddenBuild($type->{child}, "${varName}_zZ_$i", $va
$varValue->[$i], $prefix); rValue->[$i], $prefix);
} }
} elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) { } elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) {
$varValue = {} if ( ref($varValue) ne "HASH" ); $varValue = {} if ( ref($varValue) ne "HASH" );
my(@order, $childType); my(@order, $childType);
if ( defined($type->{order}) ) { if ( defined($type->{order}) ) {
@order = @{$type->{order}}; @order = @{$type->{order}};
} elsif ( defined($type->{child}) ) { } elsif ( defined($type->{child}) ) {
@order = sort(keys(%{$type->{child}})); @order = sort(keys(%{$type->{child}}));
} else { } else {
skipping to change at line 1016 skipping to change at line 1134
} else { } else {
$childType = $type->{childType}; $childType = $type->{childType};
# #
# emit list of fields since they are user-defined # emit list of fields since they are user-defined
# rather than hard-coded # rather than hard-coded
# #
$content .= <<EOF; $content .= <<EOF;
<input type="hidden" name="${prefix}_flds_${varName}_zZ_$fldNum" value="${EscHTM L($fld)}"> <input type="hidden" name="${prefix}_flds_${varName}_zZ_$fldNum" value="${EscHTM L($fld)}">
EOF EOF
} }
$content .= fieldHiddenBuild($childType, "${varName}_zZ_$fldNum", $content .= fieldHiddenBuild($childType, "${varName}_zZ_$fldNum", $v
$varValue->{$fld}, $prefix); arValue->{$fld}, $prefix);
} }
} elsif ( $type->{type} eq "shortlist" ) { } elsif ( $type->{type} eq "shortlist" ) {
$varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" );
$varValue = join(", ", @$varValue); $varValue = join(", ", @$varValue);
$content .= <<EOF; $content .= <<EOF;
<input type="hidden" name="${prefix}_zZ_$varName" value="${EscHTML($varValue)}"> <input type="hidden" name="${prefix}_zZ_$varName" value="${EscHTML($varValue)}">
EOF EOF
} else { } else {
$content .= <<EOF; $content .= <<EOF;
<input type="hidden" name="${prefix}_zZ_$varName" value="${EscHTML($varValue)}"> <input type="hidden" name="${prefix}_zZ_$varName" value="${EscHTML($varValue)}">
EOF EOF
} }
return $content; return $content;
} }
sub fieldEditBuild sub fieldEditBuild
{ {
my($type, $varName, $varValue, $errors, $level, $comment, $isError, my($type, $varName, $varValue, $errors, $level, $comment, $isError, $onchang
$onchangeSubmit, $overrideVar, $overrideSet) = @_; eSubmit, $overrideVar, $overrideSet) =
@_;
my $content; my $content;
my $size = 50 - 10 * $level; my $size = 50 - 10 * $level;
$type = { type => $type } if ( ref($type) ne "HASH" ); $type = {type => $type} if ( ref($type) ne "HASH" );
$size = $type->{size} if ( defined($type->{size}) ); $size = $type->{size} if ( defined($type->{size}) );
# #
# These fragments allow inline content to be turned on and off # These fragments allow inline content to be turned on and off
# #
# <tr><td colspan="2"><span id="id_$varName" style="display: none" class="ed itComment">$comment</span></td></tr> # <tr><td colspan="2"><span id="id_$varName" style="display: none" class="ed itComment">$comment</span></td></tr>
# <tr><td class="border"><a href="javascript: displayHelp('$varName')">$varN ame</a> # <tr><td class="border"><a href="javascript: displayHelp('$varName')">$varN ame</a>
# #
if ( $level == 0 ) { if ( $level == 0 ) {
my $lcVarName = lc($varName); my $lcVarName = lc($varName);
$content .= <<EOF; $content .= <<EOF;
<tr><td class="border"><a href="?action=view&type=docs#_conf_${lcVarName}_">$var Name</a> <tr><td class="border"><a href="?action=view&type=docs#_conf_${lcVarName}_">$var Name</a>
EOF EOF
if ( defined($overrideVar) ) { if ( defined($overrideVar) ) {
my $override_checked = ""; my $override_checked = "";
if ( !$isError && $In{deleteVar} =~ /^\Q${varName}_zZ_/ if ( !$isError && $In{deleteVar} =~ /^\Q${varName}_zZ_/
|| !$isError && $In{insertVar} =~ /^\Q${varName}\E(_zZ_|$)/ || !$isError && $In{insertVar} =~ /^\Q${varName}\E(_zZ_|$)/
|| !$isError && $In{addVar} =~ /^\Q${varName}\E(_zZ_|$)/ ) || !$isError && $In{addVar} =~ /^\Q${varName}\E(_zZ_|$)/ ) {
{ $overrideSet = 1;
$overrideSet = 1; }
} if ( $overrideSet ) {
if ( $overrideSet ) { $override_checked = "checked";
$override_checked = "checked"; }
}
$content .= <<EOF; $content .= <<EOF;
<br><input type="checkbox" name="override_$varName" $override_checked value="1" onClick="checkboxChange('$varName')">\&nbsp;${EscHTML($Lang->{CfgEdit_Button_Ove rride})} <br><input type="checkbox" name="override_$varName" $override_checked value="1" onClick="checkboxChange('$varName')">\&nbsp;${EscHTML($Lang->{CfgEdit_Button_Ove rride})}
EOF EOF
} }
$content .= "</td>\n"; $content .= "</td>\n";
} }
if ( $type->{type} eq "list" ) { if ( $type->{type} eq "list" ) {
$content .= "<td class=\"border\">\n"; $content .= "<td class=\"border\">\n";
$varValue = [] if ( !defined($varValue) ); $varValue = [] if ( !defined($varValue) );
$varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" );
if ( !$isError && $In{deleteVar} =~ /^\Q${varName}_zZ_\E(\d+)$/ if ( !$isError && $In{deleteVar} =~ /^\Q${varName}_zZ_\E(\d+)$/ && $1 <
&& $1 < @$varValue ) { @$varValue ) {
# #
# User deleted entry in this array # User deleted entry in this array
# #
splice(@$varValue, $1, 1) if ( @$varValue > 1 || $type->{emptyOk} ); splice(@$varValue, $1, 1) if ( @$varValue > 1 || $type->{emptyOk} );
$In{deleteVar} = ""; $In{deleteVar} = "";
} }
if ( !$isError && $In{insertVar} =~ /^\Q${varName}_zZ_\E(\d+)$/ if ( !$isError && $In{insertVar} =~ /^\Q${varName}_zZ_\E(\d+)$/ && $1 <
&& $1 < @$varValue ) { @$varValue ) {
# #
# User inserted entry in this array # User inserted entry in this array
# #
splice(@$varValue, $1, 0, "") splice(@$varValue, $1, 0, "")
if ( @$varValue > 1 || $type->{emptyOk} ); if ( @$varValue > 1 || $type->{emptyOk} );
$In{insertVar} = ""; $In{insertVar} = "";
} }
if ( !$isError && $In{addVar} eq $varName ) { if ( !$isError && $In{addVar} eq $varName ) {
# #
# User added entry to this array # User added entry to this array
# #
push(@$varValue, undef); push(@$varValue, undef);
$In{addVar} = ""; $In{addVar} = "";
} }
$content .= "<table border=\"1\" cellspacing=\"0\" class=\"editSubTable\ ">\n"; $content .= "<table border=\"1\" cellspacing=\"0\" class=\"editSubTable\ ">\n";
my $colspan; my $colspan;
if ( ref($type) eq "HASH" && ref($type->{child}) eq "HASH" if ( ref($type) eq "HASH" && ref($type->{child}) eq "HASH" && $type->{ch
&& $type->{child}{type} eq "horizHash" ) { ild}{type} eq "horizHash" ) {
my @order; my @order;
if ( defined($type->{child}{order}) ) { if ( defined($type->{child}{order}) ) {
@order = @{$type->{child}{order}}; @order = @{$type->{child}{order}};
} else { } else {
@order = sort(keys(%{$type->{child}{child}})); @order = sort(keys(%{$type->{child}{child}}));
} }
$content .= "<tr><td class=\"border\"></td>\n"; $content .= "<tr><td class=\"border\"></td>\n";
for ( my $i = 0 ; $i < @order ; $i++ ) { for ( my $i = 0 ; $i < @order ; $i++ ) {
$content .= "<td class=\"tableheader\">$order[$i]</td>\n"; $content .= "<td class=\"tableheader\">$order[$i]</td>\n";
} }
skipping to change at line 1127 skipping to change at line 1241
$content .= "</tr>\n"; $content .= "</tr>\n";
for ( my $i = 0 ; $i < @$varValue ; $i++ ) { for ( my $i = 0 ; $i < @$varValue ; $i++ ) {
if ( @$varValue > 1 || $type->{emptyOk} ) { if ( @$varValue > 1 || $type->{emptyOk} ) {
$content .= <<EOF; $content .= <<EOF;
<tr><td class="border"> <tr><td class="border">
<input type="button" name="del_${varName}_zZ_$i" value="${EscHTML($Lang->{CfgEdi t_Button_Delete})}" <input type="button" name="del_${varName}_zZ_$i" value="${EscHTML($Lang->{CfgEdi t_Button_Delete})}"
onClick="deleteSubmit('${varName}_zZ_$i')"> onClick="deleteSubmit('${varName}_zZ_$i')">
</td> </td>
EOF EOF
} }
$content .= fieldEditBuild($type->{child}, "${varName}_zZ_$i", $content .= fieldEditBuild(
$varValue->[$i], $errors, $level + 1, undef, $type->{child}, "${varName}_zZ_$i", $varValue->[$i], $errors
$isError, $onchangeSubmit, ,
$overrideVar, $overrideSet); $level + 1, undef, $isError, $onchan
geSubmit,
$overrideVar, $overrideSet
);
$content .= "</tr>\n"; $content .= "</tr>\n";
} }
} else { } else {
for ( my $i = 0 ; $i < @$varValue ; $i++ ) { for ( my $i = 0 ; $i < @$varValue ; $i++ ) {
$content .= <<EOF; $content .= <<EOF;
<tr><td class="border"> <tr><td class="border">
<input type="button" name="ins_${varName}_zZ_$i" value="${EscHTML($Lang->{CfgEdi t_Button_Insert})}" <input type="button" name="ins_${varName}_zZ_$i" value="${EscHTML($Lang->{CfgEdi t_Button_Insert})}"
onClick="insertSubmit('${varName}_zZ_$i')"> onClick="insertSubmit('${varName}_zZ_$i')">
EOF EOF
if ( @$varValue > 1 || $type->{emptyOk} ) { if ( @$varValue > 1 || $type->{emptyOk} ) {
$content .= <<EOF; $content .= <<EOF;
<input type="button" name="del_${varName}_zZ_$i" value="${EscHTML($Lang->{CfgEdi t_Button_Delete})}" <input type="button" name="del_${varName}_zZ_$i" value="${EscHTML($Lang->{CfgEdi t_Button_Delete})}"
onClick="deleteSubmit('${varName}_zZ_$i')"> onClick="deleteSubmit('${varName}_zZ_$i')">
EOF EOF
} }
$content .= "</td>\n"; $content .= "</td>\n";
$content .= fieldEditBuild($type->{child}, "${varName}_zZ_$i", $content .= fieldEditBuild(
$varValue->[$i], $errors, $level + 1, undef, $type->{child}, "${varName}_zZ_$i", $varValue->[$i], $errors
$isError, $onchangeSubmit, ,
$overrideVar, $overrideSet); $level + 1, undef, $isError, $onchan
geSubmit,
$overrideVar, $overrideSet
);
$content .= "</tr>\n"; $content .= "</tr>\n";
} }
$colspan = 2; $colspan = 2;
} }
$content .= <<EOF; $content .= <<EOF;
<tr><td class="border" colspan="$colspan"><input type="button" name="add_$varNam e" value="${EscHTML($Lang->{CfgEdit_Button_Add})}" <tr><td class="border" colspan="$colspan"><input type="button" name="add_$varNam e" value="${EscHTML($Lang->{CfgEdit_Button_Add})}"
onClick="addSubmit('$varName')"></td></tr> onClick="addSubmit('$varName')"></td></tr>
</table> </table>
EOF EOF
$content .= "</td>\n"; $content .= "</td>\n";
} elsif ( $type->{type} eq "hash" ) { } elsif ( $type->{type} eq "hash" ) {
$content .= "<td class=\"border\">\n"; $content .= "<td class=\"border\">\n";
$content .= "<table border=\"1\" cellspacing=\"0\" class=\"editSubTable\ ">\n"; $content .= "<table border=\"1\" cellspacing=\"0\" class=\"editSubTable\ ">\n";
$varValue = {} if ( ref($varValue) ne "HASH" ); $varValue = {} if ( ref($varValue) ne "HASH" );
if ( !$isError && !$type->{noKeyEdit} if ( !$isError
&& $In{deleteVar} !~ /^\Q${varName}_zZ_\E.*_zZ_/ && !$type->{noKeyEdit}
&& $In{deleteVar} =~ /^\Q${varName}_zZ_\E(.*)$/ ) { && $In{deleteVar} !~ /^\Q${varName}_zZ_\E.*_zZ_/
&& $In{deleteVar} =~ /^\Q${varName}_zZ_\E(.*)$/ ) {
# #
# User deleted entry in this hash # User deleted entry in this hash
# #
delete($varValue->{$1}) if ( keys(%$varValue) > 1 delete($varValue->{$1}) if ( keys(%$varValue) > 1 || $type->{emptyOk
|| $type->{emptyOk} ); } );
$In{deleteVar} = ""; $In{deleteVar} = "";
} }
if ( !$isError && !defined($type->{child}) if ( !$isError && !defined($type->{child}) && $In{addVar} eq $varName )
&& $In{addVar} eq $varName ) { {
# #
# User added entry to this array # User added entry to this array
# #
$varValue->{$In{"addVarKey_$varName"}} = "" $varValue->{$In{"addVarKey_$varName"}} = ""
if ( !defined($varValue->{$In{"addVarKey_$varName"}}) ); if ( !defined($varValue->{$In{"addVarKey_$varName"}}) );
$In{addVar} = ""; $In{addVar} = "";
} }
my(@order, $childType); my(@order, $childType);
if ( defined($type->{order}) ) { if ( defined($type->{order}) ) {
@order = @{$type->{order}}; @order = @{$type->{order}};
} elsif ( defined($type->{child}) ) { } elsif ( defined($type->{child}) ) {
@order = sort(keys(%{$type->{child}})); @order = sort(keys(%{$type->{child}}));
} else { } else {
@order = sort(keys(%$varValue)); @order = sort(keys(%$varValue));
} }
for ( my $fldNum = 0 ; $fldNum < @order ; $fldNum++ ) { for ( my $fldNum = 0 ; $fldNum < @order ; $fldNum++ ) {
my $fld = $order[$fldNum]; my $fld = $order[$fldNum];
$content .= <<EOF; $content .= <<EOF;
<tr><td class="border">$fld <tr><td class="border">$fld
EOF EOF
if ( !$type->{noKeyEdit} if ( !$type->{noKeyEdit}
&& (keys(%$varValue) > 1 || $type->{emptyOk}) ) { && (keys(%$varValue) > 1 || $type->{emptyOk}) ) {
$content .= <<EOF; $content .= <<EOF;
<input type="button" name="del_${varName}_zZ_$fld" value="${EscHTML($Lang->{CfgE dit_Button_Delete})}" <input type="button" name="del_${varName}_zZ_$fld" value="${EscHTML($Lang->{CfgE dit_Button_Delete})}"
onClick="deleteSubmit('${varName}_zZ_$fld')"> onClick="deleteSubmit('${varName}_zZ_$fld')">
EOF EOF
} }
if ( defined($type->{child}) ) { if ( defined($type->{child}) ) {
$childType = $type->{child}{$fld}; $childType = $type->{child}{$fld};
} else { } else {
$childType = $type->{childType}; $childType = $type->{childType};
# #
# emit list of fields since they are user-defined # emit list of fields since they are user-defined
# rather than hard-coded # rather than hard-coded
# #
$content .= <<EOF; $content .= <<EOF;
<input type="hidden" name="v_flds_${varName}_zZ_$fldNum" value="${EscHTML($fld)} "> <input type="hidden" name="v_flds_${varName}_zZ_$fldNum" value="${EscHTML($fld)} ">
EOF EOF
} }
$content .= "</td>\n"; $content .= "</td>\n";
$content .= fieldEditBuild($childType, "${varName}_zZ_$fldNum", $content .= fieldEditBuild(
$varValue->{$fld}, $errors, $level + 1, undef, $childType, "${varName}_zZ_$fldNum", $varValue->{$fld}, $error
$isError, $onchangeSubmit, s,
$overrideVar, $overrideSet); $level + 1, undef, $isError, $oncha
ngeSubmit,
$overrideVar, $overrideSet
);
$content .= "</tr>\n"; $content .= "</tr>\n";
} }
if ( !$type->{noKeyEdit} ) { if ( !$type->{noKeyEdit} ) {
my $keyText = defined($type->{keyText}) ? $Lang->{$type->{keyText}} : $Lang->{CfgEdit_Button_New_Key}; my $keyText = defined($type->{keyText}) ? $Lang->{$type->{keyText}} : $Lang->{CfgEdit_Button_New_Key};
$content .= <<EOF; $content .= <<EOF;
<tr><td class="border" colspan="2"> <tr><td class="border" colspan="2">
$keyText: <input type="text" class="editTextInput" name="addVarKey_$varName" siz e="20" maxlength="256" value=""> $keyText: <input type="text" class="editTextInput" name="addVarKey_$varName" siz e="20" maxlength="256" value="">
<input type="button" name="add_$varName" value="${EscHTML($Lang->{CfgEdit_Button _Add})}" onClick="addSubmit('$varName', 1)"> <input type="button" name="add_$varName" value="${EscHTML($Lang->{CfgEdit_Button _Add})}" onClick="addSubmit('$varName', 1)">
</td></tr> </td></tr>
skipping to change at line 1264 skipping to change at line 1380
} else { } else {
$childType = $type->{childType}; $childType = $type->{childType};
# #
# emit list of fields since they are user-defined # emit list of fields since they are user-defined
# rather than hard-coded # rather than hard-coded
# #
$content .= <<EOF; $content .= <<EOF;
<input type="hidden" name="v_flds_${varName}_zZ_$fldNum" value="${EscHTML($fld)} "> <input type="hidden" name="v_flds_${varName}_zZ_$fldNum" value="${EscHTML($fld)} ">
EOF EOF
} }
$content .= fieldEditBuild($childType, "${varName}_zZ_$fldNum", $content .= fieldEditBuild(
$varValue->{$fld}, $errors, $level + 1, undef, $childType, "${varName}_zZ_$fldNum", $varValue->{$fld}, $error
$isError, $onchangeSubmit, s,
$overrideVar, $overrideSet); $level + 1, undef, $isError, $oncha
ngeSubmit,
$overrideVar, $overrideSet
);
} }
} else { } else {
$content .= "<td class=\"border\">\n"; $content .= "<td class=\"border\">\n";
if ( $isError ) { if ( $isError ) {
# #
# If there was an error, we use the original post values # If there was an error, we use the original post values
# in %In, rather than the parsed values in $varValue. # in %In, rather than the parsed values in $varValue.
# This is so that the user's erroneous input is preserved. # This is so that the user's erroneous input is preserved.
# #
$varValue = $In{"v_zZ_$varName"} if ( defined($In{"v_zZ_$varName"}) ); $varValue = $In{"v_zZ_$varName"} if ( defined($In{"v_zZ_$varName"}) );
} }
if ( defined($errors->{$varName}) ) { if ( defined($errors->{$varName}) ) {
$content .= <<EOF; $content .= <<EOF;
<span class="editError">$errors->{$varName}</span><br> <span class="editError">$errors->{$varName}</span><br>
EOF EOF
} }
my $onChange; my $onChange;
if ( defined($overrideVar) ) { if ( defined($overrideVar) ) {
$onChange .= "checkboxSet('$overrideVar');"; $onChange .= "checkboxSet('$overrideVar');";
} else { } else {
$onChange .= "varChange('$varName');"; $onChange .= "varChange('$varName');";
} }
if ( $onchangeSubmit ) { if ( $onchangeSubmit ) {
$onChange .= "document.editForm.submit();"; $onChange .= "document.editForm.submit();";
} }
if ( $onChange ne "" ) { if ( $onChange ne "" ) {
$onChange = " onChange=\"$onChange\""; $onChange = " onChange=\"$onChange\"";
} }
if ( $varValue !~ /\n/ && if (
($type->{type} eq "integer" $varValue !~ /\n/
|| $type->{type} eq "string" && ( $type->{type} eq "integer"
|| $type->{type} eq "execPath" || $type->{type} eq "string"
|| $type->{type} eq "shortlist" || $type->{type} eq "execPath"
|| $type->{type} eq "float") ) { || $type->{type} eq "shortlist"
|| $type->{type} eq "float")
) {
# simple input box # simple input box
if ( $type->{type} eq "shortlist" ) { if ( $type->{type} eq "shortlist" ) {
$varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" );
$varValue = join(", ", @$varValue); $varValue = join(", ", @$varValue);
} }
my $textType = ($varName =~ /Passwd/) ? "password" : "text"; my $textType = ($varName =~ /Passwd/) ? "password" : "text";
$content .= <<EOF; $content .= <<EOF;
<input type="$textType" class="editTextInput" name="v_zZ_$varName" size="$size" maxlength="256" value="${EscHTML($varValue)}"$onChange> <input type="$textType" class="editTextInput" name="v_zZ_$varName" size="$size" maxlength="4096" value="${EscHTML($varValue)}"$onChange>
EOF EOF
} elsif ( $type->{type} eq "boolean" ) { } elsif ( $type->{type} eq "boolean" ) {
# checkbox # checkbox
my $checked = "checked" if ( $varValue ); my $checked = "checked" if ( $varValue );
$content .= <<EOF; $content .= <<EOF;
<input type="checkbox" name="v_zZ_$varName" $checked value="1"$onChange> <input type="checkbox" name="v_zZ_$varName" $checked value="1"$onChange>
EOF EOF
} elsif ( $type->{type} eq "select" ) { } elsif ( $type->{type} eq "select" ) {
$content .= <<EOF; $content .= <<EOF;
<select name="v_zZ_$varName"$onChange> <select name="v_zZ_$varName"$onChange>
EOF EOF
foreach my $option ( @{$type->{values}} ) { foreach my $option ( @{$type->{values}} ) {
my $sel = " selected" if ( $varValue eq $option ); my $sel = " selected" if ( $varValue eq $option );
$content .= "<option$sel>$option</option>\n"; $content .= "<option$sel>$option</option>\n";
} }
$content .= "</select>\n"; $content .= "</select>\n";
} else { } else {
# multi-line text area - count number of lines # multi-line text area - count number of lines
my $rowCnt = $varValue =~ tr/\n//; my $rowCnt = $varValue =~ tr/\n//;
$rowCnt = 1 if ( $rowCnt < 1 ); $rowCnt = 1 if ( $rowCnt < 1 );
$content .= <<EOF; $content .= <<EOF;
<textarea name="v_zZ_$varName" class="editTextArea" cols="$size" rows="$rowCnt"$ onChange>${EscHTML($varValue)}</textarea> <textarea name="v_zZ_$varName" class="editTextArea" cols="$size" rows="$rowCnt"$ onChange>${EscHTML($varValue)}</textarea>
EOF EOF
} }
$content .= "</td>\n"; $content .= "</td>\n";
} }
return $content; return $content;
} }
sub errorCheck sub errorCheck
skipping to change at line 1353 skipping to change at line 1474
foreach my $param ( sort(keys(%ConfigMeta)) ) { foreach my $param ( sort(keys(%ConfigMeta)) ) {
fieldErrorCheck($ConfigMeta{$param}, $param, $errors); fieldErrorCheck($ConfigMeta{$param}, $param, $errors);
} }
return $errors; return $errors;
} }
sub fieldErrorCheck sub fieldErrorCheck
{ {
my($type, $varName, $errors) = @_; my($type, $varName, $errors) = @_;
$type = { type => $type } if ( ref($type) ne "HASH" ); $type = {type => $type} if ( ref($type) ne "HASH" );
if ( $type->{type} eq "list" ) { if ( $type->{type} eq "list" ) {
for ( my $i = 0 ; ; $i++ ) { for ( my $i = 0 ; ; $i++ ) {
last if ( fieldErrorCheck($type->{child}, "${varName}_zZ_$i", $error s) ); last if ( fieldErrorCheck($type->{child}, "${varName}_zZ_$i", $error s) );
} }
} elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) { } elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) {
my(@order, $childType); my(@order, $childType);
my $ret; my $ret;
if ( defined($type->{order}) ) { if ( defined($type->{order}) ) {
skipping to change at line 1384 skipping to change at line 1505
my $fld = $order[$fldNum]; my $fld = $order[$fldNum];
if ( defined($type->{child}) ) { if ( defined($type->{child}) ) {
$childType = $type->{child}{$fld}; $childType = $type->{child}{$fld};
} else { } else {
$childType = $type->{childType}; $childType = $type->{childType};
} }
$ret ||= fieldErrorCheck($childType, "${varName}_zZ_$fldNum", $error s); $ret ||= fieldErrorCheck($childType, "${varName}_zZ_$fldNum", $error s);
} }
return $ret; return $ret;
} else { } else {
$In{"v_zZ_$varName"} = "0" if ( $type->{type} eq "boolean" $In{"v_zZ_$varName"} = "0" if ( $type->{type} eq "boolean" && $In{"v_zZ_
&& $In{"v_zZ_$varName"} eq "" ); $varName"} eq "" );
return 1 if ( !exists($In{"v_zZ_$varName"}) ); return 1 if ( !exists($In{"v_zZ_$varName"}) );
(my $var = $varName) =~ s/_zZ_/./g; (my $var = $varName) =~ s/_zZ_/./g;
if ( $type->{type} eq "integer" if ( $type->{type} eq "integer" || $type->{type} eq "boolean" ) {
|| $type->{type} eq "boolean" ) { if ( $In{"v_zZ_$varName"} !~ /^-?\d+\s*$/s && $In{"v_zZ_$varName"} n
if ( $In{"v_zZ_$varName"} !~ /^-?\d+\s*$/s e "" ) {
&& $In{"v_zZ_$varName"} ne "" ) {
$errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_an _integer}}"); $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_an _integer}}");
} }
} elsif ( $type->{type} eq "float" ) { } elsif ( $type->{type} eq "float" ) {
if ( $In{"v_zZ_$varName"} !~ /^-?\d*(\.\d*)?\s*$/s if ( $In{"v_zZ_$varName"} !~ /^-?\d*(\.\d*)?\s*$/s && $In{"v_zZ_$var
&& $In{"v_zZ_$varName"} ne "" ) { Name"} ne "" ) {
$errors->{$varName} $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_re
= eval("qq{$Lang->{CfgEdit_Error__must_be_real_valued_nu al_valued_number}}");
mber}}");
} }
} elsif ( $type->{type} eq "shortlist" ) { } elsif ( $type->{type} eq "shortlist" ) {
my @vals = split(/[,\s]+/, $In{"v_zZ_$varName"}); my @vals = split(/[,\s]+/, $In{"v_zZ_$varName"});
for ( my $i = 0 ; $i < @vals ; $i++ ) { for ( my $i = 0 ; $i < @vals ; $i++ ) {
if ( $type->{child} eq "integer" if ( $type->{child} eq "integer" && $vals[$i] !~ /^-?\d+\s*$/s &
&& $vals[$i] !~ /^-?\d+\s*$/s & $vals[$i] ne "" ) {
&& $vals[$i] ne "" ) { my $k = $i + 1;
my $k = $i + 1; $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__entry_
$errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__entry__ _must_be_an_integer}}");
must_be_an_integer}}"); } elsif ( $type->{child} eq "float" && $vals[$i] !~ /^-?\d*(\.\d
} elsif ( $type->{child} eq "float" *)?\s*$/s && $vals[$i] ne "" ) {
&& $vals[$i] !~ /^-?\d*(\.\d*)?\s*$/s my $k = $i + 1;
&& $vals[$i] ne "" ) { $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__entry_
my $k = $i + 1; _must_be_real_valued_number}}");
$errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__entry__ }
must_be_real_valued_number}}"); }
}
}
} elsif ( $type->{type} eq "select" ) { } elsif ( $type->{type} eq "select" ) {
my $match = 0; my $match = 0;
foreach my $option ( @{$type->{values}} ) { foreach my $option ( @{$type->{values}} ) {
if ( $In{"v_zZ_$varName"} eq $option ) { if ( $In{"v_zZ_$varName"} eq $option ) {
$match = 1; $match = 1;
last; last;
} }
} }
$errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_valid_ option}}") $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_valid_ option}}")
if ( !$match ); if ( !$match );
} elsif ( $type->{type} eq "execPath" ) { } elsif ( $type->{type} eq "execPath" ) {
if ( $In{"v_zZ_$varName"} ne "" && !-x $In{"v_zZ_$varName"} ) { if ( $In{"v_zZ_$varName"} ne "" && !-x $In{"v_zZ_$varName"} ) {
$errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_ex ecutable_program}}"); $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_ex ecutable_program}}");
} }
} else { } else {
# #
# $type->{type} eq "string": no error checking # $type->{type} eq "string": no error checking
# #
} }
} }
skipping to change at line 1449 skipping to change at line 1561
} }
sub inputParse sub inputParse
{ {
my($bpc, $userHost) = @_; my($bpc, $userHost) = @_;
my $conf = {}; my $conf = {};
my $override = {}; my $override = {};
foreach my $param ( sort(keys(%ConfigMeta)) ) { foreach my $param ( sort(keys(%ConfigMeta)) ) {
my $value; my $value;
next if ( $userHost next
&& (!defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) if (
|| (!$PrivAdmin $userHost
&& !$bpc->{Conf}{CgiUserConfigEdit}{$param})) ); && (
!defined($bpc->{Conf}{CgiUserConfigEdit}{$param})
|| ( !$PrivAdmin
&& !$bpc->{Conf}{CgiUserConfigEdit}{$param})
)
);
fieldInputParse($ConfigMeta{$param}, $param, \$value); fieldInputParse($ConfigMeta{$param}, $param, \$value);
$conf->{$param} = $value; $conf->{$param} = $value;
$override->{$param} = $In{"override_$param"}; $override->{$param} = $In{"override_$param"};
} }
return ($conf, $override); return ($conf, $override);
} }
sub fieldInputParse sub fieldInputParse
{ {
my($type, $varName, $value) = @_; my($type, $varName, $value) = @_;
$type = { type => $type } if ( ref($type) ne "HASH" ); $type = {type => $type} if ( ref($type) ne "HASH" );
if ( $type->{type} eq "list" ) { if ( $type->{type} eq "list" ) {
$$value = []; $$value = [];
for ( my $i = 0 ; ; $i++ ) { for ( my $i = 0 ; ; $i++ ) {
my $val; my $val;
last if ( fieldInputParse($type->{child}, "${varName}_zZ_$i", \$val) ); last if ( fieldInputParse($type->{child}, "${varName}_zZ_$i", \$val) );
push(@$$value, $val); push(@$$value, $val);
} }
$$value = undef if ( $type->{undefIfEmpty} && @$$value == 0 ); $$value = undef if ( $type->{undefIfEmpty} && @$$value == 0 );
} elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) { } elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) {
skipping to change at line 1516 skipping to change at line 1633
} elsif ( !exists($In{"v_zZ_$varName"}) ) { } elsif ( !exists($In{"v_zZ_$varName"}) ) {
return 1; return 1;
} }
my $v = $In{"v_zZ_$varName"}; my $v = $In{"v_zZ_$varName"};
if ( $type->{type} eq "integer" ) { if ( $type->{type} eq "integer" ) {
if ( $v =~ /^-?\d+\s*$/s || $v eq "" ) { if ( $v =~ /^-?\d+\s*$/s || $v eq "" ) {
$$value = 0 + $v; $$value = 0 + $v;
} else { } else {
# error value - keep in string form # error value - keep in string form
$$value = $v; $$value = $v;
} }
} elsif ( $type->{type} eq "float" ) { } elsif ( $type->{type} eq "float" ) {
if ( $v =~ /^-?\d*(\.\d*)?\s*$/s || $v eq "" ) { if ( $v =~ /^-?\d*(\.\d*)?\s*$/s || $v eq "" ) {
$$value = 0 + $v; $$value = 0 + $v;
} else { } else {
# error value - keep in string form # error value - keep in string form
$$value = $v; $$value = $v;
} }
} elsif ( $type->{type} eq "shortlist" ) { } elsif ( $type->{type} eq "shortlist" ) {
$$value = [split(/[,\s]+/, $v)]; $$value = [split(/[,\s]+/, $v)];
if ( $type->{child} eq "float" ) { if ( $type->{child} eq "float" ) {
foreach ( @$$value ) { foreach ( @$$value ) {
if ( /^-?\d*(\.\d*)?\s*$/s || $v eq "" ) { if ( /^-?\d*(\.\d*)?\s*$/s || $v eq "" ) {
$_ += 0; $_ += 0;
} }
} }
} elsif ( $type->{child} eq "integer" } elsif ( $type->{child} eq "integer" || $type->{child} eq "boolean"
|| $type->{child} eq "boolean" ) { ) {
foreach ( @$$value ) { foreach ( @$$value ) {
if ( /^-?\d+\s*$/s || $v eq "" ) { if ( /^-?\d+\s*$/s || $v eq "" ) {
$_ += 0; $_ += 0;
} }
} }
} }
} else { } else {
$$value = decode_utf8($In{"v_zZ_$varName"}); $$value = decode_utf8($In{"v_zZ_$varName"});
$$value =~ s/\r\n/\n/g; $$value =~ s/\r\n/\n/g;
# remove leading space from exec paths # remove leading space from exec paths
$$value =~ s/^\s+// if ( $type->{type} eq "execPath" ); $$value =~ s/^\s+// if ( $type->{type} eq "execPath" );
} }
$$value = undef if ( $type->{undefIfEmpty} && $$value eq "" ); $$value = undef if ( $type->{undefIfEmpty} && $$value eq "" );
} }
return 0; return 0;
} }
sub configDiffMesg sub configDiffMesg
{ {
 End of changes. 118 change blocks. 
454 lines changed or deleted 602 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)