detain/myadmin-pleskautomation-webhosting

View on GitHub
src/Plugin.php

Summary

Maintainability
D
2 days
Test Coverage
<?php

namespace Detain\MyAdminPleskAutomation;

use Detain\MyAdminPleskAutomation\PPAConnector;
use Symfony\Component\EventDispatcher\GenericEvent;

/**
 * Class Plugin
 *
 * @package Detain\MyAdminPleskAutomation
 */
class Plugin
{
    public static $name = 'PleskAutomation Webhosting';
    public static $description = 'Plesk Automation is a scalable, multi-server automation solution for shared hosting, giving growing hosters the power, performance, and scale previously only available to hosting giants.  More info at http://www.odin.com/support/automation-suite/ppa/';
    public static $help = '';
    public static $module = 'webhosting';
    public static $type = 'service';

    /**
     * Plugin constructor.
     */
    public function __construct()
    {
    }

    /**
     * @return array
     */
    public static function getHooks()
    {
        return [
            self::$module.'.settings' => [__CLASS__, 'getSettings'],
            self::$module.'.activate' => [__CLASS__, 'getActivate'],
            self::$module.'.reactivate' => [__CLASS__, 'getReactivate'],
            self::$module.'.deactivate' => [__CLASS__, 'getDeactivate'],
            self::$module.'.terminate' => [__CLASS__, 'getTerminate'],
            'function.requirements' => [__CLASS__, 'getRequirements']
        ];
    }

