Projet

Général

Profil

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.