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; }
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"; }
/** * 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); }