Subversion Repositories Applications.framework

Rev

Rev 299 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
214 jpm 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Script est une classe abstraite qui doit être implémenté par les classes éxecutant des scripts en ligne de commande.
5
 *
6
 * @category	PHP 5.2
7
 * @package	Framework
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @author		Delphine CAUQUIL <delphine@tela-botanica.org>
10
 * @copyright	Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
11
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
241 jpm 12
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
477 jpm 13
 * @since 		0.3
241 jpm 14
 * @version	$Id: Script.php 477 2014-03-25 10:39:28Z jpm $
214 jpm 15
 * @link		/doc/framework/
16
 */
17
 
18
abstract class Script {
19
	/** Niveau de message de type LOG */
20
	const MSG_LOG = 0;
21
	/** Niveau de message de type ERREUR */
22
	const MSG_ERREUR = 1;
23
	/** Niveau de message de type AVERTISSEMENT */
24
	const MSG_AVERTISSEMENT = 2;
25
	/** Niveau de message de type INFORMATION */
26
	const MSG_INFO = 3;
27
 
28
	/** Inititulé des différents types de message. */
29
	private static $msg_niveaux_txt = array('LOG', 'ERREUR','AVERTISSEMENT', 'INFO');
477 jpm 30
 
214 jpm 31
	/**
32
	 * Le nom du script tel que passé dans la ligne de commande.
33
	 * @var string
34
	 */
35
	private $script_nom = null;
477 jpm 36
 
214 jpm 37
	/**
38
	 * Paramêtres par défaut disponibles pour la ligne de commande
477 jpm 39
	 * le tableau se construit de la forme suivante :
214 jpm 40
	 * - clé =  nom du paramêtre '-foo'
41
	 * - value = contient un nouveau tableau composé de cette façon :
42
	 *  - booléen: true si le paramêtre est obligatoire
43
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
44
	 *  - string: description du contenu du paramêtre
45
	 * Les paramêtres optionels devraient être déclaré à la fin du tableau.
46
	 * Le dernier parametre du tableau peut avoir la valeur '...',
47
	 * il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
48
	 * @var array
49
	 */
50
	private $parametres_autorises_defaut = array(
51
		'-a' => array(true, true, 'Action à réaliser'),
52
		'-v' => array(false, '1', 'Mode verbeux : 1 ou 2'));
477 jpm 53
 
214 jpm 54
	/**
55
	 * Paramêtres autorisés par le script.
477 jpm 56
	 * le tableau est de la forme suivante :
214 jpm 57
	 * - clé =  nom du paramêtre '-foo'
58
	 * - value = contient un nouveau tableau composé de cette façon :
59
	 *  - booléen: true si le paramêtre est obligatoire
60
	 *  - booléen ou var : true si le paramêtre nécessite un valeur à sa suite ou la valeur par défaut
61
	 *  - string: description du contenu du paramêtre
62
	 * Les paramêtres optionels devraient être déclaré à la fin du tableau.
63
	 * Le dernier parametre du tableau peut avoir la valeur '...',
64
	 * il contiendra alors l'ensemble des paramêtres suivant trouvés sur la ligne de commande.
65
	 * @var array
66
	 */
67
	protected $parametres_autorises = null;
477 jpm 68
 
214 jpm 69
	/**
70
	 * Contient les valeurs des paramêtres récupérés de la ligne de commande :
477 jpm 71
	 * le tableau se construit de la forme suivnate :
214 jpm 72
	 * - clé =  nom du paramêtre '-foo'
73
	 * - valeur = la valeur récupérée sur la ligne de commande
74
	 * @var array
75
	 */
76
	private $parametres_cli = null;
477 jpm 77
 
214 jpm 78
	/**
79
	 * Contient le tableau des paramètres disponible après vérification :
477 jpm 80
	 * le tableau est de la forme suivante :
214 jpm 81
	 * - clé =  nom du paramêtre '-foo'
82
	 * - valeur = la valeur récupérée sur la ligne de commande
83
	 * @var array
84
	 */
85
	protected $parametres = null;
477 jpm 86
 
245 jpm 87
	/** Tableau associatif permettant de stocker l'avancement dans une boucle.
88
	 * La clé est un md5 du message à afficher au démarrage de la boucle.
477 jpm 89
	 * @var array
245 jpm 90
	 */
91
	private static $avancement = array();
477 jpm 92
 
241 jpm 93
	/** Tableau des noms des paramètres à définir dans le fichier de config car obligatoirement nécessaire à cette classe.*/
274 jpm 94
	private static $parametres_obligatoires = array('chemin_modules', 'log_script');
477 jpm 95
 
214 jpm 96
	public function __construct($script_nom, $parametres_cli) {
97
		$this->script_nom = $script_nom;
98
		$this->parametres_cli = $parametres_cli;
477 jpm 99
 
241 jpm 100
		Config::verifierPresenceParametres(self::$parametres_obligatoires);
477 jpm 101
 
214 jpm 102
		$fichier_ini_script = $this->getScriptChemin().'config.ini';
103
		Config::charger($fichier_ini_script);
477 jpm 104
 
214 jpm 105
		$this->chargerParametresAutorises();
106
		$this->chargerParametres();
107
	}
477 jpm 108
 
214 jpm 109
	private static function getMsgNiveauTxt($niveau) {
110
		return self::$msg_niveaux_txt[$niveau];
111
	}
477 jpm 112
 
214 jpm 113
	protected function getScriptNom() {
114
		return $this->script_nom;
115
	}
477 jpm 116
 
117
	/**
118
	 * Retour le chemin vers le dossier principal du script exécuter.
119
	 * Si le nom du script est au format : script/sous_script
120
	 * le chemin contiendra seulement "script" dans le chemin renvoyé.
121
	 * Si le nom du script est au format : script/sous-script-1/sous_script-2
122
	 * le chemin contiendra seulement "script/sous-script-1" dans le chemin renvoyé.
123
	 *
124
	 * @param type $doit_exister
125
	 * @return string
126
	 */
214 jpm 127
	protected function getScriptChemin($doit_exister = true) {
477 jpm 128
		$script_nom = $this->getScriptNom();
129
		if (strpos($script_nom, DS)) {
130
			$decompoScriptNom = explode(DS, $script_nom);
131
			$script_nom = array_pop($decompoScriptNom);
132
			$dossier_nom = implode(DS, $decompoScriptNom);
133
		} else {
134
			$dossier_nom = strtolower($script_nom);
135
		}
136
		$chemin = Config::get('chemin_modules').$dossier_nom.DS;
214 jpm 137
		if (!file_exists($chemin) && $doit_exister) {
477 jpm 138
			trigger_error("Erreur: le module '$script_nom' n'existe pas ($chemin)\n", E_USER_ERROR);
214 jpm 139
		}
140
		return $chemin;
141
	}
477 jpm 142
 
214 jpm 143
	protected function getParametre($parametre) {
144
		$retour = false;
145
		if (!is_null($parametre)) {
146
			$parametre = ltrim($parametre, '-');
477 jpm 147
 
214 jpm 148
			if (isset($this->parametres[$parametre])) {
149
				$retour = $this->parametres[$parametre];
150
			} else {
151
				trigger_error("Erreur: la ligne de commande ne contenait pas le paramêtre '$parametre'\n", E_USER_WARNING);
152
			}
153
		}
154
		return $retour;
155
	}
477 jpm 156
 
214 jpm 157
	abstract public function executer();
477 jpm 158
 
214 jpm 159
	private function chargerParametresAutorises() {
160
		foreach ($this->parametres_autorises_defaut as $c => $v) {
161
			if (isset($this->parametres_autorises[$c])) {
162
				trigger_error("Erreur: le script '".$this->getScriptNom()."' ne peut définir le paramêtre '$c' car il existe déjà\n", E_USER_ERROR);
163
			} else {
164
				$this->parametres_autorises[$c] = $v;
165
			}
166
		}
167
	}
477 jpm 168
 
214 jpm 169
	private function chargerParametres() {
170
		$parametres_cli = $this->parametres_cli;
171
 
172
		// Récupération des paramêtresgetMsgNiveauTxt
173
		foreach ($this->parametres_autorises as $p_nom => $p_val) {
174
			if (count($parametres_cli) == 0) {
175
				if ($p_val[0]) {
176
					trigger_error("Erreur: paramêtre manquant '".$p_nom."' \n", E_USER_WARNING);
177
				}
178
			}
179
			if ($p_nom == '...') {
180
				$this->parametres['...'] = array();
181
				foreach ($parametres_cli as $arg) {
182
					$this->parametres['...'][] = $arg;
183
				}
184
				$parametres_cli = array();
185
				break;
186
			} else {
187
				if (isset($parametres_cli[$p_nom])) {
188
					// Attribution de la valeur issue de la ligne de commande
189
					$this->parametres[ltrim($p_nom, '-')] = $parametres_cli[$p_nom];
190
					unset($parametres_cli[$p_nom]);
191
				} else {
192
					// Attribution de la valeur par défaut
193
					if ($p_val[1] !== true) {
194
						$this->parametres[ltrim($p_nom, '-')] = $p_val[1];
195
						unset($parametres_cli[$p_nom]);
196
					}
197
				}
198
			}
199
		}
477 jpm 200
 
214 jpm 201
		// Gestion de l'excédant de paramêtres
202
		if (count($parametres_cli)) {
203
			trigger_error("Erreur: trop de paramêtres\n", E_USER_ERROR);
204
		}
205
	}
477 jpm 206
 
207
	/**
214 jpm 208
	 * Affiche un message d'erreur formaté.
209
	 * Si le paramétre de verbosité (-v) vaut 1 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
477 jpm 210
	 *
214 jpm 211
	 * @param string le message d'erreur avec des %s.
212
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
213
	 * @return void.
214
	 */
215
	protected function traiterErreur($message, $tab_arguments = array()) {
216
		$this->traiterMessage($message, $tab_arguments, self::MSG_ERREUR);
217
	}
477 jpm 218
 
219
	/**
214 jpm 220
	 * Affiche un message d'avertissement formaté.
221
	 * Si le paramétre de verbosité (-v) vaut 1, le message est écrit dans le fichier de log.
222
	 * Si le paramétre de verbosité (-v) vaut 2 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
477 jpm 223
	 *
214 jpm 224
	 * @param string le message d'erreur avec des %s.
225
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
226
	 * @return void.
227
	 */
228
	protected function traiterAvertissement($message, $tab_arguments = array()) {
229
		$this->traiterMessage($message, $tab_arguments, self::MSG_AVERTISSEMENT);
230
	}
477 jpm 231
 
232
	/**
214 jpm 233
	 * Retourne un message d'information formaté.
234
	 * Si le paramétre de verbosité (-v) vaut 1 ou 2 , le message est écrit dans le fichier de log.
235
	 * Si le paramétre de verbosité (-v) vaut 3 ou plus, le message est écrit dans le fichier de log et afficher dans la console.
477 jpm 236
	 *
214 jpm 237
	 * @param string le message d'information avec des %s.
238
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
239
	 * @return void.
240
	 */
241
	protected function traiterInfo($message, $tab_arguments = array()) {
242
		$this->traiterMessage($message, $tab_arguments, self::MSG_INFO);
243
	}
477 jpm 244
 
245
	/**
214 jpm 246
	 * Retourne un message formaté en le stockant dans un fichier de log si nécessaire.
477 jpm 247
	 *
214 jpm 248
	 * @param string le message d'erreur avec des %s.
249
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
250
	 * @param int le niveau de verbosité à dépasser pour afficher les messages.
251
	 * @return void.
252
	 */
253
	private function traiterMessage($message, $tab_arguments, $niveau = self::MSG_LOG) {
254
		$log = $this->formaterMsg($message, $tab_arguments, $niveau);
255
		if ($this->getParametre('v') > ($niveau - 1)) {
256
			echo $log;
274 jpm 257
			if (Config::get('log_script')) {
214 jpm 258
				// TODO : lancer le log
259
			}
260
		}
261
	}
477 jpm 262
 
263
	/**
214 jpm 264
	 * Retourne un message d'information formaté.
477 jpm 265
	 *
214 jpm 266
	 * @param string le message d'information avec des %s.
267
	 * @param array le tableau des paramêtres à insérer dans le message d'erreur.
268
	 * @return string le message d'erreur formaté.
269
	 */
270
	protected function formaterMsg($message, $tab_arguments = array(), $niveau = null) {
271
		$texte = vsprintf($message, $tab_arguments);
272
		$prefixe = date('Y-m-j_H:i:s', time());
273
		$prefixe .= is_null($niveau) ? ' : ' : ' - '.self::getMsgNiveauTxt($niveau).' : ';
274
		$log = $prefixe.$texte."\n";
275
		return $log;
276
	}
477 jpm 277
 
278
	/**
245 jpm 279
	 * Utiliser cette méthode dans une boucle pour afficher un message suivi du nombre de tour de boucle effectué.
477 jpm 280
	 * Vous devrez vous même gérer le retour à la ligne à la sortie de la boucle.
281
	 *
245 jpm 282
	 * @param string le message d'information.
283
	 * @param int le nombre de départ à afficher.
284
	 * @return void le message est affiché dans la console.
285
	 */
286
	protected function afficherAvancement($message, $depart = 0) {
287
		if (! isset(self::$avancement[$message])) {
288
			self::$avancement[$message] = $depart;
289
			echo "$message : ";
477 jpm 290
 
245 jpm 291
			$actuel =& self::$avancement[$message];
292
			echo $actuel++;
293
		} else {
294
			$actuel =& self::$avancement[$message];
477 jpm 295
 
245 jpm 296
			// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères)
297
			$passage = 0;
298
			if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) {
477 jpm 299
				$passage = 1;
245 jpm 300
			}
477 jpm 301
 
245 jpm 302
			echo str_repeat(chr(8), (strlen((string) $actuel) - $passage));
303
			echo $actuel++;
304
		}
305
	}
214 jpm 306
}
307
?>