📄 editconfig.pm
字号:
} else { # # First time: pick up the current config settings # $mainConf = $bpc->ConfigDataRead(); if ( $host ne "" ) { $hostConf = $bpc->ConfigDataRead($host); $override = {}; foreach my $param ( keys(%$hostConf) ) { $override->{$param} = 1; } } else { my $hostInfo = $bpc->HostInfoRead(); $hostConf = {}; $mainConf->{Hosts} = [map($hostInfo->{$_}, sort(keys(%$hostInfo)))]; } $newConf = { %$mainConf, %$hostConf }; } if ( $In{saveAction} ne "Save" && $In{newMenu} ne "" && defined($ConfigMenu{$In{newMenu}}) ) { $menu = $In{newMenu}; } my %menuDisable; if ( $userHost ) { # # For a non-admin user editing the host config, we need to # figure out which subsets of the menu tree will be visible, # based on what is enabled. Admin users can edit all the # available per-host settings. # foreach my $m ( keys(%ConfigMenu) ) { my $enabled = 0; my $text = -1; my $n = 0; my @mask = (); foreach my $paramInfo ( @{$ConfigMenu{$m}{param}} ) { my $param = $paramInfo->{name}; if ( defined($paramInfo->{text}) ) { $text = $n; $mask[$text] = 1; } else { if ( $bpc->{Conf}{CgiUserConfigEdit}{$param} || (defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) && $PrivAdmin) ) { $mask[$text] = 0 if ( $text >= 0 ); $mask[$n] = 0; $enabled ||= 1; } else { $mask[$n] = 1; } } $n++; } $menuDisable{$m}{mask} = \@mask; $menuDisable{$m}{top} = !$enabled; } if ( $menuDisable{$menu}{top} ) { # # Find an enabled menu if the current menu is empty # foreach my $m ( sort(keys(%menuDisable)) ) { if ( !$menuDisable{$m}{top} ) { $menu = $m; last; } } } } my $groupText; foreach my $m ( keys(%ConfigMenu) ) { next if ( $menuDisable{$m}{top} ); my $text = eval("qq($Lang->{$ConfigMenu{$m}{text}})"); if ( $m eq $menu ) { $groupText .= <<EOF;<td class="editTabSel"><a href="javascript:menuSubmit('$m')"><b>$text</b></a></td>EOF } else { $groupText .= <<EOF;<td class="editTabNoSel"><a href="javascript:menuSubmit('$m')">$text</a></td>EOF } } if ( $host eq "" ) { $content .= eval("qq($Lang->{CfgEdit_Header_Main})"); } else { $content .= eval("qq($Lang->{CfgEdit_Header_Host})"); } my $saveStyle = ""; my $saveColor = "#ff0000"; if ( $In{modified} && $In{saveAction} ne "Save" && !%$errors ) { $saveStyle = "style=\"color:$saveColor\""; } else { $In{modified} = 0; } # # Add action and host to the URL so the nav bar link is # highlighted # my $url = "$MyURL?action=editConfig"; $url .= "&host=$host" if ( $host ne "" ); $content .= <<EOF;<table border="0" cellpadding="2"><tr>$groupText</tr><tr><form method="post" name="editForm" action="$url"><input type="hidden" name="host" value="$host"><input type="hidden" name="menu" value="$menu"><input type="hidden" name="newMenu" value=""><input type="hidden" name="modified" value="$In{modified}"><input type="hidden" name="deleteVar" value=""><input type="hidden" name="insertVar" value=""><input type="hidden" name="overrideUncheck" value=""><input type="hidden" name="addVar" value=""><input type="hidden" name="action" value="editConfig"><input type="hidden" name="saveAction" value=""><input type="button" class="editSaveButton" name="editAction" value="${EscHTML($Lang->{CfgEdit_Button_Save})}" $saveStyle onClick="saveSubmit();"><p><script language="javascript" type="text/javascript"><!-- function saveSubmit() { if ( document.editForm.modified.value != 0 ) { document.editForm.saveAction.value = 'Save'; document.editForm.submit(); } return false; } function deleteSubmit(varName) { document.editForm.deleteVar.value = varName; document.editForm.modified.value = 1; document.editForm.submit(); return; } function insertSubmit(varName) { document.editForm.insertVar.value = varName; document.editForm.modified.value = 1; document.editForm.submit(); return; } function addSubmit(varName, checkKey) { if ( checkKey && eval("document.editForm.addVarKey_" + varName + ".value") == "" ) { alert("New key must be non-empty"); return; } document.editForm.addVar.value = varName; document.editForm.modified.value = 1; document.editForm.submit(); return; } function menuSubmit(menuName) { document.editForm.newMenu.value = menuName; document.editForm.submit(); } function varChange(varName) { document.editForm.modified.value = 1; document.editForm.editAction.style.color = '$saveColor'; } function checkboxChange(varName) { document.editForm.modified.value = 1; document.editForm.editAction.style.color = '$saveColor'; // Do nothing if the checkbox is now set if ( eval("document.editForm.override_" + varName + ".checked") ) { return false; } var allVars = {}; 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; if ( (re = varRE.exec(e.name)) != null ) { if ( allVars[re[1]] == null ) { allVars[re[1]] = 0; } allVars[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 ) { allVars[re[1]] = 0; } allVars[re[1]]--; //debugMsg("allVars[" + re[1] + "] = " + allVars[re[1]]); } } var sameShape = 1; for ( v in allVars ) { if ( allVars[v] != 0 ) { //debugMsg("Not the same shape because of " + v); sameShape = 0; } else { // copy the original variable values //debugMsg("setting " + v); eval("document.editForm.v_zZ_" + v + ".value = document.editForm.orig_zZ_" + v + ".value"); } } if ( sameShape ) { return true; } else { // need to rebuild the form since the compound variable // has changed shape document.editForm.overrideUncheck.value = varName; document.editForm.submit(); return false; } } function checkboxSet(varName) { document.editForm.modified.value = 1; document.editForm.editAction.style.color = '$saveColor'; eval("document.editForm.override_" + varName + ".checked = 1;"); return false; } var debugCounter = 0; function debugMsg(msg) { debugCounter++; var t = document.createTextNode(debugCounter + ": " + msg); var br = document.createElement("br"); var debug = document.getElementById("debug"); debug.appendChild(t); debug.appendChild(br); } function displayHelp(varName) { var help = document.getElementById("id_" + varName); help.style.display = help.style.display == "block" ? "none" : "block"; }//--></script><span id="debug">$debugText</span>EOF $content .= <<EOF;<table border="1" cellspacing="0">EOF my $doneParam = {}; my $tblContent; # # There is a special case of the user deleting just the field # that has the error(s). So if the delete variable is a match # or parent to all the errors then ignore the errors. # if ( $In{deleteVar} ne "" && %$errors > 0 ) { my $matchAll = 1; foreach my $v ( keys(%$errors) ) { if ( $v ne $In{deleteVar} && $v !~ /^\Q$In{deleteVar}_zZ_/ ) { $matchAll = 0; last; } } $errors = {} if ( $matchAll ); } my $isError = %$errors; if ( !$isError && $In{saveAction} eq "Save" ) { my($mesg, $err); if ( $host ne "" ) { $hostConf = $bpc->ConfigDataRead($host) if ( !defined($hostConf) ); my %hostConf2 = %$hostConf; foreach my $param ( keys(%$newConf) ) { if ( $override->{$param} ) { $hostConf->{$param} = $newConf->{$param} } else { delete($hostConf->{$param}); } } $mesg = configDiffMesg($host, \%hostConf2, $hostConf); $err .= $bpc->ConfigDataWrite($host, $hostConf); } else { $mainConf = $bpc->ConfigDataRead() if ( !defined($mainConf) ); my $hostsSave = []; my($hostsNew, $allHosts, $copyConf); foreach my $entry ( @{$newConf->{Hosts}} ) { next if ( $entry->{host} eq "" ); $allHosts->{$entry->{host}} = 1; $allHosts->{$1} = 1 if ( $entry->{host} =~ /(.+?)\s*=/ ); } foreach my $entry ( @{$newConf->{Hosts}} ) { next if ( $entry->{host} eq "" || defined($hostsNew->{$entry->{host}}) ); if ( $entry->{host} =~ /(.+?)\s*=\s*(.+)/ ) { if ( defined($allHosts->{$2}) ) { $entry->{host} = $1; $copyConf->{$1} = $2; } else { my $fullHost = $entry->{host}; my $copyHost = $2; $err .= eval("qq($Lang->{CfgEdit_Error_Copy_host_does_not_exist})"); } } push(@$hostsSave, $entry); $hostsNew->{$entry->{host}} = $entry; } ($mesg, my $hostChange) = hostsDiffMesg($hostsNew); $bpc->HostInfoWrite($hostsNew) if ( $hostChange ); foreach my $host ( keys(%$copyConf) ) { # # 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(lc($host), $confData); $mesg .= eval("qq($Lang->{CfgEdit_Log_Copy_host_config})"); } delete($newConf->{Hosts}); $mesg .= configDiffMesg(undef, $mainConf, $newConf); $mainConf = { %$mainConf, %$newConf }; $err .= $bpc->ConfigDataWrite(undef, $mainConf); $newConf->{Hosts} = $hostsSave; } if ( defined($err) ) { $tblContent .= <<EOF;<tr><td colspan="2" class="border"><span class="editError">$err</span></td></tr>EOF } $bpc->ServerConnect(); if ( $mesg ne "" ) { (my $mesgBR = $mesg) =~ s/\n/<br>\n/g; # uncomment this if you want the changes to be displayed# $tblContent .= <<EOF;#<tr><td colspan="2" class="border"><span class="editComment">$mesgBR</span></td></tr>#EOF foreach my $str ( split(/\n/, $mesg) ) { $bpc->ServerMesg("log $str") if ( $str ne "" ); } } # # Tell the server to reload, unless we only changed # a client config # $bpc->ServerMesg("server reload") if ( $host eq "" ); } my @mask = @{$menuDisable{$menu}{mask} || []}; foreach my $paramInfo ( @{$ConfigMenu{$menu}{param}} ) { my $param = $paramInfo->{name}; my $disabled = shift(@mask); next if ( $disabled || $menuDisable{$menu}{top} ); if ( ref($paramInfo->{visible}) eq "CODE" && !&{$paramInfo->{visible}}($newConf, $bpc) ) { next; } if ( defined($paramInfo->{text}) ) { my $text = eval("qq($Lang->{$paramInfo->{text}})"); $tblContent .= <<EOF;<tr><td colspan="2" class="editHeader">$text</td></tr>EOF next; } # # TODO: get parameter documentation # my $comment = ""; #$comment =~ s/\'//g; #$comment =~ s/\"//g;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -