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')">\ ${EscHTML($Lang->{CfgEdit_Button_Ove rride})} | <br><input type="checkbox" name="override_$varName" $override_checked value="1" onClick="checkboxChange('$varName')">\ ${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 |