Process/Php7.php
[Pman.Core] / UpdateDatabase.php
index 5e907c2..2385354 100644 (file)
@@ -108,10 +108,11 @@ class Pman_Core_UpdateDatabase extends Pman
             require_once $fd;
             
             $cls = new ReflectionClass('Pman_'. $m . '_UpdateDatabase');
-            
-            $ret = array_merge($ret, $cls->getStaticPropertyValue('cli_opts'));
-            
-            
+            $ar = $cls->getStaticProperties();
+            if (isset($ar['cli_opts'])) {
+                  
+                $ret = array_merge($ret, $cls->getStaticPropertyValue('cli_opts'));
+            }
         }
         
         return $ret;
@@ -125,6 +126,22 @@ class Pman_Core_UpdateDatabase extends Pman
     
     var $local_base_url = false;
     
+    var $emailTemplates = array(
+        'EVENT_ERRORS_REPORT' => array(
+            'bcc_group' => 'Empty Group',
+            'test_class' => 'Pman/Admin/Report/SendEventErrors',
+            'to_group' => 'Administrators',
+            'active' => 1,
+            'description' => '9. System Error Messages',
+            'template_dir' => '/Pman/Admin/templates/mail/'
+        )
+    );
+    
+    var $required_extensions = array(
+        'curl',
+        'gd'
+    );
+    
     function getAuth() {
         
         
@@ -145,18 +162,18 @@ class Pman_Core_UpdateDatabase extends Pman
     
     function get($args, $opts=array())
     {
-        print_R($opts);
-        
         PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'onPearError'));
    
         $this->checkSystem();
         
+        $this->verifyExtensions($this->required_extensions);
+        
         if (class_exists('PDO_DataObjects_Introspection')) {
             PDO_DataObject_Introspection::$cache = array();
         }
-        
+        echo "Generate DB cache\n";
         HTML_FlexyFramework::get()->generateDataobjectsCache(true);
-   
+        echo "Generated DB cache\n";
         $ff = HTML_FlexyFramework::get();
         
         if(!isset($ff->Pman) || !isset($ff->Pman['local_base_url'])){
@@ -177,16 +194,34 @@ class Pman_Core_UpdateDatabase extends Pman
         $this->opts = $opts;
         
         if (!empty($opts['debug'])) {
-            echo "Setting debug Level : {$opts['debug']}\n";
-            DB_DataObject::DebugLevel($opts['debug']);
+             DB_DataObject::DebugLevel($opts['debug']);
         }
-      
         
         // ask all the modules to verify the opts
-        
+        echo "Checking options\n";
         $this->checkOpts($opts);
         
-          
+        $response = $this->curl("http://localhost{$this->local_base_url}/Core/UpdateDatabase/VerifyExtensions");
+        $json = json_decode($response, true);
+        
+        if(empty($json['data']) || $json['data'] != 'DONE'){
+            echo "\nError: Missing php extensions:\n";
+            print_r($response);
+            echo "Please install the above extensions and restart the apache.\n";
+            sleep(5);
+            
+            //exit;
+        }
+        
+        echo "Checking Setup Requirements\n";
+        require_once 'Pman/Core/UpdateDatabase/VerifyConfig.php';
+        $sq = new Pman_Core_UpdateDatabase_VerifyConfig();
+        $ret = $sq->get($args, $opts);
+        
+        if(!empty($ret)){
+            echo implode("\n", $ret) . "\n";
+            sleep(30);
+        }
         
         // do this first, so the innodb change + utf8 fixes column max sizes
         
@@ -203,6 +238,8 @@ class Pman_Core_UpdateDatabase extends Pman
             return;
         }
         
+        
+
         $this->runUpdateModulesData();
         
         if (!empty($opts['add-company']) && !in_array('Core', $this->disabled)) {
@@ -213,10 +250,11 @@ class Pman_Core_UpdateDatabase extends Pman
         
         $this->runExtensions();
         
-        $this->generateDataobjectsCache();
+        $this->clearApacheDataobjectsCache();
         
-         
+        $this->clearApacheAssetCache();
     }
+    
     function output() {
         echo "\nUpdate Completed SUCCESS\n";
         return '';
@@ -301,9 +339,10 @@ class Pman_Core_UpdateDatabase extends Pman
             // new -- sql directory..
             // new style will not support migrate ... they have to go into mysql-migrate.... directories..
             // new style will not support pg.sql etc.. naming - that's what the direcotries are for..
+            $dbdir = $dbtype == 'mysqli' ? 'mysql' : $dbtype;
             
             $this->{$dirmethod}($dburl, $this->rootDir. "/Pman/$m/sql");
-            $this->{$dirmethod}($dburl, $this->rootDir. "/Pman/$m/{$dbtype}");
+            $this->{$dirmethod}($dburl, $this->rootDir. "/Pman/$m/{$dbdir}");
             
            
             
@@ -779,16 +818,23 @@ class Pman_Core_UpdateDatabase extends Pman
             array(
                 'name' => 'bcc-email', // group who are bcc'ed on all requests.
                 'type' => 0, // system
+                'display_name' => 'Standard BCC Group'
             ),
             array(
                 'name' => 'system-email-from',
                 'type' => 0, // system
+                'display_name' => 'Standard System Email From Group'
             ),
             array(
                 'name' => 'core-person-signup-bcc',
                 'type' => 0, // system
+                'display_name' => 'Standard Person Signup BCC Group'
             ),
-        
+            array(
+                'name' => 'Empty Group', // use for no bcc emails.
+                'type' => 0,
+                'display_name' => 'Standard Empty Group'
+            )
 
         ));
         
@@ -801,17 +847,21 @@ class Pman_Core_UpdateDatabase extends Pman
         $c = DB_DataObject::Factory('core_company');
         $c->selectAdd();
         $c->selectAdd('distinct(comptype) as comptype');
-        $c->whereAdd("comptype != ''");
+        $c->whereAdd("
+                comptype != '' 
+            AND 
+                comptype != 'undefined' 
+            AND 
+                comptype != 'undefine'
+        ");
         
         $ctb = array();
         foreach($c->fetchAll('comptype') as $cts) {
             
-            
-            
-           $ctb[]= array( 'etype'=>'COMPTYPE', 'name' => $cts, 'display_name' => ucfirst(strtolower($cts)));
+            $ctb[]= array( 'etype'=>'COMPTYPE', 'name' => $cts, 'display_name' => ucfirst(strtolower($cts)));
         
         }
-         $c = DB_DataObject::Factory('core_enum');
+        $c = DB_DataObject::Factory('core_enum');
          
         $c->initEnums($ctb);
         //DB_DataObject::debugLevel(1);
@@ -833,6 +883,19 @@ class Pman_Core_UpdateDatabase extends Pman
         
     }
     
+    function updateDataEmails()
+    {
+        foreach ($this->emailTemplates as $k => $mail) {
+            
+            $mail_dir = "{$this->rootDir}{$mail['template_dir']}";
+
+            $this->initEmails(
+                $mail_dir,
+                array($k => $mail),
+                false
+            );
+        }
+    }
     
     function initEmails($templateDir, $emails, $mapping = false)
     {
@@ -848,13 +911,14 @@ class Pman_Core_UpdateDatabase extends Pman
                 if (empty($data['bcc_group'])) {
                     $this->jerr("missing bcc_group for template $name");
                 }
+                
                 $g = DB_DataObject::Factory('core_group')->lookup('name',$data['bcc_group']);
                 
                 if (empty($g->id)) {
                     $this->jerr("bcc_group {$data['bcc_group']} does not exist when importing template $name");
                 }
                 
-                if (!$g->members('email')) {
+                if (!$g->members('email') && $g->name != 'Empty Group') {
                     $this->jerr("bcc_group {$data['bcc_group']} does not have any members");
                 }
                 
@@ -862,10 +926,11 @@ class Pman_Core_UpdateDatabase extends Pman
             }
             // initEmails will always have the latest location of the test class - in theory the user should not be changign the value of this...
             //if (empty($cm->test_class)) {
-                if (empty($data['test_class'])) {
-                    $this->jerr("missing test_class for template $name");
-                }
-                $cm->test_class = $data['test_class'];
+            if (empty($data['test_class'])) {
+                $this->jerr("missing test_class for template $name");
+            }
+            
+            $cm->test_class = $data['test_class'];
             //}
             if(isset($cm->to_group_id)) {
                 print_r('isset');
@@ -890,6 +955,14 @@ class Pman_Core_UpdateDatabase extends Pman
                 $cm->active = $data['active'];
             }
             
+            /*
+             * Set description to email.
+             * However we do not update if it is been set.
+             */
+            if(empty($cm->description) && !empty($data['description'])){
+                $cm->description = $cm->escape($data['description']);
+            }
+            
             require_once $cm->test_class . '.php';
             
             $clsname = str_replace('/','_', $cm->test_class);
@@ -940,16 +1013,15 @@ class Pman_Core_UpdateDatabase extends Pman
             PDO_DataObject_Introspection::$cache = array();
         }
         HTML_FlexyFramework::get()->generateDataobjectsCache(true);