    /**
     * @param \Symfony\Component\EventDispatcher\GenericEvent $event
     * @throws \Detain\MyAdminPleskAutomation\PPAFailedRequestException
     * @throws \Detain\MyAdminPleskAutomation\PPAMalformedRequestException
     * @throws \Exception
     * @throws \SmartyException
     */
    public static function getActivate(GenericEvent $event)
    {
        if ($event['category'] == get_service_define('WEB_PPA')) {
            $serviceClass = $event->getSubject();
            myadmin_log(self::$module, 'info', 'PleskAutomation Activation', __LINE__, __FILE__, self::$module, $serviceClass->getId());
            $settings = get_module_settings(self::$module);
            $serverdata = get_service_master($serviceClass->getServer(), self::$module);
            $data = $GLOBALS['tf']->accounts->read($serviceClass->getCustid());
            $ip = $serverdata[$settings['PREFIX'].'_ip'];
            $extra = run_event('parse_service_extra', $serviceClass->getExtra(), self::$module);
            $hostname = $serviceClass->getHostname();
            if (trim($hostname) == '') {
                $hostname = $serviceClass->getId().'.server.com';
            }
            $password = website_get_password($serviceClass->getId(), $serviceClass->getCustid());
            $username = get_new_webhosting_username($serviceClass->getId(), $hostname, $serviceClass->getServer());
            include_once __DIR__.'/get_webhosting_ppa_instance.php';
            $ppaConnector = get_webhosting_ppa_instance($serverdata);
            $serviceTemplateId = 46;
            if (!isset($data['name']) || trim($data['name']) == '') {
                $data['name'] = str_replace('@', ' ', $data['account_lid']);
            }
            [$first, $last] = explode(' ', $data['name']);
            $requestPerson = [
                'first_name' => $first,
                'last_name' => $last,
                'company_name' => $data['company'] ?? ''
            ];
            $requestAddress = [
                'street_name' => $data['address'] ?? '',
                'address2' => $data['address2'] ?? '',
                'zipcode' => $data['zip'] ?? '',
                'city' => $data['city'] ?? '',
                'country' => convert_country_iso2($data['country']),
                'state' => $data['state'] ?? ''
            ];
            $requestPhone = [
                'country_code' => '1',
                'area_code' => '',
                'phone_num' => $data['phone'] ?? '',
                'ext_num' => ''
            ];
            $request = [
                'person' => $requestPerson,
                'address' => $requestAddress,
                'phone' => $requestPhone,
                'email' => $data['account_lid']
            ];
            try {
                $result = $ppaConnector->addAccount($request);
                //echo "Result:";var_dump($result);echo "\n";
                PPAConnector::checkResponse($result);
            } catch (\Exception $e) {
                echo 'Caught exception: '.$e->getMessage().PHP_EOL;
                myadmin_log(self::$module, 'info', 'addAccount Caught exception: '.$e->getMessage(), __LINE__, __FILE__, self::$module, $serviceClass->getId());
            }
            request_log(self::$module, $serviceClass->getCustid(), __FUNCTION__, 'ppa', 'addAccount', $request, $result, $serviceClass->getId());
            $accountId = $result['result']['account_id'];
            if (!is_array($extra)) {
                $extra = [];
            }
            $extra[0] = $accountId;
            $db = get_module_db(self::$module);
            $serExtra = $db->real_escape(myadmin_stringify($extra));
            $db->query("update {$settings['TABLE']} set {$settings['PREFIX']}_ip='{$ip}', {$settings['PREFIX']}_extra='{$serExtra}' where {$settings['PREFIX']}_id='{$serviceClass->getId()}'", __LINE__, __FILE__);
            myadmin_log(self::$module, 'info', "addAccount Got Account ID: {$accountId}", __LINE__, __FILE__, self::$module, $serviceClass->getId());
            $request = [
                'account_id' => $accountId,
                'auth' => [
                    'login' => $username,
                    'password' => $password
                ],
                'person' => $requestPerson,
                'address' => $requestAddress,
                'phone' => $requestPhone,
                'email' => $data['account_lid']
            ];
            try {
                $result = $ppaConnector->addAccountMember($request);
                //echo "Result:";var_dump($result);echo "\n";
                PPAConnector::checkResponse($result);
            } catch (\Exception $e) {
                echo 'Caught exception: '.$e->getMessage().PHP_EOL;
                myadmin_log(self::$module, 'info', 'addAccountMember Caught exception: '.$e->getMessage(), __LINE__, __FILE__, self::$module, $serviceClass->getId());
            }
            request_log(self::$module, $serviceClass->getCustid(), __FUNCTION__, 'ppa', 'addAccountMember', $request, $result, $serviceClass->getId());
            $userId = $result['result']['user_id'];
            $username = $db->real_escape($username);
            $extra[1] = $userId;
            $serExtra = $db->real_escape(myadmin_stringify($extra));
            $db->query("update {$settings['TABLE']} set {$settings['PREFIX']}_ip='{$ip}', {$settings['PREFIX']}_extra='{$serExtra}', {$settings['PREFIX']}_username='{$username}' where {$settings['PREFIX']}_id='{$serviceClass->getId()}'", __LINE__, __FILE__);
            myadmin_log(self::$module, 'info', "addAccountMember Got Account ID: {$userId}  Username: {$username}  Password: {$password}", __LINE__, __FILE__, self::$module, $serviceClass->getId());
            $request = [
                'account_id' => $accountId,
                'service_template_id' => $serviceTemplateId
            ];
            try {
                $result = $ppaConnector->activateSubscription($request);
                //echo "Result:";var_dump($result);echo "\n";
                PPAConnector::checkResponse($result);
            } catch (\Exception $e) {
                echo 'Caught exception: '.$e->getMessage().PHP_EOL;
                myadmin_log(self::$module, 'info', 'activatesubscription Caught exception: '.$e->getMessage(), __LINE__, __FILE__, self::$module, $serviceClass->getId());
            }
            request_log(self::$module, $serviceClass->getCustid(), __FUNCTION__, 'ppa', 'activateSubscription', $request, $result, $serviceClass->getId());
            $subscriptoinId = $result['result']['subscription_id'];
            $extra[2] = $subscriptoinId;
            $serExtra = $db->real_escape(myadmin_stringify($extra));
            $db->query("update {$settings['TABLE']} set {$settings['PREFIX']}_ip='{$ip}', {$settings['PREFIX']}_extra='{$serExtra}', {$settings['PREFIX']}_username='{$username}' where {$settings['PREFIX']}_id='{$serviceClass->getId()}'", __LINE__, __FILE__);
            myadmin_log(self::$module, 'info', "activateSubscription Got Subscription ID: {$subscriptoinId}", __LINE__, __FILE__, self::$module, $serviceClass->getId());
            /*
              $request = array(
              'subscription_id' => $subscriptoinId,
              'get_resources' => TRUE,
              );
              $result = $ppaConnector->getSubscription($request);
              echo "Result:";var_dump($result);echo "\n";
              try {
                PPAConnector::checkResponse($result);
              } catch (\Exception $e) {
              echo 'Caught exception: '.$e->getMessage().PHP_EOL;
              }
              print_r($result);
             */
            $request = [
                'new_webspace' => [
                    'sub_id' => $subscriptoinId,
                    'domain' => $hostname,
                    'resources' => [
                        ['rt_id' => 1000084], // plesk_integration Subscription
                        ['rt_id' => 1000115], // pleskwebiis_hosting IIS Webspace
                        ['rt_id' => 1000087], // plesk_db_hosting MySQL database
                        //array('rt_id' => 1000091), // plesk_db_hosting Microsoft SQL database
                        ['rt_id' => 1000152], // plesk_db_hosting Microsoft SQL database
                        ['rt_id' => 1000132], // plesk__mail PostFix Mail
                    ]
                ]
            ];
            try {
                $result = $ppaConnector->{'pleskintegration.createWebspace'}($request);
                //echo "Result:";var_dump($result);echo "\n";
                PPAConnector::checkResponse($result);
            } catch (\Exception $e) {
                echo 'Caught exception: '.$e->getMessage().PHP_EOL;
                myadmin_log(self::$module, 'info', 'createWebspace Caught exception: '.$e->getMessage(), __LINE__, __FILE__, self::$module, $serviceClass->getId());
            }
            request_log(self::$module, $serviceClass->getCustid(), __FUNCTION__, 'ppa', 'createWebspace', $request, $result, $serviceClass->getId());
            $webspaceId = $result['result']['webspace_id'];
            $extra[3] = $webspaceId;
            $serExtra = $db->real_escape(myadmin_stringify($extra));
            $db->query("update {$settings['TABLE']} set {$settings['PREFIX']}_ip='{$ip}', {$settings['PREFIX']}_extra='{$serExtra}', {$settings['PREFIX']}_username='{$username}' where {$settings['PREFIX']}_id='{$serviceClass->getId()}'", __LINE__, __FILE__);
            myadmin_log(self::$module, 'info', "Got Website ID: {$webspaceId}", __LINE__, __FILE__, self::$module, $serviceClass->getId());
            if (is_numeric($webspaceId)) {
                //myadmin_log(self::$module, 'info', "Success, Response: " . var_export($vesta->response, TRUE), __LINE__, __FILE__, self::$module, $serviceClass->getId());;
                website_welcome_email($serviceClass->getId());
                $event['success'] = true;
            } else {
                add_output('Error Creating Website');
                myadmin_log(self::$module, 'info', 'Failure, Response: '.var_export($result, true), __LINE__, __FILE__, self::$module, $serviceClass->getId());
                $event['success'] = false;
            }
            /*
              $request = array(
              'subscription_id' => $subscriptoinId,
              );
              $result = $ppaConnector->removeSubscription($request);
              //echo "Result:";var_dump($result);echo "\n";
              try {
                PPAConnector::checkResponse($result);
              } catch (\Exception $e) {
              echo 'Caught exception: '.$e->getMessage().PHP_EOL;
              }
              echo "Success Removing Subscription\n";
              $request = array(
              'account_id' => $accountId,
              );
              $result = $ppaConnector->removeAccount($request);
              //echo "Result:";var_dump($result);echo "\n";
              try {
                PPAConnector::checkResponse($result);
              } catch (\Exception $e) {
              echo 'Caught exception: '.$e->getMessage().PHP_EOL;
              }
              echo "Success Removing Account.\n";
             */
            $event->stopPropagation();
        }
    }

