protected function _DoExecute($oTrigger, $aContextArgs, &$oLog)
 {
     $sPreviousUrlMaker = ApplicationContext::SetUrlMakerClass();
     try {
         $sScriptPath = $this->Get('script_path');
         if (!is_executable($sScriptPath)) {
             throw new Exception('cannot execute script');
         }
         $sCMD = '';
         $aParams = explode("\n", $this->Get('params'));
         array_walk($aParams, function (&$aParam) {
             $aParam = explode('=', $aParam);
             $aParam = array_map('trim', $aParam);
         });
         foreach ($aParams as $aParam) {
             if (count($aParam) == 2) {
                 $sVarName = $aParam[0];
                 $sVarValue = MetaModel::ApplyParams($aParam[1], $aContextArgs);
                 if ($sVarValue == $aParam[1]) {
                     $sVarValue = '';
                     // Значит ApplyParams не нашел такого плейсхолдера
                     if ($this->IsBeingTested() && !is_null($oLog)) {
                         $oLog->Set('log', $oLog->Get('log') . "There is no value for placeholder: {$aParam['1']}\n");
                     }
                 }
             } else {
                 $sVarName = $aParam[0];
                 $sVarValue = MetaModel::ApplyParams($aParam[0], $aContextArgs);
                 if ($sVarValue == $aParam[0]) {
                     $sVarValue = '';
                     if ($this->IsBeingTested() && !is_null($oLog)) {
                         $oLog->Set('log', $oLog->Get('log') . "There is no value for placeholder: {$aParam['0']}\n");
                     }
                 }
             }
             $sVarName = str_replace('->', '_', $sVarName);
             $sVarName = str_replace('$', '', $sVarName);
             $sVarName = strtoupper($sVarName);
             $sCMD .= $sVarName . '="' . $sVarValue . '" ';
         }
         $sCMD .= ' ' . $sScriptPath;
         if ($this->IsBeingTested()) {
             if (!is_null($oLog)) {
                 $oLog->Set('log', $oLog->Get('log') . "Start executing shell command:\n{$sCMD}");
             }
             return "Script will be started.";
         }
         if (!is_null($oLog)) {
             $oLog->Set('log', shell_exec($sCMD));
         }
         return "Script {$sScriptPath} successfully started.";
     } catch (Exception $e) {
         ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker);
         throw $e;
         // Ошибка выбрасывается на верхний уровень и записывается в лог оповещения.
     }
     ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker);
 }
Exemplo n.º 2
0
 public function Render(WebPage $oPage, $aParams = array())
 {
     $this->m_sTemplate = MetaModel::ApplyParams($this->m_sTemplate, $aParams);
     $iStart = 0;
     $iEnd = strlen($this->m_sTemplate);
     $iCount = 0;
     $iBeforeTagPos = $iStart;
     $iAfterTagPos = $iStart;
     while ($sTag = $this->GetNextTag($iStart, $iEnd)) {
         $sContent = $this->GetTagContent($sTag, $iStart, $iEnd);
         $iAfterTagPos = $iEnd + strlen('</' . $sTag . '>');
         $sOuterTag = substr($this->m_sTemplate, $iStart, $iAfterTagPos - $iStart);
         $oPage->add(substr($this->m_sTemplate, $iBeforeTagPos, $iStart - $iBeforeTagPos));
         if ($sTag == DisplayBlock::TAG_BLOCK) {
             try {
                 $oBlock = DisplayBlock::FromTemplate($sOuterTag);
                 if (is_object($oBlock)) {
                     $oBlock->Display($oPage, 'block_' . self::$iBlockCount, $aParams);
                 }
             } catch (OQLException $e) {
                 $oPage->p('Error in template (please contact your administrator) - Invalid query<!--' . $sOuterTag . '-->');
             } catch (Exception $e) {
                 $oPage->p('Error in template (please contact your administrator)<!--' . $e->getMessage() . '--><!--' . $sOuterTag . '-->');
             }
             self::$iBlockCount++;
         } else {
             $aAttributes = $this->GetTagAttributes($sTag, $iStart, $iEnd);
             //$oPage->p("Tag: $sTag - ($iStart, $iEnd)");
             $this->RenderTag($oPage, $sTag, $aAttributes, $sContent);
         }
         $iAfterTagPos = $iEnd + strlen('</' . $sTag . '>');
         $iBeforeTagPos = $iAfterTagPos;
         $iStart = $iEnd;
         $iEnd = strlen($this->m_sTemplate);
         $iCount++;
     }
     $oPage->add(substr($this->m_sTemplate, $iAfterTagPos));
 }
