Subversion Repositories Applications.framework

Rev

Rev 241 | Rev 274 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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