XpressEngine Core  1.11.2
 All Classes Namespaces Files Functions Variables Pages
autoinstall.lib.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) NAVER <http://www.navercorp.com> */
3 
4 require_once(_XE_PATH_ . 'libs/ftp.class.php');
5 
11 {
12 
17  var $package = NULL;
18 
23  var $base_url;
24 
29  var $temp_dir = './files/cache/autoinstall/';
30 
36 
42 
47  var $url;
48 
54 
60 
67  function setServerUrl($url)
68  {
69  $this->base_url = $url;
70  }
71 
77  function uninstall()
78  {
79  $oModel = getModel('autoinstall');
80  $type = $oModel->getTypeFromPath($this->package->path);
81  if($type == "module")
82  {
83  $output = $this->uninstallModule();
84  if(!$output->toBool())
85  {
86  return $output;
87  }
88  }
89 
90  $output = $this->_connect();
91  if(!$output->toBool())
92  {
93  return $output;
94  }
95 
96  $output = $this->_removeDir($this->package->path);
97  $this->_close();
98  return $output;
99  }
100 
108  {
109  $this->ftp_password = $ftp_password;
110  }
111 
117  function _download()
118  {
119  if($this->package->path == ".")
120  {
121  $this->download_file = $this->temp_dir . "xe.tar";
122  $this->target_path = "";
123  $this->download_path = $this->temp_dir;
124  }
125  else
126  {
127  $subpath = trim(substr($this->package->path, 2), '/');
128  $this->download_file = $this->temp_dir . $subpath . ".tar";
129  $subpatharr = explode("/", $subpath);
130  array_pop($subpatharr);
131  $this->download_path = $this->temp_dir . implode("/", $subpatharr);
132  $this->target_path = implode("/", $subpatharr);
133  }
134 
135  $postdata = array();
136  $postdata["path"] = $this->package->path;
137  $postdata["module"] = "resourceapi";
138  $postdata["act"] = "procResourceapiDownload";
139  $buff = FileHandler::getRemoteResource($this->base_url, NULL, 3, "POST", "application/x-www-form-urlencoded", array(), array(), $postdata);
140  FileHandler::writeFile($this->download_file, $buff);
141  }
142 
150  function uninstallModule()
151  {
152  $path_array = explode("/", $this->package->path);
153  $target_name = array_pop($path_array);
154  $oModule = getModule($target_name, "class");
155  if(!$oModule)
156  {
157  return new BaseObject(-1, 'msg_invalid_request');
158  }
159  if(!method_exists($oModule, "moduleUninstall"))
160  {
161  return new BaseObject(-1, 'msg_invalid_request');
162  }
163 
164  $output = $oModule->moduleUninstall();
165  if(is_subclass_of($output, 'BaseObject') && !$output->toBool())
166  {
167  return $output;
168  }
169 
170  $schema_dir = sprintf('%s/schemas/', $this->package->path);
171  $schema_files = FileHandler::readDir($schema_dir);
172  $oDB = DB::getInstance();
173  if(is_array($schema_files))
174  {
175  foreach($schema_files as $file)
176  {
177  $filename_arr = explode(".", $file);
178  $filename = array_shift($filename_arr);
179  $oDB->dropTable($filename);
180  }
181  }
182  return new BaseObject();
183  }
184 
192  function installModule()
193  {
194  $path = $this->package->path;
195  if($path != ".")
196  {
197  $path_array = explode("/", $path);
198  $target_name = array_pop($path_array);
199  $type = substr(array_pop($path_array), 0, -1);
200  }
201 
202  if($type == "module")
203  {
204  $oModuleModel = getModel('module');
205  $oInstallController = getController('install');
206  $module_path = ModuleHandler::getModulePath($target_name);
207  if($oModuleModel->checkNeedInstall($target_name))
208  {
209  $oInstallController->installModule($target_name, $module_path);
210  }
211  if($oModuleModel->checkNeedUpdate($target_name))
212  {
213  $oModule = getModule($target_name, 'class');
214  if(method_exists($oModule, 'moduleUpdate'))
215  {
216  $oModule->moduleUpdate();
217  }
218  }
219  }
220  }
221 
229  function install()
230  {
231  $this->_download();
232  $file_list = $this->_unPack();
233  $output = $this->_copyDir($file_list);
234  if(!$output->toBool())
235  {
236  FileHandler::removeDir($this->temp_dir);
237  return $output;
238  }
239  $this->installModule();
240 
241  FileHandler::removeDir($this->temp_dir);
242  return new BaseObject();
243  }
244 
250  function _unPack()
251  {
252  require_once(_XE_PATH_ . 'libs/tar.class.php');
253 
254  $oTar = new tar();
255  $oTar->openTAR($this->download_file);
256 
257  $_files = $oTar->files;
258  $file_list = array();
259  if(is_array($_files))
260  {
261  foreach($_files as $key => $info)
262  {
263  FileHandler::writeFile($this->download_path . "/" . $info['name'], $info['file']);
264  $file_list[] = $info['name'];
265  }
266  }
267  return $file_list;
268  }
269 
276  function _removeDir($path)
277  {
278  $real_path = FileHandler::getRealPath($path);
279  $oDir = dir($path);
280  $files = array();
281  while($file = $oDir->read())
282  {
283  if($file == "." || $file == "..")
284  {
285  continue;
286  }
287  $files[] = $file;
288  }
289 
290  foreach($files as $file)
291  {
292  $file_path = $path . "/" . $file;
293  if(is_dir(FileHandler::getRealPath($file_path)))
294  {
295  $output = $this->_removeDir($file_path);
296  if(!$output->toBool())
297  {
298  return $output;
299  }
300  }
301  else
302  {
303  $output = $this->_removeFile($file_path);
304  if(!$output->toBool())
305  {
306  return $output;
307  }
308  }
309  }
310  $output = $this->_removeDir_real($path);
311  return $output;
312  }
313 
314 }
315 
321 {
322 
327  var $ftp_info = NULL;
328 
333  var $connection = NULL;
334 
339  var $sftp = NULL;
340 
348  {
349  $this->package = &$package;
350  $this->ftp_info = Context::getFTPInfo();
351  }
352 
358  function _connect()
359  {
360  if(!function_exists('ssh2_connect'))
361  {
362  return new BaseObject(-1, 'msg_sftp_not_supported');
363  }
364 
365  if(!$this->ftp_info->ftp_user || !$this->ftp_info->sftp || $this->ftp_info->sftp != 'Y')
366  {
367  return new BaseObject(-1, 'msg_ftp_invalid_auth_info');
368  }
369 
370  if($this->ftp_info->ftp_host)
371  {
372  $ftp_host = $this->ftp_info->ftp_host;
373  }
374  else
375  {
376  $ftp_host = "127.0.0.1";
377  }
378  $this->connection = ssh2_connect($ftp_host, $this->ftp_info->ftp_port);
379  if(!@ssh2_auth_password($this->connection, $this->ftp_info->ftp_user, $this->ftp_password))
380  {
381  return new BaseObject(-1, 'msg_ftp_invalid_auth_info');
382  }
383  $_SESSION['ftp_password'] = $this->ftp_password;
384  $this->sftp = ssh2_sftp($this->connection);
385  return new BaseObject();
386  }
387 
393  function _close()
394  {
395 
396  }
397 
404  function _removeFile($path)
405  {
406  if(substr($path, 0, 2) == "./")
407  {
408  $path = substr($path, 2);
409  }
410  $target_path = $this->ftp_info->ftp_root_path . $path;
411 
412  if(!@ssh2_sftp_unlink($this->sftp, $target_path))
413  {
414  return new BaseObject(-1, sprintf(Context::getLang('msg_delete_file_failed'), $path));
415  }
416  return new BaseObject();
417  }
418 
425  function _removeDir_real($path)
426  {
427  if(substr($path, 0, 2) == "./")
428  {
429  $path = substr($path, 2);
430  }
431  $target_path = $this->ftp_info->ftp_root_path . $path;
432 
433  if(!@ssh2_sftp_rmdir($this->sftp, $target_path))
434  {
435  return new BaseObject(-1, sprintf(Context::getLang('msg_delete_dir_failed'), $path));
436  }
437  return new BaseObject();
438  }
439 
446  function _copyDir(&$file_list)
447  {
448  if(!$this->ftp_password)
449  {
450  return new BaseObject(-1, 'msg_ftp_password_input');
451  }
452 
453  $output = $this->_connect();
454  if(!$output->toBool())
455  {
456  return $output;
457  }
458  $target_dir = $this->ftp_info->ftp_root_path . $this->target_path;
459  $copied = array();
460 
461  if(is_array($file_list))
462  {
463  foreach($file_list as $k => $file)
464  {
465  $org_file = $file;
466  if($this->package->path == ".")
467  {
468  $file = substr($file, 3);
469  }
470  $path = FileHandler::getRealPath("./" . $this->target_path . "/" . $file);
471  $pathname = dirname($target_dir . "/" . $file);
472 
473  if(!file_exists(FileHandler::getRealPath($real_path)))
474  {
475  ssh2_sftp_mkdir($this->sftp, $pathname, 0755, TRUE);
476  }
477 
478  ssh2_scp_send($this->connection, FileHandler::getRealPath($this->download_path . "/" . $org_file), $target_dir . "/" . $file);
479  $copied[] = $path;
480  }
481  }
482 
483  FileHandler::clearStatCache($copied, true);
485 
486  return new BaseObject();
487  }
488 
489 }
490 
496 {
497 
502  var $ftp_info = NULL;
503 
508  var $connection = NULL;
509 
517  {
518  $this->package = &$package;
519  $this->ftp_info = Context::getFTPInfo();
520  }
521 
527  function _connect()
528  {
529  if($this->ftp_info->ftp_host)
530  {
531  $ftp_host = $this->ftp_info->ftp_host;
532  }
533  else
534  {
535  $ftp_host = "127.0.0.1";
536  }
537 
538  $this->connection = ftp_connect($ftp_host, $this->ftp_info->ftp_port);
539  if(!$this->connection)
540  {
541  return new BaseObject(-1, sprintf(Context::getLang('msg_ftp_not_connected'), 'host'));
542  }
543 
544  $login_result = @ftp_login($this->connection, $this->ftp_info->ftp_user, $this->ftp_password);
545  if(!$login_result)
546  {
547  $this->_close();
548  return new BaseObject(-1, 'msg_ftp_invalid_auth_info');
549  }
550 
551  $_SESSION['ftp_password'] = $this->ftp_password;
552  if($this->ftp_info->ftp_pasv != "N")
553  {
554  ftp_pasv($this->connection, TRUE);
555  }
556  return new BaseObject();
557  }
558 
565  function _removeFile($path)
566  {
567  if(substr($path, 0, 2) == "./")
568  {
569  $path = substr($path, 2);
570  }
571  $target_path = $this->ftp_info->ftp_root_path . $path;
572 
573  if(!@ftp_delete($this->connection, $target_path))
574  {
575  return new BaseObject(-1, "failed to delete file " . $path);
576  }
577  return new BaseObject();
578  }
579 
586  function _removeDir_real($path)
587  {
588  if(substr($path, 0, 2) == "./")
589  {
590  $path = substr($path, 2);
591  }
592  $target_path = $this->ftp_info->ftp_root_path . $path;
593 
594  if(!@ftp_rmdir($this->connection, $target_path))
595  {
596  return new BaseObject(-1, "failed to delete directory " . $path);
597  }
598  return new BaseObject();
599  }
600 
606  function _close()
607  {
608  ftp_close($this->connection);
609  }
610 
617  function _copyDir(&$file_list)
618  {
619  if(!$this->ftp_password)
620  {
621  return new BaseObject(-1, 'msg_ftp_password_input');
622  }
623 
624  $output = $this->_connect();
625  if(!$output->toBool())
626  {
627  return $output;
628  }
629 
630  if(!$this->target_path)
631  {
632  $this->target_path = '.';
633  }
634  if(substr($this->download_path, -1) == '/')
635  {
636  $this->download_path = substr($this->download_path, 0, -1);
637  }
638  $target_dir = $this->ftp_info->ftp_root_path . $this->target_path;
639  $copied = array();
640 
641  if(is_array($file_list))
642  {
643  foreach($file_list as $k => $file)
644  {
645  if(!$file)
646  {
647  continue;
648  }
649  $org_file = $file;
650  if($this->package->path == ".")
651  {
652  $file = substr($file, 3);
653  }
654  $path = FileHandler::getRealPath("./" . $this->target_path . "/" . $file);
655  $path_list = explode('/', dirname($this->target_path . "/" . $file));
656 
657  $real_path = "./";
658  $ftp_path = $this->ftp_info->ftp_root_path;
659 
660  for($i = 0; $i < count($path_list); $i++)
661  {
662  if($path_list == "")
663  {
664  continue;
665  }
666  $real_path .= $path_list[$i] . "/";
667  $ftp_path .= $path_list[$i] . "/";
668  if(!file_exists(FileHandler::getRealPath($real_path)))
669  {
670  if(!@ftp_mkdir($this->connection, $ftp_path))
671  {
672  return new BaseObject(-1, "msg_make_directory_failed");
673  }
674 
675  if(strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')
676  {
677  if(function_exists('ftp_chmod'))
678  {
679  if(!ftp_chmod($this->connection, 0755, $ftp_path))
680  {
681  return new BaseObject(-1, "msg_permission_adjust_failed");
682  }
683  }
684  else
685  {
686  if(!ftp_site($this->connection, "CHMOD 755 " . $ftp_path))
687  {
688  return new BaseObject(-1, "msg_permission_adjust_failed");
689  }
690  }
691  }
692  }
693  }
694  if(!ftp_put($this->connection, $target_dir . '/' . $file, FileHandler::getRealPath($this->download_path . "/" . $org_file), FTP_BINARY))
695  {
696  return new BaseObject(-1, "msg_ftp_upload_failed");
697  }
698  $copied[] = $path;
699  }
700  }
701 
702  FileHandler::clearStatCache($copied, true);
704 
705  $this->_close();
706  return new BaseObject();
707  }
708 
709 }
710 
716 {
717 
722  var $oFtp = NULL;
723 
728  var $ftp_info = NULL;
729 
736  {
737  $this->package = &$package;
738  $this->ftp_info = Context::getFTPInfo();
739  }
740 
746  function _connect()
747  {
748  if($this->ftp_info->ftp_host)
749  {
750  $ftp_host = $this->ftp_info->ftp_host;
751  }
752  else
753  {
754  $ftp_host = "127.0.0.1";
755  }
756 
757  $this->oFtp = new ftp();
758  if(!$this->oFtp->ftp_connect($ftp_host, $this->ftp_info->ftp_port))
759  {
760  return new BaseObject(-1, sprintf(Context::getLang('msg_ftp_not_connected'), 'host'));
761  }
762  if(!$this->oFtp->ftp_login($this->ftp_info->ftp_user, $this->ftp_password))
763  {
764  $this->_close();
765  return new BaseObject(-1, 'msg_ftp_invalid_auth_info');
766  }
767  $_SESSION['ftp_password'] = $this->ftp_password;
768  return new BaseObject();
769  }
770 
777  function _removeFile($path)
778  {
779  if(substr($path, 0, 2) == "./")
780  {
781  $path = substr($path, 2);
782  }
783  $target_path = $this->ftp_info->ftp_root_path . $path;
784 
785  if(!$this->oFtp->ftp_delete($target_path))
786  {
787  return new BaseObject(-1, sprintf(Context::getLang('msg_delete_file_failed'), $path));
788  }
789  return new BaseObject();
790  }
791 
797  function _removeDir_real($path)
798  {
799  if(substr($path, 0, 2) == "./")
800  {
801  $path = substr($path, 2);
802  }
803  $target_path = $this->ftp_info->ftp_root_path . $path;
804 
805  if(!$this->oFtp->ftp_rmdir($target_path))
806  {
807  return new BaseObject(-1, sprintf(Context::getLang('msg_delete_dir_failed'), $path));
808  }
809  return new BaseObject();
810  }
811 
817  function _close()
818  {
819  $this->oFtp->ftp_quit();
820  }
821 
828  function _copyDir(&$file_list)
829  {
830  if(!$this->ftp_password)
831  {
832  return new BaseObject(-1, 'msg_ftp_password_input');
833  }
834 
835  $output = $this->_connect();
836  if(!$output->toBool())
837  {
838  return $output;
839  }
840 
841  $oFtp = &$this->oFtp;
842  $target_dir = $this->ftp_info->ftp_root_path . $this->target_path;
843 
844  $copied = array();
845 
846  if(is_array($file_list))
847  {
848  foreach($file_list as $k => $file)
849  {
850  $org_file = $file;
851  if($this->package->path == ".")
852  {
853  $file = substr($file, 3);
854  }
855  $path = FileHandler::getRealPath("./" . $this->target_path . "/" . $file);
856  $path_list = explode('/', dirname($this->target_path . "/" . $file));
857 
858  $real_path = "./";
859  $ftp_path = $this->ftp_info->ftp_root_path;
860 
861  for($i = 0; $i < count($path_list); $i++)
862  {
863  if($path_list == "")
864  {
865  continue;
866  }
867  $real_path .= $path_list[$i] . "/";
868  $ftp_path .= $path_list[$i] . "/";
869  if(!file_exists(FileHandler::getRealPath($real_path)))
870  {
871  $oFtp->ftp_mkdir($ftp_path);
872  $oFtp->ftp_site("CHMOD 755 " . $ftp_path);
873  }
874  }
875  $oFtp->ftp_put($target_dir . '/' . $file, FileHandler::getRealPath($this->download_path . "/" . $org_file));
876  $copied[] = $path;
877  }
878  }
879 
880  FileHandler::clearStatCache($copied, true);
882 
883  $this->_close();
884 
885  return new BaseObject();
886  }
887 
888 }
889 
895 {
902  {
903  $this->package = &$package;
904  }
905 
911  function _connect()
912  {
913  return new BaseObject();
914  }
915 
922  function _removeFile($path)
923  {
924  if(substr($path, 0, 2) == "./")
925  {
926  $path = substr($path, 2);
927  }
929 
931  {
932  return new BaseObject(-1, sprintf(Context::getLang('msg_delete_file_failed'), $path));
933  }
934  return new BaseObject();
935  }
936 
942  function _removeDir_real($path)
943  {
944  if(substr($path, 0, 2) == "./")
945  {
946  $path = substr($path, 2);
947  }
949 
951 
952  return new BaseObject();
953  }
954 
960  function _close()
961  {
962  }
963 
970  function _copyDir(&$file_list)
971  {
972  $output = $this->_connect();
973  if(!$output->toBool())
974  {
975  return $output;
976  }
977  $target_dir = $this->target_path;
978  $copied = array();
979 
980  if(is_array($file_list))
981  {
982  foreach($file_list as $k => $file)
983  {
984  $org_file = $file;
985  if($this->package->path == ".")
986  {
987  $file = substr($file, 3);
988  }
989  $path = FileHandler::getRealPath("./" . $this->target_path . "/" . $file);
990  $path_list = explode('/', dirname($this->target_path . "/" . $file));
991  $real_path = "./";
992 
993  for($i = 0; $i < count($path_list); $i++)
994  {
995  if($path_list == "")
996  {
997  continue;
998  }
999  $real_path .= $path_list[$i] . "/";
1000  if(!file_exists(FileHandler::getRealPath($real_path)))
1001  {
1002  FileHandler::makeDir($real_path);
1003  }
1004  }
1005  FileHandler::copyFile( FileHandler::getRealPath($this->download_path . "/" . $org_file), FileHandler::getRealPath("./" . $target_dir . '/' . $file));
1006  $copied[] = $path;
1007  }
1008  }
1009 
1010  FileHandler::clearStatCache($copied, true);
1012 
1013  $this->_close();
1014 
1015  return new BaseObject();
1016  }
1017 
1018 }
1019 /* End of file autoinstall.lib.php */
1020 /* Location: ./modules/autoinstall/autoinstall.lib.php */
$oModuleModel
Definition: ko.install.php:236
getController($module_name)
Definition: func.inc.php:90
removeFile($filename)
$output
Definition: ko.install.php:193
writeFile($filename, $buff, $mode="w")
static invalidateOpcache($target, $force=true)
getRemoteResource($url, $body=null, $timeout=3, $method= 'GET', $content_type=null, $headers=array(), $cookies=array(), $post_data=array(), $request_config=array())
getInstance($db_type=NULL)
Definition: DB.class.php:142
getRealPath($source)
makeDir($path_string)
copyFile($source, $target, $force= 'Y')
getLang($code)
const _XE_PATH_
Definition: config.inc.php:49
getModel($module_name)
Definition: func.inc.php:145
readDir($path, $filter= '', $to_lower=FALSE, $concat_prefix=FALSE)
static clearStatCache($target, $include=false)
getModule($module_name, $type= 'view', $kind= '')
Definition: func.inc.php:79
setPassword($ftp_password)