753 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			753 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| /*
 | |
|   ----------------------------------------------------------------------
 | |
|   LICENSE
 | |
| 
 | |
|   This program is free software; you can redistribute it and/or
 | |
|   modify it under the terms of the GNU General Public License (GPL)
 | |
|   as published by the Free Software Foundation; either version 2
 | |
|   of the License, or (at your option) any later version.
 | |
| 
 | |
|   This program is distributed in the hope that it will be useful,
 | |
|   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|   GNU General Public License for more details.
 | |
| 
 | |
|   To read the license please visit http://www.gnu.org/copyleft/gpl.html
 | |
|   ----------------------------------------------------------------------
 | |
| */
 | |
| 
 | |
| class m_oci {
 | |
| 
 | |
|     function hook_menu() {
 | |
|         global $hooks, $L_ALTERNC_WPCLI_BIN, $L_ALTERNC_DRUSH_BIN;
 | |
|         $menu = array(
 | |
|             'title' => _('Quick Install'),
 | |
|             'ico' => 'images/ocilogo.png',
 | |
|             'link' => 'toggle',
 | |
|             'pos' => 11,
 | |
|             'links' => array(),
 | |
|         );
 | |
|         // @TODO invoke a hook to get supported applications
 | |
|         // need: id (eg. wordpress), weight (to order), ico, and
 | |
|         // optionally - a different action path.
 | |
|         // @TODO required binaries for installation: eg, wp-cli, drush
 | |
|         if ($this->app_is_installable('wordpress')) {
 | |
|             $menu['links'][] = array(
 | |
|                 'txt' => _('WordPress'),
 | |
|                 'url' => 'oci_install.php?app=wordpress',
 | |
|                 'ico' => 'images/wordpress.png',
 | |
|             );
 | |
|         }
 | |
|         if ($this->app_is_installable('drupal')) {
 | |
|             $menu['links'][] = array(
 | |
|                 'txt' => _('Drupal'),
 | |
|                 'url' => 'oci_install.php?app=drupal',
 | |
|                 'ico' => 'images/drupal.png',
 | |
|             );
 | |
|         }
 | |
|         if ($menu['links']) {
 | |
|             return $menu;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Checks to see if requirements are met to install an application.
 | |
|      *
 | |
|      * @param $app string
 | |
|      *  The string identifier of the application (eg. drupal, wordpress).
 | |
|      */
 | |
|     function app_is_installable($app) {
 | |
|         global $hooks;
 | |
|         $vals = $hooks->invoke('hook_oci_is_installable', array($app));
 | |
|         foreach ($vals as $class => $rval) {
 | |
|             if ($rval) {
 | |
|                 return TRUE;
 | |
|             }
 | |
|         }
 | |
|         return FALSE;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Implements hook_oci_is_installable().
 | |
|      */
 | |
|     function hook_oci_is_installable($app) {
 | |
|         global $L_ALTERNC_DRUSH_BIN, $L_ALTERNC_WP_BIN;
 | |
|         switch ($app) {
 | |
|             case 'drupal':
 | |
|                 if ($L_ALTERNC_DRUSH_BIN) {
 | |
|                     return TRUE;
 | |
|                 }
 | |
|                 break;
 | |
|             case 'wordpress':
 | |
|                 if ($L_ALTERNC_WP_BIN) {
 | |
|                     return TRUE;
 | |
|                 }
 | |
|                 break;
 | |
|         }
 | |
|         return FALSE;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Gets which fields should be loaded for the one click install form.
 | |
|      *
 | |
|      * @param $app string
 | |
|      *
 | |
|      * @returns array
 | |
|      *   Array of fields indexed by parameter name. Each value is an array
 | |
|      *   of ["fetch_type", "data_type", "default"].
 | |
|      *   fetch_type may be "get" or "post".
 | |
|      */
 | |
|     function oci_form_fields($app) {
 | |
|         global $hooks;
 | |
|         $fields = array(
 | |
|             'application' => array('post', 'string', ''), // Used in confirmation.
 | |
| 
 | |
|             'domain' => array('post', 'string', ''),
 | |
|             'new_domain_name' => array('post', 'string', ''),
 | |
| 
 | |
|             'sub_domain' => array('post', 'string', ''),
 | |
|             'new_sub_domain_name' => array('post', 'string'),
 | |
|             'new_sub_domain_path' => array('post', 'string', ''),
 | |
|             'new_sub_domain_type' => array('post', 'string', 'vhost'),
 | |
| 
 | |
|             'db_name' => array('post', 'string', ''),
 | |
|             'new_db_name' => array('post', 'string', ''),
 | |
|             'db_prefix' => array('post', 'string', ''),
 | |
|         );
 | |
|         $vals = $hooks->invoke('hook_oci_form_fields', array($app));
 | |
|         foreach ($vals as $v) {
 | |
|             $fields = $fields + $v;
 | |
|         }
 | |
|         return $fields;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Implements hook_oci_form_fields().
 | |
|      */
 | |
|     function hook_oci_form_fields($app) {
 | |
|         global $mem;
 | |
|         if ($app == 'drupal') {
 | |
|             $fields = array(
 | |
|                 'drupal_install_source' => array('post', 'string', ''),
 | |
|                 'drupal_makefile' => array('post', 'string', ''),
 | |
|                 'drupal_core_version' => array('post', 'string', ''),
 | |
|                 'drupal_title' => array('post', 'string', ''),
 | |
|                 'drupal_admin_name' => array('post', 'string', 'admin'),
 | |
|                 // @TODO use user e-mail as a default
 | |
|                 'drupal_admin_mail' => array('post', 'string', ''),
 | |
|                 'drupal_site_name' => array('post', 'string', ''),
 | |
|                 'drupal_site_mail' => array('post', 'string', ''),
 | |
|             );
 | |
|             return $fields;
 | |
|         }
 | |
|         if ($app == 'wordpress') {
 | |
|             $fields = array(
 | |
|                 'wordpress_title' => array('post', 'string', ''),
 | |
|                 'wordpress_admin_mail' => array('post', 'string', ''),
 | |
|                 'wordpress_admin_name' => array('post', 'string', 'admin'),
 | |
|                 'wordpress_locale' => array('post', 'string', ''),
 | |
|             );
 | |
|             return $fields;
 | |
|         }
 | |
|         return array();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Helper function to get the action script path.
 | |
|      *
 | |
|      * @returns string
 | |
|      *   String containing the name of the php script which should be
 | |
|      *   invoked to run the installation.
 | |
|      */
 | |
|     function get_app_action($app) {
 | |
|         return 'oci_doinstall_' . $app . '.php';
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * Returns a list of subdomain types which can be used for
 | |
|      * installing applications into.
 | |
|      *
 | |
|      * @returns array
 | |
|      *   Array of vhost types (strings).
 | |
|      */
 | |
|     function allowed_subdomain_types() {
 | |
|         // Maybe just there the type has target DIRECTORY.
 | |
|         global $dom;
 | |
|         $dtypes = $dom->domains_type_lst();
 | |
|         $types = array();
 | |
|         foreach ($dtypes as $name => $record) {
 | |
|             if ($record['target'] == 'DIRECTORY') {
 | |
|                 $types[] = $name;
 | |
|             }
 | |
|         }
 | |
|         return $types;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Provides the a base form for installation of applications.
 | |
|      *
 | |
|      * @param $app string
 | |
|      *   The string identifier of the application (eg. drupal, wordpress).
 | |
|      */
 | |
|     function oci_form($app) {
 | |
|         global $hooks, $quota, $dom, $mysql;
 | |
|         $form = "<form method=\"post\" action=\"oci_confirm.php\" id=\"oci-install-$app\" name=\"oci-install-$app\" autocomplete=\"off\">";
 | |
|         ob_start();
 | |
|         csrf_get();
 | |
|         $csrf = ob_get_contents();
 | |
|         ob_end_clean();
 | |
|         $form .= $csrf;
 | |
|         $form .= '<h4>' . _('common options') . '</h4>';
 | |
|         $form .= '<input type="hidden" name="application" value="' . $app . '"/>';
 | |
| 
 | |
|         // Domain
 | |
|         $new_domain_possible = $quota->cancreate('dom');
 | |
|         $current_domains = $dom->enum_domains();
 | |
|         if ($new_domain_possible) {
 | |
|             $current_domains[] = '*new*';
 | |
|         }
 | |
|         if ($current_domains) {
 | |
|             $form .= '<div id="domain-wrapper">';
 | |
|             // @TODO on select change which sub-domains are listed.
 | |
|             $form .= '<label for="domain">' . _('Choose domain to create the site in ') . '</label>';
 | |
|             $form .= '<select name="domain" id="domain">';
 | |
|             foreach ($current_domains as $d) {
 | |
|                 $form .= "<option value=\"$d\">$d</option>";
 | |
|             }
 | |
|             $form .= '</select></div>';
 | |
|         }
 | |
|         if ($new_domain_possible) {
 | |
|             $form .= '<label for="new-domain-name">' . _('Choose new domain name') . '</label>';
 | |
|             $form .= '<input type="text" name="new_domain_name" id="new-domain-name"/>';
 | |
|         }
 | |
| 
 | |
|         // Choose a sub-domain or new
 | |
|         $allowed_subdomain_types = $this->allowed_subdomain_types();
 | |
|         $form .= '<div id="sub-domain-wrapper">';
 | |
|         $form .= '<label for="sub_domain">' . _('Choose an existing sub-domain or select "<strong>*new*</strong>" to create a new sub-domain') . '</label>';
 | |
|         $form .= '<select name="sub_domain" id="sub_domain">';
 | |
|         foreach ($current_domains as $domain) {
 | |
|             if ($current_domains == '*new*') {
 | |
|                 continue;
 | |
|             }
 | |
|             $dom->lock();
 | |
|             $d = $dom->get_domain_all($domain);
 | |
|             $dom->unlock();
 | |
|             if (!$d) {
 | |
|                 continue;
 | |
|             }
 | |
|             foreach ($d['sub'] as $delta => $sub_data) {
 | |
|                 if (!in_array($sub_data['type'], $allowed_subdomain_types)) {
 | |
|                     continue;
 | |
|                 }
 | |
|                 $form .= "<option value=\"$domain;${sub_data['name']}\">";
 | |
|                 $form .= "${sub_data['name']} (${sub_data['type']} in $domain)</option>";
 | |
|             }
 | |
|         }
 | |
|         $form .= '<option value="*new*">' . _('*new*') . '</div>';
 | |
|         $form .= '</select></div>';
 | |
| 
 | |
|         // new sub_domain name ; new sub_domain type ; new sub_domain path
 | |
|         $form .= '<div id="new-sub-domain-name-wrapper">';
 | |
|         $form .= '<label for="new-sub-domain-name">' . _('Choose new sub-domain name (eg. www)') . '</label>';
 | |
|         $form .= '<input type="text" name="new_sub_domain_name" id="new-sub-domain-name"/>';
 | |
|         $form .= '</div>';
 | |
| 
 | |
|         $form .= '<div id="new-sub-domain-type-wrapper">';
 | |
|         $form .= '<label for="new-sub-domain-type">' . _('Choose a type for the new sub-domain') . '</label>';
 | |
|         $form .= '<select name="sub_domain_type" id="new-sub-domain-type">';
 | |
|         foreach ($this->allowed_subdomain_types() as $t) {
 | |
|             $form .= "<option value=\"$t\">$t</option>";
 | |
|         }
 | |
|         $form .= '</select></div>';
 | |
| 
 | |
|         $form .= '<div id="new-sub-domain-path-wrapper">';
 | |
|         $form .= '<label for="new-sub-domain-path">' . _('Choose a path for the new sub-domain') . '</label>';
 | |
|         $form .= '<input type="text" name="new_sub_domain_path" id="new-sub-domain-path"/>';
 | |
|         $form .= '</div>';
 | |
| 
 | |
|         // Database
 | |
|         $new_db_possible = $quota->cancreate('mysql');
 | |
| 
 | |
|         $dbs = $mysql->get_dblist();
 | |
|         $form .= '<div id="database-wrapper">';
 | |
|         $form .= '<label for="db_name">' . _('Choose a database to use') . '</label>';
 | |
|         $form .= '<select name="db_name" id="db_name">';
 | |
|         foreach ($dbs as $d) {
 | |
|             $form .= '<option value="' . $d['db'] . '">' . $d['db'] . '</option>';
 | |
|         }
 | |
|         if ($new_db_possible) {
 | |
|             $form .= '<option value ="*new*">' . _('*new*') . '</option>';
 | |
|         }
 | |
|         $form .= '</select>';
 | |
|         $form .= '</div>';
 | |
|         $form .= '<div id="new-db-name-wrapper">';
 | |
|         $form .= '<label for="new-db-name">' . _('Choose name for new database') . '</label>';
 | |
|         $form .= '<input type="text" name="new_db_name" id="new-db-name"/>';
 | |
|         $form .= '</div>';
 | |
| 
 | |
|         $form .= '<div id="db-prefix-wrapper">';
 | |
|         $form .= '<label for="db-prefix">' . _('Choose a database prefix (optional)') . '</label>';
 | |
|         $form .= '<input type="text" name="db_prefix" id="db-prefix"/>';
 | |
|         $form .= '</div>';
 | |
| 
 | |
|         // Invoke hook to get app-specific form fields.
 | |
|         $extra = '';
 | |
|         $vals = $hooks->invoke('hook_oci_form', array($app));
 | |
|         foreach ($vals as $v) {
 | |
|             if ($v) {
 | |
|                 $extra .= $v;
 | |
|             }
 | |
|         }
 | |
|         if ($extra) {
 | |
|             $form .= '<div class="app-' . $app . '" id="app-wrapper">';
 | |
|             $form .= '<h4>' . $app . ' ' . _('installation options') . '</h3>';
 | |
|             $form .= $extra;
 | |
|             $form .= '</div>';
 | |
|         }
 | |
| 
 | |
|         // Submit
 | |
|         // @TODO option to disable confirmation screen?
 | |
|         $form .= '<input type="submit" class="inb" name="submit" value="' . _('Continue') . '"/>';
 | |
|         $form  .= "</form>";
 | |
|         return $form;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Implements hook_oci_form.
 | |
|      */
 | |
|     function hook_oci_form($app) {
 | |
|         $f = '';
 | |
|         switch ($app) {
 | |
|         case 'drupal':
 | |
|             // These fields should be defined in hook_oci_form_fields
 | |
|             // Choose the install source
 | |
|             $f .= '<div id="drupal-install-source-wrapper">';
 | |
|             $f .= '<label for="drupal-install-source">' . _('Choose installation source') . '</label>';
 | |
|             $f .= '<select name="drupal_install_source" id="drupal-install-source">';
 | |
|             $f .= '<option value="drupal-core">' . _('Core Version') . '</option>';
 | |
|             $f .= '<option value="makefile">' . _('Makefile') . '</option>';
 | |
|             $f .= '</select></div>';
 | |
|             // Core Version
 | |
|             $f .= '<div id="drupal-core-version-wrapper">';
 | |
|             $f .= '<label for="drupal-core-version">' . _('Choose Drupal Core Version') . '</label>';
 | |
|             $f .= '<select name="drupal_core_version" id="drupal-core-version">';
 | |
|             $f .= '<option value="8">Drupal 8</option>';
 | |
|             $f .= '<option value="7">Drupal 7</option>';
 | |
|             $f .= '</select></div>';
 | |
|             // Makefile
 | |
|             $f .= '<div id="drupal-makefile-wrapper">';
 | |
|             $f .= '<label for="drupal-makefile">' . _('Makefile location (eg. an URL)') . '</label>';
 | |
|             $f .= '<input type="text" name="drupal_makefile" id="drupal-makefile"/>';
 | |
|             $f .= '</div>';
 | |
|             // Site Title
 | |
|             $f .= '<div id="drupal-title-wrapper">';
 | |
|             $f .= '<label for="drupal-title">' . _('Site Title') . '</label>';
 | |
|             $f .= '<input type="text" name="drupal_title" id="drupal-title">';
 | |
|             $f .= '</div>';
 | |
|             // Drupal Admin Name
 | |
|             $f .= '<div id="drupal-admin-name-wrapper">';
 | |
|             $f .= '<label for="drupal-admin-name">' . _('Admin username') . '</label>';
 | |
|             $f .= '<input type="text" name="drupal_admin_name" id="drupal-admin-name"/>';
 | |
|             $f .= '</div>';
 | |
|             // Drupal Admin Mail
 | |
|             $f .= '<div id="drupal-admin-maik-wrapper">';
 | |
|             $f .= '<label for="drupal-admin-mail">' . _('Admin e-mail') . '</label>';
 | |
|             $f .= '<input type="text" name="drupal_admin_mail" id="drupal-admin-mail"/>';
 | |
|             $f .= '</div>';
 | |
|             // Drupal Site Mail
 | |
|             $f .= '<div id="drupal-site-mail-wrapper">';
 | |
|             $f .= '<label for="drupal-site-mail">' . _('Site e-mail (used when sending e-mail)') . '</label>';
 | |
|             $f .= '<input type="text" name="drupal_site_mail" id="drupal-site-mail"/>';
 | |
|             $f .= '</div>';
 | |
|             // Drupal Site Name
 | |
|             $f .= '<div id="drupal-site-name-wrapper">';
 | |
|             $f .= '<label for="drupal-site-name">' . _('Short site name') . '</label>';
 | |
|             $f .= '<input type="text" name="drupal_site_name" id="drupal-site-name"/>';
 | |
|             $f .= '</div>';
 | |
|             break;
 | |
|         case 'wordpress':
 | |
|             // Site Title
 | |
|             $f .= '<div id="wordpress-title-wrapper">';
 | |
|             $f .= '<label for="wordpress-title">' . _('Site Title') . '</label>';
 | |
|             $f .= '<input type="text" name="wordpress_title" id="wordpress-title">';
 | |
|             $f .= '</div>';
 | |
|             // wordpress Admin Name
 | |
|             $f .= '<div id="wordpress-admin-name-wrapper">';
 | |
|             $f .= '<label for="wordpress-admin-name">' . _('Admin username') . '</label>';
 | |
|             $f .= '<input type="text" name="wordpress_admin_name" id="wordpress-admin-name"/>';
 | |
|             $f .= '</div>';
 | |
|             // wordpress Admin Mail
 | |
|             $f .= '<div id="wordpress-admin-maik-wrapper">';
 | |
|             $f .= '<label for="wordpress-admin-mail">' . _('Admin e-mail') . '</label>';
 | |
|             $f .= '<input type="text" name="wordpress_admin_mail" id="wordpress-admin-mail"/>';
 | |
|             $f .= '</div>';
 | |
|             // wordpress locale
 | |
|             $f .= '<div id="wordpress-locale">';
 | |
|             $f .= '<label for="wordpress-locale">' . _('Locale (eg. en_CA, fr_CA, or en_US)') . '</label>';
 | |
|             $f .= '<input type="text" name="wordpress_locale" id="wordpress-locale"/>';
 | |
|             $f .= '</div>';
 | |
|             break;
 | |
|         default:
 | |
|             break;
 | |
|         }
 | |
|         return $f;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Perform validation of the form data.
 | |
|      *
 | |
|      * @param array $vars
 | |
|      *   Array of name/value for the submitted data as received in oci_confirm.php
 | |
|      *
 | |
|      * @returns array
 | |
|      *   Array of errors eg. array(0 => array('module' => 'm_oci', 'message' => '...'), ...)
 | |
|      */
 | |
|     function oci_form_validate($app, $vars) {
 | |
|         global $hooks, $dom, $db;
 | |
|         $errors = array();
 | |
|         if ($vars['domain'] == '*new*') {
 | |
|             if (!$vars['new_domain_name']) {
 | |
|                 $errors[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('new_domain_name must not be empty when trying to create new domain'),
 | |
|                 );
 | |
|             }
 | |
|             // Repeat validation done in m_dom::add_domain
 | |
|             if (checkfqdn(strtolower($vars['new_domain_name']))) {
 | |
|                 $errors[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('new_domain_name is syntaxically incorrect'),
 | |
|                 );
 | |
|             }
 | |
|             $db->query("SELECT domain FROM forbidden_domains WHERE domain= ? ;", array($domain));
 | |
|             if ($db->num_rows()) {
 | |
|                 $errors[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('new_domain_name is forbidden on this server'),
 | |
|                 );
 | |
|             }
 | |
|             if ($domain == $L_FQDN || $domain == "www.$L_FQDN") {
 | |
|                 $errors[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('new_domain_name is the server\'s domain. You cannot host it on your account'),
 | |
|                 );
 | |
|             }
 | |
|             $db->query("SELECT compte FROM domaines WHERE domaine= ?;", array($domain));
 | |
|             if ($db->num_rows()) {
 | |
|                 $errors[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('The domain already exists'),
 | |
|                 );
 | |
|             }
 | |
|             $db->query("SELECT compte FROM `sub_domaines` WHERE sub != \"\" AND concat( sub, \".\", domaine )= ? OR domaine= ?;", array($domain, $domain));
 | |
|             if ($db->num_rows()) {
 | |
|                 $errors[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('The domain already exists'),
 | |
|                 );
 | |
|             }
 | |
|             // There are so many more... whois, dns, quota
 | |
|         }
 | |
| 
 | |
|         $sub = '';
 | |
|         if ($vars['sub_domain'] == '*new*') {
 | |
|             if (!$vars['new_sub_domain_name']) {
 | |
|                 $errors[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('new_sub_domain_name must not be empty'),
 | |
|                 );
 | |
|             }
 | |
|             if (!$vars['new_sub_domain_path']) {
 | |
|                 $errors[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('new_sub_domain_path must not be empty'),
 | |
|                 );
 | |
|             }
 | |
|             if (!$vars['new_sub_domain_type']) {
 | |
|                 $errors[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('new_sub_domain_type must not be empty'),
 | |
|                 );
 | |
|             }
 | |
|         } else {
 | |
|             // Make sure the sub-domain is in the current domain
 | |
|             list($d, $s) = explode(';', $vars['sub_domain']);
 | |
|             if (trim($d) != $vars['domain']) {
 | |
|                 $errors[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('sub-domain does not belong to selected domain'),
 | |
|                     'data' => array(
 | |
|                         'sub_domain' => $vars['sub_domain'],
 | |
|                         'domain' => $vars['domain'],
 | |
|                         'd' => $d,
 | |
|                         's' => $s,
 | |
|                     ),
 | |
|                 );
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if ($vars['db_name'] == '*new*') {
 | |
|             if (!preg_match("#^[0-9a-z]*$#", $vars['new_db_name'])) {
 | |
|                 $error[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('new_database_name can only contain letters and numbers'),
 | |
|                 );
 | |
|                 $msg->raise("ERROR", "mysql", _("Database name can contain only letters and numbers"));
 | |
|                 return false;
 | |
|             }
 | |
| 
 | |
|             $len=variable_get("sql_max_database_length", 64);
 | |
|             if (strlen($vars['db_name']) > $len) {
 | |
|                 $error[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('new_database_name cannot exceed character length') . ': ' . $len,
 | |
|                 );
 | |
|             }
 | |
|             $db->query("SELECT * FROM db WHERE db= ? ;", array($dbname));
 | |
|             if ($db->num_rows()) {
 | |
|                 $error[] = array(
 | |
|                     'module' => 'm_oci',
 | |
|                     'message' => _('new_database_name already exists'),
 | |
|                 );
 | |
|             }
 | |
|         }
 | |
|         $vals = $hooks->invoke('hook_oci_form_validate', array($app, $vars));
 | |
|         foreach ($vals as $v) {
 | |
|             if ($v && is_array($v) && !is_empty($v)) {
 | |
|                 $errors = $errors + $v;
 | |
|             }
 | |
|         }
 | |
|         return $errors;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Implements hook_oci_form_validate.
 | |
|      */
 | |
|     function hook_oci_form_validate($app, $vars) {
 | |
|         $errors = array();
 | |
|         // @TODO Drupal
 | |
|         // @TODO Wordpress
 | |
|         return $errors;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Installs an application.
 | |
|      */
 | |
|     function install($app, $vars) {
 | |
|         global $hooks, $dom, $mysql, $msg, $mem, $db, $cuid, $L_ALTERNC_HTML;
 | |
|         $r = '';
 | |
| 
 | |
|         // Add new domain if necessary.
 | |
|         if ($vars['domain'] == '*new*') {
 | |
|             $dom->lock();
 | |
|             // @TODO don't force dns to on enabled.
 | |
|             if (!$dom->add_domain($vars['new_domain_name'], 1)) {
 | |
|                 $msg->raise('ERROR', '....');
 | |
|                 return '';
 | |
|             } else {
 | |
|                 $vars['domain'] = $vars['new_domain_name'];
 | |
|                 unset($vars['new_domain_name']);
 | |
|             }
 | |
|             $dom->unlock();
 | |
|         }
 | |
| 
 | |
|         // Add new sub-domain if necessary.
 | |
|         if ($vars['sub_domain'] == '*new*') {
 | |
|             // @TODO special case: handle new_sub_domain_name was a default domain graceully.
 | |
|             $dom->lock();
 | |
|             if (!$dom->set_sub_domain($vars['domain'], $vars['new_sub_domain_name'],
 | |
|                 $vars['new_sub_domain_type'], $vars['new_sub_domain_path'])) {
 | |
|                 $msg->raise('ERROR', '......');
 | |
|                 return '';
 | |
|             } else {
 | |
|                 $vars['sub_domain'] = $vars['new_sub_domain_name'];
 | |
|                 unset($vars['new_sub_domain_name']);
 | |
|                 unset($vars['new_sub_domain_path']);
 | |
|                 unset($vars['new_sub_domain_type']);
 | |
|             }
 | |
|             $dom->unlock();
 | |
|         } else {
 | |
|             list($d, $s) = explode(';', $vars['sub_domain']);
 | |
|             if ($d != $vars['domain']) {
 | |
|                 $msg->raise('ERROR', 'm_oci', 'sub_domai %s doesn\'t belong to domain %s',
 | |
|                             array($vars['sub_domain'], $vars['domain']));
 | |
|             }
 | |
|             $vars['sub_domain'] = $s;
 | |
|         }
 | |
| 
 | |
|         // Add database if necessary.
 | |
|         if ($vars['db_name'] == '*new*') {
 | |
|             $login = $mem->user['login'];
 | |
|             if(!$mysql->add_db("${login}_${vars['new_db_name']}")) {
 | |
|                 $msg->raise('ERROR', '....');
 | |
|                 return '';
 | |
|             } else {
 | |
|                 $vars['db_name'] = "${login}_${vars['new_db_name']}";
 | |
|                 unset($vars['new_db_name']);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Fill out variables to pass on to the install hooks.
 | |
|         $db->query("SELECT dbu.name,dbu.password, dbs.host FROM dbusers dbu, db_servers dbs, membres m WHERE dbu.uid= ? and enable='ACTIVATED' and dbs.id=m.db_server_id and m.uid= ? and dbu.name = ?;", array($cuid, $cuid, $vars['db_name']));
 | |
|         if (!$db->num_rows()) {
 | |
|             $msg->raise('ERROR', 'm_oci', _('Unable to get database information for user "%s", db "%s"'), array($cuid, $vars['db_name']));
 | |
|             return '';
 | |
|         }
 | |
|         $db->next_record();
 | |
|         $vars['db_user'] = $db->Record['name'];
 | |
|         $vars['db_pass'] = $db->Record['password'];
 | |
|         $vars['db_host'] = $db->Record['host'];
 | |
|         $vars['db_port'] = '3306'; // Seems to be hardcoded in AlternC
 | |
| 
 | |
|         $dom->lock();
 | |
|         $domain_info = $dom->get_domain_all($vars['domain']);
 | |
|         $dom->unlock();
 | |
|         $vars['url'] = ($vars['sub_domain']) ? $vars['sub_domain'] . '.' : '';
 | |
|         $vars['url'] .= $vars['domain'];
 | |
|         $msg->raise('INFO', 'm_oci', 'Domain info: %s', print_r($domain_info, TRUE));
 | |
|         foreach ($domain_info['sub'] as $delta => $sub_info) {
 | |
|             if($sub_info['name'] != $vars['sub_domain']) {
 | |
|                 continue;
 | |
|             }
 | |
|             $vars['path'] = $sub_info['dest'];
 | |
|         }
 | |
|         $login = $mem->user['login'];
 | |
|         $vars['path'] = $L_ALTERNC_HTML . '/' . substr($login, 0, 1) . '/' . $login . $vars['path'];
 | |
| 
 | |
|         // db_user,pass,host,port,name ; url,path
 | |
|         $msg->raise('INFO', 'm_oci', 'Invoking hook_oci_install for app %s with args %s',
 | |
|                     array($app, print_r($vars, TRUE)));
 | |
|         $vals = $hooks->invoke('hook_oci_install', array($app, $vars));
 | |
|         foreach ($vals as $v) {
 | |
|             $r .= $v;
 | |
|         }
 | |
|         $vals = $hooks->invoke('hook_oci_post_install', array($app, $hook_vars));
 | |
|         foreach ($vals as $v) {
 | |
|             $r .= $v;
 | |
|         }
 | |
|         return $r;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Implements hook_oci_install.
 | |
|      */
 | |
|     function hook_oci_install($app, $vars) {
 | |
|         if ($app == 'drupal') {
 | |
|             $r .= $this->_install_drupal($app, $vars);
 | |
|         } elseif ($app == 'wordpress') {
 | |
|             $r .= $this->_install_wordpress($app, $vars);
 | |
|         }
 | |
|         return '';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Install drupal
 | |
|      */
 | |
|     private function _install_drupal($app, $vars) {
 | |
|         global $L_ALTERNC_DRUSH_BIN, $msg;
 | |
|         $si_args = array(
 | |
|             '--site-mail' => $vars['drupal_site_mail'],
 | |
|             '--site-name' => $vars['drupal_title'],
 | |
|             '--sites-subdir' => $vars['drupal_site_name'],
 | |
|             '--root' => $vars['path'],
 | |
|             '--account-mail' => $vars['drupal_admin_mail'],
 | |
|             '--account-name' => $vars['drupal_admin_name'],
 | |
|             '--db-prefix' => $vars['db_prefix'],
 | |
|             '--db-url' => "mysql://${vars['db_user']}:${vars['db_pass']}@${vars['db_host']}:${vars['db_port']}/${vars['db_name']}",
 | |
|         );
 | |
|         $r = '';
 | |
|         if ($vars['drupal_makefile']) {
 | |
|             $cmd = sprintf("$_ALTERNC_DRUSH_BIN make --concurrency=5 %s %s",
 | |
|                            $vars['drupal_makefile'],
 | |
|                            $vars['path']);
 | |
|             $msg->raise('INFO', 'm_oci', 'Running command: %s', array($cmd));
 | |
|             $r .= shell_exec($cmd . ' 2>&1');
 | |
|         }
 | |
|         if ($vars['drupal_core_version']) {
 | |
|             $version = 'drupal-' . $vars['drupal_core_version'];
 | |
|             $cmd = sprintf("$L_ALTERNC_DRUSH_BIN dl %s %s %s --yes",
 | |
|                            escapeshellarg($version),
 | |
|                            '--destination=' . escapeshellarg($vars['path']),
 | |
|                            '--drupal-project-rename="."'
 | |
|             );
 | |
|             $msg->raise('INFO', 'm_oci', 'Running command: %s', array($cmd));
 | |
|             $r .= shell_exec($cmd . ' 2>&1');
 | |
|         }
 | |
| 
 | |
|         $si_arg = '';
 | |
|         foreach ($si_args as $name => $value) {
 | |
|             if (!$value) {
 | |
|                 continue;
 | |
|             }
 | |
|             $si_arg .= "$name=" . escapeshellarg($value) . ' ';
 | |
|         }
 | |
|         $si_arg .= ' --yes'; // . ' ' . escapeshellarg($vars['drupal_site_name']);
 | |
|         $msg->raise('INFO', 'm_oci', _('Starting Drupal installation with arguments: %s'), array($si_arg));
 | |
|         // @FIXME This seems to use an insane about of memory and gets OOM killed.
 | |
|         $r .= shell_exec("$L_ALTERNC_DRUSH_BIN si $si_arg 2>&1");
 | |
|         return $r;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Install wordpress
 | |
|      */
 | |
|     private function _install_wordpress($app, $vars) {
 | |
|         global $L_ALTERNC_WP_BIN, $msg;
 | |
|         $dl = array(
 | |
|             '--path' => $vars['path'],
 | |
|             '--locale' => $vars['wordpress_locale'],
 | |
|         );
 | |
|         $dl_arg = '';
 | |
|         foreach ($dl as $n => $v) {
 | |
|             if ($v) {
 | |
|                 $dl_arg .= " $n=" . escapeshellarg($v);
 | |
|             }
 | |
|         }
 | |
|         $msg->raise('INFO', 'm_oci', 'Running command: %s',
 | |
|                     array("$L_ALTERNC_WP_BIN core download $dl_arg"));
 | |
|         $r = shell_exec("$L_ALTERNC_WP_BIN core download $dl_arg 2>&1");
 | |
|         $cfg = array(
 | |
|             '--path' => $vars['path'],
 | |
|             '--dbname' => $vars['db_name'],
 | |
|             '--dbuser' => $vars['db_user'],
 | |
|             '--dbhost' => $vars['db_host'],
 | |
|             '--dbpass' => $vars['db_pass'],
 | |
|             '--locale' => $vars['wordpress_locale'],
 | |
|         );
 | |
| 
 | |
|         $cfg_arg = '';
 | |
|         foreach ($cfg as $n => $v) {
 | |
|             if (!$v) {
 | |
|                 continue;
 | |
|             }
 | |
|             $cfg_arg .= ' ' . "$n=" . escapeshellarg($v);
 | |
|         }
 | |
|         $msg->raise('INFO', 'm_oci', 'Running command: %s',
 | |
|                     array("$L_ALTERNC_WP_BIN config create $cfg_arg"));
 | |
|         $r .= shell_exec("$L_ALTERNC_WP_BIN config create $cfg_arg 2>&1");
 | |
| 
 | |
|         $inst = array(
 | |
|             '--path' => $vars['path'],
 | |
|             '--url' => $vars['url'],
 | |
|             '--title' => $vars['wordpress_title'],
 | |
|             '--admin_email' => $vars['wordpress_admin_mail'],
 | |
|             '--admin_name' => $vars['wordpress_admin_name'],
 | |
|         );
 | |
|         $inst_arg = '';
 | |
|         foreach ($inst as $n => $v) {
 | |
|             if (!$v) {
 | |
|                 continue;
 | |
|             }
 | |
|             $inst_arg .= ' ' . "$n=" . escapeshellarg($v);
 | |
|         }
 | |
|         $msg->raise('INFO', 'm_oci', 'Running command: %s',
 | |
|                     array("$L_ALTERNC_WP_BIN core install $inst_arg"));
 | |
|         $r .= shell_exec("$L_ALTERNC_WP_BIN core install $inst_arg 2>&1");
 | |
|         return $r;
 | |
|     }
 | |
| }
 |