X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=lib%2FBackupPC%2FCGI%2FEditConfig.pm;h=9b78b15f085154ee2ad5361b7a0739229e9640fd;hp=f8f0addb84e458b1f3b9d5b8e53daed492696da8;hb=5b79f9a3c01bca16dd4d211e76fc53daa549e421;hpb=ee969a9445a5439cf94a516c7d882e12b1bdf945 diff --git a/lib/BackupPC/CGI/EditConfig.pm b/lib/BackupPC/CGI/EditConfig.pm index f8f0add..9b78b15 100644 --- a/lib/BackupPC/CGI/EditConfig.pm +++ b/lib/BackupPC/CGI/EditConfig.pm @@ -10,7 +10,7 @@ # Craig Barratt # # COPYRIGHT -# Copyright (C) 2005 Craig Barratt +# Copyright (C) 2005-2007 Craig Barratt # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ # #======================================================================== # -# Version 3.0.0beta2, released 18 Nov 2006. +# Version 3.1.1, released 22 Dec 2008. # # See http://backuppc.sourceforge.net. # @@ -93,11 +93,21 @@ our %ConfigMenu = ( {name => "Bzip2Path"}, {text => "CfgEdit_Title_Install_Paths"}, - {name => "TopDir"}, - {name => "ConfDir"}, - {name => "LogDir"}, + # + # Can only edit TopDir and LogDir if we are in FHS mode. + # Otherwise they are hardcoded in lib/BackupPC/Lib.pm. + # + {name => "TopDir", + visible => sub { return $_[1]->useFHS(); } }, + {name => "LogDir", + visible => sub { return $_[1]->useFHS(); } }, {name => "CgiDir"}, - {name => "InstallDir"}, + # + # Cannot edit ConfDir or InstallDir, since the real value is hardcoded in + # lib/BackupPC/Lib.pm. + # {name => "ConfDir"}, + # {name => "InstallDir"}, + # ], }, email => { @@ -161,7 +171,9 @@ our %ConfigMenu = ( {name => "XferMethod", onchangeSubmit => 1}, {name => "XferLogLevel"}, {name => "ClientCharset"}, + {name => "ClientCharsetLegacy"}, + ### Smb Settings {text => "CfgEdit_Title_Smb_Settings", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, {name => "SmbShareName", @@ -171,11 +183,13 @@ our %ConfigMenu = ( {name => "SmbSharePasswd", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, + ### Tar Settings {text => "CfgEdit_Title_Tar_Settings", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, {name => "TarShareName", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, + ### Rsync Settings {text => "CfgEdit_Title_Rsync_Settings", visible => sub { return $_[0]->{XferMethod} eq "rsync"; } }, {text => "CfgEdit_Title_Rsyncd_Settings", @@ -191,6 +205,25 @@ our %ConfigMenu = ( {name => "RsyncCsumCacheVerifyProb", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, + ### Ftp Settings + {text => "CfgEdit_Title_Ftp_Settings", + visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, + {name => "FtpShareName", + visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, + {name => "FtpUserName", + visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, + {name => "FtpPasswd", + 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"; } }, + + ### BackupPCd Settings {text => "CfgEdit_Title_BackupPCd_Settings", visible => sub { return $_[0]->{XferMethod} eq "backuppcd"; } }, {name => "BackupPCdShareName", @@ -202,6 +235,7 @@ our %ConfigMenu = ( {name => "BackupPCdRestoreCmd", visible => sub { return $_[0]->{XferMethod} eq "backuppcd"; } }, + ### Archive Settings {text => "CfgEdit_Title_Archive_Settings", visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, {name => "ArchiveDest", @@ -213,6 +247,7 @@ our %ConfigMenu = ( {name => "ArchiveSplit", visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, + ### Include/Exclude Settings {text => "CfgEdit_Title_Include_Exclude", visible => sub { return $_[0]->{XferMethod} ne "archive"; } }, {name => "BackupFilesOnly", @@ -220,6 +255,7 @@ our %ConfigMenu = ( {name => "BackupFilesExclude", visible => sub { return $_[0]->{XferMethod} ne "archive"; } }, + ### Samba paths and commands {text => "CfgEdit_Title_Smb_Paths_Commands", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, {name => "SmbClientPath", @@ -231,6 +267,7 @@ our %ConfigMenu = ( {name => "SmbClientRestoreCmd", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, + ### Tar paths and commands {text => "CfgEdit_Title_Tar_Paths_Commands", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, {name => "TarClientPath", @@ -244,6 +281,7 @@ our %ConfigMenu = ( {name => "TarClientRestoreCmd", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, + ### Rsync paths and commands {text => "CfgEdit_Title_Rsync_Paths_Commands_Args", visible => sub { return $_[0]->{XferMethod} eq "rsync"; } }, {text => "CfgEdit_Title_Rsyncd_Port_Args", @@ -261,6 +299,7 @@ our %ConfigMenu = ( {name => "RsyncRestoreArgs", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, + ### Archive paths and commands {text => "CfgEdit_Title_Archive_Paths_Commands", visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, {name => "ArchiveClientCmd", @@ -368,13 +407,17 @@ sub action } if ( (my $var = $In{overrideUncheck}) ne "" ) { # - # a compound variable was unchecked; delete extra - # variables to make the shape the same. + # a compound variable was unchecked; delete or + # add extra variables to make the shape the same. # #print STDERR Dumper(\%In); foreach my $v ( keys(%In) ) { - next if ( $v !~ /^v_z_(\Q$var\E(_z_.*|$))/ ); - delete($In{$v}) if ( !defined($In{"orig_z_$1"}) ); + if ( $v =~ /^v_zZ_(\Q$var\E(_zZ_.*|$))/ ) { + delete($In{$v}) if ( !defined($In{"orig_zZ_$1"}) ); + } + if ( $v =~ /^orig_zZ_(\Q$var\E(_zZ_.*|$))/ ) { + $In{"v_zZ_$1"} = $In{$v}; + } } delete($In{"vflds.$var"}); } @@ -572,8 +615,8 @@ EOF return false; } var allVars = {}; - var varRE = new RegExp("^v_z_(" + varName + ".*)"); - var origRE = new RegExp("^orig_z_(" + varName + ".*)"); + var varRE = new RegExp("^v_zZ_(" + varName + ".*)"); + var origRE = new RegExp("^orig_zZ_(" + varName + ".*)"); for ( var i = 0 ; i < document.editForm.elements.length ; i++ ) { var e = document.editForm.elements[i]; var re; @@ -582,7 +625,7 @@ EOF allVars[re[1]] = 0; } allVars[re[1]]++; - //debugMsg("found v_z_ match with " + re[1]); + //debugMsg("found v_zZ_ match with " + re[1]); //debugMsg("allVars[" + re[1] + "] = " + allVars[re[1]]); } else if ( (re = origRE.exec(e.name)) != null ) { if ( allVars[re[1]] == null ) { @@ -600,7 +643,7 @@ EOF } else { // copy the original variable values //debugMsg("setting " + v); - eval("document.editForm.v_z_" + v + ".value = document.editForm.orig_z_" + v + ".value"); + eval("document.editForm.v_zZ_" + v + ".value = document.editForm.orig_zZ_" + v + ".value"); } } if ( sameShape ) { @@ -661,7 +704,7 @@ EOF if ( $In{deleteVar} ne "" && %$errors > 0 ) { my $matchAll = 1; foreach my $v ( keys(%$errors) ) { - if ( $v ne $In{deleteVar} && $v !~ /^\Q$In{deleteVar}_z_/ ) { + if ( $v ne $In{deleteVar} && $v !~ /^\Q$In{deleteVar}_zZ_/ ) { $matchAll = 0; last; } @@ -714,9 +757,14 @@ EOF ($mesg, my $hostChange) = hostsDiffMesg($hostsNew); $bpc->HostInfoWrite($hostsNew) if ( $hostChange ); foreach my $host ( keys(%$copyConf) ) { - my $confData = $bpc->ConfigDataRead($copyConf->{$host}); + # + # Currently host names are forced to lc when they + # are read from the hosts file. Therefore we need + # to force the from and to hosts to lc. + # + my $confData = $bpc->ConfigDataRead(lc($copyConf->{$host})); my $fromHost = $copyConf->{$host}; - $err .= $bpc->ConfigDataWrite($host, $confData); + $err .= $bpc->ConfigDataWrite(lc($host), $confData); $mesg .= eval("qq($Lang->{CfgEdit_Log_Copy_host_config})"); } @@ -758,7 +806,7 @@ EOF next if ( $disabled || $menuDisable{$menu}{top} ); if ( ref($paramInfo->{visible}) eq "CODE" - && !&{$paramInfo->{visible}}($newConf) ) { + && !&{$paramInfo->{visible}}($newConf, $bpc) ) { next; } @@ -848,7 +896,7 @@ EOF if ( defined($In{menu}) || $In{saveAction} eq "Save" ) { if ( $In{saveAction} eq "Save" && !$userHost ) { # - # Emit the new settings as orig_z_ parameters + # Emit the new settings as orig_zZ_ parameters # $doneParam = {}; foreach my $param ( keys(%ConfigMeta) ) { @@ -867,10 +915,10 @@ EOF } } else { # - # Just switching menus: copy all the orig_z_ input parameters + # Just switching menus: copy all the orig_zZ_ input parameters # foreach my $var ( keys(%In) ) { - next if ( $var !~ /^orig_z_/ ); + next if ( $var !~ /^orig_zZ_/ ); my $val = decode_utf8($In{$var}); $contentHidden .= < @@ -920,7 +968,7 @@ sub fieldHiddenBuild $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); for ( my $i = 0 ; $i < @$varValue ; $i++ ) { - $content .= fieldHiddenBuild($type->{child}, "${varName}_z_$i", + $content .= fieldHiddenBuild($type->{child}, "${varName}_zZ_$i", $varValue->[$i], $prefix); } } elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) { @@ -948,18 +996,18 @@ sub fieldHiddenBuild EOF } - $content .= fieldHiddenBuild($childType, "${varName}_z_$fld", + $content .= fieldHiddenBuild($childType, "${varName}_zZ_$fld", $varValue->{$fld}, $prefix); } } elsif ( $type->{type} eq "shortlist" ) { $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); $varValue = join(", ", @$varValue); $content .= < + EOF } else { $content .= < + EOF } return $content; @@ -986,13 +1034,13 @@ sub fieldEditBuild if ( $level == 0 ) { my $lcVarName = lc($varName); $content .= <$varName +$varName EOF if ( defined($overrideVar) ) { my $override_checked = ""; - if ( !$isError && $In{deleteVar} =~ /^\Q${varName}_z_/ - || !$isError && $In{insertVar} =~ /^\Q${varName}\E(_z_|$)/ - || !$isError && $In{addVar} =~ /^\Q${varName}\E(_z_|$)/ ) { + if ( !$isError && $In{deleteVar} =~ /^\Q${varName}_zZ_/ + || !$isError && $In{insertVar} =~ /^\Q${varName}\E(_zZ_|$)/ + || !$isError && $In{addVar} =~ /^\Q${varName}\E(_zZ_|$)/ ) { $overrideSet = 1; } if ( $overrideSet ) { @@ -1009,7 +1057,7 @@ EOF $content .= "\n"; $varValue = [] if ( !defined($varValue) ); $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); - if ( !$isError && $In{deleteVar} =~ /^\Q${varName}_z_\E(\d+)$/ + if ( !$isError && $In{deleteVar} =~ /^\Q${varName}_zZ_\E(\d+)$/ && $1 < @$varValue ) { # # User deleted entry in this array @@ -1017,7 +1065,7 @@ EOF splice(@$varValue, $1, 1) if ( @$varValue > 1 || $type->{emptyOk} ); $In{deleteVar} = ""; } - if ( !$isError && $In{insertVar} =~ /^\Q${varName}_z_\E(\d+)$/ + if ( !$isError && $In{insertVar} =~ /^\Q${varName}_zZ_\E(\d+)$/ && $1 < @$varValue ) { # # User inserted entry in this array @@ -1054,12 +1102,12 @@ EOF if ( @$varValue > 1 || $type->{emptyOk} ) { $content .= < - + EOF } - $content .= fieldEditBuild($type->{child}, "${varName}_z_$i", + $content .= fieldEditBuild($type->{child}, "${varName}_zZ_$i", $varValue->[$i], $errors, $level + 1, undef, $isError, $onchangeSubmit, $overrideVar, $overrideSet); @@ -1069,17 +1117,17 @@ EOF for ( my $i = 0 ; $i < @$varValue ; $i++ ) { $content .= < - + EOF if ( @$varValue > 1 || $type->{emptyOk} ) { $content .= < + EOF } $content .= "\n"; - $content .= fieldEditBuild($type->{child}, "${varName}_z_$i", + $content .= fieldEditBuild($type->{child}, "${varName}_zZ_$i", $varValue->[$i], $errors, $level + 1, undef, $isError, $onchangeSubmit, $overrideVar, $overrideSet); @@ -1099,8 +1147,8 @@ EOF $varValue = {} if ( ref($varValue) ne "HASH" ); if ( !$isError && !$type->{noKeyEdit} - && $In{deleteVar} !~ /^\Q${varName}_z_\E.*_z_/ - && $In{deleteVar} =~ /^\Q${varName}_z_\E(.*)$/ ) { + && $In{deleteVar} !~ /^\Q${varName}_zZ_\E.*_zZ_/ + && $In{deleteVar} =~ /^\Q${varName}_zZ_\E(.*)$/ ) { # # User deleted entry in this hash # @@ -1134,8 +1182,8 @@ EOF if ( !$type->{noKeyEdit} && (keys(%$varValue) > 1 || $type->{emptyOk}) ) { $content .= < + EOF } if ( defined($type->{child}) ) { @@ -1151,7 +1199,7 @@ EOF EOF } $content .= "\n"; - $content .= fieldEditBuild($childType, "${varName}_z_$fld", + $content .= fieldEditBuild($childType, "${varName}_zZ_$fld", $varValue->{$fld}, $errors, $level + 1, undef, $isError, $onchangeSubmit, $overrideVar, $overrideSet); @@ -1193,7 +1241,7 @@ EOF EOF } - $content .= fieldEditBuild($childType, "${varName}_z_$fld", + $content .= fieldEditBuild($childType, "${varName}_zZ_$fld", $varValue->{$fld}, $errors, $level + 1, undef, $isError, $onchangeSubmit, $overrideVar, $overrideSet); @@ -1206,7 +1254,7 @@ EOF # in %In, rather than the parsed values in $varValue. # This is so that the user's erroneous input is preserved. # - $varValue = $In{"v_z_$varName"} if ( defined($In{"v_z_$varName"}) ); + $varValue = $In{"v_zZ_$varName"} if ( defined($In{"v_zZ_$varName"}) ); } if ( defined($errors->{$varName}) ) { $content .= < + EOF } elsif ( $type->{type} eq "boolean" ) { # checkbox my $checked = "checked" if ( $varValue ); $content .= < + EOF } elsif ( $type->{type} eq "select" ) { $content .= < + EOF } $content .= "\n"; @@ -1286,7 +1334,7 @@ sub fieldErrorCheck if ( $type->{type} eq "list" ) { for ( my $i = 0 ; ; $i++ ) { - last if ( fieldErrorCheck($type->{child}, "${varName}_z_$i", $errors) ); + last if ( fieldErrorCheck($type->{child}, "${varName}_zZ_$i", $errors) ); } } elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) { my(@order, $childType); @@ -1305,31 +1353,31 @@ sub fieldErrorCheck } else { $childType = $type->{childType}; } - $ret ||= fieldErrorCheck($childType, "${varName}_z_$fld", $errors); + $ret ||= fieldErrorCheck($childType, "${varName}_zZ_$fld", $errors); } return $ret; } else { - $In{"v_z_$varName"} = "0" if ( $type->{type} eq "boolean" - && $In{"v_z_$varName"} eq "" ); + $In{"v_zZ_$varName"} = "0" if ( $type->{type} eq "boolean" + && $In{"v_zZ_$varName"} eq "" ); - return 1 if ( !exists($In{"v_z_$varName"}) ); + return 1 if ( !exists($In{"v_zZ_$varName"}) ); - (my $var = $varName) =~ s/_z_/./g; + (my $var = $varName) =~ s/_zZ_/./g; if ( $type->{type} eq "integer" || $type->{type} eq "boolean" ) { - if ( $In{"v_z_$varName"} !~ /^-?\d+\s*$/s - && $In{"v_z_$varName"} ne "" ) { + if ( $In{"v_zZ_$varName"} !~ /^-?\d+\s*$/s + && $In{"v_zZ_$varName"} ne "" ) { $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_an_integer}}"); } } elsif ( $type->{type} eq "float" ) { - if ( $In{"v_z_$varName"} !~ /^-?\d*(\.\d*)?\s*$/s - && $In{"v_z_$varName"} ne "" ) { + if ( $In{"v_zZ_$varName"} !~ /^-?\d*(\.\d*)?\s*$/s + && $In{"v_zZ_$varName"} ne "" ) { $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_real_valued_number}}"); } } elsif ( $type->{type} eq "shortlist" ) { - my @vals = split(/[,\s]+/, $In{"v_z_$varName"}); + my @vals = split(/[,\s]+/, $In{"v_zZ_$varName"}); for ( my $i = 0 ; $i < @vals ; $i++ ) { if ( $type->{child} eq "integer" && $vals[$i] !~ /^-?\d+\s*$/s @@ -1346,7 +1394,7 @@ sub fieldErrorCheck } elsif ( $type->{type} eq "select" ) { my $match = 0; foreach my $option ( @{$type->{values}} ) { - if ( $In{"v_z_$varName"} eq $option ) { + if ( $In{"v_zZ_$varName"} eq $option ) { $match = 1; last; } @@ -1354,7 +1402,7 @@ sub fieldErrorCheck $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_valid_option}}") if ( !$match ); } elsif ( $type->{type} eq "execPath" ) { - if ( $In{"v_z_$varName"} ne "" && !-x $In{"v_z_$varName"} ) { + if ( $In{"v_zZ_$varName"} ne "" && !-x $In{"v_zZ_$varName"} ) { $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_executable_program}}"); } } else { @@ -1395,7 +1443,7 @@ sub fieldInputParse $$value = []; for ( my $i = 0 ; ; $i++ ) { my $val; - last if ( fieldInputParse($type->{child}, "${varName}_z_$i", \$val) ); + last if ( fieldInputParse($type->{child}, "${varName}_zZ_$i", \$val) ); push(@$$value, $val); } $$value = undef if ( $type->{undefIfEmpty} && @$$value == 0 ); @@ -1419,19 +1467,19 @@ sub fieldInputParse } else { $childType = $type->{childType}; } - $ret ||= fieldInputParse($childType, "${varName}_z_$fld", \$val); + $ret ||= fieldInputParse($childType, "${varName}_zZ_$fld", \$val); last if ( $ret ); $$value->{$fld} = $val; } return $ret; } else { if ( $type->{type} eq "boolean" ) { - $$value = 0 + $In{"v_z_$varName"}; - } elsif ( !exists($In{"v_z_$varName"}) ) { + $$value = 0 + $In{"v_zZ_$varName"}; + } elsif ( !exists($In{"v_zZ_$varName"}) ) { return 1; } - my $v = $In{"v_z_$varName"}; + my $v = $In{"v_zZ_$varName"}; if ( $type->{type} eq "integer" ) { if ( $v =~ /^-?\d+\s*$/s || $v eq "" ) { @@ -1464,8 +1512,10 @@ sub fieldInputParse } } } else { - $$value = decode_utf8($In{"v_z_$varName"}); + $$value = decode_utf8($In{"v_zZ_$varName"}); $$value =~ s/\r\n/\n/g; + # remove leading space from exec paths + $$value =~ s/^\s+// if ( $type->{type} eq "execPath" ); } $$value = undef if ( $type->{undefIfEmpty} && $$value eq "" ); }