ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/docs/pws2004/freenet.mgp
Revision: 1.6
Committed: Mon Jun 28 18:56:45 2004 UTC (22 years, 4 months ago) by root
Branch: MAIN
Changes since 1.5: +132 -76 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 %include "std.mgp"
2     %%default 1 bimage "gtk/gtk-window.jpg" 1024x768, center
3     %page
4 root 1.5 %charset "iso8859-1"
5 root 1.1 %%bimage "gtk/screenshot.jpg" 1600x1200
6    
7     Freenet
8    
9 root 1.6
10    
11 root 1.1 "I worry about my child and the Internet all
12     the time, even though she's too young to have
13     logged on yet. Here's what I worry about. I
14     worry that 10 or 15 years from now, she will
15     come to me and say 'Daddy, where were you
16     when they took freedom of the press away from
17     the Internet?'"
18    
19     --Mike Godwin, Electronic Frontier Foundation
20    
21    
22     %center
23     %%image "gtk/hello31.jpg" 0 200 200 1
24    
25     %page
26    
27     Ziele
28    
29    
30     Projekt, Dokumentation und Implementation frei und für jeden zugänglich
31     %pause
32    
33     Informationsfreiheit ohne Zensur
34     %pause
35    
36     garantiert anonyme Veröffentlichung
37     %pause
38    
39     garantierter Zugang zur Information
40    
41     %page
42    
43     Implementation
44    
45    
46     virtuelles Netzwerk
47     %pause
48     Ausfall auch großer Teile des Netzes werden kompensiert
49    
50     %pause
51     einzelne Knoten
52     %pause
53     kennen die gespeicherten Daten nicht
54     %pause
55 root 1.3 können Datenverkehr anderer Knoten nicht lesen
56 root 1.1 %pause
57     kennen Sender und Empfänger von Daten nicht
58    
59    
60     %page
61    
62 root 1.3 Freenet aus "Benutzersicht"
63 root 1.1
64 root 1.6
65 root 1.1 %pause
66     Alle Daten werden in Datenblöcken (keys) organisiert
67 root 1.6
68 root 1.1 %pause
69     Keys werden in das Netzwerk "eingefügt"
70     %pause
71 root 1.6
72 root 1.1 Maximale Größe eines Datenblocks: 1MB
73     %pause
74 root 1.6
75 root 1.1 HTML-Seiten werden üblicherweise in einem Key gespeichert
76     %pause
77 root 1.6
78 root 1.3 Große Dateien werden mit forward error correction in kleinere Blöcke geteilt
79     %pause
80 root 1.1 Algorithm::FEC
81    
82    
83     %page
84    
85     Freenet-URLs
86    
87 root 1.6
88 root 1.1 Übliche Form eines Freenet-Links:
89    
90 root 1.6 %font "t4"
91     http://localhost:8888/
92     CHK@pfAv9IejYPXDguEkUhiNUMAwI,blzDbhN~q4JrfRWw
93     //Suffix
94 root 1.1 %font "s"
95    
96     %pause
97     http://localhost:8888/ nur der Pfad zum HTTP-Proxy des Knotens
98     %pause
99     CHK ist der Typ (hier: Content Hash Key)
100     %pause
101     Dahinter Folgen Parameter (meist Schlüssel u.ä.), "base64"-codiert
102     %pause
103 root 1.3 Suffix (nach //) wird von Freenet ignoriert
104 root 1.1
105     %page
106    
107     Content Hash Keys
108    
109 root 1.6
110 root 1.1 %font "t3"
111     CHK@pfAv9IejYPLQwaTLXDguEkUhiNUMAwI,blzDbhN~8Q28esq4JrfRWw
112     ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
113     Typ Routing-Key Crypto-Key
114     %font "s"
115    
116 root 1.6
117 root 1.1 %pause
118     Crypto-Key wird aus den Daten generiert
119     verschlüsselt die Daten
120 root 1.6
121 root 1.1 %pause
122     Routing-Key wird aus dem Crypto-Key generiert
123     dient zum Indizieren und Suchen der Daten
124 root 1.6
125 root 1.1 %pause
126 root 1.6 Daten können mehrfach eingefügt werden. Da gleiche Daten == gleicher Key wird das Netzwerk nicht belastet
127 root 1.1
128     %page
129    
130 root 1.2 Freenet Live
131    
132     %system "/opt/bin/links -g http://129.13.162.73:8888/"
133    
134     %page
135    
136 root 1.3 Abrufen eines Keys (1)
137 root 1.2
138 root 1.6
139 root 1.2 Beispiel: ein Bild der Seite "Thought-Crime":
140    
141     %font "t3"
142     CHK@pfAv9IejYPLQwaTLXDguEkUhiNUMAwI,blzDbhN~8Q28esq4JrfRWw
143     %font "s"
144    
145 root 1.3 1. Suche nach CHK@pfAvI...kUhiNUMAwI
146 root 1.2 %pause
147 root 1.3 (a5f02ff487a36...e12452188d50c0302)
148 root 1.2 %pause
149     0c == 4k, 0302 == CHK + Twofish
150     %pause
151     Skalierbarkeit durch lineare Suche
152 root 1.6
153 root 1.2 %pause
154     2. Entschlüsseln der Daten mit blzDbhN~8Q28esq4JrfRWw
155     (6e5cc36e137ef10dbc7acab826b7d15b)
156    
157     %page
158    
159 root 1.3 Abrufen eines Keys (2)
160 root 1.2
161 root 1.6
162     Abgerufene Daten bestehen aus Metadaten und Daten
163 root 1.2
164     Metadaten:
165    
166     %font "t3"
167     Revision=1
168     EndPart
169     Document
170     Info.Format=image/png
171     End
172     %font "s"
173    
174     Daten:
175    
176     %font "t3"
177     PNG^Z...
178     %font "s"
179    
180     %page
181    
182 root 1.1 Signed Subspace Key
183    
184 root 1.6
185 root 1.1 %font "t3"
186     SSK@Sc6qV~D6iFhaYord6HtbjJ8MaEYPAgM,Jrd6HtbjJfw1UO1g/YoYo
187     ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
188     Typ Public Key PAgM Entropie + Daten
189     %font "s"
190    
191     %pause
192     Daten werden mit einem private Key signiert
193 root 1.6
194 root 1.1 %pause
195     maximale Größe 32K
196 root 1.6
197 root 1.1 %pause
198     mit einem Schüsselpaar können viele Keys eingefügt werden
199     Unterscheidung über angehängte Daten
200    
201     %page
202    
203 root 1.2 Und nun: Perl
204 root 1.1
205    
206 root 1.2 Net::Freenet::FCP
207     http://www.sf.net/projects/perlfcp
208     %pause
209     stark bei Metadaten
210     %pause
211 root 1.1
212 root 1.2 Net::FCP
213     CPAN
214     %pause
215     stark beim asynchronen Einfügen bzw. Abrufen
216     %pause
217 root 1.6 ist von mir :)
218 root 1.1
219 root 1.2 %page
220 root 1.1
221 root 1.2 Einfache Abfragen
222 root 1.1
223 root 1.6 %pause
224 root 1.2 Abfragen benutzen das Freenet Client Protocol (FCP)
225     %pause
226     ein einziger Horror
227     %pause
228     zum Glück gibt's Perl :)
229     %pause
230 root 1.1
231 root 1.2 %font "t5"
232     use Net::FCP;
233     my $fcp = new Net::FCP;
234 root 1.6
235 root 1.2 %pause
236     my ($meta, $data)
237     = @{ $fcp->client_get (
238     "freenet:SSK@0O....PAgM/fx/3//"
239     15
240     ) };
241 root 1.1
242 root 1.2 %font "s"
243 root 1.1
244 root 1.2 %page
245 root 1.1
246 root 1.2 Fehlerbehandlung
247 root 1.1
248 root 1.6
249     %pause
250 root 1.2 Bei Nichtfinden: die
251     %pause
252     Net::FCP::Exception<<data_not_found,>>
253     %pause
254     einfach nochmal probieren
255 root 1.6
256 root 1.2 %pause
257     Bei Netzwerkfehlern: die
258     %pause
259     Net::FCP::Exception<<short_data,reason:unexpected eof or internal node error>>
260     %pause
261     einfach nochmal probieren
262 root 1.6
263 root 1.2 %pause
264     Bei Schluckauf: die
265     %pause
266     einfach nochmal probieren
267     %pause
268 root 1.1
269 root 1.2 Daher: eval { } benutzen.
270 root 1.1
271 root 1.2 %page
272 root 1.1
273 root 1.2 Metadaten in Perl
274 root 1.1
275 root 1.6
276 root 1.2 %pause
277     Metadaten in Perl: Net::FCP::Metadata-Objekte
278     %pause
279 root 1.1
280 root 1.2 Am besten einmal ausgeben lassen:
281 root 1.1
282 root 1.2 %font "t5"
283     use Data::Dumper;
284     print STDERR Dumper $meta;
285     print $data;
286     %font "s"
287 root 1.1
288 root 1.2 %pause
289     z.B. mit eg/fetch1:
290 root 1.1
291 root 1.2 %font "t4"
292     eg/fetch1 SSK@0OhV.......oPAgM/fx/3// >data
293     %font "s"
294 root 1.1
295 root 1.2 %page
296 root 1.1
297 root 1.2 Metadaten einer Freesite
298 root 1.1
299 root 1.6
300 root 1.2 Stark gekürzt:
301 root 1.6
302 root 1.2 %pause
303 root 1.6 %font "t5"
304 root 1.2 version => { 'revision' => '1' },
305     document => [ {
306 root 1.6 info => { format => 'image/png' },
307     redirect=> { target => 'freenet:CHK@...' },
308     name => 'activelink.png'
309     } ],
310 root 1.2 raw => 'Version
311     Revision=1
312     ...
313     End
314     '
315     };
316     %font "s"
317 root 1.1
318 root 1.2 %page
319 root 1.1
320 root 1.2 Manifest-Metadaten
321 root 1.1
322    
323 root 1.2 Beispiele für Keys aus den Metadaten der Freesite:
324 root 1.1
325 root 1.2 %pause
326     %font "t3"
327     Hauptseite
328     SSK@0OhVDWutibbBMbXmbxNXW0M6YFoPAgM/fx/3//
329 root 1.6
330 root 1.2 %pause
331     Icon
332     SSK@0OhVDWutibbBMbXmbxNXW0M6YFoPAgM/fx/3//activelink.png
333     %font "s"
334 root 1.1
335    
336 root 1.2 %pause
337 root 1.3 client_get liefert identische Daten
338 root 1.1
339 root 1.2 %pause
340     Freenet ignoriert alles hinter //
341 root 1.1
342 root 1.2 %page
343 root 1.1
344 root 1.2 Manifest-Metadaten
345 root 1.1
346 root 1.6
347 root 1.3 Selbst nachschauen durch Lookup in den Metadaten:
348 root 1.2 %pause
349 root 1.1
350 root 1.6 %font "t5"
351 root 1.2 $link = grep $_->{name} eq "activelink.png",
352     @{ $metadata->{document} };
353     %pause
354     print $link->{redirect};
355     %font "s"
356 root 1.1
357 root 1.2 %pause
358     kein Redirect => Daten sind angehängt
359 root 1.1
360 root 1.2 %page
361 root 1.1
362 root 1.3 Freesite-Management
363 root 1.1
364 root 1.6
365 root 1.3 %pause
366 root 1.6 Wie verändert man Daten, die nicht mehr veränderbar sind?
367 root 1.1
368 root 1.3 %pause
369     Lösung 1: Veränderbare Keys (TUKs)
370     %pause
371     Viel Rauch, wenig Realität
372 root 1.6
373 root 1.3 %pause
374     Lösung 2: Editions
375     %pause
376     Links auf zukünftige Inhalte
377     %pause
378     "verkettete Liste"
379 root 1.6
380 root 1.3 %pause
381     Lösung 3: DBR-Links
382     %pause
383     Date-Based-Redirects
384 root 1.1
385 root 1.3 %page
386 root 1.1
387 root 1.3 Editions (1)
388 root 1.1
389 root 1.6
390     A-HREF + IMG-Element, zeigt auf activelink der nächsten
391     Edition.
392 root 1.1
393 root 1.3 %pause
394     Beispiel: Freesite "Freenet Explained"
395 root 1.1
396 root 1.6 %font "t5"
397 root 1.3 SSK@0OhV...oPAgM/fx/4//
398     # Link-Ziel
399     SSK@0OhV...oPAgM/fx/4//activelink.png
400     # IMG-SRC
401     %font "s"
402 root 1.1
403 root 1.3 %pause
404     Edition 4 existiert noch nicht
405     %pause
406     Editionen werden durchnummeriert
407     %pause
408     Für Spider: .next-Eintrag
409 root 1.1
410 root 1.3 %page
411 root 1.1
412 root 1.3 Editions (2)
413 root 1.1
414    
415 root 1.3 %pause
416     Vorteile:
417     %pause
418     "relativ" einfach für Autoren
419     %pause
420     realisierbar mit "Hausmittel"
421     %pause
422     keine Pflege notwendig
423     %pause
424 root 1.1
425 root 1.3 Nachteile:
426     %pause
427     umständlich in der Benutzung
428     %pause
429     "es ist und bleibt ein Hack"
430 root 1.1
431 root 1.3 %page
432 root 1.1
433 root 1.3 Date-Based-Redirects (1)
434 root 1.1
435    
436 root 1.3 Unterstützung spezieller Redirects
437     %pause
438 root 1.6 Timestamp statt fortlaufender Nummer
439 root 1.3 %pause
440 root 1.6 Spezielle Metadaten
441 root 1.3 %pause
442 root 1.1
443 root 1.3 Beispiel "The Freenet Help Index":
444     %pause
445 root 1.1
446 root 1.6 %font "t4"
447 root 1.3 'version' => { 'revision' => '1' },
448     'document' => [
449     { 'date_redirect' => {
450     'increment' => '15180',
451     'target' => 'SSK@rjY...8PAgM/FreenetHelp'
452 root 1.1 }
453 root 1.3 }
454     ],
455     %font "s"
456    
457     %page
458 root 1.1
459 root 1.3 Date-Based-Redirects (2)
460 root 1.1
461    
462 root 1.3 Vorteile:
463     %pause
464     einfach in der Benutzung
465     %pause
466 root 1.6 "sauber" über Metadaten implementiert
467 root 1.3 %pause
468     festgelegter Key
469     %pause
470 root 1.1
471 root 1.3 Nachteile:
472     %pause
473     feste Abstände zwischen Updates
474     %pause
475     häufige Pflege
476     %pause
477     keine inserts == keine Freesite
478 root 1.1
479 root 1.3 %page
480 root 1.1
481 root 1.4 DBRs in Perl
482 root 1.1
483 root 1.6
484     %font "t5"
485 root 1.3 %pause
486     my $D = $metadata->{document}[0];
487 root 1.4
488 root 1.3 %pause
489     my $incr = (hex $D->{increment}) || 86400;
490     my $offs = (hex $D->{offset}) || 0;
491     my $targ = $D->{target} || die;
492 root 1.4
493 root 1.3 %pause
494 root 1.4 my ($head, $tail) = split /\//, $targ, 2;
495 root 1.1
496 root 1.3 %pause
497     my $NOW = time;
498     my $time = $NOW - $NOW % $incr + $offs;
499     %pause
500     my $result = sprintf "%s/%x-%s",
501     $head, $time, $tail;
502     %pause
503     %font "t3"
504 root 1.1
505     SSK@rjYFfgPHfolmcStiaoxESFfBXz8PAgM/40a16900-FreenetHelp
506    
507 root 1.3 %page
508    
509     Effiziente Freenet-Abfragen
510 root 1.1
511 root 1.6
512 root 1.3 %pause
513     Problem:
514 root 1.6 Freenet == hohe Latenz
515 root 1.4 %pause
516 root 1.3 parallele Anfragen absolut notwendig
517 root 1.4 %pause
518 root 1.3 Implementation über Threads schlecht
519 root 1.4 %pause
520 root 1.3 Perl hat keine echten Threads
521    
522 root 1.4 %pause
523 root 1.6 %font "s"
524 root 1.3 Lösung:
525 root 1.4 %pause
526 root 1.6 Ereignisgesteuerung
527 root 1.4 %pause
528     Unterstützung für Coro, Event, Glib, Tk...
529 root 1.3
530     %page
531 root 1.1
532 root 1.4 Transaktionen
533    
534 root 1.6
535     %pause
536 root 1.4 Implementation von $fcp->client_get:
537 root 1.1
538 root 1.4 %pause
539     %font "t5"
540 root 1.1 my $txn = $fcp->txn_client_get (...);
541    
542 root 1.4 %pause
543     return $txn->result;
544    
545     %pause
546     %font "s"
547 root 1.6 Jeder FCP-Requesttyp besitzt eine txn_-Methode.
548 root 1.1
549 root 1.4 %pause
550     Parallelisierung:
551     %pause
552 root 1.1
553 root 1.4 %font "t5"
554 root 1.1 map $_->result,
555     map $_->txn_client_get ($_),
556     @download;
557    
558 root 1.4 %page
559 root 1.1
560 root 1.4 Asynchrone Abfragen
561 root 1.1
562    
563 root 1.4 %pause
564     Ziel: n ausstehende Anfragen zu jedem Zeitpunkt
565 root 1.1
566 root 1.4 %pause
567     Callback bei Beendigung
568 root 1.1
569    
570 root 1.4 %pause
571     %font "t5"
572     my $txn = $fcp->txn_client_get (...)
573     ->cb (\&callback);
574     %font "s"
575 root 1.1
576 root 1.4 %pause
577     txn-Methoden sind i.Allg. "chainbar"
578 root 1.1
579 root 1.4 %page
580 root 1.1
581 root 1.4 Hauptprogramm
582 root 1.1
583 root 1.6
584 root 1.4 Hauptprogramm muß in die Hauptschleife springen:
585 root 1.1
586 root 1.4 %font "t5"
587     use Net::FCP qw(event=Event);
588 root 1.1
589 root 1.4 %pause
590     my $fcp = new Net::FCP;
591     $fcp->txn_client_get ($_)->cb (\&finished)
592     for @ARGV;
593 root 1.1
594 root 1.4 %pause
595     Event::loop;
596 root 1.1
597 root 1.4 %font "s"
598     %pause
599     Angabe des Event-Moduls nur im Hauptprogramm
600 root 1.1
601 root 1.4 %page
602 root 1.1
603 root 1.6 Callback
604 root 1.1
605    
606 root 1.4 %font "t5"
607 root 1.6 %pause
608     sub finished {
609     my ($txn) = @_;
610 root 1.1
611 root 1.6 %pause
612     # .. neue txn starten
613 root 1.4
614 root 1.6 %pause
615     my ($meta, $data) = eval {
616     @{ $txn->result }
617     };
618 root 1.1
619 root 1.6 %pause
620     if ($@) {
621     warn "error $@, who cares :)"
622     } else {
623     warn "Lo and Behold! We got soemthing!";
624     # tue etwas
625     }
626 root 1.4 }
627 root 1.1
628 root 1.4 %page
629 root 1.1
630 root 1.4 Callbacks und Threads
631 root 1.1
632 root 1.6
633     Das Coro Modul ermöglicht es,
634     "Callback-Stil" und "Thread-Stil" zu mischen:
635 root 1.1
636 root 1.4 %pause
637 root 1.6 %font "t4"
638     use Net::FCP qw(event=Coro);
639 root 1.1
640 root 1.6 my $fcp = new Net::FCP;
641 root 1.1
642 root 1.6 # Achtung. Pseudocode :)
643     for my $url (@urls) {
644     async {
645     %pause
646     my ($meta, $data) = @{ $fcp->client_get ($url) };
647    
648     for (@alle_splitfile_blöcke) {
649     $fcp->txn_client_get (...)
650     ->cb (\&save_splitfile_block);
651     }
652     };
653     }
654 root 1.1
655 root 1.4 %page
656 root 1.1
657 root 1.4 Splitfiles
658 root 1.1
659    
660 root 1.6
661    
662 root 1.4 %pause
663     Zerteilen von großen Dateien in:
664 root 1.1
665 root 1.4 %pause
666     Segmente (max. 128MB)
667 root 1.1
668 root 1.4 %pause
669     Datenblöcke (max 1MB)
670 root 1.1
671 root 1.4 %pause
672     Checkblöcke (50% der Gesamtzahl)
673 root 1.1
674    
675 root 1.4 %page
676 root 1.1
677 root 1.4 Publizieren
678 root 1.1
679 root 1.6
680 root 1.4 Einfügen von Keys ist so einfach(?) wie auslesen
681 root 1.1
682 root 1.4 %pause
683     %font "t4"
684     $fcp->client_put ($uri, $meta, $data, $htl, $remove);
685     %font "s"
686 root 1.1
687 root 1.4 %pause
688     Parallelität mit txn_client_put
689     %pause
690     Key Collisions sind O.K.
691     %pause
692     Key wird automatisch erzeugt:
693 root 1.1
694 root 1.4 %pause
695     %font "t4"
696 root 1.6 my $attr = $fcp->client_put
697     ('CHK@', "", "Daten\n", 20);
698     print "Eingefügte URI: $attr->{uri}\n";
699 root 1.1
700 root 1.4 %pause
701     %font "t3"
702     => freenet:CHK@MT~LuxKHH8fugJehkcgp239h7C4KAwI,378rJzHVZbsQbd7VGMHxSg
703 root 1.1
704 root 1.4 %page
705 root 1.1
706 root 1.4 SSK-Keys generieren
707 root 1.1
708 root 1.6
709 root 1.4 SSK = Spezialfall von SVK
710 root 1.1
711 root 1.4 %pause
712     %font "t4"
713     my ($public, $private, $crypto)
714     = @{ $fcp->generate_svk_pair };
715     %font "s"
716 root 1.1
717 root 1.4 %pause
718     Einfüge- und Ausleseschlüssel:
719 root 1.1
720 root 1.4 %pause
721     %font "t4"
722     my $name = "..."; # beliebig
723     my $get = "SSK\@${public}PAgM,$crypto/$name";
724     %pause
725     my $put = "SSK\@$private,$crypto/$name";
726     %font "s"
727 root 1.6
728 root 1.4 %pause
729     Net::FCP::Key::SSK
730 root 1.1
731 root 1.4 %page
732 root 1.1
733 root 1.4 Erzeugen einer Freesite (1)
734 root 1.1
735 root 1.6
736 root 1.4 %pause
737     %font "t4"
738     perl -MNet::FCP -MNet::FCP::Key::SSK
739 root 1.6 -e 'Net::FCP::Key::SSK->new_from_fcp
740     (Net::FCP->new)
741 root 1.4 ->save ($ARGV[0])' mykey
742 root 1.1
743 root 1.6
744    
745     %font "t5"
746 root 1.4 %pause
747 root 1.6 # Definitionen
748     my $edition = 1;
749     my $keyfile = "mykey";
750     my $htl = 10;
751 root 1.1
752 root 1.4 %pause
753 root 1.6 # Module
754     use Net::FCP qw(event=Event);
755     use Net::FCP::Metadata;
756     use Net::FCP::Key::SSK;
757 root 1.1
758 root 1.4 %page
759    
760     Erzeugen einer Freesite (2)
761    
762 root 1.6
763 root 1.4 %font "t4"
764     %pause
765     # Notwendige Objekte erzeugen/laden
766     my $fcp = new Net::FCP;
767     my $ssk = new_from_file Net::FCP::Key::SSK $keyfile;
768    
769     %pause
770     \# Hilfsfunktion zum (asynchronen) Einfügen
771     sub add_key {
772     my ($name, $key, $meta, $data) = @_;
773    
774     $fcp->txn_client_put ($chk, $meta, $data, $htl, 1)
775     ->cb (sub {
776     eval {
777     my $attr = $_[0]->result;
778     } or warn "'$name': $@";
779     });
780     }
781 root 1.1
782 root 1.4 %page
783 root 1.1
784 root 1.4 Erzeugen einer Freesite (3)
785 root 1.1
786 root 1.6
787    
788 root 1.4 %font "t4"
789     \# Hilfsfunktion für Dateien
790     sub add_file {
791     my ($name, $path, $contenttype) = @_;
792    
793     # lies die Datei ein
794     my $data = ...
795    
796     my $chk = $fcp->generate_chk ("", $data);
797     $manifest->add_redirect ($name => $chk,
798     format => $contenttype);
799     add_key $name, $chk, "", $data;
800     }
801 root 1.1
802 root 1.4 %page
803 root 1.1
804 root 1.4 Erzeugen einer Freesite (4)
805 root 1.1
806 root 1.6
807 root 1.4 %font "t4"
808     \# Hauptprogramm: Manifest erzeugen
809 root 1.1
810 root 1.4 my $manifest = new Net::FCP::Metadata;
811 root 1.1
812 root 1.4 %pause
813     \# .prev-Link
814 root 1.6 $manifest->add_redirect (
815     ".prev" => $ssk->gen_pub ($edition - 1))
816 root 1.4 if $edition > 1;
817 root 1.1
818 root 1.4 %pause
819     \# .next-Link
820 root 1.6 $manifest->add_redirect (
821     ".next" => $ssk->gen_pub ($edition + 1));
822 root 1.1
823 root 1.4 %page
824 root 1.1
825 root 1.4 Erzeugen einer Freesite (5)
826 root 1.1
827 root 1.6
828 root 1.4 %font "t4"
829     \# Dateien hinzufügen
830 root 1.1
831 root 1.4 %pause
832     add_file "activelink.png" => "logo.png", "image/png";
833     add_file "" => "index.html", "text/html";
834     add_file "index.html" => "index.html", "text/html";
835     add_file "freesite" => "freesite", "text/plain";
836 root 1.1
837 root 1.4 %pause
838     \# Manifest einfügen
839     my $site = $ssk->gen_pub ($edition);
840 root 1.6
841 root 1.4 %pause
842     add_key "manifest", $site, $manifest, "";
843 root 1.1
844 root 1.4 %pause
845     print "site generated as $site//\n";
846 root 1.1
847 root 1.4 %pause
848     Event::loop;
849 root 1.1
850    
851 root 1.4 %page
852 root 1.1
853 root 1.4 Erzeugen einer Freesite (6)
854 root 1.1
855    
856 root 1.4 Ausgabe des Programms:
857 root 1.1
858 root 1.6 %font "t5"
859 root 1.4 %pause
860     site generated as SSK@wg...gPAgM,Jr...UO1g/1//
861     %pause
862     Insert of 'freesite' (1688 bytes) ok.
863     Insert of 'activelink.png' (1346 bytes) ok.
864     Insert of 'index.html' (200 bytes) ok.
865     Insert of '' (200 bytes) ok.
866     Insert of 'manifest' (0 bytes) ok.
867 root 1.1
868 root 1.4 %page
869 root 1.1
870 root 1.4 Fragen?
871 root 1.1
872    
873    
874