📄 editconfig.pm
字号:
@order = sort(keys(%{$type->{child}})); } else { @order = sort(keys(%$varValue)); } foreach my $fld ( @order ) { if ( defined($type->{child}) ) { $childType = $type->{child}{$fld}; } else { $childType = $type->{childType}; # # emit list of fields since they are user-defined # rather than hard-coded # $content .= <<EOF;<input type="hidden" name="vflds.$varName" value="${EscHTML($fld)}">EOF } $content .= fieldEditBuild($childType, "${varName}_zZ_$fld", $varValue->{$fld}, $errors, $level + 1, undef, $isError, $onchangeSubmit, $overrideVar, $overrideSet); } } else { $content .= "<td class=\"border\">\n"; if ( $isError ) { # # If there was an error, we use the original post values # in %In, rather than the parsed values in $varValue. # This is so that the user's erroneous input is preserved. # $varValue = $In{"v_zZ_$varName"} if ( defined($In{"v_zZ_$varName"}) ); } if ( defined($errors->{$varName}) ) { $content .= <<EOF;<span class="editError">$errors->{$varName}</span><br>EOF } my $onChange; if ( defined($overrideVar) ) { $onChange .= "checkboxSet('$overrideVar');"; } else { $onChange .= "varChange('$varName');"; } if ( $onchangeSubmit ) { $onChange .= "document.editForm.submit();"; } if ( $onChange ne "" ) { $onChange = " onChange=\"$onChange\""; } if ( $varValue !~ /\n/ && ($type->{type} eq "integer" || $type->{type} eq "string" || $type->{type} eq "execPath" || $type->{type} eq "shortlist" || $type->{type} eq "float") ) { # simple input box if ( $type->{type} eq "shortlist" ) { $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); $varValue = join(", ", @$varValue); } my $textType = ($varName =~ /Passwd/) ? "password" : "text"; $content .= <<EOF;<input type="$textType" class="editTextInput" name="v_zZ_$varName" size="$size" maxlength="256" value="${EscHTML($varValue)}"$onChange>EOF } elsif ( $type->{type} eq "boolean" ) { # checkbox my $checked = "checked" if ( $varValue ); $content .= <<EOF;<input type="checkbox" name="v_zZ_$varName" $checked value="1"$onChange>EOF } elsif ( $type->{type} eq "select" ) { $content .= <<EOF;<select name="v_zZ_$varName"$onChange>EOF foreach my $option ( @{$type->{values}} ) { my $sel = " selected" if ( $varValue eq $option ); $content .= "<option$sel>$option</option>\n"; } $content .= "</select>\n"; } else { # multi-line text area - count number of lines my $rowCnt = $varValue =~ tr/\n//; $rowCnt = 1 if ( $rowCnt < 1 ); $content .= <<EOF;<textarea name="v_zZ_$varName" class="editTextArea" cols="$size" rows="$rowCnt"$onChange>${EscHTML($varValue)}</textarea>EOF } $content .= "</td>\n"; } return $content;}sub errorCheck{ my $errors = {}; foreach my $param ( keys(%ConfigMeta) ) { fieldErrorCheck($ConfigMeta{$param}, $param, $errors); } return $errors;}sub fieldErrorCheck{ my($type, $varName, $errors) = @_; $type = { type => $type } if ( ref($type) ne "HASH" ); if ( $type->{type} eq "list" ) { for ( my $i = 0 ; ; $i++ ) { last if ( fieldErrorCheck($type->{child}, "${varName}_zZ_$i", $errors) ); } } elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) { my(@order, $childType); my $ret; if ( defined($type->{order}) ) { @order = @{$type->{order}}; } elsif ( defined($type->{child}) ) { @order = sort(keys(%{$type->{child}})); } else { @order = split(/\0/, $In{"vflds.$varName"}); } foreach my $fld ( @order ) { if ( defined($type->{child}) ) { $childType = $type->{child}{$fld}; } else { $childType = $type->{childType}; } $ret ||= fieldErrorCheck($childType, "${varName}_zZ_$fld", $errors); } return $ret; } else { $In{"v_zZ_$varName"} = "0" if ( $type->{type} eq "boolean" && $In{"v_zZ_$varName"} eq "" ); return 1 if ( !exists($In{"v_zZ_$varName"}) ); (my $var = $varName) =~ s/_zZ_/./g; if ( $type->{type} eq "integer" || $type->{type} eq "boolean" ) { 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_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_zZ_$varName"}); for ( my $i = 0 ; $i < @vals ; $i++ ) { if ( $type->{child} eq "integer" && $vals[$i] !~ /^-?\d+\s*$/s && $vals[$i] ne "" ) { my $k = $i + 1; $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__entry__must_be_an_integer}}"); } elsif ( $type->{child} eq "float" && $vals[$i] !~ /^-?\d*(\.\d*)?\s*$/s && $vals[$i] ne "" ) { my $k = $i + 1; $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__entry__must_be_real_valued_number}}"); } } } elsif ( $type->{type} eq "select" ) { my $match = 0; foreach my $option ( @{$type->{values}} ) { if ( $In{"v_zZ_$varName"} eq $option ) { $match = 1; last; } } $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_valid_option}}") if ( !$match ); } elsif ( $type->{type} eq "execPath" ) { if ( $In{"v_zZ_$varName"} ne "" && !-x $In{"v_zZ_$varName"} ) { $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_executable_program}}"); } } else { # # $type->{type} eq "string": no error checking # } } return 0;}sub inputParse{ my($bpc, $userHost) = @_; my $conf = {}; my $override = {}; foreach my $param ( keys(%ConfigMeta) ) { my $value; next if ( $userHost && (!defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) || (!$PrivAdmin && !$bpc->{Conf}{CgiUserConfigEdit}{$param})) ); fieldInputParse($ConfigMeta{$param}, $param, \$value); $conf->{$param} = $value; $override->{$param} = $In{"override_$param"}; } return ($conf, $override);}sub fieldInputParse{ my($type, $varName, $value) = @_; $type = { type => $type } if ( ref($type) ne "HASH" ); if ( $type->{type} eq "list" ) { $$value = []; for ( my $i = 0 ; ; $i++ ) { my $val; last if ( fieldInputParse($type->{child}, "${varName}_zZ_$i", \$val) ); push(@$$value, $val); } $$value = undef if ( $type->{undefIfEmpty} && @$$value == 0 ); } elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) { my(@order, $childType); my $ret; $$value = {}; if ( defined($type->{order}) ) { @order = @{$type->{order}}; } elsif ( defined($type->{child}) ) { @order = sort(keys(%{$type->{child}})); } else { @order = split(/\0/, $In{"vflds.$varName"}); } foreach my $fld ( @order ) { my $val; if ( defined($type->{child}) ) { $childType = $type->{child}{$fld}; } else { $childType = $type->{childType}; } $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_zZ_$varName"}; } elsif ( !exists($In{"v_zZ_$varName"}) ) { return 1; } my $v = $In{"v_zZ_$varName"}; if ( $type->{type} eq "integer" ) { if ( $v =~ /^-?\d+\s*$/s || $v eq "" ) { $$value = 0 + $v; } else { # error value - keep in string form $$value = $v; } } elsif ( $type->{type} eq "float" ) { if ( $v =~ /^-?\d*(\.\d*)?\s*$/s || $v eq "" ) { $$value = 0 + $v; } else { # error value - keep in string form $$value = $v; } } elsif ( $type->{type} eq "shortlist" ) { $$value = [split(/[,\s]+/, $v)]; if ( $type->{child} eq "float" ) { foreach ( @$$value ) { if ( /^-?\d*(\.\d*)?\s*$/s || $v eq "" ) { $_ += 0; } } } elsif ( $type->{child} eq "integer" || $type->{child} eq "boolean" ) { foreach ( @$$value ) { if ( /^-?\d+\s*$/s || $v eq "" ) { $_ += 0; } } } } else { $$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 "" ); } return 0;}sub configDiffMesg{ my($host, $oldConf, $newConf) = @_; my $mesg; my $conf; if ( $host ne "" ) { $conf = "host $host config"; } else { $conf = "main config"; } foreach my $p ( keys(%ConfigMeta) ) { if ( !exists($oldConf->{$p}) && !exists($newConf->{$p}) ) { next; } elsif ( exists($oldConf->{$p}) && !exists($newConf->{$p}) ) { $mesg .= eval("qq($Lang->{CfgEdit_Log_Delete_param})"); } elsif ( !exists($oldConf->{$p}) && exists($newConf->{$p}) ) { my $dump = Data::Dumper->new([$newConf->{$p}]); $dump->Indent(0); $dump->Sortkeys(1); $dump->Terse(1); my $value = $dump->Dump; $value =~ s/\n/\\n/g; $value =~ s/\r/\\r/g; $mesg .= eval("qq($Lang->{CfgEdit_Log_Add_param_value})"); } else { my $dump = Data::Dumper->new([$newConf->{$p}]); $dump->Indent(0); $dump->Sortkeys(1); $dump->Terse(1); my $valueNew = $dump->Dump; my $v = $oldConf->{$p}; if ( ref($newConf->{$p}) eq "ARRAY" && ref($v) eq "" ) { $v = [$v]; } $dump = Data::Dumper->new([$v]); $dump->Indent(0); $dump->Sortkeys(1); $dump->Terse(1); my $valueOld = $dump->Dump; (my $valueNew2 = $valueNew) =~ s/['\n\r]//g; (my $valueOld2 = $valueOld) =~ s/['\n\r]//g; next if ( $valueOld2 eq $valueNew2 ); $valueNew =~ s/\n/\\n/g; $valueOld =~ s/\n/\\n/g; $valueNew =~ s/\r/\\r/g; $valueOld =~ s/\r/\\r/g; $mesg .= eval("qq($Lang->{CfgEdit_Log_Change_param_value})"); } } return $mesg;}sub hostsDiffMesg{ my($hostsNew) = @_; my $hostsOld = $bpc->HostInfoRead(); my($mesg, $hostChange); foreach my $host ( keys(%$hostsOld) ) { if ( !defined($hostsNew->{$host}) ) { $mesg .= eval("qq($Lang->{CfgEdit_Log_Host_Delete})"); $hostChange++; next; } foreach my $key ( keys(%{$hostsNew->{$host}}) ) { next if ( $hostsNew->{$host}{$key} eq $hostsOld->{$host}{$key} ); my $valueOld = $hostsOld->{$host}{$key}; my $valueNew = $hostsNew->{$host}{$key}; $mesg .= eval("qq($Lang->{CfgEdit_Log_Host_Change})"); $hostChange++; } } foreach my $host ( keys(%$hostsNew) ) { next if ( defined($hostsOld->{$host}) ); my $dump = Data::Dumper->new([$hostsNew->{$host}]); $dump->Indent(0); $dump->Sortkeys(1); $dump->Terse(1); my $value = $dump->Dump; $value =~ s/\n/\\n/g; $value =~ s/\r/\\r/g; $mesg .= eval("qq($Lang->{CfgEdit_Log_Host_Add})"); $hostChange++; } return ($mesg, $hostChange);}1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -