Merge branch '2014.11' into 2014.11-develop
authorPhilipp Schüle <p.schuele@metaways.de>
Mon, 26 Oct 2015 11:26:21 +0000 (12:26 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Mon, 26 Oct 2015 11:26:21 +0000 (12:26 +0100)
1  2 
tine20/Tinebase/Frontend/Cli.php

@@@ -26,114 -26,6 +26,114 @@@ class Tinebase_Frontend_Cli extends Tin
      protected $_applicationName = 'Tinebase';
  
      /**
 +     * clean timemachine_modlog for records that have been pruned (not deleted!)
 +     */
 +    public function cleanModlog()
 +    {
 +        $deleted = Tinebase_Timemachine_ModificationLog::getInstance()->clean();
 +
 +        echo "\ndeleted $deleted modlogs records\n";
 +    }
 +
 +    /**
 +     * clean relations, set relation to deleted if at least one of the ends has been set to deleted or pruned
 +     */
 +    public function cleanRelations()
 +    {
 +        $relations = Tinebase_Relations::getInstance();
 +        $filter = new Tinebase_Model_Filter_FilterGroup();
 +        $pagination = new Tinebase_Model_Pagination();
 +        $pagination->limit = 10000;
 +        $pagination->sort = 'id';
 +
 +        $totalCount = 0;
 +        $date = Tinebase_DateTime::now()->subYear(1);
 +
 +        while ( ($recordSet = $relations->search($filter, $pagination)) && $recordSet->count() > 0 ) {
 +            $filter = new Tinebase_Model_Filter_FilterGroup();
 +            $pagination->start += $pagination->limit;
 +            $models = array();
 +
 +            foreach($recordSet as $relation) {
 +                $models[$relation->own_model][$relation->own_id][] = $relation->id;
 +                $models[$relation->related_model][$relation->related_id][] = $relation->id;
 +            }
 +            foreach ($models as $model => &$ids) {
 +                $doAll = false;
 +
 +                try {
 +                    $app = Tinebase_Core::getApplicationInstance($model, '', true);
 +                } catch (Tinebase_Exception_NotFound $tenf) {
 +                    if (Tinebase_Core::isLogLevel(Zend_Log::INFO))
 +                        Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' model: ' . $model . ' no application found for it');
 +                    $doAll = true;
 +                }
 +                if (!$doAll) {
 +                    if ($app instanceof Tinebase_Container)
 +                    {
 +                        $backend = $app;
 +                    } else {
 +                        if (!$app instanceof Tinebase_Controller_Record_Abstract) {
 +                            if (Tinebase_Core::isLogLevel(Zend_Log::INFO))
 +                                Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' model: ' . $model . ' controller: ' . get_class($app) . ' not an instance of Tinebase_Controller_Record_Abstract');
 +                            continue;
 +                        }
 +
 +                        $backend = $app->getBackend();
 +                    }
 +                    if (!$backend instanceof Tinebase_Backend_Interface) {
 +                        if (Tinebase_Core::isLogLevel(Zend_Log::INFO))
 +                            Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' model: ' . $model . ' backend: ' . get_class($backend) . ' not an instance of Tinebase_Backend_Interface');
 +                        continue;
 +                    }
 +                    $record = new $model(null, true);
 +
 +                    $modelFilter = $model . 'Filter';
 +                    $idFilter = new $modelFilter(array(), '', array('ignoreAcl' => true));
 +                    $idFilter->addFilter(new Tinebase_Model_Filter_Id(array(
 +                        'field' => $record->getIdProperty(), 'operator' => 'in', 'value' => array_keys($ids)
 +                    )));
 +
 +
 +                    $existingIds = $backend->search($idFilter, null, true);
 +
 +                    if (!is_array($existingIds)) {
 +                        throw new Exception('search for model: ' . $model . ' returned not an array!');
 +                    }
 +                    foreach ($existingIds as $id) {
 +                        unset($ids[$id]);
 +                    }
 +                }
 +
 +                if ( count($ids) > 0 ) {
 +                    $toDelete = array();
 +                    foreach ($ids as $idArrays) {
 +                        foreach ($idArrays as $id) {
 +                            $toDelete[$id] = true;
 +                        }
 +                    }
 +
 +                    $toDelete = array_keys($toDelete);
 +
 +                    foreach($toDelete as $id) {
 +                        if ( $recordSet->getById($id)->creation_time && $recordSet->getById($id)->creation_time->isLater($date) ) {
 +                            Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' relation is about to get deleted that is younger than 1 year: ' . print_r($recordSet->getById($id)->toArray(false), true));
 +                        }
 +                    }
 +
 +                    $relations->delete($toDelete);
 +                    $totalCount += count($toDelete);
 +                }
 +            }
 +        }
 +
 +        $message = 'Deleted ' . $totalCount . ' relations in total';
 +        if (Tinebase_Core::isLogLevel(Zend_Log::INFO))
 +            Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' ' . $message);
 +        echo $message . "\n";
 +    }
 +
 +    /**
       * authentication
       *
       * @param string $_username
       */
      public function triggerAsyncEvents($_opts)
      {
 -        if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ .' Triggering async events from CLI.');
 +        if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
 +            . ' Triggering async events from CLI.');
 +
 +        $freeLock = $this->_aquireMultiServerLock(__CLASS__ . '::' . __FUNCTION__);
 +        if (! $freeLock) {
 +            if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
 +                .' Job already running.');
 +            return false;
 +        }
          
          $userController = Tinebase_User::getInstance();
          
          $responseString = ($responses) ? implode(',', array_keys($responses)) : 'NULL';
          echo "Tine 2.0 scheduler run (" . $responseString . ") complete.\n";
          
 -        return TRUE;
 +        return true;
      }
      
      /**
          }
  
          $args = $this->_parseArgs($_opts, array(), 'tables');
 +        $doEverything = false;
  
          if (! (isset($args['tables']) || array_key_exists('tables', $args)) || empty($args['tables'])) {
              echo "No tables given.\nPurging records from all tables!\n";
              $args['tables'] = $this->_getAllApplicationTables();
 +            $doEverything = true;
          }
          
          $db = Tinebase_Core::getDb();
                  echo "\nCleared table $table (deleted $deleteCount records).";
              }
          }
 +
 +        if ($doEverything) {
 +            echo "\nCleaning relations...";
 +            $this->cleanRelations();
 +
 +            echo "\nCleaning modlog...";
 +            $this->cleanModlog();
 +        }
 +
          echo "\n\n";
          
          return TRUE;
  
          // get all persistent filters without grants
          // TODO this could be enhanced by allowing to set default grants for other filters, too
-         $filters = Tinebase_PersistentFilter::getInstance()->search(new Tinebase_Model_PersistentFilterFilter());
+         Tinebase_PersistentFilter::getInstance()->doContainerACLChecks(false);
+         $filters = Tinebase_PersistentFilter::getInstance()->search(new Tinebase_Model_PersistentFilterFilter(array(),'', array('ignoreAcl' => true)));
          $filtersWithoutGrants = 0;
  
          foreach ($filters as $filter) {