Gopher » Historique » Version 1
Fabien Dupont, 12/06/2013 11:30
1 | 1 | Fabien Dupont | h1. Installation d'un serveur gopher |
---|---|---|---|
2 | 1 | Fabien Dupont | |
3 | 1 | Fabien Dupont | h2. Gopher ? |
4 | 1 | Fabien Dupont | |
5 | 1 | Fabien Dupont | Gopher, c'est lui : |
6 | 1 | Fabien Dupont | |
7 | 1 | Fabien Dupont | !http://www.toutelatele.com/IMG/jpg/croisiere-s_amuse-gopher.jpg! |
8 | 1 | Fabien Dupont | |
9 | 1 | Fabien Dupont | Mais ce n'est pas ce qui nous intéresse actuellement sauf si un fan de la croisière s'amuse tombe sur cette page. |
10 | 1 | Fabien Dupont | |
11 | 1 | Fabien Dupont | Gopher, c'est avant tout (je cite "wikipedia":http://fr.wikipedia.org/wiki/Gopher) : « un monde parallèle à celui du Web (et créé à la même époque que ce dernier). ». C'est pas du web mais c'est de l'Internet, donc pourquoi pas faire ça chez Tetaneutral.net ? |
12 | 1 | Fabien Dupont | |
13 | 1 | Fabien Dupont | C'est une sorte d'accès à des fichiers listés par une sorte d'index, la « gophermap ». C'est du simple, du minimaliste, mais ça fonctionne bien depuis des années. |
14 | 1 | Fabien Dupont | |
15 | 1 | Fabien Dupont | h2. Installation du daemon gopher. |
16 | 1 | Fabien Dupont | |
17 | 1 | Fabien Dupont | h3. Le daemon |
18 | 1 | Fabien Dupont | |
19 | 1 | Fabien Dupont | Il existe plusieurs implémentations de gopher, j'ai choisi "gophrier":http://gophrier.tuxfamily.org/ car le nom est rigolo (c'est vraiment le seul argument). |
20 | 1 | Fabien Dupont | |
21 | 1 | Fabien Dupont | <pre> |
22 | 1 | Fabien Dupont | # apt-get install build-essentials cmake |
23 | 1 | Fabien Dupont | # cd /usr/local/src |
24 | 1 | Fabien Dupont | # wget http://download.tuxfamily.org/gophrier/gophrier-0.2.3.tar.gz |
25 | 1 | Fabien Dupont | # tar xvf gophrier-0.2.3.tar.gz |
26 | 1 | Fabien Dupont | # cd gophrier-0.2.3.tar.gz |
27 | 1 | Fabien Dupont | # cmake . |
28 | 1 | Fabien Dupont | # make |
29 | 1 | Fabien Dupont | # cp gophrier /usr/local/bin |
30 | 1 | Fabien Dupont | </pre> |
31 | 1 | Fabien Dupont | |
32 | 1 | Fabien Dupont | h3. La configuration |
33 | 1 | Fabien Dupont | |
34 | 1 | Fabien Dupont | Gophrier a un système de configuration simple : des fichiers dans un répertoire contenant une seule ligne. |
35 | 1 | Fabien Dupont | |
36 | 1 | Fabien Dupont | <pre> |
37 | 1 | Fabien Dupont | # mkdir -p /etc/gophrier/gophermap |
38 | 1 | Fabien Dupont | # echo 1 > /etc/gophrier/ipv6 |
39 | 1 | Fabien Dupont | # mkdir /var/log/gophrier |
40 | 1 | Fabien Dupont | # echo /var/log/gophrier > /etc/gophrier/logdir |
41 | 1 | Fabien Dupont | # echo /var/run/gophier.pid > /etc/gophrier/pidpath |
42 | 1 | Fabien Dupont | # mkdir /var/gopher |
43 | 1 | Fabien Dupont | # echo /var/gopher > /etc/gophrier/rootdir |
44 | 1 | Fabien Dupont | # echo 1 > /etc/gophrier/gophermap/enable |
45 | 1 | Fabien Dupont | </pre> |
46 | 1 | Fabien Dupont | |
47 | 1 | Fabien Dupont | h3. Le script de démarrage |
48 | 1 | Fabien Dupont | |
49 | 1 | Fabien Dupont | Lui, je l'ai fait à partir de /etc/init.d/skel et c'est donc /etc/init.d/gophrier |
50 | 1 | Fabien Dupont | |
51 | 1 | Fabien Dupont | <pre> |
52 | 1 | Fabien Dupont | #! /bin/sh |
53 | 1 | Fabien Dupont | ### BEGIN INIT INFO |
54 | 1 | Fabien Dupont | # Provides: skeleton |
55 | 1 | Fabien Dupont | # Required-Start: $remote_fs $syslog |
56 | 1 | Fabien Dupont | # Required-Stop: $remote_fs $syslog |
57 | 1 | Fabien Dupont | # Default-Start: 2 3 4 5 |
58 | 1 | Fabien Dupont | # Default-Stop: 0 1 6 |
59 | 1 | Fabien Dupont | # Short-Description: Example initscript |
60 | 1 | Fabien Dupont | # Description: This file should be used to construct scripts to be |
61 | 1 | Fabien Dupont | # placed in /etc/init.d. |
62 | 1 | Fabien Dupont | ### END INIT INFO |
63 | 1 | Fabien Dupont | |
64 | 1 | Fabien Dupont | # Author: Foo Bar <foobar@baz.org> |
65 | 1 | Fabien Dupont | # |
66 | 1 | Fabien Dupont | # Please remove the "Author" lines above and replace them |
67 | 1 | Fabien Dupont | # with your own name if you copy and modify this script. |
68 | 1 | Fabien Dupont | |
69 | 1 | Fabien Dupont | # Do NOT "set -e" |
70 | 1 | Fabien Dupont | |
71 | 1 | Fabien Dupont | # PATH should only include /usr/* if it runs after the mountnfs.sh script |
72 | 1 | Fabien Dupont | PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin |
73 | 1 | Fabien Dupont | DESC="Gopher server" |
74 | 1 | Fabien Dupont | NAME=gophrier |
75 | 1 | Fabien Dupont | DAEMON=/usr/local/bin/$NAME |
76 | 1 | Fabien Dupont | DAEMON_ARGS="-c /etc/gophrier" |
77 | 1 | Fabien Dupont | PIDFILE=/var/run/$NAME.pid |
78 | 1 | Fabien Dupont | SCRIPTNAME=/etc/init.d/$NAME |
79 | 1 | Fabien Dupont | |
80 | 1 | Fabien Dupont | # Exit if the package is not installed |
81 | 1 | Fabien Dupont | [ -x "$DAEMON" ] || exit 0 |
82 | 1 | Fabien Dupont | |
83 | 1 | Fabien Dupont | # Read configuration variable file if it is present |
84 | 1 | Fabien Dupont | [ -r /etc/default/$NAME ] && . /etc/default/$NAME |
85 | 1 | Fabien Dupont | |
86 | 1 | Fabien Dupont | # Load the VERBOSE setting and other rcS variables |
87 | 1 | Fabien Dupont | . /lib/init/vars.sh |
88 | 1 | Fabien Dupont | |
89 | 1 | Fabien Dupont | # Define LSB log_* functions. |
90 | 1 | Fabien Dupont | # Depend on lsb-base (>= 3.2-14) to ensure that this file is present |
91 | 1 | Fabien Dupont | # and status_of_proc is working. |
92 | 1 | Fabien Dupont | . /lib/lsb/init-functions |
93 | 1 | Fabien Dupont | |
94 | 1 | Fabien Dupont | # |
95 | 1 | Fabien Dupont | # Function that starts the daemon/service |
96 | 1 | Fabien Dupont | # |
97 | 1 | Fabien Dupont | do_start() |
98 | 1 | Fabien Dupont | { |
99 | 1 | Fabien Dupont | # Return |
100 | 1 | Fabien Dupont | # 0 if daemon has been started |
101 | 1 | Fabien Dupont | # 1 if daemon was already running |
102 | 1 | Fabien Dupont | # 2 if daemon could not be started |
103 | 1 | Fabien Dupont | start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ |
104 | 1 | Fabien Dupont | || return 1 |
105 | 1 | Fabien Dupont | start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ |
106 | 1 | Fabien Dupont | $DAEMON_ARGS \ |
107 | 1 | Fabien Dupont | || return 2 |
108 | 1 | Fabien Dupont | # Add code here, if necessary, that waits for the process to be ready |
109 | 1 | Fabien Dupont | # to handle requests from services started subsequently which depend |
110 | 1 | Fabien Dupont | # on this one. As a last resort, sleep for some time. |
111 | 1 | Fabien Dupont | } |
112 | 1 | Fabien Dupont | |
113 | 1 | Fabien Dupont | # |
114 | 1 | Fabien Dupont | # Function that stops the daemon/service |
115 | 1 | Fabien Dupont | # |
116 | 1 | Fabien Dupont | do_stop() |
117 | 1 | Fabien Dupont | { |
118 | 1 | Fabien Dupont | # Return |
119 | 1 | Fabien Dupont | # 0 if daemon has been stopped |
120 | 1 | Fabien Dupont | # 1 if daemon was already stopped |
121 | 1 | Fabien Dupont | # 2 if daemon could not be stopped |
122 | 1 | Fabien Dupont | # other if a failure occurred |
123 | 1 | Fabien Dupont | start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME |
124 | 1 | Fabien Dupont | RETVAL="$?" |
125 | 1 | Fabien Dupont | [ "$RETVAL" = 2 ] && return 2 |
126 | 1 | Fabien Dupont | # Wait for children to finish too if this is a daemon that forks |
127 | 1 | Fabien Dupont | # and if the daemon is only ever run from this initscript. |
128 | 1 | Fabien Dupont | # If the above conditions are not satisfied then add some other code |
129 | 1 | Fabien Dupont | # that waits for the process to drop all resources that could be |
130 | 1 | Fabien Dupont | # needed by services started subsequently. A last resort is to |
131 | 1 | Fabien Dupont | # sleep for some time. |
132 | 1 | Fabien Dupont | start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON |
133 | 1 | Fabien Dupont | [ "$?" = 2 ] && return 2 |
134 | 1 | Fabien Dupont | # Many daemons don't delete their pidfiles when they exit. |
135 | 1 | Fabien Dupont | rm -f $PIDFILE |
136 | 1 | Fabien Dupont | return "$RETVAL" |
137 | 1 | Fabien Dupont | } |
138 | 1 | Fabien Dupont | |
139 | 1 | Fabien Dupont | # |
140 | 1 | Fabien Dupont | # Function that sends a SIGHUP to the daemon/service |
141 | 1 | Fabien Dupont | # |
142 | 1 | Fabien Dupont | do_reload() { |
143 | 1 | Fabien Dupont | # |
144 | 1 | Fabien Dupont | # If the daemon can reload its configuration without |
145 | 1 | Fabien Dupont | # restarting (for example, when it is sent a SIGHUP), |
146 | 1 | Fabien Dupont | # then implement that here. |
147 | 1 | Fabien Dupont | # |
148 | 1 | Fabien Dupont | start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME |
149 | 1 | Fabien Dupont | return 0 |
150 | 1 | Fabien Dupont | } |
151 | 1 | Fabien Dupont | |
152 | 1 | Fabien Dupont | case "$1" in |
153 | 1 | Fabien Dupont | start) |
154 | 1 | Fabien Dupont | [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" |
155 | 1 | Fabien Dupont | do_start |
156 | 1 | Fabien Dupont | case "$?" in |
157 | 1 | Fabien Dupont | 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; |
158 | 1 | Fabien Dupont | 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; |
159 | 1 | Fabien Dupont | esac |
160 | 1 | Fabien Dupont | ;; |
161 | 1 | Fabien Dupont | stop) |
162 | 1 | Fabien Dupont | [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" |
163 | 1 | Fabien Dupont | do_stop |
164 | 1 | Fabien Dupont | case "$?" in |
165 | 1 | Fabien Dupont | 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; |
166 | 1 | Fabien Dupont | 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; |
167 | 1 | Fabien Dupont | esac |
168 | 1 | Fabien Dupont | ;; |
169 | 1 | Fabien Dupont | status) |
170 | 1 | Fabien Dupont | status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? |
171 | 1 | Fabien Dupont | ;; |
172 | 1 | Fabien Dupont | #reload|force-reload) |
173 | 1 | Fabien Dupont | # |
174 | 1 | Fabien Dupont | # If do_reload() is not implemented then leave this commented out |
175 | 1 | Fabien Dupont | # and leave 'force-reload' as an alias for 'restart'. |
176 | 1 | Fabien Dupont | # |
177 | 1 | Fabien Dupont | #log_daemon_msg "Reloading $DESC" "$NAME" |
178 | 1 | Fabien Dupont | #do_reload |
179 | 1 | Fabien Dupont | #log_end_msg $? |
180 | 1 | Fabien Dupont | #;; |
181 | 1 | Fabien Dupont | restart|force-reload) |
182 | 1 | Fabien Dupont | # |
183 | 1 | Fabien Dupont | # If the "reload" option is implemented then remove the |
184 | 1 | Fabien Dupont | # 'force-reload' alias |
185 | 1 | Fabien Dupont | # |
186 | 1 | Fabien Dupont | log_daemon_msg "Restarting $DESC" "$NAME" |
187 | 1 | Fabien Dupont | do_stop |
188 | 1 | Fabien Dupont | case "$?" in |
189 | 1 | Fabien Dupont | 0|1) |
190 | 1 | Fabien Dupont | do_start |
191 | 1 | Fabien Dupont | case "$?" in |
192 | 1 | Fabien Dupont | 0) log_end_msg 0 ;; |
193 | 1 | Fabien Dupont | 1) log_end_msg 1 ;; # Old process is still running |
194 | 1 | Fabien Dupont | *) log_end_msg 1 ;; # Failed to start |
195 | 1 | Fabien Dupont | esac |
196 | 1 | Fabien Dupont | ;; |
197 | 1 | Fabien Dupont | *) |
198 | 1 | Fabien Dupont | # Failed to stop |
199 | 1 | Fabien Dupont | log_end_msg 1 |
200 | 1 | Fabien Dupont | ;; |
201 | 1 | Fabien Dupont | esac |
202 | 1 | Fabien Dupont | ;; |
203 | 1 | Fabien Dupont | *) |
204 | 1 | Fabien Dupont | #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 |
205 | 1 | Fabien Dupont | echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 |
206 | 1 | Fabien Dupont | exit 3 |
207 | 1 | Fabien Dupont | ;; |
208 | 1 | Fabien Dupont | esac |
209 | 1 | Fabien Dupont | |
210 | 1 | Fabien Dupont | : |
211 | 1 | Fabien Dupont | </pre> |
212 | 1 | Fabien Dupont | |
213 | 1 | Fabien Dupont | Il faut bien sûr l'activer au démarrage de la machine. |
214 | 1 | Fabien Dupont | |
215 | 1 | Fabien Dupont | <pre> |
216 | 1 | Fabien Dupont | # update-rc.d gophrier defaults |
217 | 1 | Fabien Dupont | </pre> |
218 | 1 | Fabien Dupont | |
219 | 1 | Fabien Dupont | h2. Quick and dirty HTML to gopher |
220 | 1 | Fabien Dupont | |
221 | 1 | Fabien Dupont | Vu que j'avais la flemme d'écrire le site "tetaneutral.net":http://www.tetaneutral.net à la main en texte, j'ai fait un script môche de conversion (/usr/local/bin/html2gopher.pl) : |
222 | 1 | Fabien Dupont | |
223 | 1 | Fabien Dupont | <pre> |
224 | 1 | Fabien Dupont | #!/usr/bin/env perl |
225 | 1 | Fabien Dupont | |
226 | 1 | Fabien Dupont | use strict; |
227 | 1 | Fabien Dupont | use utf8; |
228 | 1 | Fabien Dupont | use Text::Unidecode; |
229 | 1 | Fabien Dupont | |
230 | 1 | Fabien Dupont | my $url = "http://www.tetaneutral.net/"; |
231 | 1 | Fabien Dupont | my $site = "tetaneutral.net"; |
232 | 1 | Fabien Dupont | my $port = 70; |
233 | 1 | Fabien Dupont | my $dest = "/var/gopher"; |
234 | 1 | Fabien Dupont | my $map = "$dest/gophermap"; |
235 | 1 | Fabien Dupont | |
236 | 1 | Fabien Dupont | my $cat; |
237 | 1 | Fabien Dupont | |
238 | 1 | Fabien Dupont | system "rm -f $dest/*"; |
239 | 1 | Fabien Dupont | open(MAP, ">$map"); |
240 | 1 | Fabien Dupont | open(DUMP, "elinks -dump -no-numbering -no-references -dump-charset iso-8859-1 -default-mime-type text/html $url |"); |
241 | 1 | Fabien Dupont | while(<DUMP>) |
242 | 1 | Fabien Dupont | { |
243 | 1 | Fabien Dupont | s/\n$//; |
244 | 1 | Fabien Dupont | if(/^[^ ]/) |
245 | 1 | Fabien Dupont | { |
246 | 1 | Fabien Dupont | $cat = unidecode($_); |
247 | 1 | Fabien Dupont | if($cat) |
248 | 1 | Fabien Dupont | { |
249 | 1 | Fabien Dupont | close DEST; |
250 | 1 | Fabien Dupont | print MAP "0$cat "; |
251 | 1 | Fabien Dupont | $cat =~ s/( |')/_/g; |
252 | 1 | Fabien Dupont | print MAP "$cat.txt $site $port\n"; |
253 | 1 | Fabien Dupont | } |
254 | 1 | Fabien Dupont | open(DEST, ">$dest/$cat.txt"); |
255 | 1 | Fabien Dupont | } |
256 | 1 | Fabien Dupont | |
257 | 1 | Fabien Dupont | if($cat) |
258 | 1 | Fabien Dupont | { |
259 | 1 | Fabien Dupont | print DEST "$_\n"; |
260 | 1 | Fabien Dupont | } |
261 | 1 | Fabien Dupont | } |
262 | 1 | Fabien Dupont | |
263 | 1 | Fabien Dupont | close DEST; |
264 | 1 | Fabien Dupont | close MAP; |
265 | 1 | Fabien Dupont | </pre> |
266 | 1 | Fabien Dupont | |
267 | 1 | Fabien Dupont | Concrêtement, ce script dumpe http://www.tetaneutral.net/, extrait les catégories, en fait des fichiers textes et créé la gophermap du site gopher. |
268 | 1 | Fabien Dupont | |
269 | 1 | Fabien Dupont | Il est exécuté via crontab, une fois par heure, pour suivre les mises à jour du site. |
270 | 1 | Fabien Dupont | |
271 | 1 | Fabien Dupont | <pre> |
272 | 1 | Fabien Dupont | # Generation du site gopher (http://chiliproject.tetaneutral.net/projects/tetaneutral/wiki/Gopher) |
273 | 1 | Fabien Dupont | 0 * * * * /usr/local/bin/html2gopher.pl |
274 | 1 | Fabien Dupont | </pre> |
275 | 1 | Fabien Dupont | |
276 | 1 | Fabien Dupont | h2. Accès au site en gopher |
277 | 1 | Fabien Dupont | |
278 | 1 | Fabien Dupont | h3. Dans un terminal, lynx ou elinks |
279 | 1 | Fabien Dupont | |
280 | 1 | Fabien Dupont | <pre> |
281 | 1 | Fabien Dupont | # elinks gopher://tetaneutral.net/ |
282 | 1 | Fabien Dupont | </pre> |
283 | 1 | Fabien Dupont | |
284 | 1 | Fabien Dupont | <pre> |
285 | 1 | Fabien Dupont | Gopher Menu |
286 | 1 | Fabien Dupont | Gopher Menu |
287 | 1 | Fabien Dupont | |
288 | 1 | Fabien Dupont | (FILE) Contact |
289 | 1 | Fabien Dupont | (FILE) Campagne d'adhesion |
290 | 1 | Fabien Dupont | (FILE) Actualites |
291 | 1 | Fabien Dupont | (FILE) Le projet |
292 | 1 | Fabien Dupont | (FILE) Participer |
293 | 1 | Fabien Dupont | (FILE) Transparence |
294 | 1 | Fabien Dupont | (FILE) Services |
295 | 1 | Fabien Dupont | (FILE) Neutralite du reseau |
296 | 1 | Fabien Dupont | (FILE) Fournir un acces a internet |
297 | 1 | Fabien Dupont | (FILE) Hebergeur internet |
298 | 1 | Fabien Dupont | (FILE) Operateur |
299 | 1 | Fabien Dupont | (FILE) Partenaires |
300 | 1 | Fabien Dupont | (FILE) Les moyens techniques |
301 | 1 | Fabien Dupont | (FILE) Historique du projet |
302 | 1 | Fabien Dupont | (FILE) Actualites passees |
303 | 1 | Fabien Dupont | (FILE) Administratif |
304 | 1 | Fabien Dupont | |
305 | 1 | Fabien Dupont | Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back. |
306 | 1 | Fabien Dupont | Arrow keys: Up and Down to move. Right to follow a link; Left to go back. |
307 | 1 | Fabien Dupont | H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list |
308 | 1 | Fabien Dupont | </pre> |
309 | 1 | Fabien Dupont | |
310 | 1 | Fabien Dupont | h3. Dans firefox ou android |
311 | 1 | Fabien Dupont | |
312 | 1 | Fabien Dupont | Je cite alarig dans IRC : |
313 | 1 | Fabien Dupont | |
314 | 1 | Fabien Dupont | <pre> |
315 | 1 | Fabien Dupont | alarig â Il existe aussi https://addons.mozilla.org/fr/firefox/addon/overbiteff/ |
316 | 1 | Fabien Dupont | alarig â Tu peux lire du gopher dans firefox avec ça |
317 | 1 | Fabien Dupont | </pre> |
318 | 1 | Fabien Dupont | |
319 | 1 | Fabien Dupont | http://gopher.floodgap.com/overbite/ pour plus d'informations. |