Overview

Namespaces

  • GAubry
    • ErrorHandler
    • Helpers
    • Logger
    • Shell
  • Himedia
    • Padocc
      • DB
      • Minifier
      • Numbering
      • Properties
      • Task
        • Base
        • Extended
  • None
  • Psr
    • Log

Classes

  • Backup
  • Call
  • Composer
  • Copy
  • Environment
  • ExternalProperty
  • FillTemplate
  • HTTP
  • Link
  • MkDir
  • Project
  • Property
  • Rename
  • Sync
  • Target
  • Overview
  • Namespace
  • Class
  • Tree
  • Deprecated
  • Todo
  1: <?php
  2: 
  3: namespace Himedia\Padocc\Task\Base;
  4: 
  5: use Himedia\Padocc\AttributeProperties;
  6: use Himedia\Padocc\Task;
  7: 
  8: /**
  9:  * Permet de générer des fichiers sur la base de templates texte incluant des propriétés.
 10:  * Exemple, ici PHP :
 11:  * <?php
 12:  *     define('DEPLOY_PROJECT', '${PROJECT_NAME}');
 13:  *     define('DEPLOY_ENV', '${ENVIRONMENT_NAME}');
 14:  *     define('DEPLOY_EXECUTION_ID', '${EXECUTION_ID}');
 15:  *     define('TWENGABUILD', '${EXECUTION_ID}');
 16:  *     define('DEPLOY_BASEDIR', '${BASEDIR}');
 17:  * Ce qui génèrera pour cet exemple :
 18:  * <?php
 19:  *     define('DEPLOY_PROJECT', 'front');
 20:  *     define('DEPLOY_ENV', 'prod');
 21:  *     define('DEPLOY_EXECUTION_ID', '20111221154051_01652');
 22:  *     define('TWENGABUILD', '20111221154051_01652');
 23:  *     define('DEPLOY_BASEDIR', '/home/httpd/www.twenga');
 24:  *
 25:  * N'importe quelle propriété y est adressable : celles de master_synchro.cfg si chargé,
 26:  * celles provenant des tags property et celles venant des externalproperty.
 27:  * À inclure dans une tâche env ou target.
 28:  *
 29:  * Exemple :
 30:  * <filltemplate
 31:  *     srcfile="${TMPDIR}/inc/deploy_config-template.inc.php"
 32:  *     destfile="${TMPDIR}/inc/deploy_config.inc.php"
 33:  * />
 34:  *
 35:  * @author Geoffroy AUBRY <gaubry@hi-media.com>
 36:  */
 37: class FillTemplate extends Task
 38: {
 39:     /**
 40:      * {@inheritdoc}
 41:      */
 42:     protected function init()
 43:     {
 44:         parent::init();
 45: 
 46:         $this->aAttrProperties = array(
 47:             'srcfile' => AttributeProperties::ALLOW_PARAMETER | AttributeProperties::REQUIRED
 48:                 | AttributeProperties::FILE,
 49:             'destfile' => AttributeProperties::ALLOW_PARAMETER | AttributeProperties::REQUIRED
 50:                 | AttributeProperties::FILE,
 51:         );
 52:     }
 53: 
 54:     /**
 55:      * {@inheritdoc}
 56:      * @codeCoverageIgnore
 57:      */
 58:     public static function getTagName ()
 59:     {
 60:         return 'filltemplate';
 61:     }
 62: 
 63:     /**
 64:      * Vérifie au moyen de tests basiques que la tâche peut être exécutée.
 65:      * Lance une exception si tel n'est pas le cas.
 66:      *
 67:      * Comme toute les tâches sont vérifiées avant que la première ne soit exécutée,
 68:      * doit permettre de remonter au plus tôt tout dysfonctionnement.
 69:      * Appelé avant la méthode execute().
 70:      *
 71:      * @throws \UnexpectedValueException en cas d'attribut ou fichier manquant
 72:      * @throws \DomainException en cas de valeur non permise
 73:      */
 74:     public function check ()
 75:     {
 76:         parent::check();
 77: 
 78:         // Pour l'instant ne gère pas les chemins distants :
 79:         list($bIsSrcRemote, , ) = $this->oShell->isRemotePath($this->aAttValues['srcfile']);
 80:         list($bIsDestRemote, , ) = $this->oShell->isRemotePath($this->aAttValues['destfile']);
 81:         if ($bIsSrcRemote || $bIsDestRemote) {
 82:             throw new \DomainException('Remote paths not yet handled.');
 83:         }
 84:     }
 85: 
 86:     /**
 87:      * Phase de traitements centraux de l'exécution de la tâche.
 88:      * Elle devrait systématiquement commencer par "parent::centralExecute();".
 89:      * Appelé par execute().
 90:      * @see execute()
 91:      */
 92:     protected function centralExecute ()
 93:     {
 94:         parent::centralExecute();
 95:         $sMsg = "+++Generate '" . $this->aAttValues['destfile'] . "' from '" . $this->aAttValues['srcfile'] . "'.";
 96:         $this->getLogger()->info($sMsg);
 97: 
 98:         $sSrcFile = $this->processSimplePath($this->aAttValues['srcfile']);
 99:         $sDestFile = $this->processSimplePath($this->aAttValues['destfile']);
100:         $sContent = file_get_contents($sSrcFile);
101: 
102:         preg_match_all('/\$\{[^}]+\}/i', $sContent, $aMatches);
103:         $aParameters = array_unique($aMatches[0]);
104:         $aValues = array();
105:         foreach ($aParameters as $sParameter) {
106:             try {
107:                 $sValue = $this->oProperties->getProperty(substr($sParameter, 2, -1));
108:                 $aValues[] = addslashes($sValue);
109:             } catch (\UnexpectedValueException $oException) {
110:                 $aValues[] = $sParameter;
111:                 $sMsg = "[WARNING] Parameter '$sParameter' not resolved in '$sSrcFile' ("
112:                       . $oException->getMessage() . ").";
113:                 $this->getLogger()->warning($sMsg);
114:             }
115:         }
116:         $sContent = str_replace($aParameters, $aValues, $sContent);
117:         file_put_contents($sDestFile, $sContent);
118: 
119:         $this->getLogger()->info('---');
120:     }
121: }
122: 
Platform for Automatized Deployments with pOwerful Concise Configuration API documentation generated by ApiGen 2.8.0