root/traduc/trunk/www/tools/addrelease.php

Revision 1009, 8.2 kB (checked in by gleu, 4 months ago)

Nettoyage, ajout d'un usage, amélioration de la connexion, etc.

  • Property svn:executable set to *
Line 
1 #! /usr/bin/php -qC
2 <?
3
4 function usage() {
5   echo '
6 Ceci est is '.$_SERVER["argv"][0].'.
7
8 Usage:
9   '.$_SERVER["argv"][0].' [OPTIONS]... REPERTOIRE_HTML VERSION_MAJEURE
10
11 Options générales :
12   -d BASE         nom de la base de données de connexion
13                   (par défaut : "'.$PGDATABASE.'")
14   --help          affiche cette aide, puis quitte
15
16 Options de connexion :
17   -h HOTE         hÃŽte du serveur de base de données ou répertoire de la
18                   socket (par défaut : "'.$PGHOST.'")
19   -p PORT         port TCP du serveur (par défaut : "'.$PGPORT.'")
20   -U UTILISATEUR  utilisateur PostgreSQL (par défaut : "'.$PGUSER.'")
21   -W              force la demande du mot de passe
22 ';
23 }
24
25 // Récupération des variables d'environnement
26 $PGHOST = getenv('PGHOST');
27 $PGPORT = getenv('PGPORT');
28
29 $PGUSER = getenv('PGUSER');
30 if (strlen("$PGUSER") == 0) {
31   $PGUSER = getenv('USER');
32 }
33
34 $PGDATABASE = getenv('PGDATABASE');
35 if (strlen("$PGDATABASE") == 0) {
36   $PGDATABASE = $PGUSER;
37 }
38
39 $PGPASSWORD = getenv('PGPASSWORD');
40
41 // Déchiffrage des options en ligne de commande
42 for ($i = 1; $i < $_SERVER["argc"]; $i++) {
43   switch($_SERVER["argv"][$i]) {
44     case "-h":
45     case "--host":
46       $PGHOST = $_SERVER['argv'][++$i];
47       break;
48     case "-p":
49     case "--port":
50       $PGPORT = $_SERVER['argv'][++$i];
51       break;
52     case "-U":
53     case "--user":
54       $PGUSER = $_SERVER['argv'][++$i];
55       break;
56     case "-d":
57     case "--database":
58       $PGDATABASE = $_SERVER['argv'][++$i];
59       break;
60     case "-W":
61       $g_passwordrequired = true;
62       break;
63     case "-?":
64     case "-h":
65     case "--help":
66       usage();
67       exit;
68       break;
69     default:
70       if ($i == count($_SERVER['argv']) - 2) {
71         $dir = $_SERVER['argv'][$i];
72       } else if ($i == count($_SERVER['argv']) - 1) {
73         $version = $_SERVER['argv'][$i];
74         switch ($version) {
75           case '8.1':
76             $version_int = 801;
77             break;
78           case '8.2':
79             $version_int = 802;
80             break;
81           case '8.3':
82             $version_int = 803;
83             break;
84           default:
85             echo "Il s'agit d'une version majeure : 8.1, 8.2 ou 8.3\n";
86             exit;
87             break;
88         }
89       }
90       break;
91   }
92 }
93
94 if (strlen($dir) == 0 or strlen($version) == 0) {
95   usage();
96   exit;
97 }
98
99 // Vérification du mot de passe
100 if ($g_passwordrequired and strlen($PGPASSWORD) == 0) {
101   // On commence par la vérification de .pgpass
102   $pgpassfilename = getenv('HOME').'/.pgpass';
103   if (file_exists($pgpassfilename)) {
104     $permissions = substr(decoct(fileperms($pgpassfilename)), 3);
105     if (!strcmp($permissions, '600')) {
106       $pgpassfile = fopen($pgpassfilename, 'r');
107       $found = false;
108       while (!$found and $line = fgets($pgpassfile)) {
109         list($host, $port, $database, $user, $password) = split (":", trim($line), 5);
110         if ((!strcmp($PGHOST, $host) or !strcmp('*', $host)) and
111             (!strcmp($PGPORT, $port) or !strcmp('*', $port)) and
112             (!strcmp($PGDATABASE, $database) or !strcmp('*', $database)) and
113             (!strcmp($PGUSER, $user) or !strcmp('*', $user))) {
114           $found = true;
115           $PGPASSWORD = $password;
116         }
117       }
118     }
119   }
120   // s'il n'y a toujours pas de mot de passe
121   if (strlen($PGPASSWORD) == 0) {
122     // Attention, le mot de passe apparaîtra en clair sur le terminal...
123     // Au moins, il ne sera pas affiché avec la commande ps :-/
124     echo "Mot de passe : ";
125     $stdin = fopen('php://stdin', 'r');
126     $PGPASSWORD = fgets(STDIN);
127   }
128 }
129
130 // Connexion à la base de données suivant les variables d'environnement
131
132 $DSN = '';
133
134 if (strlen("$PGHOST") > 0) {
135   $DSN .= 'host='.$PGHOST.' ';       
136 }
137 if (strlen("$PGPORT") > 0) {
138   $DSN .= 'port='.$PGPORT.' ';       
139 }
140
141 $DSN .= 'dbname='.$PGDATABASE.' '.
142        'user='.$PGUSER;
143
144 if (strlen("$PGPASSWORD") > 0) {
145   $DSN .= ' password='.$PGPASSWORD;
146 }
147
148 $pgconn = pg_connect($DSN)
149   or die('Connexion impossible');
150
151 // l'encodage est l'UTF-8
152 $query = "SET client_encoding TO utf8;";
153 pg_query($pgconn, $query);
154
155 // lecture du répertoire
156 if ($handle = opendir($dir)) {
157   echo "Traitement du répertoire : ";
158
159   $result = pg_query($pgconn, 'BEGIN');
160
161   $query = 'DELETE FROM pages WHERE version='.$version_int;
162   $result = pg_query($pgconn, $query);
163
164   while (false !== ($file = readdir($handle))
165          and pg_result_status($result) == PGSQL_COMMAND_OK) {
166     if (strcmp($file, '.') and strcmp($file, '..')) {
167       echo ".";
168       // lecture du contenu en un coup
169       $contenu = file_get_contents($dir.'/'.$file);
170       // récup du titre
171       if (preg_match('#<title[^>]*>([^<]+)</title[^>]*>#si', $contenu, $matches)) {
172         $titre = $matches[1];
173         $titre = preg_replace('#\s+#',' ',$titre);
174       }
175       $titre = trim(ereg_replace('[0-9A-Z.]*\&nbsp;', '', $titre));
176       $titre = ereg_replace('Chapitre', '', $titre);
177       $titre = ereg_replace('Annexe', '', $titre);
178       $titre = ereg_replace('Partie', '', $titre);
179       $titre = html_entity_decode($titre,ENT_COMPAT,'utf-8');
180       // récup des mots clés d'index
181       if (preg_match('#<em class="firstterm"[^>]*>([^<]+)</em[^>]*>#si', $contenu, $matches)) {
182         $tags1 = '';
183         for ($index = 1; $index < count($matches); $index=$index+2) {
184           if (strlen($tags1) > 0) {
185             $tags1 .= ',';
186           }
187           $tags1 .= $matches[$index];
188         }
189         $tags1 = preg_replace('#\s+#',' ',$tags1);
190       }
191       // récup des mots clés d'index
192       if (preg_match('#<em class="secondterm"[^>]*>([^<]+)</em[^>]*>#si', $contenu, $matches)) {
193         $tags2 = '';
194         for ($index = 1; $index < count($matches); $index=$index+2) {
195           if (strlen($tags2) > 0) {
196             $tags2 .= ',';
197           }
198           $tags2 .= $matches[$index];
199         }
200         $tags2 = preg_replace('#\s+#',' ',$tags2);
201       }
202       // récup du corps
203       if (preg_match('#<div class="part"[^>]*>(.*)</div[^>]*>[^<]*<div#si', $contenu, $matches)) {
204         $corps = $matches[1];
205       }
206       elseif (preg_match('#<div class="sect1"[^>]*>(.*)</div[^>]*>[^<]*<div#si', $contenu, $matches)) {
207         $corps = $matches[1];
208       }
209       elseif (preg_match('#<div class="refentry"[^>]*>(.*)</div[^>]*>[^<]*<div#si', $contenu, $matches)) {
210         $corps = $matches[1];
211       }
212       elseif (preg_match('#<div class="reference"[^>]*>(.*)</div[^>]*>[^<]*<div#si', $contenu, $matches)) {
213         $corps = $matches[1];
214       }
215       elseif (preg_match('#<div class="appendix"[^>]*>(.*)</div[^>]*>[^<]*<div#si', $contenu, $matches)) {
216         $corps = $matches[1];
217       }
218       elseif (preg_match('#<div class="chapter"[^>]*>(.*)</div[^>]*>[^<]*<div#si', $contenu, $matches)) {
219         $corps = $matches[1];
220       }
221       elseif (preg_match('#<body[^>]*>(.*)</body[^>]*>#si', $contenu, $matches)) {
222         $corps = $matches[1];
223       }
224       $corps = strip_tags($corps);
225       $corps = preg_replace('#\s+#',' ',$corps);
226       $corps = html_entity_decode($corps,ENT_COMPAT,'utf-8');
227       // préparation de la requête...
228       $query = "INSERT INTO pages (url, version, titre, tags1, tags2, contenu) VALUES (
229                '".pg_escape_string($file)."',
230                ".$version_int.",
231                '".pg_escape_string($titre)."',
232                '".pg_escape_string($tags1)."',
233                '".pg_escape_string($tags2)."',
234                '".pg_escape_string($corps)."')";
235       // ... et exécution de cette derniÚre
236       $result = pg_query($pgconn, $query);
237     }
238   }
239
240   $result = pg_query($pgconn, 'END');
241   if (pg_result_status($result) == PGSQL_COMMAND_OK)
242     echo " OK\n";
243   else
244     echo " ERREUR !\n".pg_last_error($pgconn);
245
246   $query = "UPDATE pages SET "
247           ."fti = setweight( to_tsvector('french', titre), 'A' ) || setweight( to_tsvector('french', tags1), 'B' ) || setweight( to_tsvector('french', tags2), 'C' ) || setweight( to_tsvector('french', contenu), 'D' )";
248   $result = pg_query($pgconn, $query);
249   if (pg_result_status($result) == PGSQL_COMMAND_OK)
250     echo "Mise à jour OK\n";
251   else
252     echo "ERREUR lors de la mise à jour !\n".pg_last_error($pgconn);
253
254   $query = "VACUUM ANALYZE pages";
255   $result = pg_query($pgconn, $query);
256   if (pg_result_status($result) == PGSQL_COMMAND_OK)
257     echo "Vacuum OK\n";
258   else
259     echo "ERREUR lors du Vacuum !\n".pg_last_error($pgconn);
260
261   closedir($handle);
262 }
263
264 pg_close($pgconn);
265
266 ?>
267
Note: See TracBrowser for help on using the browser.