<?php
/**
 * ExecuteService File
 *
 * @category Admin
 * @package  ClientExec
 * @author   Alberto Vasquez <alberto@clientexec.com>
 * @license  ClientExec License
 * @version  [someversion]
 * @link     http://www.clientexec.com
 */

require_once 'newedge/classes/NE_PluginCollection.php';

/**
 * ExecuteService Action Class
 *
 * @category Admin
 * @package  ClientExec
 * @author   Alberto Vasquez <alberto@clientexec.com>
 * @license  ClientExec License
 * @version  [someversion]
 * @link     http://www.clientexec.com
 */
class ExecuteService extends NE_Action
{
    var $permission     = '';

    // user authentication and permission validation done inside dispatch()

    /**
     * Action's dispatch method
     *
     * @return redirect
     */
    function dispatch()
    {
        if (defined('RUNNING_SERVICE_SCRIPT')) {
            // *************************
            // Running from outside CE
            // *************************
            if (isset($_GET['service']) && $this->settings->get('Allow run services from URL')) {
                $runService = $_GET['service'];
                $manuallyExecuted = 2;
                $this->logger->log(2, "** OUTSIDE SERVICE REQUEST **: services.php called for service '$runService'");
            } elseif ($runService = @$_SERVER['argv'][1]) {
                $this->logger->log(2, "** CRON REQUEST **: services.php called for service '$runService'");
                $manuallyExecuted = 0;
            } else {
                die('Service not defined or services not set up to run from the URL.');
            }

            if ($this->settings->get("plugin_{$runService}_Enabled") != 1) {
                die("Service $runService is not Enabled.");
            }
        } else {
            // ************************
            // Running from inside CE
            // ************************
            if (!isset($_SESSION['userId'])) {
                NE_Lib::redirectPage('index.php?fuse=admin&amp;view=Login');
            }
            if (!$this->user->hasPermission('admin_manage_plugins')) {
                trigger_error("You don't have enough permissions to trigger this action", E_USER_ERROR);
                exit;
            }

            if (!isset($_GET['service'])) {
                die('Service not defined.');
            }
            $manuallyExecuted = 1;
            $runService = $_GET['service'];
        }

        $plugins = new NE_PluginCollection("services", $this->user);

        // service execution can take a while
        @set_time_limit(0);

        while ($plugin = $plugins->getNext()) {
            if ($plugin->getInternalName() == $runService) {
                require_once 'modules/admin/models/ServicePlugin.php';

                // Search if the service is already running, if so, then do nothing.
                $query = "SELECT status "
                        ."FROM services_log "
                        ."WHERE plugin = ? "
                        ."ORDER BY id DESC "
                        ."LIMIT 1 ";
                $dbResult = $this->db->query($query, $plugin->getInternalName());
                $row = $dbResult->fetch();

                if(isset($row['status']) && $row['status'] == SERVICE_STATUS_IN_PROCESS){
                    $this->logger->log(2, "Service '$runService' is already running. Service request ignored.");
                    break;
                }

                // Report the service is in process.
                $query = "INSERT INTO services_log (plugin, time, manually_executed, results, errors, status) VALUES(?, ?, ?, ?, ?, ?)";
                $this->db->query($query, $plugin->getInternalName(), date('Y-m-d H:i:s'), $manuallyExecuted, '', '', SERVICE_STATUS_IN_PROCESS);

                $messages = $plugin->execute();
                $errors = '';
                $results = '';
                if (is_array($messages)) {
                    foreach ($messages as $message) {
                        if (is_a($message, 'NE_Error')) {
                            $errors .= $message->getMessage()."\n";
                        } else {
                            $results .= "$message\n";
                        }
                    }
                }

                $query = "INSERT INTO services_log (plugin, time, manually_executed, results, errors, status) VALUES(?, ?, ?, ?, ?, ?)";
                $this->db->query($query, $plugin->getInternalName(), date('Y-m-d H:i:s'), $manuallyExecuted, $results, $errors, SERVICE_STATUS_FINISHED);

                if (defined('RUNNING_SERVICE_SCRIPT') && $errors) {
                    echo "Errors calling plugin ".$plugin->getInternalName().":\n$errors\n";
                    if ($recipients = $this->settings->get('Application Error Notification')) {
                        include_once 'newedge/classes/NE_MailGateway.php';
                        $mailGateway = new NE_MailGateway();
                        $body = "ClientExec automated error notification\n\nThe service plugin ".$this->settings->get("plugin_".$plugin->getInternalName()."_Plugin Name")
                                ." generated the following error(s):\n$errors\n";

                        $recipients = explode("\r\n", $recipients);
                        foreach ($recipients as $recipient) {
                            // bypass mail queue, because it could be it the one failing, creating thus an infinite loop
                            $mailSend = $mailGateway->mailMessageEmail(
                                array('HTML' => null, 'plainText' => $body),
                                $this->settings->get('Support E-mail'),
                                $this->settings->get('Support E-mail'),
                                $recipient,
                                '',
                                'ClientExec Service Plugin Error Notification',
                                1
                            );
                            if (is_a($mailSend, 'NE_Error')) {
                                echo $mailSend->getMessage();
                            }
                        }
                    }
                }

                if (!defined('RUNNING_SERVICE_SCRIPT') && $errors) {
                    NE_Lib::addMessage(nl2br($errors));
                    NE_Lib::addMessage(nl2br($results));
                }

                if (!defined('RUNNING_SERVICE_SCRIPT') && !$errors) {
                    NE_Lib::addMessage($this->lang('Service executed successfully'));
                    NE_Lib::addMessage(nl2br($results));
                }
                break;
            }
        }

        if (!defined('RUNNING_SERVICE_SCRIPT')) {
            NE_Lib::redirectPage("index.php?settingID=".$_REQUEST['service']."&amp;fuse=admin&amp;view=Services");
        }
    }
}

?>