    /**
     * @param \Symfony\Component\EventDispatcher\GenericEvent $event
     * @throws \Detain\MyAdminPleskAutomation\Detain\MyAdminPleskAutomation\PPAFailedRequestException
     * @throws \Detain\MyAdminPleskAutomation\Detain\MyAdminPleskAutomation\PPAMalformedRequestException
     */
    public static function getReactivate(GenericEvent $event)
    {
        if ($event['category'] == get_service_define('WEB_PPA')) {
            $serviceClass = $event->getSubject();
            $serverdata = get_service_master($serviceClass->getServer(), self::$module);
            $extra = run_event('parse_service_extra', $serviceClass->getExtra(), self::$module);
            if (count($extra) == 0) {
                function_requirements('get_pleskautomation_info_from_domain');
                include_once __DIR__.'/get_pleskautomation_info_from_domain.php';
                $extra = \get_pleskautomation_info_from_domain($serviceClass->getHostname());
            }
            if (count($extra) == 0) {
                $msg = 'Blank/Empty Plesk Subscription Info, Email support@interserver.net about this';
                dialog('Error', $msg);
                myadmin_log(self::$module, 'info', $msg, __LINE__, __FILE__, self::$module, $serviceClass->getId());
                $event['success'] = false;
            } else {
                //list($accountId, $userId, $subscriptoinId, $webspaceId) = $extra;
                $subscriptoinId = $extra[2];
                function_requirements('get_webhosting_ppa_instance');
                include_once __DIR__.'/get_webhosting_ppa_instance.php';
                $ppaConnector = get_webhosting_ppa_instance($serverdata);
                $request = ['subscription_id' => $subscriptoinId];
                $result = $ppaConnector->enableSubscription($request);
                try {
                    PPAConnector::checkResponse($result);
                } catch (\Exception $e) {
                    echo 'Caught exception: '.$e->getMessage().PHP_EOL;
                }
                myadmin_log(self::$module, 'info', 'enableSubscription Called got '.json_encode($result), __LINE__, __FILE__, self::$module, $serviceClass->getId());
            }
            $event->stopPropagation();
        }
    }

