예제 #1
0
 private function _checkExistingModelFolder($model, $folder, $mustExist = false)
 {
     \GO::debug("Check existing model folder " . $model->className() . "(ID:" . $model->id . " Folder ID: " . $folder->id . " ACL ID: " . $model->findAclId() . ")");
     if (!$folder->fsFolder->exists()) {
         //throw new \Exception("Fs folder doesn't exist! ".$folder->fsFolder->path());
         \GO::debug("Deleting it because filesystem folder doesn't exist");
         $folder->readonly = 1;
         //makes sure acl is not deleted
         $folder->delete(true);
         if ($mustExist) {
             return $this->_createNewModelFolder($model);
         } else {
             return 0;
         }
     }
     //todo test this:
     //      if(!isset($model->acl_id) && empty($params['mustExist'])){
     //          //if this model is not a container like an addressbook but a contact
     //          //then delete the folder if it's empty.
     //          $ls = $folder->fsFolder->ls();
     //          if(!count($ls) && $folder->fsFolder->mtime()<time()-60){
     //              $folder->delete();
     //              $response['files_folder_id']=$model->files_folder_id=0;
     //              $model->save();
     //              return $response['files_folder_id'];
     //          }
     //      }
     $currentPath = $folder->path;
     $newPath = $model->buildFilesPath();
     if (!$newPath) {
         return false;
     }
     if (\GO::router()->getControllerAction() == 'checkdatabase') {
         //Always ensure folder exists on check database
         $destinationFolder = \GO\Files\Model\Folder::model()->findByPath(dirname($newPath), true, array('acl_id' => $model->findAclId(), 'readonly' => 1));
     }
     if ($currentPath != $newPath) {
         \GO::debug("Moving folder " . $currentPath . " to " . $newPath);
         //model has a new path. We must move the current folder
         $destinationFolder = \GO\Files\Model\Folder::model()->findByPath(dirname($newPath), true, array('acl_id' => $model->findAclId(), 'readonly' => 1));
         //sometimes the folder must be moved into a folder with the same. name
         //for example:
         //projects/Name must be moved into projects/Name/Name
         //then we temporarily move it to a temp name
         if ($destinationFolder->id == $folder->id || $destinationFolder->fsFolder->isSubFolderOf($folder->fsFolder)) {
             \GO::debug("Destination folder is the same!");
             $folder->name = uniqid();
             $folder->systemSave = true;
             $folder->save(true);
             \GO::debug("Moved folder to temp:" . $folder->fsFolder->path());
             \GO::modelCache()->remove("GO\\Files\\Model\\Folder");
             $destinationFolder = \GO\Files\Model\Folder::model()->findByPath(dirname($newPath), true);
             \GO::debug("Now moving to:" . $destinationFolder->fsFolder->path());
         }
         if ($destinationFolder->id == $folder->id) {
             throw new \Exception("Same ID's!");
         }
         $fsFolder = new \GO\Base\Fs\Folder($newPath);
         //          $fsFolder->appendNumberToNameIfExists();
         if ($existingFolder = $destinationFolder->hasFolder($fsFolder->name())) {
             \GO::debug("Merging into existing folder." . $folder->path . ' (' . $folder->id . ') -> ' . $existingFolder->path . ' (' . $existingFolder->id . ')');
             //if (!empty($model->acl_id))
             $existingFolder->acl_id = $model->findAclId();
             $existingFolder->visible = 0;
             $existingFolder->readonly = 1;
             $existingFolder->save(true);
             $folder->systemSave = true;
             $existingFolder->moveContentsFrom($folder, true);
             //delete empty folder.
             $folder->readonly = 1;
             //makes sure acl is not deleted
             $folder->delete(true);
             return $existingFolder->id;
         } else {
             //              if ($model->acl_id>0)
             //                  $folder->acl_id = $model->acl_id;
             //              else
             //                  $folder->acl_id=0;
             $folder->acl_id = $model->findAclId();
             $folder->name = $fsFolder->name();
             $folder->parent_id = $destinationFolder->id;
             $folder->systemSave = true;
             $folder->visible = 0;
             $folder->readonly = 1;
             if ($folder->isModified()) {
                 if (!$folder->save(true)) {
                     throw new \Exception(var_export($folder->getValidationErrors(), true));
                 }
             }
         }
     } else {
         \GO::debug("No change needed");
         //          if ($model->acl_id>0)
         //              $folder->acl_id = $model->acl_id;
         //          else
         //              $folder->acl_id=0;
         $folder->acl_id = $model->findAclId();
         $folder->systemSave = true;
         $folder->visible = 0;
         $folder->readonly = 1;
         if ($folder->isModified()) {
             $folder->save(true);
         }
     }
     return $folder->id;
 }
