예제 #1
0
 /**
  * Begin installation
  *
  * @return	@e void
  */
 public function start()
 {
     /* INIT */
     $app_directory = IPSText::alphanumericalClean($this->request['app_directory']);
     $type = 'upgrade';
     $data = array();
     $ok = 1;
     $errors = array();
     $localfiles = array(DOC_IPS_ROOT_PATH . 'cache/skin_cache');
     $info = array();
     /* Init Data */
     $data = IPSSetUp::fetchXmlAppInformation($app_directory, $this->settings['gb_char_set']);
     $_numbers = IPSSetUp::fetchAppVersionNumbers($app_directory);
     $_files = IPSSetUp::fetchXmlAppWriteableFiles($app_directory);
     /* Grab Data */
     $data['app_directory'] = $app_directory;
     $data['current_version'] = $_numbers['current'][0] ? $_numbers['current'][0] : $this->lang->words['cur_version_none'];
     $data['latest_version'] = $_numbers['latest'][1];
     $data['next_version'] = $_numbers['next'][0];
     /* Install, or upgrade? */
     if (!$_numbers['current'][0]) {
         $type = 'install';
     } else {
         @header("Location: {$this->settings['board_url']}/" . CP_DIRECTORY . "/upgrade/");
         exit;
     }
     /* Version Check */
     if ($data['current_version'] > 0 and $data['current_version'] == $data['latest_version']) {
         $this->registry->output->global_message = $this->lang->words['error__up_to_date'];
         $this->registry->output->silentRedirectWithMessage($this->settings['base_url']);
         return;
     }
     /* Check local files */
     foreach ($localfiles as $_path) {
         if (!file_exists($_path)) {
             if ($data['dir']) {
                 if (!@mkdir($_path, IPS_FOLDER_PERMISSION, TRUE)) {
                     $info['notexist'][] = $_path;
                 }
             } else {
                 $info['notexist'][] = $_path;
             }
         } else {
             if (!is_writeable($_path)) {
                 if (!@chmod($_path, is_dir($_path) ? IPS_FOLDER_PERMISSION : IPS_FILE_PERMISSION)) {
                     $info['notwrite'][] = $_path;
                 }
             }
         }
     }
     /* Check files... */
     if (is_array($_files) and count($_files)) {
         $info = array_merge($info, $_files);
     }
     if (count($info['notexist'])) {
         foreach ($info['notexist'] as $path) {
             $errors[] = sprintf($this->lang->words['error__file_missing'], $path);
         }
     }
     if (count($info['notwrite'])) {
         foreach ($info['notwrite'] as $path) {
             $errors[] = sprintf($this->lang->words['error__file_chmod'], $path);
         }
     }
     /**
      * Custom errors
      */
     if (count($info['other'])) {
         foreach ($info['other'] as $error) {
             $errors[] = $error;
         }
     }
     /* Check for xml files */
     $required_xml = array("information");
     foreach ($required_xml as $r) {
         if (!is_file($this->app_full_path . "xml/{$r}.xml")) {
             $errors[] = sprintf($this->lang->words['error__file_needed'], $this->app_full_path . "xml/{$r}.xml");
         }
     }
     /* Show splash */
     $this->registry->output->html .= $this->html->setup_splash_screen($data, $errors, $type);
 }
예제 #2
0
 /**
  * Execute selected method
  *
  * @access	public
  * @param	object		Registry object
  * @return	@e void
  */
 public function doExecute(ipsRegistry $registry)
 {
     /* Check input? */
     if ($this->request['do'] == 'check') {
         /* Check Directory */
         if (!is_array($_POST['apps']) or !count($_POST['apps'])) {
             $this->registry->output->addError('You must select to install at least one application');
         } else {
             /* Save Form Data */
             IPSSetUp::setSavedData('install_apps', implode(',', array_keys($_POST['apps'])));
             /* Check writeable files */
             foreach (array_keys($_POST['apps']) as $appDir) {
                 $info = IPSSetUp::fetchXmlAppWriteableFiles($appDir);
                 if (count($info['notexist'])) {
                     foreach ($info['notexist'] as $path) {
                         $this->registry->output->addWarning('File or directory does not exist: "' . $path . '", please create it via FTP');
                     }
                 }
                 if (count($info['notwrite'])) {
                     foreach ($info['notwrite'] as $path) {
                         $this->registry->output->addWarning('File or directory is not writeable: "' . $path . '", please CHMOD via FTP');
                     }
                 }
                 /**
                  * Custom errors
                  */
                 if (count($info['other'])) {
                     foreach ($info['other'] as $error) {
                         $this->registry->output->addWarning($error);
                     }
                 }
             }
             /* Do we have errors? */
             if (!count($this->registry->output->fetchWarnings())) {
                 /* Next Action */
                 $this->registry->autoLoadNextAction('address');
             }
         }
     }
     /* Generate apps... */
     $apps = array('core' => array(), 'ips' => array(), 'other' => array());
     foreach (array('applications', 'applications_addon/ips', 'applications_addon/other') as $_pBit) {
         $path = IPS_ROOT_PATH . $_pBit;
         $handle = opendir($path);
         while (($file = readdir($handle)) !== FALSE) {
             if (!preg_match("#^\\.#", $file)) {
                 if (is_dir($path . '/' . $file)) {
                     //-----------------------------------------
                     // Get it!
                     //-----------------------------------------
                     if (!is_file(IPS_ROOT_PATH . $_pBit . '/' . $file . '/xml/information.xml')) {
                         continue;
                     }
                     $data = IPSSetUp::fetchXmlAppInformation($file, $this->settings['gb_char_set']);
                     switch ($_pBit) {
                         case 'applications':
                             $apps['core'][$file] = $data;
                             break;
                         case 'applications_addon/ips':
                             $apps['ips'][$file] = $data;
                             break;
                         case 'applications_addon/other':
                             $apps['other'][$file] = $data;
                             break;
                     }
                 }
             }
         }
         closedir($handle);
     }
     /* We don't want IP.SEO to be installed on future versions. Bad things happen. */
     unset($apps['ips']['ipseo']);
     unset($apps['other']['ipseo']);
     /* Reorder the array so that core is first */
     $new_array = array();
     $new_array['core'] = $apps['core']['core'];
     foreach ($apps['core'] as $app => $data) {
         if ($app == 'core') {
             continue;
         }
         $new_array[$app] = $data;
     }
     $apps['core'] = $new_array;
     /* Page Output */
     $this->registry->output->setTitle("Applications");
     $this->registry->output->setNextAction('apps&do=check');
     $this->registry->output->addContent($this->registry->output->template()->page_apps($apps));
     $this->registry->output->sendOutput();
 }