%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/controller/admin/ |
Current File : /home/bitrix/www/bitrix/modules/controller/admin/controller_run_command.php |
<? require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); /** @global CMain $APPLICATION */ /** @global CDatabase $DB */ /** @global CUser $USER */ /** @global CUserTypeManager $USER_FIELD_MANAGER */ $member_id = intval($_REQUEST['member']); if (!CModule::IncludeModule("controller")) { $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); } $bCanRunCommand = false; if ($USER->CanDoOperation("controller_run_command")) { $bCanRunCommand = true; } else { foreach (\Bitrix\Controller\AuthGrantTable::getControllerMemberScopes($member_id, $USER->GetID(), $USER->GetUserGroupArray()) as $grant ) { if ($grant["SCOPE"] === "php") { $bCanRunCommand = true; } } } if (!$bCanRunCommand) { $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); } require_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/controller/prolog.php"); IncludeModuleLangFile(__FILE__); $remove = 0; if (isset($_REQUEST["remove"]) && preg_match('/^tab(\d+)$/', $_REQUEST["remove"], $match) && check_bitrix_sessid()) { $remove = $match[1]; } if (isset($_REQUEST["query_count"]) && $_REQUEST["query_count"] > 1 && check_bitrix_sessid()) { $query_count = intval($_REQUEST["query_count"]); CUserOptions::SetOption("controller_run_command", "count", $query_count); } $query_count = CUserOptions::GetOption("controller_run_command", "count", 1); if ($query_count <= 1) $remove = 0; if (isset($_REQUEST["save"]) && check_bitrix_sessid()) { CUtil::JSPostUnescape(); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_js.php"); $i = 1; while (isset($_POST["query".$i])) { $saved = CUserOptions::GetOption("controller_run_command", "query".$i, ''); if ($saved !== $_POST["query".$i]) { CUserOptions::SetOption("controller_run_command", "query".$i, $_POST["query".$i]); } $i++; } while (strlen(CUserOptions::GetOption("controller_run_command", "query".$i, ''))) { CUserOptions::DeleteOption("controller_run_command", "query".$i); $i++; } echo "saved"; require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin_js.php"); die(); } $maxSafeCount = (isset($_REQUEST["force"]) && $_REQUEST["force"] == "Y"? false: COption::GetOptionString("controller", "safe_count")); $cnt = 0; $sTableID = "tbl_controller_run"; if ( $query <> "" && check_bitrix_sessid() && !isset($_POST["add"]) && !$remove ) { CUtil::JSPostUnescape(); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_js.php"); $arFilter = array( "DISCONNECTED" => "N", "CONTROLLER_GROUP_ID" => $_REQUEST['controller_group_id'], ); if ($member_id > 0) { $arFilter["=ID"] = $member_id; } elseif (isset($_REQUEST['controller_member_id']) && trim($_REQUEST['controller_member_id']) != "") { if (!is_array($_REQUEST['controller_member_id'])) $IDs = array_map("trim", explode(" ", $_REQUEST['controller_member_id'])); else $IDs = array_map("trim", $_REQUEST['controller_member_id']); $arFilterID = array(); $arFilterNAME = array(); foreach ($IDs as $id) { if (is_numeric($id)) $arFilterID[] = $id; else $arFilterNAME[] = strtoupper($id); } if (!empty($arFilterID) || !empty($arFilterNAME)) { $arFilter[0] = array("LOGIC" => "OR"); if (!empty($arFilterID)) $arFilter[0]["=ID"] = $arFilterID; if (!empty($arFilterNAME)) $arFilter[0]["NAME"] = $arFilterNAME; } } $runQueue = array(); $dbr_members = CControllerMember::GetList(Array("ID" => "ASC"), $arFilter); while ($ar_member = $dbr_members->Fetch()) { $runQueue[$ar_member["ID"]] = $ar_member["NAME"]; $cnt++; if ($maxSafeCount !== false && $cnt > $maxSafeCount) { $runQueue = array(); break; } } $cnt_ok = 0; foreach ($runQueue as $memberId => $memberName) { if ($_REQUEST['add_task'] == "Y") { if (CControllerTask::Add(array( "TASK_ID" => "REMOTE_COMMAND", "CONTROLLER_MEMBER_ID" => $memberId, "INIT_EXECUTE" => $query, )) ) { $cnt_ok++; } } else { echo BeginNote(); echo "<b>".htmlspecialcharsEx($memberName).":</b><br>"; $result = CControllerMember::RunCommandWithLog($memberId, $query); if ($result === false) { $e = $APPLICATION->GetException(); echo "Error: ".$e->GetString(); } else { echo nl2br($result); } echo EndNote(); } } if ($maxSafeCount !== false && $cnt > $maxSafeCount) { echo BeginNote(); echo GetMessage("CTRLR_RUN_ERR_TOO_MANY_SELECTED"); echo EndNote(); ?> <script>top.document.getElementById('tr_force').style.display = '';</script><? } else { if ($cnt <= 0) { echo BeginNote(); echo GetMessage("CTRLR_RUN_ERR_NSELECTED"); echo EndNote(); } if ($_REQUEST['add_task'] == "Y") { echo BeginNote(); echo GetMessage("CTRLR_RUN_SUCCESS", array( "#SUCCESS_CNT#" => $cnt_ok, "#CNT#" => $cnt, "#LANG#" => LANGUAGE_ID, )); echo EndNote(); } } require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin_js.php"); die(); } $APPLICATION->SetTitle(GetMessage("CTRLR_RUN_TITLE")); if( $_SERVER['REQUEST_METHOD'] == 'POST' && $_POST["ajax"] === "y" && (isset($_POST["add"]) || $remove) ) { CUtil::JSPostUnescape(); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_js.php"); } else { require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/prolog_admin_after.php"); } $aTabs = array(); for ($i = 1; $i <= $query_count - ($remove? 1: 0); $i++) { $aTabs[] = array( "DIV" => "tab".$i, "TAB" => GetMessage("CTRLR_RUN_COMMAND_FIELD")." (".$i.")", "TITLE" => GetMessage("CTRLR_RUN_COMMAND_TAB_TITLE"), ); } $aTabs[] = array( "DIV" => "tab_plus", "TAB" => '', "ONSELECT" => "AddNewTab();", ); $editTab = new CAdminTabControl("editTab", $aTabs); ?> <script> var tabActionInProgress = false; function TabAction(action, param, showWait) { var firstTab = BX('tab_cont_tab1'); if (!firstTab) return; tabActionInProgress = true; var data = { ajax: 'y' }; data[action] = param; var lastIndex = 1; while (BX('tab_cont_tab' + lastIndex)) { data['query' + lastIndex] = BX('query' + lastIndex).value; lastIndex++; } if (action == 'add') data['query_count'] = lastIndex; var selectedTab = BX('editTab_active_tab'); if (action == 'add') data[selectedTab.name] = 'tab' + lastIndex; else data[selectedTab.name] = param; if (showWait) { ShowWaitWindow(); } BX.ajax.post( 'controller_run_command.php?lang=' + phpVars.LANGUAGE_ID + '&sessid=' + phpVars.bitrix_sessid, data, function(result){ if (result && result != 'saved') { document.getElementById('whole_form').innerHTML = result; queries = []; CloseWaitWindow(); } tabActionInProgress = false; } ); } function AddNewTab() { TabAction('add', 'y'); } function RemoveTab(event) { if (event) { var tab = event.target.parentNode; var m = tab.id.match(/^tab_cont_(.+)$/); if (m) { TabAction('remove', m[1]); } } } var oldQueries = {}; function saveQueries(firstRun) { var newQueries = {}; var lastIndex = 1; while (BX('query' + lastIndex)) { newQueries['query' + lastIndex] = BX('query' + lastIndex).value; lastIndex++; } if (firstRun) { oldQueries = newQueries; return; } if (!tabActionInProgress && !compareMaps(oldQueries, newQueries)) { oldQueries = newQueries; TabAction('save', 'y', false); } } var queries = []; function adjustTabTitles() { var lastIndex = 1; while (BX('tab_cont_tab' + lastIndex)) { var query = BX('query' + lastIndex).value; if (query != queries[lastIndex]) { var m = query.match(/^\/\/title:\s*(.+)\n/); if (m) BX('tab_cont_tab' + lastIndex).innerHTML = BX.util.htmlspecialchars(m[1]); var close = BX.findChildren(BX('tab_cont_tab' + lastIndex), {className: 'adm-detail-tab-close'}, true); if (!close || close.length == 0) { var button = BX.create('SPAN', {props: {className: 'adm-detail-tab-close'}}); BX('tab_cont_tab' + lastIndex).appendChild(button); BX.bind(button, 'click', RemoveTab); //BX.bind(BX('query' + lastIndex), "keyup", saveQueries); } } queries[lastIndex] = query; lastIndex++; } var plus = BX.findChildren(BX('tab_cont_tab_plus'), {className: 'adm-detail-tab-plus'}, true); if(!plus || plus.length == 0) { button = BX.create('SPAN', {props: {className: 'adm-detail-tab-plus'}}); BX('tab_cont_tab_plus').appendChild(button); } } BX.ready( function init() { saveQueries(true); adjustTabTitles(); setInterval(function() { saveQueries(); adjustTabTitles(); }, 250); BX.addCustomEvent('OnAfterActionSelectionChanged', function() { saveQueries(); adjustTabTitles(); }); } ); function __FPHPSubmit() { if (confirm('<?echo GetMessage("CTRLR_RUN_CONFIRM")?>')) { var selectedTab = BX('editTab_active_tab'); var m = selectedTab.value.match(/^tab(\d+)$/); var data = { query: BX('query' + m[1]).value, add_task: (BX('add_task' + m[1]).checked ? 'Y' : 'N'), force: (BX('force').checked ? 'Y' : 'N'), ajax: 'y', sessid: phpVars.bitrix_sessid, controller_member_id: BX('controller_member_id').value, controller_group_id: BX('controller_group_id').value, } window.scrollTo(0, 500); ShowWaitWindow(); BX.ajax.post( 'controller_run_command.php?lang=' + phpVars.LANGUAGE_ID, data, function(result){ BX('result_div').innerHTML = result; CloseWaitWindow(); } ); } } function compareMaps(map1, map2) { var testVal; if (map1.size !== map2.size) { return false; } for (key in map1) { if (map1.hasOwnProperty(key)) { val = map1[key]; testVal = map2[key]; // in cases of an undefined value, make sure the key // actually exists on the object so there are no false positives if (testVal !== val || (testVal === undefined && !map2.hasOwnProperty(key))) { return false; } } } return true; } </script> <div id="whole_form"> <? if( $_SERVER['REQUEST_METHOD'] == 'POST' && $_POST["ajax"] === "y" && (isset($_POST["add"]) || $remove) ) { $APPLICATION->RestartBuffer(); ?> <script>window.editTab = null;</script> <? } ?> <form name="form1" action="<? echo $APPLICATION->GetCurPage() ?>" method="POST"> <input type="hidden" name="lang" value="<?=LANG?>"> <? if ($member_id > 0) { echo GetMessage("CTRLR_RUN_FILTER_SITE").': #'.$member_id."<br><br>"; } else { $arGroups = Array(); $dbr_groups = CControllerGroup::GetList(Array("SORT" => "ASC", "NAME" => "ASC", "ID" => "ASC")); while ($ar_groups = $dbr_groups->GetNext()) { $arGroups[$ar_groups["ID"]] = $ar_groups["NAME"]; } $filter = new CAdminFilter( $sTableID."_filter_id", Array(GetMessage("CTRLR_RUN_FILTER_GROUP")) ); $filter->Begin(); ?> <tr> <td nowrap><label for="controller_member_id"><?= GetMessage("CTRLR_RUN_FILTER_SITE") ?></label>: </td> <td nowrap> <? $dbr_members = CControllerMember::GetList(array( "SORT" => "ASC", "NAME" => "ASC", "ID" => "ASC", ), array( "DISCONNECTED" => "N", ), array( "ID", "NAME", ), array( ), array( "nTopCount" => $maxSafeCount+1, )); $arMembers = array(); $c = 0; while ($ar_member = $dbr_members->Fetch()) { $arMembers[$ar_member["ID"]] = $ar_member["NAME"]; $c++; if ($maxSafeCount !== false && $c > $maxSafeCount) { $arMembers = array(); break; } } if ($arMembers):?> <select name="controller_member_id" id="controller_member_id"> <option value=""><? echo GetMessage("CTRLR_RUN_FILTER_SITE_ALL") ?></option> <? foreach ($arMembers as $ID => $NAME): ?> <option value="<? echo htmlspecialcharsbx($ID) ?>" <? if ($controller_member_id == $ID) echo ' selected'; ?> ><? echo htmlspecialcharsEx($NAME." [".$ID."]") ?></option> <? endforeach ?> </select> <? else:?> <input type="text" name="controller_member_id" id="controller_member_id" value="<? echo htmlspecialcharsbx($controller_member_id) ?>" size="47" /> <? endif ?> </td> </tr> <tr> <td nowrap> <label for="controller_group_id"><? echo htmlspecialcharsEx(GetMessage("CTRLR_RUN_FILTER_GROUP")) ?></label>: </td> <td nowrap><? echo htmlspecialcharsEx($controller_group_id) ?> <select name="controller_group_id" id="controller_group_id"> <option value=""><? echo GetMessage("CTRLR_RUN_FILTER_GROUP_ANY") ?></option> <? foreach ($arGroups as $group_id => $group_name): ?> <option value="<?= $group_id ?>" <? if ($group_id == $controller_group_id) echo "selected" ?> ><?= $group_name ?></option> <? endforeach; ?> </select> </td> </tr> <? $filter->Buttons(); $filter->End(); } ?> <?=bitrix_sessid_post()?> <? $editTab->Begin(); for ($i = 1; $i <= $query_count - ($remove? 1: 0); $i++) { $index = $remove? ($i >= $remove? $i + 1: $i): $i; if (isset($_REQUEST['query'.$index])) $query = $_REQUEST['query'.$index]; else $query = CUserOptions::GetOption("controller_run_command", "query".$index, ''); $editTab->BeginNextTab(); ?> <tr> <td> <input type="hidden" name="lang" value="<?=LANG?>"> <textarea name="query<?echo $i?>" id="query<?echo $i?>" rows="15" style="width:100%;" title=""><? echo htmlspecialcharsbx($query); ?></textarea> <? if (COption::GetOptionString('fileman', "use_code_editor", "Y") == "Y" && CModule::IncludeModule('fileman')) { CCodeEditor::Show(array( 'textareaId' => 'query'.$i, 'height' => 350, 'forceSyntax' => 'php', )); } ?> </td> </tr> <tr> <td><br> <div class="adm-list"> <div class="adm-list-item"> <div class="adm-list-control"><input type="checkbox" id="add_task<?echo $i?>" name="add_task<?echo $i?>" title="<? echo GetMessage("CTRLR_RUN_ADD_TASK_LABEL") ?>" value="Y"></div> <div class="adm-list-label"><label for="add_task<?echo $i?>" title="<?echo GetMessage("CTRLR_RUN_ADD_TASK_LABEL")?>"><?echo GetMessage("CTRLR_RUN_ADD_TASK")?></label></div> </div> <div class="adm-list-item" style="display:none" id="tr_force"> <div class="adm-list-control"><input type="checkbox" id="force" name="force" value="Y"></div> <div class="adm-list-label"><label for="force"><? echo GetMessage("CTRLR_RUN_FORCE_RUN") ?></label></div> </div> </div> </td> </tr> <? } $editTab->Buttons(); ?> <input type="button" accesskey="x" name="execute" value="<? echo GetMessage("CTRLR_RUN_BUTT_RUN") ?>" onclick="return __FPHPSubmit();" class="adm-btn-save" <? if (!$bCanRunCommand) echo 'disabled="disabled"' ?> > <? $editTab->End(); ?> </form> </div> <? if( $_SERVER['REQUEST_METHOD'] == 'POST' && $_POST["ajax"] === "y" && (isset($_POST["add"]) || $remove) ) { if ($remove) { CUserOptions::SetOption("controller_run_command", "count", $query_count - 1); } ?><script>adjustTabTitles();</script><? require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin_js.php"); } else { ?><div id="result_div"></div><? } require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin.php");