get_parms('proxy', 'proxyport', 'period', 'syslog'); $dom = new DOMDocument(); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; if ((@$dom->loadXML($oldxml)) != FALSE) { foreach (array('str:proxy', 'str:proxyport', 'str:period', 'pop:syslog') as $pname) { $ptype = substr($pname, 0, 3); $pname = substr($pname, 4); $pvalue = $parm2[$pname]; if (($ns = $dom->getElementsByTagName($pname)->item(0)) != NULL) { // 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 $ns = $dom->documentElement->appendChild($dom->createElement($pname)); } // on fixe sa valeur switch ($ptype) { case "str": case "pop": $ns->appendChild($dom->createTextNode($pvalue)); break; case "boo": $ns->appendChild($dom->createTextNode($pvalue ? '1' : '0')); break; } } } return($dom->saveXML()); } /** * * @return void */ public function printInterfaceJS() { ?>
get_parms( 'xml' , 'name' , 'active' , 'proxy' , 'proxyport' , 'period' ); if ($parm["xml"] === null) { // pas de xml 'raw' : on accepte les champs 'graphic view' $domTaskSettings = new DOMDocument(); if ((@$domTaskSettings->loadXML($taskrow["settings"])) != FALSE) { $xmlchanged = false; foreach (array( 'proxy' , 'proxyport' , 'period' ) as $f) { if ($parm[$f] !== NULL) { if (($ns = $domTaskSettings->getElementsByTagName($f)->item(0)) != NULL) { // 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 $ns = $domTaskSettings->documentElement->appendChild($domTaskSettings->createElement($f)); } // on fixe sa valeur $ns->appendChild($domTaskSettings->createTextNode($parm[$f])); $xmlchanged = true; } } if ($xmlchanged) { $parm["xml"] = $domTaskSettings->saveXML(); } } } // si on doit changer le xml, on verifie qu'il est valide $domdoc = new DOMDocument(); if ($parm["xml"] && ! @$domdoc->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; } } else { return true; } } protected function loadSettings(SimpleXMLElement $sx_task_settings) { $this->proxy = (string) $sx_task_settings->proxy; $this->proxyport = (string) $sx_task_settings->proxyport; parent::loadSettings($sx_task_settings); } protected function retrieveContent(appbox $appbox) { foreach ($this->dependencyContainer['EM'] ->getRepository('Entities\FtpExport') ->findCrashedExports(new \DateTime('-1 month')) as $export) { $this->dependencyContainer['EM']->remove($export); } $this->dependencyContainer['EM']->flush(); return $this->dependencyContainer['EM'] ->getRepository('Entities\FtpExport') ->findDoableExports(); } protected function processOneContent(appbox $appbox, $export) { $state = ""; $ftp_server = $export->getAddr(); $ftp_user_name = $export->getLogin(); $ftp_user_pass = $export->getPwd(); $ftpLog = $ftp_user_name . "@" . p4string::addEndSlash($ftp_server) . $export->getDestfolder(); if ($export->getCrash() == 0) { $line = sprintf( _('task::ftp:Etat d\'envoi FTP vers le serveur' . ' "%1$s" avec le compte "%2$s" et pour destination le dossier : "%3$s"') . PHP_EOL , $ftp_server , $ftp_user_name , $export->getDestfolder() ); $state .= $line; $this->logger->addDebug($line); } $state .= $line = sprintf( _("task::ftp:TENTATIVE no %s, %s") , $export->getCrash() + 1 , " (" . date('r') . ")" ) . PHP_EOL; $this->logger->addDebug($line); try { $ssl = $export->isSsl(); $ftp_client = $this->dependencyContainer['phraseanet.ftp.client']($ftp_server, 21, 300, $ssl, $this->proxy, $this->proxyport); $ftp_client->login($ftp_user_name, $ftp_user_pass); if ($export->isPassif()) { try { $ftp_client->passive(true); } catch (Exception $e) { $this->logger->addDebug($e->getMessage()); } } if (trim($export->getDestfolder()) != '') { try { $ftp_client->chdir($export->getDestFolder()); $export->setDestfolder('/' . $export->getDestfolder()); } catch (Exception $e) { $this->logger->addDebug($e->getMessage()); } } else { $export->setDestfolder('/'); } if (trim($export->getFoldertocreate()) != '') { try { $ftp_client->mkdir($export->getFoldertocreate()); } catch (Exception $e) { $this->logger->addDebug($e->getMessage()); } try { $new_dir = $ftp_client->add_end_slash($export->getDestfolder()) . $export->getFoldertocreate(); $ftp_client->chdir($new_dir); } catch (Exception $e) { $this->logger->addDebug($e->getMessage()); } } $obj = array(); $basefolder = ''; if (!in_array(trim($export->getDestfolder()), array('.', './', ''))) { $basefolder = p4string::addEndSlash($export->getDestfolder()); } $basefolder .= $export->getFoldertocreate(); if (in_array(trim($basefolder), array('.', './', ''))) { $basefolder = '/'; } foreach ($export->getElements() as $exportElement) { if ($exportElement->isDone()) { continue; } $base_id = $exportElement->getBaseId(); $record_id = $exportElement->getRecordId(); $subdef = $exportElement->getSubdef(); $localfile = null; try { $sbas_id = phrasea::sbasFromBas($this->dependencyContainer, $base_id); $record = new record_adapter($this->dependencyContainer, $sbas_id, $record_id); $sdcaption = $record->get_caption()->serialize(caption_record::SERIALIZE_XML, $exportElement->isBusinessfields()); $remotefile = $exportElement->getFilename(); if ($subdef == 'caption') { $desc = $record->get_caption()->serialize(\caption_record::SERIALIZE_XML, $exportElement->isBusinessfields()); $localfile = $this->dependencyContainer['root.path'] . '/tmp/' . md5($desc . time() . mt_rand()); if (file_put_contents($localfile, $desc) === false) { throw new Exception('Impossible de creer un fichier temporaire'); } } elseif ($subdef == 'caption-yaml') { $desc = $record->get_caption()->serialize(\caption_record::SERIALIZE_YAML, $exportElement->isBusinessfields()); $localfile = $this->dependencyContainer['root.path'] . '/tmp/' . md5($desc . time() . mt_rand()); if (file_put_contents($localfile, $desc) === false) { throw new Exception('Impossible de creer un fichier temporaire'); } } else { $sd = $record->get_subdefs(); if (!$sd || !isset($sd[$subdef])) { continue; } $localfile = $sd[$subdef]->get_pathfile(); if (!file_exists($localfile)) { throw new Exception('Le fichier local n\'existe pas'); } } $current_folder = p4string::delEndSlash(str_replace('//', '/', $basefolder . $exportElement->getFolder())); if ($ftp_client->pwd() != $current_folder) { try { $ftp_client->chdir($current_folder); } catch (Exception $e) { $this->logger->addDebug($e->getMessage()); } } $ftp_client->put($remotefile, $localfile); $obj[] = array( "name" => $subdef, "size" => filesize($localfile), "shortXml" => ($sdcaption ? $sdcaption : '') ); if ($subdef == 'caption') { unlink($localfile); } $exportElement ->setDone(true) ->setError(false); $this->dependencyContainer['EM']->persist($exportElement); $this->dependencyContainer['EM']->flush(); $this->logexport($record, $obj, $ftpLog); } catch (Exception $e) { $state .= $line = sprintf(_('task::ftp:File "%1$s" (record %2$s) de la base "%3$s"' . ' (Export du Document) : Transfert cancelled (le document n\'existe plus)') , basename($localfile), $record_id , phrasea::sbas_labels(phrasea::sbasFromBas($this->dependencyContainer, $base_id), $this->dependencyContainer)) . "\n