예제 #2
0
 protected function actionDownloadFromShop($params)
 {
     $this->requireCli();
     $proPackageName = 'groupoffice-pro';
     $this->checkRequiredParameters(array('shopuser', 'shoppass'), $params);
     $shopUrl = 'https://intermesh.group-office.com/';
     $packages = isset($params['packages']) ? explode(",", $params['packages']) : array('documents-4.0', 'billing-4.0', 'groupoffice-pro-4.0');
     $downloads = array();
     foreach ($packages as $package_name) {
         echo "\nGetting latest " . $package_name . "\n";
         $packageUrl = $shopUrl . '?r=licenses/package/downloadPackageFile&package_name=' . $package_name;
         $c = new \GO\Base\Util\HttpClient();
         if (!$c->groupofficeLogin($shopUrl, $params['shopuser'], $params['shoppass'])) {
             exit("Bad user name or password for shop");
         } else {
             echo "Shop login successful\n";
         }
         $tmpDir = new \GO\Base\Fs\Folder(getcwd());
         if (!$tmpDir->isWritable()) {
             exit("Error: " . $tmpDir->path() . " is not writable!\n");
         }
         $file = $tmpDir->createChild($package_name . '.tar.gz');
         echo "Downloading file from shop...\n";
         if (!$c->downloadFile($packageUrl, $file)) {
             exit("Error: Failed to download file");
         }
         $file->rename($c->getLastDownloadedFilename());
         $downloads[] = $file;
         if (!empty($params['replacefolder'])) {
             $params['unpack'] = 1;
         }
         //echo "Filename: ".$c->getLastDownloadedFilename()."\n";
         echo "File saved in " . $file->path() . "\n";
         if (!empty($params['unpack'])) {
             echo "Unpacking " . $file->name() . "\n";
             system('tar zxf ' . $file->name());
         }
     }
     if (!empty($params['unpack'])) {
         foreach ($downloads as $download) {
             if (strpos($download->name(), $proPackageName) !== false) {
                 $proDownload = $download;
                 break;
             }
         }
         if (empty($proDownload)) {
             exit("Error: Can't unpack. Group-Office Professional was not part of the downloads\n");
         }
         echo "Moving modules into pro package\n";
         $downloadFolder = str_replace('.tar.gz', '', $proDownload->name());
         $newFolder = new \GO\Base\Fs\Folder(getcwd() . '/' . $downloadFolder);
         if (!$newFolder->exists()) {
             exit("Download folder " . $newFolder->path() . " does not exist.\n");
         }
         foreach ($downloads as $download) {
             if (strpos($download->name(), $proPackageName) === false) {
                 $modPackageName = str_replace('.tar.gz', '', $download->name());
                 system('rm -Rf ' . $modPackageName . '/professional');
                 system('mv ' . $modPackageName . '/* ' . $downloadFolder . '/modules/');
                 system('rm -Rf ' . $modPackageName . '*');
                 $proDownload->delete();
             }
         }
         if (!empty($params['replacefolder'])) {
             $params['replacefolder'] = realpath($params['replacefolder']);
             echo "Replacing: " . $params['replacefolder'] . "\n";
             $replaceFolder = new \GO\Base\Fs\Folder($params['replacefolder']);
             $origFolderName = $replaceFolder->name();
             $backupName = $origFolderName . '_bak_' . date('YmdGis');
             echo "Creating backup in " . $backupName . "\n";
             if (!$replaceFolder->exists()) {
                 exit("Error: Folder " . $params['replacefolder'] . " does not exist!\n");
             }
             if (!$replaceFolder->rename($backupName)) {
                 die("Failed to rename " . $replaceFolder->path() . "\n");
             }
             //				$newFolder = new \GO\Base\Fs\Folder(getcwd().'/'.$downloadFolder);
             if (!$newFolder->rename($origFolderName)) {
                 die("Failed to rename " . $newFolder->path() . "\n");
             }
             //there might be a config file or license file in the directory
             echo "Copying possible config and license files\n";
             system('cp ' . $replaceFolder->path() . '/config.php ' . $replaceFolder->path() . '/*license.txt ' . $newFolder->path() . '/');
         }
     }
     echo "All done\n";
 }
예제 #3
0
파일: Folder.php 프로젝트: ajaboa/crmpuan
 /**
  * Add a filesystem file to this folder. The file will be moved to this folder
  * and added to the database.
  *
  * @param \GO\Base\Fs\File $file
  * @return File
  */
 public function addFilesystemFolder(\GO\Base\Fs\Folder $folder)
 {
     $folder->move($this->fsFolder);
     return $this->addFolder($folder->name(), true);
 }