+        
         $this->updateDataEnums();
         $this->updateDataGroups();
         $this->updateDataCompanies();
         
+        $this->updateDataEmails();
+        
         $c = DB_DataObject::Factory('I18n');
         $c->buildDB();
-         
-       
-        
-        
     }
     
     function fixMysqlInnodb()
@@ -992,7 +1064,9 @@ class Pman_Core_UpdateDatabase extends Pman
                     in_array('STRICT_TRANS_TABLES', $modes) || 
                     !in_array('ALLOW_INVALID_DATES', $modes)
             ){
-                die("Error: set sql_mode include 'ALLOW_INVALID_DATES', remove 'NO_ZERO_IN_DATE' AND 'STRICT_TRANS_TABLES' AND 'NO_ZERO_DATE' in my.cnf\n\n");
+                die("Error: set sql_mode include 'ALLOW_INVALID_DATES', remove 'NO_ZERO_IN_DATE' AND 'STRICT_TRANS_TABLES' AND 'NO_ZERO_DATE' in my.cnf\n\n".
+                    "Recommended line: \n\nsql_mode = ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ALLOW_INVALID_DATES\n\n"
+                );
             }
         }
         
@@ -1140,7 +1214,8 @@ class Pman_Core_UpdateDatabase extends Pman
             'pdftoppm',
             'rsvg-convert',  //librsvg2-bin
             'strings',
-            'oathtool'
+            'oathtool',
+            'gifsicle', // used for gif conversions
         );
          
          
@@ -1184,14 +1259,45 @@ class Pman_Core_UpdateDatabase extends Pman
         
     }
     
-    function generateDataobjectsCache()
+    function clearApacheDataobjectsCache()
     {
+        echo "Clearing Database Cache\n";
+        // this needs to clear it's own cache along with remote one..
+  
         $url = "http://localhost{$this->local_base_url}/Core/RefreshDatabaseCache";
-            
-        $this->curl($url);
+        $response = $this->curl($url);
+        
+        $json = json_decode($response, true);
+        
+        if(empty($json['data']) || $json['data'] != 'DONE'){
+            echo "fetching $url\n";
+            echo "GOT:" . $response. "\n";
+            echo "Clear DataObjects Cache failed\n";
+            exit;
+        }
+        
+    }
+    
+    
+    function clearApacheAssetCache()
+    {
+        echo "Clearing Asset Cache\n";
+        $response = $this->curl(
+            "http://localhost{$this->local_base_url}/Core/Asset",
+            array( '_clear_cache' => 1 ,'returnHTML' => 'NO' ),
+            'POST'
+        );
+        $json = json_decode($response, true);
+        
+        if(empty($json['success']) || !$json['success']) {
+            echo $response. "\n";
+            echo "CURL Clear Asset cache failed\n";
+            exit;
+        }
         
     }
     
+    
     function curl($url, $request = array(), $method = 'GET') 
     {
         if($method == 'GET'){
@@ -1207,7 +1313,6 @@ class Pman_Core_UpdateDatabase extends Pman
             curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
             
         } else {
-            
             curl_setopt($ch, CURLOPT_HTTPHEADER,
                     array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($request)));
             
@@ -1227,6 +1332,25 @@ class Pman_Core_UpdateDatabase extends Pman
         return $response;
     }
     
-    
+    static function verifyExtensions($extensions)
+    {
+        $error = array();
+        
+        foreach ($extensions as $e){
+            
+            if(empty($e) || extension_loaded($e)) {
+                continue;
+            }
+            
+            $error[] = "Error: Please install php extension: {$e}";
+        }
+        
+        if(empty($error)){
+           return true; 
+        }
+        $ff = HTML_FLexyFramework::get();
+        
+        $ff->page->jerr(implode('\n', $error));
+    }
     
 }