    /**
     * @param \Symfony\Component\EventDispatcher\GenericEvent $event
     * @throws \Detain\MyAdminPleskAutomation\PPAMalformedRequestException
     */
    public static function getDeactivate(GenericEvent $event)
    {
        if ($event['category'] == get_service_define('WEB_PPA')) {
            $serviceClass = $event->getSubject();
            myadmin_log(self::$module, 'info', 'PleskAutomation Deactivation', __LINE__, __FILE__, self::$module, $serviceClass->getId());
            $extra = run_event('parse_service_extra', $serviceClass->getExtra(), self::$module);
            $serverdata = get_service_master($serviceClass->getServer(), self::$module);
            if (count($extra) == 0) {
                $msg = 'Blank/Empty Plesk Subscription Info, so either dont know what to remove or nothing to remove';
                dialog('Error', $msg);
                myadmin_log(self::$module, 'info', $msg, __LINE__, __FILE__, self::$module, $serviceClass->getId());
            } else {
                //list($accountId, $userId, $subscriptoinId, $webspaceId) = $extra;
                $subscriptoinId = $extra[2];
                include_once __DIR__.'/get_webhosting_ppa_instance.php';
                $ppaConnector = get_webhosting_ppa_instance($serverdata);
                $request = [
                    'subscription_id' => $subscriptoinId
                ];
                $result = $ppaConnector->disableSubscription($request);
                //echo "Result:";var_dump($result);echo "\n";
                try {
                    \Detain\MyAdminPleskAutomation\PPAConnector::checkResponse($result);
                    $event['success'] = true;
                } catch (PPAFailedRequestException $e) {
                    echo 'Caught exception: '.$e->getMessage().PHP_EOL;
                    $event['success'] = false;
                } catch (\Exception $e) {
                    echo 'Caught exception: '.$e->getMessage().PHP_EOL;
                    $event['success'] = false;
                }
                myadmin_log(self::$module, 'info', 'disableSubscription Called got '.json_encode($result), __LINE__, __FILE__, self::$module, $serviceClass->getId());
            }
            $event->stopPropagation();
        }
    }

