diff --git a/lib/classes/task/period/ftpPull.class.php b/lib/classes/task/period/ftpPull.class.php old mode 100644 new mode 100755 index f629ce3395..02d349f954 --- a/lib/classes/task/period/ftpPull.class.php +++ b/lib/classes/task/period/ftpPull.class.php @@ -2,7 +2,7 @@ /* * This file is part of Phraseanet * - * (c) 2005-2012 Alchemy + * (c) 2005-2010 Alchemy * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -16,334 +16,404 @@ */ class task_period_ftpPull extends task_appboxAbstract { - protected $debug = false; - protected $proxy; - protected $proxyport; - protected $host; - protected $port; - protected $user; - protected $password; - protected $ssl; - protected $passive; - protected $ftppath; - protected $localpath; - public function getName() + protected $debug = false; + protected $proxy; + protected $proxyport; + protected $host; + protected $port; + protected $user; + protected $password; + protected $ssl; + protected $passive; + protected $ftppath; + protected $localpath; + + public function getName() + { + return(_("task::ftp:FTP Pull")); + } + + public function help() + { + return ''; + } + + public function graphic2xml($oldxml) + { + $request = http_request::getInstance(); + + $parm2 = $request->get_parms( + "proxy", "proxyport", "host", "port", "user" + , "password", "ssl", "ftppath", "localpath" + , "passive", "period" + ); + if ($dom = @DOMDocument::loadXML($oldxml)) { - return(_("task::ftp:FTP Pull")); - } - - public function help() - { - return ''; - } - - public function graphic2xml($oldxml) - { - $request = http_request::getInstance(); - - $parm2 = $request->get_parms( - "proxy", "proxyport", "host", "port", "user" - , "password", "ssl", "ftppath", "localpath" - , "passive", "period" - ); - if ($dom = @DOMDocument::loadXML($oldxml)) { - $xmlchanged = false; - foreach (array("str:proxy", "str:proxyport", "str:period", "boo:passive", "boo:ssl", "str:password", "str:user", "str:ftppath", "str:localpath", "str:port", "str:host") as $pname) { - $ptype = substr($pname, 0, 3); - $pname = substr($pname, 4); - $pvalue = $parm2[$pname]; - if ($ns = $dom->getElementsByTagName($pname)->item(0)) { - // le champ existait dans le xml, on supprime son ancienne valeur (tout le contenu) - while (($n = $ns->firstChild)) - $ns->removeChild($n); - } else { - // le champ n'existait pas dans le xml, on le cree - $dom->documentElement->appendChild($dom->createTextNode("\t")); - $ns = $dom->documentElement->appendChild($dom->createElement($pname)); - $dom->documentElement->appendChild($dom->createTextNode("\n")); - } - // on fixe sa valeur - switch ($ptype) { - case "str": - $ns->appendChild($dom->createTextNode($pvalue)); - break; - case "boo": - $ns->appendChild($dom->createTextNode($pvalue ? '1' : '0')); - break; - } - $xmlchanged = true; - } + $xmlchanged = false; + foreach (array("str:proxy", "str:proxyport", "str:period", "boo:passive", "boo:ssl", "str:password", "str:user", "str:ftppath", "str:localpath", "str:port", "str:host") as $pname) + { + $ptype = substr($pname, 0, 3); + $pname = substr($pname, 4); + $pvalue = $parm2[$pname]; + if ($ns = $dom->getElementsByTagName($pname)->item(0)) + { + // le champ existait dans le xml, on supprime son ancienne valeur (tout le contenu) + while (($n = $ns->firstChild)) + $ns->removeChild($n); } - - return($dom->saveXML()); - } - - public function xml2graphic($xml, $form) - { - if (($sxml = simplexml_load_string($xml))) { // in fact XML IS always valid here... - // ... but we could check for safe values (ex. 0 < period < 3600) - ?> - - documentElement->appendChild($dom->createTextNode("\t")); + $ns = $dom->documentElement->appendChild($dom->createElement($pname)); + $dom->documentElement->appendChild($dom->createTextNode("\n")); } + // on fixe sa valeur + switch ($ptype) + { + case "str": + $ns->appendChild($dom->createTextNode($pvalue)); + break; + case "boo": + $ns->appendChild($dom->createTextNode($pvalue ? '1' : '0')); + break; + } + $xmlchanged = true; + } } - public function printInterfaceJS() + return($dom->saveXML()); + } + + public function xml2graphic($xml, $form) + { + if (($sxml = simplexml_load_string($xml))) // in fact XML IS always valid here... { - global $parm; - ?> - + + + +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +
+ + +
+ + +  
+
+get_parms( + "xml", "name", "active", "proxy", "proxyport", "period" + , "localpath", "ftppath", "port", "host", "user" + , "password", "passive", "ssl", "debug" + ); + + if ($parm["xml"] === null) + { + // pas de xml 'raw' : on accepte les champs 'graphic view' + if ($domTaskSettings = DOMDocument::loadXML($taskrow["settings"])) + { + $xmlchanged = false; + foreach (array("proxy", "proxyport", "period", "host", "port", "user", "password", "ssl", "passive", "localpath", "ftppath") as $f) + { + if ($parm[$f] !== NULL) + { + if ($ns = $domTaskSettings->getElementsByTagName($f)->item(0)) { - setDirty(); + // le champ existait dans le xml, on supprime son ancienne valeur (tout le contenu) + while (($n = $ns->firstChild)) + $ns->removeChild($n); } - function chgxmlck(checkinput, fieldname) + else { - setDirty(); + // le champ n'existait pas dans le xml, on le cree + $domTaskSettings->documentElement->appendChild($domTaskSettings->createTextNode("\t")); + $ns = $domTaskSettings->documentElement->appendChild($domTaskSettings->createElement($f)); + $domTaskSettings->documentElement->appendChild($domTaskSettings->createTextNode("\n")); } - function chgxmlpopup(popupinput, fieldname) - { - setDirty(); - } - - appendChild($domTaskSettings->createTextNode($parm[$f])); + $xmlchanged = true; + } + } + if ($xmlchanged) + $parm["xml"] = $domTaskSettings->saveXML(); + } } - function getGraphicForm() + // si on doit changer le xml, on verifie qu'il est valide + if ($parm["xml"] && !DOMDocument::loadXML($parm["xml"])) + + return(false); + + $sql = ""; + $params = array(':task_id' => $taskid); + if ($parm["xml"] !== NULL) { + $sql .= ( $sql ? " ," : "") . "settings = :settings"; + $params[':settings'] = $parm['xml']; + } + if ($parm["name"] !== NULL) + { + $sql .= ( $sql ? " ," : "") . "name = :name"; + $params[':name'] = $parm['name']; + } + if ($parm["active"] !== NULL) + { + $sql .= ( $sql ? " ," : "") . "active = :active"; + $params[':active'] = $parm['active']; + } + + if ($sql) + { + try + { + $sql = "UPDATE task2 SET $sql WHERE task_id = :task_id"; + $stmt = $conn->prepare($sql); + $stmt->execute($params); + $stmt->closeCursor(); + return true; + } + catch (Exception $e) + { + return false; + } } - - public function printInterfaceHTML() + else { - global $parm; - ob_start(); - ?> -
-
- -
-
- -
-
- - -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - - -
- - -
- - -  
-
- proxy = (string) $sx_task_settings->proxy; + $this->proxyport = (string) $sx_task_settings->proxyport; + $this->host = (string) ($sx_task_settings->host); + $this->port = (string) ($sx_task_settings->port); + $this->user = (string) ($sx_task_settings->user); + $this->password = (string) ($sx_task_settings->password); + $this->ssl = !!((string) ($sx_task_settings->ssl)); + $this->passive = !!((string) ($sx_task_settings->passive)); + $this->ftppath = (string) ($sx_task_settings->ftppath); + $this->localpath = (string) ($sx_task_settings->localpath); + + parent::load_settings($sx_task_settings); + + return $this; + } + + protected function retrieve_content(appbox $appbox) + { + foreach(array('localpath', 'host', 'port', 'user', 'password', 'ftppath') as $f) + { + if(trim((string)($this->{$f})) === '') + { + $this->log('setting \''.$f.'\' must be set'); + $this->running = FALSE; + } + } + if (!is_dir($this->localpath) || !system_file::mkdir($this->localpath)) + { + $this->log('\''.$this->localpath.'\' does not exists'); + $this->running = FALSE; + } + if (!is_writeable($this->localpath)) + { + $this->log('\''.$this->localpath.'\' is not writeable'); + $this->running = FALSE; + } + if(!$this->running ) + { + $this->set_status(self::STATUS_STOPPED); + return array(); + } + + try { - $request = http_request::getInstance(); + $ftp = new ftpclient($this->host, $port, 90, $this->ssl, $this->proxy, $this->proxyport); + $ftp->login($this->user, $this->password); + $ftp->chdir($this->ftppath); + $list_1 = $ftp->list_directory(true); - $parm = $request->get_parms( - "xml", "name", "active", "proxy", "proxyport", "period" - , "localpath", "ftppath", "port", "host", "user" - , "password", "passive", "ssl", "debug" - ); + $todo = count($list_1); + $this->setProgress($done, $todo); - if ($parm["xml"] === null) { - // pas de xml 'raw' : on accepte les champs 'graphic view' - if ($domTaskSettings = DOMDocument::loadXML($taskrow["settings"])) { - $xmlchanged = false; - foreach (array("proxy", "proxyport", "period", "host", "port", "user", "password", "ssl", "passive", "localpath", "ftppath") as $f) { - if ($parm[$f] !== NULL) { - if ($ns = $domTaskSettings->getElementsByTagName($f)->item(0)) { - // le champ existait dans le xml, on supprime son ancienne valeur (tout le contenu) - while (($n = $ns->firstChild)) - $ns->removeChild($n); - } else { - // le champ n'existait pas dans le xml, on le cree - $domTaskSettings->documentElement->appendChild($domTaskSettings->createTextNode("\t")); - $ns = $domTaskSettings->documentElement->appendChild($domTaskSettings->createElement($f)); - $domTaskSettings->documentElement->appendChild($domTaskSettings->createTextNode("\n")); - } - // on fixe sa valeur - $ns->appendChild($domTaskSettings->createTextNode($parm[$f])); - $xmlchanged = true; - } - } - if ($xmlchanged) - $parm["xml"] = $domTaskSettings->saveXML(); - } + if ($this->debug) + echo "attente de 25sec pour avoir les fichiers froids...\n"; + for($t = 25; $this->running && $t > 0; $t--) // DON'T do sleep($this->period - $when_started) because it prevents ticks ! + { + $s = $this->get_status(); + if($s == self::STATUS_TOSTOP) + { + if (isset($ftp) && $ftp instanceof ftpclient) + $ftp->close(); + $this->set_status(self::STATUS_STOPPED); + $this->running = FALSE; + return array(); + } + else + { + sleep(1); + } + } + + $list_2 = $ftp->list_directory(true); + + foreach ($list_1 as $filepath => $timestamp) + { + $done++; + $this->setProgress($done, $todo); + + if (!isset($list_2[$filepath])) + { + if ($this->debug) + echo "le fichier $filepath a disparu...\n"; + continue; + } + if ($list_2[$filepath] !== $timestamp) + { + if ($this->debug) + echo "le fichier $filepath a ete modifie depuis le dernier passage...\n"; + continue; } - // si on doit changer le xml, on verifie qu'il est valide - if ($parm["xml"] && ! DOMDocument::loadXML($parm["xml"])) { - return(false); - } + $finalpath = p4string::addEndSlash($this->localpath) . ($filepath[0] == '/' ? mb_substr($filepath, 1) : $filepath); + echo "Ok pour rappatriement de $filepath vers $finalpath\n"; - $sql = ""; - $params = array(':task_id' => $taskid); - if ($parm["xml"] !== NULL) { - $sql .= ( $sql ? " ," : "") . "settings = :settings"; - $params[':settings'] = $parm['xml']; - } - if ($parm["name"] !== NULL) { - $sql .= ( $sql ? " ," : "") . "name = :name"; - $params[':name'] = $parm['name']; - } - if ($parm["active"] !== NULL) { - $sql .= ( $sql ? " ," : "") . "active = :active"; - $params[':active'] = $parm['active']; - } + try + { + if (file_exists($finalpath)) + throw new Exception("Un fichier du meme nom ($finalpath) existe deja..."); - if ($sql) { - try { - $sql = "UPDATE task2 SET $sql WHERE task_id = :task_id"; - $stmt = $conn->prepare($sql); - $stmt->execute($params); - $stmt->closeCursor(); + system_file::mkdir(dirname($finalpath)); - return true; - } catch (Exception $e) { - return false; - } - } else { - return true; + $ftp->get($finalpath, $filepath); + $ftp->delete($filepath); } + catch (Exception $e) + { + if ($this->debug) + echo "Erreur lors du rappatriement de $filepath : " . $e->getMessage() . "\n"; + } + } + + $ftp->close(); + + $this->setProgress(0, 0); } - - protected function load_settings(SimpleXMLElement $sx_task_settings) + catch (Exception $e) { - $this->proxy = (string) $sx_task_settings->proxy; - $this->proxyport = (string) $sx_task_settings->proxyport; - $this->host = (string) ($sx_task_settings->host); - $this->port = (string) ($sx_task_settings->port); - $this->user = (string) ($sx_task_settings->user); - $this->password = (string) ($sx_task_settings->password); - $this->ssl = ! ! ((string) ($sx_task_settings->ssl)); - $this->passive = ! ! ((string) ($sx_task_settings->passive)); - $this->ftppath = (string) ($sx_task_settings->ftppath); - $this->localpath = (string) ($sx_task_settings->localpath); - - parent::load_settings($sx_task_settings); - - return $this; + if (isset($ftp) && $ftp instanceof ftpclient) + $ftp->close(); + echo $e->getMessage() . "\n"; + return array(); } + } - protected function retrieve_content(appbox $appbox) - { - try { - if ( ! is_dir($this->localpath) || ! system_file::mkdir($this->localpath)) - throw new Exception("$this->localpath is not writeable\n"); + protected function process_one_content(appbox $appbox, Array $row) + { - if ( ! is_writeable($this->localpath)) - throw new Exception("$this->localpath is not writeable\n"); + } - $ftp = new ftpclient($this->host, $port, 90, $this->ssl, $this->proxy, $this->proxyport); - $ftp->login($this->user, $this->password); - $ftp->chdir($this->ftppath); - $list_1 = $ftp->list_directory(true); + protected function post_process_one_content(appbox $appbox, Array $row) + { - $todo = count($list_1); - $this->setProgress($done, $todo); + } - if ($this->debug) - echo "attente de 25sec pour avoir les fichiers froids...\n"; - sleep(25); - - $list_2 = $ftp->list_directory(true); - - foreach ($list_1 as $filepath => $timestamp) { - $done ++; - $this->setProgress($done, $todo); - - if ( ! isset($list_2[$filepath])) { - if ($this->debug) - echo "le fichier $filepath a disparu...\n"; - continue; - } - if ($list_2[$filepath] !== $timestamp) { - if ($this->debug) - echo "le fichier $filepath a ete modifie depuis le dernier passage...\n"; - continue; - } - - $finalpath = p4string::addEndSlash($this->localpath) . ($filepath[0] == '/' ? mb_substr($filepath, 1) : $filepath); - echo "Ok pour rappatriement de $filepath vers $finalpath\n"; - - try { - if (file_exists($finalpath)) - throw new Exception("Un fichier du meme nom ($finalpath) existe deja..."); - - system_file::mkdir(dirname($finalpath)); - - $ftp->get($finalpath, $filepath); - $ftp->delete($filepath); - } catch (Exception $e) { - if ($this->debug) - echo "Erreur lors du rappatriement de $filepath : " . $e->getMessage() . "\n"; - } - } - - $ftp->close(); - - $this->setProgress(0, 0); - } catch (Exception $e) { - if (isset($ftp) && $ftp instanceof ftpclient) - $ftp->close(); - echo $e->getMessage() . "\n"; - } - } - - protected function process_one_content(appbox $appbox, Array $row) - { - - } - - protected function post_process_one_content(appbox $appbox, Array $row) - { - - } }