Exemplo n.º 3
0
 protected function _DoExecute($oTrigger, $aContextArgs, &$oLog)
 {
     $sPreviousUrlMaker = ApplicationContext::SetUrlMakerClass();
     try {
         $this->m_iRecipients = 0;
         $this->m_aMailErrors = array();
         $bRes = false;
         // until we do succeed in sending the email
         // Determine recicipients
         //
         $sTo = $this->FindRecipients('to', $aContextArgs);
         $sCC = $this->FindRecipients('cc', $aContextArgs);
         $sBCC = $this->FindRecipients('bcc', $aContextArgs);
         $sFrom = MetaModel::ApplyParams($this->Get('from'), $aContextArgs);
         $sReplyTo = MetaModel::ApplyParams($this->Get('reply_to'), $aContextArgs);
         $sSubject = MetaModel::ApplyParams($this->Get('subject'), $aContextArgs);
         $sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs);
         $oObj = $aContextArgs['this->object()'];
         $sMessageId = sprintf('iTop_%s_%d_%f@%s.openitop.org', get_class($oObj), $oObj->GetKey(), microtime(true), MetaModel::GetEnvironmentId());
         $sReference = '<' . $sMessageId . '>';
     } catch (Exception $e) {
         ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker);
         throw $e;
     }
     ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker);
     if (!is_null($oLog)) {
         // Note: we have to secure this because those values are calculated
         // inside the try statement, and we would like to keep track of as
         // many data as we could while some variables may still be undefined
         if (isset($sTo)) {
             $oLog->Set('to', $sTo);
         }
         if (isset($sCC)) {
             $oLog->Set('cc', $sCC);
         }
         if (isset($sBCC)) {
             $oLog->Set('bcc', $sBCC);
         }
         if (isset($sFrom)) {
             $oLog->Set('from', $sFrom);
         }
         if (isset($sSubject)) {
             $oLog->Set('subject', $sSubject);
         }
         if (isset($sBody)) {
             $oLog->Set('body', $sBody);
         }
     }
     $oEmail = new EMail();
     if ($this->IsBeingTested()) {
         $oEmail->SetSubject('TEST[' . $sSubject . ']');
         $sTestBody = $sBody;
         $sTestBody .= "<div style=\"border: dashed;\">\n";
         $sTestBody .= "<h1>Testing email notification " . $this->GetHyperlink() . "</h1>\n";
         $sTestBody .= "<p>The email should be sent with the following properties\n";
         $sTestBody .= "<ul>\n";
         $sTestBody .= "<li>TO: {$sTo}</li>\n";
         $sTestBody .= "<li>CC: {$sCC}</li>\n";
         $sTestBody .= "<li>BCC: {$sBCC}</li>\n";
         $sTestBody .= "<li>From: {$sFrom}</li>\n";
         $sTestBody .= "<li>Reply-To: {$sReplyTo}</li>\n";
         $sTestBody .= "<li>References: {$sReference}</li>\n";
         $sTestBody .= "</ul>\n";
         $sTestBody .= "</p>\n";
         $sTestBody .= "</div>\n";
         $oEmail->SetBody($sTestBody);
         $oEmail->SetRecipientTO($this->Get('test_recipient'));
         $oEmail->SetRecipientFrom($this->Get('test_recipient'));
         $oEmail->SetReferences($sReference);
         $oEmail->SetMessageId($sMessageId);
     } else {
         $oEmail->SetSubject($sSubject);
         $oEmail->SetBody($sBody);
         $oEmail->SetRecipientTO($sTo);
         $oEmail->SetRecipientCC($sCC);
         $oEmail->SetRecipientBCC($sBCC);
         $oEmail->SetRecipientFrom($sFrom);
         $oEmail->SetRecipientReplyTo($sReplyTo);
         $oEmail->SetReferences($sReference);
         $oEmail->SetMessageId($sMessageId);
     }
     if (isset($aContextArgs['attachments'])) {
         $aAttachmentReport = array();
         foreach ($aContextArgs['attachments'] as $oDocument) {
             $oEmail->AddAttachment($oDocument->GetData(), $oDocument->GetFileName(), $oDocument->GetMimeType());
             $aAttachmentReport[] = array($oDocument->GetFileName(), $oDocument->GetMimeType(), strlen($oDocument->GetData()));
         }
         $oLog->Set('attachments', $aAttachmentReport);
     }
     if (empty($this->m_aMailErrors)) {
         if ($this->m_iRecipients == 0) {
             return 'No recipient';
         } else {
             $iRes = $oEmail->Send($aErrors, false, $oLog);
             // allow asynchronous mode
             switch ($iRes) {
                 case EMAIL_SEND_OK:
                     return "Sent";
                 case EMAIL_SEND_PENDING:
                     return "Pending";
                 case EMAIL_SEND_ERROR:
                     return "Errors: " . implode(', ', $aErrors);
             }
         }
     } else {
         if (is_array($this->m_aMailErrors) && count($this->m_aMailErrors) > 0) {
             $sError = implode(', ', $this->m_aMailErrors);
         } else {
             $sError = 'Unknown reason';
         }
         return 'Notification was not sent: ' . $sError;
     }
 }