    /**
     * @param \Symfony\Component\EventDispatcher\GenericEvent $event
     * @return boolean|null
     * @throws \Detain\MyAdminPleskAutomation\PPAFailedRequestException
     * @throws \Detain\MyAdminPleskAutomation\PPAMalformedRequestException
     */
    public static function getTerminate(GenericEvent $event)
    {
        if ($event['category'] == get_service_define('WEB_PPA')) {
            $event->stopPropagation();
            $serviceClass = $event->getSubject();
            myadmin_log(self::$module, 'info', 'PleskAutomation Termination', __LINE__, __FILE__, self::$module, $serviceClass->getId());
            $extra = run_event('parse_service_extra', $serviceClass->getExtra(), self::$module);
            $serverdata = get_service_master($serviceClass->getServer(), self::$module);
            if (count($extra) == 0) {
                /**
                 * @TODO Double Check The Server To Ensure The Site Isnt There And Our Information Is Correct, If Not Then Update It With Correect Info And Use That To Terminate Instead.
                 */
                //$msg = 'Blank/Empty Plesk Subscription Info, so either dont know what to remove or nothing to remove';
                //dialog('Error', $msg);
                myadmin_log(self::$module, 'info', 'Blank/Empty Plesk Subscription Info, so either dont know what to remove or nothing to remove', __LINE__, __FILE__, self::$module, $serviceClass->getId());
                return true;
            } else {
                //list($accountId, $userId, $subscriptoinId, $webspaceId) = $extra;
                $subscriptoinId = $extra[2];
                try {
                    include_once __DIR__.'/get_webhosting_ppa_instance.php';
                    $ppaConnector = get_webhosting_ppa_instance($serverdata);
                } catch (\Exception $e) {
                    myadmin_log(self::$module, 'info', 'PPAConnector::getInstance Caught exception: '.$e->getMessage(), __LINE__, __FILE__, self::$module, $serviceClass->getId());
                    $event['success'] = false;
                    return false;
                }
                $request = [
                    'subscription_id' => $subscriptoinId
                ];
                try {
                    $result = $ppaConnector->disableSubscription($request);
                } catch (\Exception $e) {
                    myadmin_log(self::$module, 'info', 'ppaConnector->disableSubscription Caught exception: '.$e->getMessage(), __LINE__, __FILE__, self::$module, $serviceClass->getId());
                    $event['success'] = false;
                    return false;
                }
                //echo "Result:";var_dump($result);echo "\n";
                try {
                    \Detain\MyAdminPleskAutomation\PPAConnector::checkResponse($result);
                } catch (\Exception $e) {
                    myadmin_log(self::$module, 'info', 'PPAConnector::checkResponse Caught exception: '.$e->getMessage(), __LINE__, __FILE__, self::$module, $serviceClass->getId());
                    $event['success'] = false;
                    return false;
                }
                /*
                  $request = array(
                  'subscription_id' => $subscriptoinId,
                  );
                  $result = $ppaConnector->removeSubscription($request);
                  //echo "Result:";var_dump($result);echo "\n";
                  try {
                    \Detain\MyAdminPleskAutomation\PPAConnector::checkResponse($result);
                  } catch (\Exception $e) {
                  echo 'Caught exception: '.$e->getMessage().PHP_EOL;
                  }
                  echo "Success Removing Subscription\n";
                  $request = array(
                  'account_id' => $accountId,
                  );
                  $result = $ppaConnector->removeAccount($request);
                  //echo "Result:";var_dump($result);echo "\n";
                  try {
                    \Detain\MyAdminPleskAutomation\PPAConnector::checkResponse($result);
                  } catch (\Exception $e) {
                      echo 'Caught exception: '.$e->getMessage().PHP_EOL;
                  }
                  echo "Success Removing Account.\n";
                 */
                myadmin_log(self::$module, 'info', 'disableSubscription Called got '.json_encode($result), __LINE__, __FILE__, self::$module, $serviceClass->getId());
                return true;
            }
        }
    }

    /**
     * @param \Symfony\Component\EventDispatcher\GenericEvent $event
     */
    public static function getChangeIp(GenericEvent $event)
    {
        if ($event['category'] == get_service_define('WEB_PPA')) {
            $serviceClass = $event->getSubject();
            $settings = get_module_settings(self::$module);
            $pleskautomation = new PleskAutomation(FANTASTICO_USERNAME, FANTASTICO_PASSWORD);
            myadmin_log(self::$module, 'info', 'IP Change - (OLD:'.$serviceClass->getIp().") (NEW:{$event['newip']})", __LINE__, __FILE__, self::$module, $serviceClass->getId());
            $result = $pleskautomation->editIp($serviceClass->getIp(), $event['newip']);
            if (isset($result['faultcode'])) {
                myadmin_log(self::$module, 'error', 'PleskAutomation editIp('.$serviceClass->getIp().', '.$event['newip'].') returned Fault '.$result['faultcode'].': '.$result['fault'], __LINE__, __FILE__, self::$module, $serviceClass->getId());
                $event['status'] = 'error';
                $event['status_text'] = 'Error Code '.$result['faultcode'].': '.$result['fault'];
            } else {
                $GLOBALS['tf']->history->add($settings['TABLE'], 'change_ip', $event['newip'], $serviceClass->getId(), $serviceClass->getCustid());
                $serviceClass->set_ip($event['newip'])->save();
                $event['status'] = 'ok';
                $event['status_text'] = 'The IP Address has been changed.';
            }
            $event->stopPropagation();
        }
    }

    /**
     * @param \Symfony\Component\EventDispatcher\GenericEvent $event
     */
    public static function getMenu(GenericEvent $event)
    {
        $menu = $event->getSubject();
        if ($GLOBALS['tf']->ima == 'admin') {
            $menu->add_link(self::$module, 'choice=none.reusable_pleskautomation', '/images/myadmin/to-do.png', _('ReUsable PleskAutomation Licenses'));
            $menu->add_link(self::$module, 'choice=none.pleskautomation_list', '/images/myadmin/to-do.png', _('PleskAutomation Licenses Breakdown'));
            $menu->add_link(self::$module.'api', 'choice=none.pleskautomation_licenses_list', '/images/whm/createacct.gif', _('List all PleskAutomation Licenses'));
        }
    }

    /**
     * @param \Symfony\Component\EventDispatcher\GenericEvent $event
     */
    public static function getRequirements(GenericEvent $event)
    {
        /**
         * @var \MyAdmin\Plugins\Loader $this->loader
         */
        $loader = $event->getSubject();
        $loader->add_requirement('get_pleskautomation_info_from_domain', '/../vendor/detain/myadmin-pleskautomation-webhosting/src/get_pleskautomation_info_from_domain.php');
        $loader->add_requirement('get_webhosting_ppa_instance', '/../vendor/detain/myadmin-pleskautomation-webhosting/src/get_webhosting_ppa_instance.php');
    }

    /**
     * @param \Symfony\Component\EventDispatcher\GenericEvent $event
     */
    public static function getSettings(GenericEvent $event)
    {
        /**
         * @var \MyAdmin\Settings $settings
         **/
        $settings = $event->getSubject();
        $settings->setTarget('module');
        $settings->add_select_master(_(self::$module), _('Default Servers'), self::$module, 'new_website_ppa_server', _('Default Plesk Automation Setup Server'), defined('NEW_WEBSITE_PPA_SERVER') ? NEW_WEBSITE_PPA_SERVER : 0, get_service_define('WEB_PPA'));
        $settings->add_dropdown_setting(self::$module, _('Out of Stock'), 'outofstock_webhosting_ppa', _('Out Of Stock Plesk Automation Webhosting'), _('Enable/Disable Sales Of This Type'), $settings->get_setting('OUTOFSTOCK_WEBHOSTING_PPA'), ['0', '1'], ['No', 'Yes']);
        $settings->setTarget('global');
    }
}