less debug output
[oweals/gnunet.git] / contrib / config.scm
1 ;; This is not a stand-alone guile application.
2 ;; It can only be executed from within gnunet-setup.
3 ;;
4 ;; GNUnet setup defines a function "build-tree-node"
5 ;; (with arguments section, option, description, help,
6 ;;  children, visible, value and range) which is
7 ;;  used by the script to create the configuration tree.
8 ;;
9 ;; GNUnet setup defines a function "change-visible"
10 ;; (with arguments context, section, option, yesno) which
11 ;;  can be used by the script to dynamically change the
12 ;;  visibility of options.
13 ;;
14 ;; GNUnet setup defines a function "get-option"
15 ;; (with arguments context, section, option) which
16 ;;  can be used to query the current value of an option.
17 ;;
18 ;; GNUnet setup defines a function "set-option"
19 ;; (with arguments context, section, option, value) which
20 ;;  can be used to set the value of an option.
21 ;;
22 ;;
23 ;; GNUnet setup requires two functions from this script.
24 ;; First, a function "gnunet-config-setup" which constructs the
25 ;; configuration tree.
26 ;;
27 ;; Second, a function "gnunet-config-change" which is notified whenever
28 ;; configuration options are changed; the script can then
29 ;; change the visibility of other options.
30
31
32 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
33
34 ;; for GNU gettext
35 (define (_ msg) msg)
36
37 ;; common string
38 (define (nohelp) 
39   (_ "No help available.") )
40
41 (define (nathelp)
42   (_ "You can use 'make check' in src/transports/upnp/ to find out if your NAT supports UPnP.  You should disable this option if you are sure that you are not behind a NAT.  If your NAT box does not support UPnP, having this on will not do much harm (only cost a small amount of resources).") )
43
44 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
45
46 ;; menu definitions
47
48 ;; meta-menu
49
50 (define (meta-exp builder) 
51  (builder
52    "Meta"
53    "EXPERIMENTAL"
54    (_ "Prompt for development and/or incomplete code")
55    (_
56 "If EXPERIMENTAL is set to NO, options for experimental code are not shown.  If in doubt, use NO.
57
58 Some options apply to experimental code that maybe in a state of development where the functionality, stability, or the level of testing is not yet high enough for general use.  These features are said to be of \"alpha\" quality.  If a feature is currently in alpha, uninformed use is discouraged (since the developers then do not fancy \"Why doesn't this work?\" type messages).
59
60 However, active testing and qualified feedback of these features is always welcome.  Users should just be aware that alpha features may not meet the normal level of reliability or it may fail to work in some special cases.  Bug reports are usually welcomed by the developers, but please read the documents <file://README> and <http://gnunet.org/faq.php3> and use <https://gnunet.org/mantis/> for how to report problems." )
61    '()
62    #t
63    #f
64    #f
65    'advanced) )
66
67 (define (meta-adv builder) 
68  (builder
69    "Meta"
70    "ADVANCED"
71    (_ "Show options for advanced users")
72    (_
73 "These are options that maybe difficult to understand for the beginner. These options typically refer to features that allow tweaking of the installation.  If in a hurry, say NO." )
74    '()
75    #t
76    #t
77    #f
78    'always) )
79
80 (define (meta-rare builder) 
81  (builder
82   "Meta"
83    "RARE"
84    (_ "Show rarely used options")
85    (_
86 "These are options that hardly anyone actually needs.  If you plan on doing development on GNUnet, you may want to look into these.  If in doubt or in a hurry, say NO." )
87    '()
88    #t
89    #t
90    #f
91    'advanced) )
92
93 (define (meta builder)
94  (builder
95    "Meta"
96    "" 
97    (_ "Meta-configuration") 
98    (_ "Which level of configuration should be available")
99    (list 
100      (meta-adv builder) 
101      (meta-rare builder)
102      (meta-exp builder)
103    )
104    #t
105    #f
106    #f
107    'always) )
108
109 ;; fundamentals
110
111 (define (paths-home builder)
112  (builder
113   "PATHS"
114   "GNUNETD_HOME"
115   (_ "Full pathname of GNUnet HOME directory")
116   (_ 
117 "This gives the root-directory of the GNUnet installation. Make sure there is some space left in that directory. :-)  Users inserting or indexing files will be able to store data in this directory up to the (global) quota specified below.  Having a few gigabytes of free space is recommended." ) 
118   '()
119   #t
120   "/var/lib/gnunet"
121   '()
122   'always) )
123
124 ;; General menu
125
126 (define (fs-path builder)
127  (builder
128   "FS"
129   "DIR"
130   (_ "Full pathname of GNUnet directory for file-sharing data")
131   (nohelp) 
132   '()
133   #t
134   "$GNUNETD_HOME/data/fs"
135   '()
136   'always) )
137
138 (define (kv-path builder)
139  (builder
140   "KEYVALUE_DATABASE"
141   "DIR"
142   (_ "Full pathname to the directory with the key-value database")
143   (_ "Note that the kvstore is currently not used.") 
144   '()
145   #f
146   "$GNUNETD_HOME/kvstore/"
147   '()
148   'never) )
149
150 (define (index-path builder)
151  (builder
152   "FS"
153   "INDEX-DIRECTORY"
154   (_ "Full pathname of GNUnet directory for indexed files symbolic links")
155   (nohelp) 
156   '()
157   #t
158   "$GNUNETD_HOME/data/shared"
159   '()
160   'always) )
161
162 (define (general-helloexpires builder)
163  (builder
164   "GNUNETD"
165   "HELLOEXPIRES"
166   (_ "How many minutes should peer advertisements last?")
167   (_ 
168 "How many minutes is the current IP valid?  (GNUnet will sign HELLO messages with this expiration timeline. If you are on dialup, 60 (for 1 hour) is suggested. If you have a static IP address, you may want to set this to a large value (say 14400).  The default is 1440 (1 day). If your IP changes periodically, you will want to choose an expiry period smaller than the frequency with which your IP changes." )
169   '()
170   #t
171   1440
172   (cons 1 14400)
173   'advanced) )
174
175 (define (general-hostlisturl builder)
176  (builder
177   "GNUNETD"
178   "HOSTLISTURL"
179   (_ "Where can GNUnet find an initial list of peers?")
180   (_ 
181 "GNUnet can automatically update the hostlist from the web. While GNUnet internally communicates which hosts are online, it is typically a good idea to get a fresh hostlist whenever gnunetd starts from the WEB. By setting this option, you can specify from which server gnunetd should try to download the hostlist. The default should be fine for now.
182                 
183 The general format is a list of space-separated URLs.  Each URL must have the format http://HOSTNAME/FILENAME
184                 
185 If you want to setup an alternate hostlist server, you must run a permanent node and \"cat data/hosts/* > hostlist\" every few minutes to keep the list up-to-date.
186                 
187 If you do not specify a HOSTLISTURL, you must copy valid hostkeys to data/hosts manually.")
188   '()
189   #t
190   "http://gnunet.org/hostlist.php http://gnunet.mine.nu:8081/hostlist http://vserver1236.vserver-on.de/hostlist-074"
191   '()
192   'always) )
193
194 (define (general-http-proxy builder)
195  (builder
196   "GNUNETD"
197   "HTTP-PROXY"
198   (_ "HTTP Proxy Server")
199   (_ 
200 "If you have to use a proxy for outbound HTTP connections, specify the proxy configuration here.  Default is no proxy." )
201   '()
202   #t
203   ""
204   '()
205   'advanced) )
206
207
208 (define (general-hosts builder)
209  (builder
210   "GNUNETD"
211   "HOSTS"
212   (_ "Name of the directory where gnunetd should store contact information about peers")
213   (_ 
214 "Unless you want to share the directory directly using a webserver, the default is most likely just fine." )
215   '()
216   #t
217   "$GNUNETD_HOME/data/hosts/"
218   '()
219   'rare) )
220
221
222 ;; logging options
223
224 (define (log-level description option builder)
225  (builder
226    "LOGGING"
227    option
228    description
229    (nohelp)
230    '()
231    #t
232    "WARNING"
233    (list "SC" "NOTHING" "FATAL" "ERROR" "WARNING" "INFO" "STATUS" "DEBUG")
234    'always))
235
236 (define (log-keeplog builder)
237  (builder
238   "GNUNETD"
239   "KEEPLOG"
240   (_ "How long should logs be kept?")
241   (_ 
242 "How long should logs be kept? If you specify a value greater than zero, a log is created each day with the date appended to its filename. These logs are deleted after $KEEPLOG days.  To keep logs forever, set this value to 0." )
243   '()
244   #t
245   3
246   (cons 0 36500)
247   'advanced) )
248
249 (define (daemon-fdlimit builder)
250  (builder
251   "GNUNETD"
252   "FDLIMIT"
253   (_ "What maximum number of open file descriptors should be requested from the OS?")
254   (_ 
255 "The default of 1024 should be fine for most systems.  If your system can support more, increasing the number might help support additional clients on machines with plenty of bandwidth.  For embedded systems, a smaller number might be acceptable.  A value of 0 will leave the descriptor limit untouched.  This option is mostly for OS X systems where the default is too low.  Note that if gnunetd cannot obtain the desired number of file descriptors from the operating system, it will print a warning and try to run with what it is given." )
256   '()
257   #t
258   1024
259   (cons 64 65536)
260   'rare) )
261
262 (define (log-logfile builder)
263  (builder
264   "GNUNETD"
265   "LOGFILE"
266   (_ "Where should gnunetd write the logs?")
267   (nohelp)
268   '()
269   #f
270   "$GNUNETD_HOME/daemon-logs"
271   '()
272   'rare) )
273
274 (define (log-devel builder)
275  (builder
276   "LOGGING"
277   "DEVELOPER"
278   (_ "Enable for extra-verbose logging.")
279   (nohelp)
280   '()
281   #f
282   #f
283   #f
284   'rare) )
285
286 (define (logging builder)
287  (builder
288    "LOGGING"
289    "" 
290    (_ "Logging") 
291    (_ "Specify which system messages should be logged how")
292    (list 
293      (log-keeplog builder)
294      (log-logfile builder)
295      (log-devel builder)
296      (log-level (_ "Logging of events for users") "USER-LEVEL" builder) 
297      (log-level (_ "Logging of events for the system administrator") "ADMIN-LEVEL" builder) 
298    )
299    #t
300    #f
301    #f
302    'advanced) )
303
304  
305 (define (general-pidfile builder)
306  (builder
307   "GNUNETD"
308   "PIDFILE"
309   (_ "Where should gnunetd write the PID?")
310   (_ "The default is no longer /var/run/gnunetd.pid since we could not delete the file on shutdown at that location." )
311   '()
312   #f
313   "/var/run/gnunetd/pid"
314   '()
315   'rare) )
316
317
318 (define (general-username builder)
319  (builder
320   "GNUNETD"
321   "USER"
322   (_ "As which user should gnunetd run?")
323   (_ 
324 "Empty means \"current user\". On computer startup, it is root/SYSTEM.  Under Windows, this setting affects the creation of a new system service only.")
325   '()
326   #f
327   ""
328   '()
329   'advanced) )
330  
331
332
333 (define (general-autostart builder)
334  (builder
335  "GNUNETD"
336  "AUTOSTART"
337  (_ "Should gnunetd be automatically started when the system boots?")
338  (_ "Set to YES if gnunetd should be automatically started on boot.  If this option is set, gnunet-setup will install a script to start the daemon upon completion.  This option may not work on all systems.")
339  '()
340  #t
341  #f
342  #f
343  'rare) )
344
345
346 (define (general-transports builder)
347  (builder
348   "GNUNETD"
349   "TRANSPORTS"
350   (_ "Which transport mechanisms should GNUnet use?")
351   (_ 
352 "Use a space-separated list of modules, e.g.  \"udp smtp tcp\".  The available transports are udp, tcp, http, smtp and nat.
353                 
354 Loading the 'nat' and 'tcp' modules is required for peers behind NAT boxes that cannot directly be reached from the outside.  Peers that are NOT behind a NAT box and that want to *allow* peers that ARE behind a NAT box to connect must ALSO load the 'nat' module.  Note that the actual transfer will always be via tcp initiated by the peer behind the NAT box.  The nat transport requires the use of tcp, http and/or smtp in addition to nat itself.")
355   '()
356   #t
357   "udp tcp http nat"
358   (list "MC" "udp" "tcp" "nat" "http" "smtp")
359   'always) )
360  
361
362 (define (general-applications builder)
363  (builder
364   "GNUNETD"
365   "APPLICATIONS"
366   (_ "Which applications should gnunetd support?")
367   (_ 
368 "Whenever this option is changed, you MUST run gnunet-update. Currently, the available applications are:
369
370 advertising: advertises your peer to other peers. Without it, your peer will not participate in informing peers about other peers.  You should always load this module.
371
372 getoption:  allows clients to query gnunetd about the values of various configuration options.  Many tools need this.  You should always load this module.
373
374 stats: allows tools like gnunet-stats and gnunet-gtk to query gnunetd about various statistics.  This information is usually quite useful to diagnose errors, hence it is recommended that you load this module.
375
376 traffic: keeps track of how many messages were recently received and transmitted.  This information can then be used to establish how much cover traffic is currently available.  The amount of cover traffic becomes important if you want to make anonymous requests with an anonymity level that is greater than one.  It is recommended that you load this module.
377
378 fs: needed for anonymous file sharing. You should always load this module.
379
380 hostlist: integrated hostlist HTTP server.  Useful if you want to offer a hostlist and running Apache would be overkill.
381
382 chat: broadcast chat (demo-application, ALPHA quality). Required for gnunet-chat.  Note that the current implementation of chat is not considered to be secure.
383
384 tbench: benchmark transport performance.  Required for gnunet-tbench.  Note that tbench allows other users to abuse your resources.
385
386 tracekit: topology visualization toolkit.  Required for gnunet-tracekit. Note that loading tracekit will make it slightly easier for an adversary to compromise your anonymity." )
387   '()
388   #t
389   "advertising getoption fs stats traffic"
390   (list "MC" "advertising" "getoption" "fs" "hostlist" "stats" "traffic" "dht" "tracekit" "tbench" "vpn" "chat")
391   'always) )
392  
393
394
395 (define (tcpserver-disable builder)
396  (builder
397  "TCPSERVER"
398  "DISABLE"
399  (_ "Disable client-server connections")
400  (_ "This option can be used to tell gnunetd not to open the client port.  When run like this, gnunetd will participate as a peer in the network but not support any user interfaces.  This may be useful for headless systems that are never expected to have end-user interactions.  Note that this will also prevent you from running diagnostic tools like gnunet-stats!")
401  '()
402  #t
403  #f
404  #f
405  'rare) )
406
407
408 (define (gnunetd-disable-ipv6 builder)
409  (builder
410  "GNUNETD"
411  "DISABLE-IPV6"
412  (_ "YES disables IPv6 support, NO enables IPv6 support")
413  (_ "This option may be useful on peers where the kernel does not support IPv6.  You might also want to set this option if you do not have an IPv6 network connection.")
414  '()
415  #t
416  #t
417  #t
418  'advanced) )
419
420
421 (define (gnunetd-private-network builder)
422  (builder
423  "GNUNETD"
424  "PRIVATE-NETWORK"
425  (_ "Disable peer discovery")
426  (_ "The option 'PRIVATE-NETWORK' can be used to limit the connections of this peer to peers of which the hostkey has been copied by hand to data/hosts;  if this option is given, GNUnet will not accept advertisements of peers that the local node does not already know about.  Note that in order for this option to work, HOSTLISTURL should either not be set at all or be set to a trusted peer that only advertises the private network. Also, the option does NOT work at the moment if the NAT transport is loaded; for that, a couple of lines above would need some minor editing :-).")
427  '()
428  #t
429  #f
430  #f
431  'rare) )
432
433 (define (network-disable-advertising builder)
434  (builder
435  "NETWORK"
436  "DISABLE-ADVERTISEMENTS"
437  (_ "Disable advertising this peer to other peers")
438  (nohelp)
439  '()
440  #t
441  #f
442  #f
443  'rare) )
444
445 (define (network-disable-autoconnect builder)
446  (builder
447  "NETWORK"
448  "DISABLE-AUTOCONNECT"
449  (_ "Disable automatic establishment of connections")
450  (_ "If this option is enabled, GNUnet will not automatically establish connections to other peers, but instead wait for applications to specifically request connections to other peers (or for other peers to connect to us).")
451  '()
452  #t
453  #f
454  #f
455  'experimental) )
456
457 (define (network-disable-helloexchange builder)
458  (builder
459  "NETWORK"
460  "HELLOEXCHANGE"
461  (_ "Enable advertising of other peers by this peer")
462  (_ "This option may be useful during testing, but turning it off is dangerous! If in any doubt, set it to YES (which is the default).")
463  '()
464  #t
465  #t
466  #t
467  'experimental) )
468
469 (define (network-port builder)
470  (builder
471  "NETWORK"
472  "PORT"
473  (_ "Port for communication with GNUnet user interfaces")
474  (_ "Which is the client-server port that is used between gnunetd and the clients (TCP only).  You may firewall this port for non-local machines (but you do not have to since GNUnet will perform access control and only allow connections from machines that are listed under TRUSTED).")
475  '()
476  #t
477  2087
478  (cons 1 65535)
479  'advanced) )
480
481 (define (hostlist-port builder)
482  (builder
483  "HOSTLIST"
484  "PORT"
485  (_ "Port for the integrated hostlist HTTP server")
486  (nohelp)
487  '()
488  #t
489  8080
490  (cons 1 65535)
491  'hostlist-loaded) )
492
493 (define (network-trusted builder)
494  (builder
495  "NETWORK"
496  "TRUSTED"
497  (_ "IPv4 networks allowed to use gnunetd server")
498  (_ "This option specifies which hosts are trusted enough to connect as clients (to the TCP port).  This is useful if you run gnunetd on one host of your network and want to allow all other hosts to use this node as their server.  By default, this is set to 'loopback only'.  The format is IP/NETMASK where the IP is specified in dotted-decimal and the netmask either in CIDR notation (/16) or in dotted decimal (255.255.0.0). Several entries must be separated by a semicolon, spaces are not allowed.")
499  '()
500  #t
501  "127.0.0.0/8;"
502  '()
503  'advanced) )
504
505 (define (network-trusted6 builder)
506  (builder
507  "NETWORK"
508  "TRUSTED6"
509  (_ "IPv6 networks allowed to use gnunetd server")
510  (_ "This option specifies which hosts are trusted enough to connect as clients (to the TCP port).  This is useful if you run gnunetd on one host of your network and want to allow all other hosts to use this node as their server.  By default, this is set to 'loopback only'.  The format is IP/NETMASK where the IP is specified in dotted-decimal and the netmask either in CIDR notation (/16) or in dotted decimal (255.255.0.0). Several entries must be separated by a semicolon, spaces are not allowed.")
511  '()
512  #t
513  "::1;"
514  '()
515  'ipv6) )
516
517
518 (define (limit-allow builder)
519  (builder
520  "GNUNETD"
521  "LIMIT-ALLOW"
522  (_ "Limit connections to the specfied set of peers.")
523  (_ "If this option is not set, any peer is allowed to connect.  If it is set, only the specified peers are allowed. Specify the list of peer IDs (not IPs!)")
524  '()
525  #t
526  ""
527  '()
528  'rare))
529
530 (define (general-groupname builder)
531  (builder
532  "GNUNETD"
533  "GROUP"
534  (_ "Run gnunetd as this group.")
535  (_ "When started as root, gnunetd will change permissions to the given group.")
536  '()
537  #t
538  "gnunetd"
539  '()
540  'advanced))
541
542 (define (limit-deny builder)
543  (builder
544  "GNUNETD"
545  "LIMIT-DENY"
546  (_ "Prevent the specfied set of peers from connecting.")
547  (_ "If this option is not set, any peer is allowed to connect.  If the ID of a peer is listed here, connections from that peer will be refused.  Specify the list of peer IDs (not IPs!)")
548  '()
549  #t
550  ""
551  '()
552  'rare))
553
554 (define (advertising builder)
555  (builder
556   "ADVERTISING"
557   ""
558  (_ "Topology Maintenance")
559  (_ "Rarely used settings for peer advertisements and connections")
560  (list
561     (general-helloexpires builder) 
562     (tcpserver-disable builder) 
563     (gnunetd-private-network builder) 
564     (network-disable-advertising builder) 
565     (network-disable-helloexchange builder) 
566     (network-disable-autoconnect builder) 
567     (limit-allow builder) 
568     (limit-deny builder) 
569  )
570   #t
571   #f
572   #f
573   'rare) )
574
575 (define (general builder)
576  (builder
577   "GNUNETD"
578   ""
579   (_ "General settings")
580   (_ "Settings that change the behavior of GNUnet in general")
581   (list 
582     (network-port builder) 
583     (hostlist-port builder)
584     (network-trusted builder) 
585     (general-hostlisturl builder)
586     (general-hosts builder)
587     (general-http-proxy builder)
588     (f2f builder) 
589     (fs-path builder) 
590     (index-path builder) 
591     (daemon-fdlimit builder) 
592     (gnunetd-disable-ipv6 builder) 
593     (general-username builder) 
594     (general-groupname builder) 
595     (general-pidfile builder) 
596     (general-autostart builder) 
597   )
598   #t
599   #f
600   #f
601   'always) )
602
603 (define (modules builder)
604  (builder
605   "MODULES"
606   ""
607   (_ "Modules")
608   (_ "Settings that select specific implementations for GNUnet modules")
609   (list 
610     (modules-sqstore builder) 
611     (modules-dstore builder) 
612     (modules-topology builder) 
613   )
614   #t
615   #f
616   #f
617   'advanced) )
618
619
620
621
622 (define (fundamentals builder)
623  (builder
624   "PATHS"
625   ""
626   (_ "Fundamentals")
627   ""
628   (list 
629     (paths-home builder) 
630     (general-applications builder) 
631     (general-transports builder) 
632     (modules builder) 
633   )
634   #t
635   #f
636   #f
637   'always) )
638
639
640 ;; modules menu
641
642 (define (modules-sqstore builder)
643  (builder
644   "MODULES"
645   "sqstore"
646   (_ "Which database should be used?")
647   (_ 
648 "Which database should be used?  The options are \"sqstore_sqlite\", \"sqstore_postgres\" and \"sqstore_mysql\".  You must run gnunet-update after changing this value!
649                         
650 In order to use MySQL or Postgres, you must configure the respective database, which is relatively simple.  Read the file doc/README.mysql or doc/README.postgres for how to setup the respective database." )
651   '()
652   #t
653   "sqstore_sqlite"
654   (list "SC" "sqstore_sqlite" "sqstore_postgres" "sqstore_mysql")
655   'fs-loaded) )
656
657 (define (modules-dstore builder)
658  (builder
659   "MODULES"
660   "dstore"
661   (_ "Which topology should be used?")
662   (_ "Which database should be used for the temporary datastore of the DHT?" )
663   '()
664   #t
665   "dstore_sqlite"
666   (list "SC" "dstore_sqlite" "dstore_mysql")
667   'advanced) )
668
669
670 (define (modules-topology builder)
671  (builder
672   "MODULES"
673   "topology"
674   (_ "Which topology should be used?")
675   (_ 
676 "Which topology should be used?  The only option at the moment is \"topology_default\"" )
677   '()
678   #t
679   "topology_default"
680   (list "SC" "topology_default")
681   'rare) )
682
683
684 ;; f2f menu
685
686 (define (f2f-minimum builder)
687  (builder
688  "F2F"
689  "MINIMUM"
690  (_ "The minimum number of connected friends before this peer is allowed to connect to peers that are not listed as friends")
691  (_ "Note that this option does not guarantee that the peer will be able to connect to the specified number of friends.  Also, if the peer had connected to a sufficient number of friends and then established non-friend connections, some of the friends may drop out of the network, temporarily resulting in having fewer than the specified number of friends connected while being connected to non-friends.  However, it is guaranteed that the peer itself will never choose to drop a friend's connection if this would result in dropping below the specified number of friends (unless that number is higher than the overall connection target).")
692  '()
693  #t
694  0
695  (cons 0 1024)
696  'f2fr) )
697
698 (define (f2f-restrict builder)
699  (builder
700  "F2F"
701  "FRIENDS-ONLY"
702  (_ "If set to YES, the peer is only allowed to connect to other peers that are explicitly specified as friends")
703  (_ "Use YES only if you have (trustworthy) friends that use GNUnet and are afraid of establishing (direct) connections to unknown peers")
704  '()
705  #t
706  #f
707  #f
708  'advanced) )
709
710 (define (f2f-friends builder)
711  (builder
712   "F2F"
713   "FRIENDS"
714   (_ "List of friends for friend-to-friend topology")
715   (_ "Specifies the name of a file which contains a list of GNUnet peer IDs that are friends.  If used with the friend-to-friend topology, this will ensure that GNUnet only connects to these peers (via any available transport).")
716   '()
717   #f
718   "$GNUNETD_HOME/friends"
719   '()
720   'f2f) )
721
722 (define (f2f builder)
723  (builder
724   "F2F"
725   ""
726  (_ "Friend-to-Friend Topology Specification")
727  (_ "Settings for restricting connections to friends")
728  (list
729     (f2f-restrict builder) 
730     (f2f-minimum builder) 
731     (f2f-friends builder) 
732  )
733   #t
734   #f
735   #f
736   'advanced) )
737
738 ;; mysql menu
739
740 (define (mysql-database builder)
741  (builder
742   "MYSQL"
743   "DATABASE"
744   (_ "Name of the MySQL database GNUnet should use")
745   (nohelp) 
746   '()
747   #t
748   "gnunet"
749   '()
750   'mysql) )
751
752 (define (mysql-config builder)
753  (builder
754   "MYSQL"
755   "CONFIG"
756   (_ "Configuration file that specifies the MySQL username and password")
757   (nohelp) 
758   '()
759   #t
760   "/etc/my.cnf"
761   '()
762   'mysql) )
763
764 (define (mysql builder)
765  (builder
766   "MYSQL"
767   ""
768   (_ "Configuration of the MySQL database")
769   (nohelp)
770   (list
771     (mysql-config builder)
772     (mysql-database builder)
773   )
774   #t
775   #f
776   #f
777   'mysql) )
778  
779
780
781 ;; applications menu
782
783 (define (fs-quota builder)
784  (builder
785   "FS"
786   "QUOTA"
787   (_ "MB of diskspace GNUnet can use for anonymous file sharing")
788   (_
789 "How much disk space (MB) is GNUnet allowed to use for anonymous file sharing?  This does not take indexed files into account, only the space directly used by GNUnet is accounted for.  GNUnet will gather content from the network if the current space-consumption is below the number given here (and if content migration is allowed below).
790
791 Note that if you change the quota, you need to run gnunet-update afterwards.")
792   '()
793   #t
794   1024
795   (cons 1 1000000)
796   'always))
797
798
799 (define (fs-migration-buffer builder)
800  (builder
801   "FS"
802   "MIGRATIONBUFFERSIZE"
803   (_ "Number of entries in the migration buffer")
804   (_ "Each entry uses about 32k of memory.  More entries can reduce disk IO and CPU usage at the expense of having gnunetd use more memory. Very large values may again increase CPU usage.  A value of 0 will prevent your peer from sending unsolicited responses.")
805   '()
806   #t
807   64
808   (cons 0 1048576)
809   'always))
810
811
812 (define (fs-gap-tablesize builder)
813  (builder
814   "GAP"
815   "TABLESIZE"
816   (_ "Size of the routing table for anonymous routing.")
817   (nohelp)
818   '()
819   #t
820   65536
821   (cons 1024 1048576)
822   'rare))
823
824 (define (fs-dht-tablesize builder)
825  (builder
826   "DHT"
827   "TABLESIZE"
828   (_ "Size of the routing table for DHT routing.")
829   (nohelp)
830   '()
831   #t
832   1024
833   (cons 128 1048576)
834   'rare))
835
836
837 (define (fs-activemigration builder)
838  (builder
839   "FS"
840   "ACTIVEMIGRATION"
841   (_ "Allow migrating content to this peer.")
842   (_ 
843 "If you say yes here, GNUnet will migrate content to your server, and you will not be able to control what data is stored on your machine. 
844                         
845 If you activate it, you can claim for *all* the non-indexed (-n to gnunet-insert) content that you did not know what it was even if an adversary takes control of your machine.  If you do not activate it, it is obvious that you have knowledge of all the content that is hosted on your machine and thus can be considered liable for it.")
846   '()
847   #t
848   #f
849   #f
850   'advanced))
851
852
853 (define (dstore-quota builder)
854  (builder
855   "DSTORE"
856   "QUOTA"
857   (_ "MB of diskspace GNUnet can use for caching DHT index data (the data will be stored in /tmp)")
858   (_ "DHT index data is inherently small and expires comparatively quickly.  It is deleted whenever gnunetd is shut down.
859
860 The size of the DSTORE QUOTA is specified in MB.")
861   '()
862   #t
863   1
864   (cons 1 1024)
865   'rare))
866  
867
868 (define (fs builder)
869  (builder
870   "FS"
871   ""
872   (_ "Options for anonymous file sharing")
873   (nohelp)
874   (list
875     (fs-quota builder)
876     (fs-activemigration builder)
877     (fs-gap-tablesize builder)
878     (fs-dht-tablesize builder)
879     (dstore-quota builder)
880     (mysql builder)
881   )
882   #t
883   #t
884   #f
885   'fs-loaded))
886
887 (define (applications builder)
888  (builder
889   ""
890   ""
891   (_ "Applications")
892   (nohelp)
893   (list 
894     (fs builder)
895   )
896   #t
897   #f
898   #f
899   'always) )
900
901 ;; transport menus
902
903 (define (nat builder)
904  (builder
905  "NAT"
906  "LIMITED"
907  (_ "Is this machine unreachable behind a NAT?")
908  (_ "Set to YES if this machine is behind a NAT that limits connections from the outside to the GNUnet port and that cannot be traversed using UPnP. Note that if you have configured your NAT box to allow direct connections from other machines to the GNUnet ports or if GNUnet can open ports using UPnP, you should set the option to NO. Set this only to YES if other peers cannot contact you directly. You can use 'make check' in src/transports/upnp/ to find out if your NAT supports UPnP. You can also use gnunet-transport-check with the '-p' option in order to determine which setting results in more connections.  Use YES only if you get no connections otherwise. Set to AUTO to use YES if the local IP is belongs to a private IP network and NO otherwise.")
909  '()
910  #t
911  "AUTO"
912  (list "SC" "YES" "AUTO" "NO")
913  'nat-loaded) )
914
915 (define (tcp-port builder)
916  (builder
917  "TCP"
918  "PORT"
919  (_ "Which port should be used by the TCP IPv4 transport?")
920  (nohelp)
921  '()
922  #t
923  2086
924  (cons 0 65535)
925  'advanced))
926
927 (define (tcp-upnp builder)
928  (builder
929  "TCP"
930  "UPNP"
931  (_ "Should we try to determine our external IP using UPnP?")
932  (nathelp)
933  '()
934  #t
935  #t
936  #f
937  'tcp-loaded))
938
939 (define (tcp-blacklist builder)
940  (builder
941  "TCP"
942  "BLACKLISTV4"
943  (_ "Which IP(v4)s are not allowed to connect?")
944  (nohelp)
945  '()
946  #t
947  "127.0.0.1;"
948  '()
949  'advanced))
950
951 (define (tcp-whitelist builder)
952  (builder
953  "TCP"
954  "WHITELISTV4"
955  (_ "Which IP(v4)s are allowed to connect? Leave empty to use the IP of your primary network interface.")
956  (nohelp)
957  '()
958  #t
959  ""
960  '()
961  'advanced))
962
963 (define (tcp6-blacklist builder)
964  (builder
965  "TCP"
966  "BLACKLISTV6"
967  (_ "Which IPv6s are not allowed to connect?")
968  (nohelp)
969  '()
970  #t
971  ""
972  '()
973  'ipv6))
974
975 (define (tcp6-whitelist builder)
976  (builder
977  "TCP"
978  "WHITELISTV6"
979  (_ "Which IPv6s are allowed to connect? Leave empty to allow any IP to connect.")
980  (nohelp)
981  '()
982  #t
983  ""
984  '()
985  'ipv6))
986
987
988 (define (tcp builder)
989  (builder
990  "TCP"
991  ""
992  (_ "TCP transport")
993  (nohelp)
994  (list 
995    (tcp-port builder)
996    (tcp-upnp builder)
997    (tcp-blacklist builder)
998    (tcp-whitelist builder)
999    (tcp6-blacklist builder)
1000    (tcp6-whitelist builder)
1001  )
1002  #t
1003  #f
1004  #f
1005  'tcp-loaded) )
1006
1007
1008 (define (http-port builder)
1009  (builder
1010  "HTTP"
1011  "PORT"
1012  (_ "Which port should be used by the HTTP transport?")
1013  (nohelp)
1014  '()
1015  #t
1016  1080
1017  (cons 0 65535)
1018  'advanced))
1019
1020 (define (http-upnp builder)
1021  (builder
1022  "HTTP"
1023  "UPNP"
1024  (_ "Should we try to determine our external IP using UPnP?")
1025  (nathelp)
1026  '()
1027  #t
1028  #t
1029  #f
1030  'http-port-nz))
1031
1032 (define (http-advertised-port builder)
1033  (builder
1034  "HTTP"
1035  "ADVERTISED-PORT"
1036  (_ "Which is the external port of the HTTP transport?")
1037  (_ "Use this option if your firewall maps, say, port 80 to your real HTTP port.  This can be useful in making the HTTP messages appear even more legit (without needing to run gnunetd as root due to the use of a privileged port).")
1038  '()
1039  #t
1040  80
1041  (cons 0 65535)
1042  'advanced))
1043
1044 (define (http builder)
1045  (builder
1046  "HTTP"
1047  ""
1048  (_ "HTTP transport")
1049  (nohelp)
1050  (list 
1051    (http-port builder)
1052    (http-advertised-port builder)
1053    (http-upnp builder)
1054  )
1055  #t
1056  #f
1057  #f
1058  'http-loaded) )
1059
1060
1061
1062
1063 (define (smtp-mtu builder)
1064  (builder
1065  "SMTP"
1066  "MTU"
1067  (_ "What is the maximum transfer unit for SMTP?")
1068  (nohelp)
1069  '()
1070  #t
1071  65528
1072  (cons 1200 65528)
1073  'smtp-loaded))
1074
1075 (define (smtp-ratelimit builder)
1076  (builder
1077  "SMTP"
1078  "RATELIMIT"
1079  (_ "What is the maximum number of e-mails that gnunetd would be allowed to send per hour?")
1080  (_ "Use 0 for unlimited")
1081  '()
1082  #t
1083  0
1084  (cons 0 1048576)
1085  'smtp-loaded))
1086
1087 (define (smtp-email builder)
1088  (builder
1089  "SMTP"
1090  "EMAIL"
1091  (_ "Which e-mail address should be used to send e-mail to this peer?")
1092  (_ "You must make sure that e-mail received at this address is forwarded to the PIPE which is read by gnunetd.  Use the FILTER option to filter e-mail with procmail and the PIPE option to set the name of the pipe.")
1093  '()
1094  #t
1095  "gnunet@localhost"
1096  '()
1097  'smtp-loaded))
1098
1099 (define (smtp-filter builder)
1100  (builder
1101  "SMTP"
1102  "FILTER"
1103  (_ "Which header line should other peers include in e-mails to enable filtering?")
1104  (_ "You can specify a header line here which can then be used by procmail to filter GNUnet e-mail from your inbox and forward it to gnunetd.")
1105  '()
1106  #t
1107  "X-mailer: GNUnet"
1108  '()
1109  'smtp-loaded))
1110
1111 (define (smtp-pipe builder)
1112  (builder
1113  "SMTP"
1114  "PIPE"
1115  (_ "What is the filename of the pipe where gnunetd can read its e-mail?")
1116  (_ "Have a look at contrib/dot-procmailrc for an example .procmailrc file.")
1117  '()
1118  #t
1119  "$GNUNETD_HOME/smtp-pipe"
1120  '()
1121  'smtp-loaded))
1122
1123 (define (smtp-server builder)
1124  (builder
1125  "SMTP"
1126  "SERVER"
1127  (_ "What is the name and port of the server for outgoing e-mail?")
1128  (_ "The basic format is HOSTNAME:PORT.")
1129  '()
1130  #t
1131  "localhost:25"
1132  '()
1133  'smtp-loaded))
1134
1135 (define (smtp builder)
1136  (builder
1137  "SMTP"
1138  ""
1139  (_ "SMTP transport")
1140  (nohelp)
1141  (list 
1142    (smtp-email builder)
1143    (smtp-ratelimit builder)
1144    (smtp-filter builder)
1145    (smtp-pipe builder)
1146    (smtp-server builder)
1147    (smtp-mtu builder)
1148  )
1149  #t
1150  #f
1151  #f
1152  'smtp-loaded) )
1153
1154
1155
1156
1157
1158 (define (udp-port builder)
1159  (builder
1160  "UDP"
1161  "PORT"
1162  (_ "Which port should be used by the UDP IPv4 transport?")
1163  (nohelp)
1164  '()
1165  #t
1166  2086
1167  (cons 0 65535)
1168  'advanced))
1169
1170 (define (udp-upnp builder)
1171  (builder
1172  "UDP"
1173  "UPNP"
1174  (_ "Should we try to determine our external IP using UPnP?")
1175  (nathelp)
1176  '()
1177  #t
1178  #t
1179  #f
1180  'udp-port-nz))
1181
1182 (define (udp-mtu builder)
1183  (builder
1184  "UDP"
1185  "MTU"
1186  (_ "What is the maximum transfer unit for UDP?")
1187  (nohelp)
1188  '()
1189  #t
1190  1472
1191  (cons 1200 65500)
1192  'rare))
1193
1194 (define (udp-blacklist builder)
1195  (builder
1196  "UDP"
1197  "BLACKLISTV4"
1198  (_ "Which IPs are not allowed to connect?")
1199  (nohelp)
1200  '()
1201  #t
1202  "127.0.0.1;"
1203  '()
1204  'advanced))
1205
1206 (define (udp-whitelist builder)
1207  (builder
1208  "UDP"
1209  "WHITELISTV4"
1210  (_ "Which IPs are allowed to connect? Leave empty to allow connections from any IP.")
1211  (nohelp)
1212  '()
1213  #t
1214  ""
1215  '()
1216  'advanced))
1217
1218 (define (udp6-blacklist builder)
1219  (builder
1220  "UDP"
1221  "BLACKLISTV6"
1222  (_ "Which IPv6s are not allowed to connect?")
1223  (nohelp)
1224  '()
1225  #t
1226  ""
1227  '()
1228  'ipv6))
1229
1230 (define (udp6-whitelist builder)
1231  (builder
1232  "UDP6"
1233  "WHITELISTV6"
1234  (_ "Which IPv6s are allowed to connect? Leave empty to allow any IP to connect.")
1235  (nohelp)
1236  '()
1237  #t
1238  ""
1239  '()
1240  'ipv6))
1241
1242 (define (udp builder)
1243  (builder
1244  "UDP"
1245  ""
1246  (_ "UDP transport")
1247  (nohelp)
1248  (list 
1249    (udp-port builder)
1250    (udp-upnp builder)
1251    (udp-mtu builder)
1252    (udp-blacklist builder)
1253    (udp-whitelist builder)
1254    (udp6-blacklist builder)
1255    (udp6-whitelist builder)
1256  )
1257  #t
1258  #f
1259  #f
1260  'udp-loaded) )
1261
1262
1263
1264 (define (network-interface builder)
1265  (builder
1266  "NETWORK"
1267  "INTERFACE"
1268  (_ "Network interface")
1269  (nohelp)
1270  '()
1271  #t
1272  "eth0"
1273  '()
1274  'advanced) )
1275
1276 (define (network-ip builder)
1277  (builder
1278  "NETWORK"
1279  "IP"
1280  (_ "External IP address (leave empty to try auto-detection)")
1281  (nohelp)
1282  '()
1283  #t
1284  ""
1285  '()
1286  'advanced) )
1287
1288 (define (network-ip6 builder)
1289  (builder
1290  "NETWORK"
1291  "IP6"
1292  (_ "External IPv6 address (leave empty to try auto-detection)")
1293  (nohelp)
1294  '()
1295  #t
1296  ""
1297  '()
1298  'ipv6) )
1299
1300 (define (transports builder)
1301  (builder
1302   ""
1303   ""
1304   (_ "Transports")
1305   (nohelp)
1306   (list 
1307     (nat builder)
1308     (network-interface builder)
1309     (network-ip builder)
1310     (tcp builder)
1311     (udp builder)
1312     (http builder)
1313     (smtp builder)
1314   )
1315   #t
1316   #f
1317   #f
1318   'always) )
1319
1320
1321
1322 (define (load-maxdown builder)
1323  (builder
1324  "LOAD"
1325  "MAXNETDOWNBPSTOTAL"
1326  (_ "What is the maximum number of bytes per second that we may receive?")
1327  (nohelp)
1328  '()
1329  #t
1330  50000
1331  (cons 1 999999999)
1332  'always))
1333
1334 (define (load-maxup builder)
1335  (builder
1336  "LOAD"
1337  "MAXNETUPBPSTOTAL"
1338  (_ "What is the maximum number of bytes per second that we may send?")
1339  (nohelp)
1340  '()
1341  #t
1342  50000
1343  (cons 1 999999999)
1344  'always))
1345
1346 (define (load-cpu builder)
1347  (builder
1348  "LOAD"
1349  "MAXCPULOAD"
1350  (_ "What is the maximum CPU load (percentage)?")
1351  (_ "The highest tolerable CPU load. Load here always refers to the total system load, that is it includes CPU utilization by other processes.  A value of 50 means that once your 1 minute-load average goes over 50% non-idle, GNUnet will try to reduce CPU consumption until the load goes under the threshold.  Reasonable values are typically between 50 and 100.  Multiprocessors may use values above 100." )
1352  '()
1353  #t
1354  100
1355  (cons 0 10000)
1356  'always))
1357
1358 (define (load-io builder)
1359  (builder
1360  "LOAD"
1361  "MAXIOLOAD"
1362  (_ "What is the maximum IO load (permille)?")
1363  (_ 
1364 "The highest tolerable IO load.  Load here refers to the percentage of CPU cycles wasted waiting for IO for the entire system, that is it includes disk utilization by other processes.  A value of 10 means that once the average number of cycles wasted waiting for IO is more than 10% non-idle, GNUnet will try to reduce IO until the load goes under the threshold.  Reasonable values are typically between 10 and 75." )
1365  '()
1366  #t
1367  50
1368  (cons 0 10000)
1369  'advanced))
1370
1371 (define (load-cpu-hard builder)
1372  (builder
1373  "LOAD"
1374  "HARDCPULIMIT"
1375  (_ "What is the maximum CPU load (hard limit)?")
1376  (_ "The highest tolerable CPU load.  This is the hard limit, so once it is reached, gnunetd will start to massively drop data to reduce the load.  Use with caution.")
1377  '()
1378  #t
1379  0
1380  (cons 0 99999)
1381  'rare))
1382
1383 (define (load-hard-up-limit builder)
1384  (builder
1385  "LOAD"
1386  "HARDUPLIMIT"
1387  (_ "What is the maximum upstream bandwidth (hard limit)?")
1388  (_ "The limit is given as a percentage of the MAXNETUPBPS limit.  Use 100 to have MAXNETUPBPS be the hard limit.  Use zero for no limit.")
1389  '()
1390  #t
1391  0
1392  (cons 0 999999999)
1393  'rare))
1394
1395
1396 (define (load-priority builder)
1397  (builder
1398  "LOAD"
1399  "PRIORITY"
1400  (_ "What priority should gnunetd use to run?")
1401  (_ "You can specify priorities like NORMAL, ABOVE NORMAL, BELOW NORMAL, HIGH and IDLE or a numerical integer value (man nice).  The default is IDLE, which should result in gnunetd only using resources that would otherwise be idle.")
1402  '()
1403  #t
1404  "IDLE"
1405  '()
1406  'always))
1407
1408
1409 (define (load-padding builder)
1410  (builder
1411  "GNUNETD-EXPERIMENTAL"
1412  "PADDING"
1413  (_ "Should we disable random padding (experimental option)?")
1414  (nohelp)
1415  '()
1416  #t
1417  #f
1418  #f
1419  'experimental))
1420
1421 (define (load-basiclimiting builder)
1422  (builder
1423  "LOAD"
1424  "BASICLIMITING"
1425  (_ "Use basic bandwidth limitation? (YES/NO).  If in doubt, say YES.")
1426  (_ 
1427 "Basic bandwidth limitation (YES) means simply that the bandwidth limits specified apply to GNUnet and only to GNUnet.  If set to YES, you simply specify the maximum bandwidth (upstream and downstream) that GNUnet is allowed to use and GNUnet will stick to those limitations.  This is useful if your overall bandwidth is so large that the limit is mostly used to ensure that enough capacity is left for other applications.  Even if you want to dedicate your entire connection to GNUnet you should not set the limits to values higher than what you have since GNUnet uses those limits to determine for example the number of connections to establish (and it would be inefficient if that computation yields a number that is far too high).  
1428
1429 While basic bandwidth limitation is simple and always works, there are some situations where it is not perfect.  Suppose you are running another application which performs a larger download. During that particular time, it would be nice if GNUnet would throttle its bandwidth consumption (automatically) and resume using more bandwidth after the download is complete.  This is obviously advanced magic since GNUnet will have to monitor the behavior of other applications. Another scenario is a monthly cap on bandwidth imposed by your ISP, which you would want to ensure is obeyed.  Here, you may want GNUnet to monitor the traffic from other applications to ensure that the combined long-term traffic is within the pre-set bounds.  Note that you should probably not set the bounds tightly since GNUnet may observe that the bounds are about to be broken but would be unable to stop other applications from continuing to use bandwidth.
1430
1431 If either of these two scenarios applies, set BASICLIMITING to NO. Then set the bandwidth limits to the COMBINED amount of traffic that is acceptable for both GNUnet and other applications.  GNUnet will then immediately throttle bandwidth consumption if the short-term average is above the limit, and it will also try to ensure that the long-term average is below the limit.  Note however that using NO can have the effect of GNUnet (almost) ceasing operations after other applications perform high-volume downloads that are beyond the defined limits.  GNUnet would reduce consumption until the long-term limits are again within bounds.
1432
1433 NO only works on platforms where GNUnet can monitor the amount of traffic that the local host puts out on the network.  This is only implemented for Linux and Win32.  In order for the code to work, GNUnet needs to know the specific network interface that is used for the external connection (after all, the amount of traffic on loopback or on the LAN should never be counted since it is irrelevant).")
1434  '()
1435  #t
1436  #t
1437  #f
1438  'advanced))
1439
1440 (define (load-interfaces builder)
1441  (builder
1442  "LOAD"
1443  "INTERFACES"
1444  (_ "Network interface to monitor")
1445  (_ "For which interfaces should we do accounting?  GNUnet will evaluate the total traffic (not only the GNUnet related traffic) and adjust its bandwidth usage accordingly. You can currently only specify a single interface. GNUnet will also use this interface to determine the IP to use. Typical values are eth0, ppp0, eth1, wlan0, etc.  'ifconfig' will tell you what you have.  Never use 'lo', that just won't work.  Under Windows, specify the index number reported by  'gnunet-win-tool -n'.")
1446  '()
1447  #t
1448  "eth0"
1449  (list "*" "eth0" "eth1" "eth2")
1450  'nobasiclimit))
1451
1452 (define (load builder)
1453  (builder
1454   ""
1455   ""
1456   (_ "Load management")
1457   (nohelp)
1458   (list 
1459     (load-priority builder)
1460     (load-maxdown builder)
1461     (load-maxup builder)
1462     (load-hard-up-limit builder)
1463     (load-cpu builder)
1464     (load-io builder)
1465     (load-cpu-hard builder)
1466     (load-basiclimiting builder)
1467     (load-interfaces builder)
1468     (load-padding builder)
1469   )
1470   #t
1471   #f
1472   #f
1473   'always) )
1474
1475
1476 ;; main-menu
1477
1478 (define (main builder)
1479  (builder 
1480   "Root"
1481   ""
1482   (_ "Root node")
1483   (nohelp)
1484   (list 
1485     (meta builder)
1486     (fundamentals builder)
1487     (general builder) 
1488     (advertising builder) 
1489     (logging builder)
1490     (load builder)
1491     (transports builder) 
1492     (applications builder) 
1493   )
1494   #t 
1495   #f 
1496   #f 
1497   'always) )
1498
1499
1500
1501 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1502
1503 ;; first main method: build tree using build-tree-node
1504 ;; The lambda expression is used to throw away the last argument,
1505 ;; which we use internally and which is not used by build-tree-node!
1506 (define (gnunet-config-setup) 
1507  (main 
1508   (lambda (a b c d e f g h i) (build-tree-node a b c d e f g h) ) ) )
1509
1510
1511 ;; second main method: update visibility (and values)
1512 ;; "change" uses again the tree builder but this time
1513 ;; scans the "i" tags to determine how the visibility needs to change
1514
1515 (define (gnunet-config-change ctx)
1516  (let 
1517    ( 
1518      (advanced (get-option ctx "Meta" "ADVANCED"))
1519      (rare (get-option ctx "Meta" "RARE"))
1520      (nobasiclimit (not (get-option ctx "LOAD" "BASICLIMITING")))
1521      (experimental (get-option ctx "Meta" "EXPERIMENTAL"))
1522      (ipv6 (not (get-option ctx "GNUNETD" "DISABLE-IPV6")))
1523      (f2fr (not (get-option ctx "F2F" "RESTRICT") ) )
1524      (f2f (or (get-option ctx "F2F" "FRIENDS-ONLY")
1525               (not (eq? (get-option ctx "F2F" "MINIMUM") 0) ) ) )
1526      (tcp-port-nz (eq? (get-option ctx "TCP" "PORT") 0) )
1527      (udp-port-nz (eq? (get-option ctx "UDP" "PORT") 0) )
1528      (http-port-nz (eq? (get-option ctx "HTTP" "PORT") 0) )
1529      (mysql (string= (get-option ctx "MODULES" "sqstore") "sqstore_mysql") )
1530      (fs-loaded (list? (member "fs" (string-split (get-option ctx "GNUNETD" "APPLICATIONS") #\  ) ) ) )
1531      (hostlist-loaded (list? (member "hostlist" (string-split (get-option ctx "GNUNETD" "APPLICATIONS") #\  ) ) ) )
1532      (nat-loaded (list? (member "nat" (string-split (get-option ctx "GNUNETD" "TRANSPORTS") #\  ) ) ) )
1533      (tcp-loaded (list? (member "tcp" (string-split (get-option ctx "GNUNETD" "TRANSPORTS") #\  ) ) ) )
1534      (udp-loaded (list? (member "udp" (string-split (get-option ctx "GNUNETD" "TRANSPORTS") #\  ) ) ) )
1535      (http-loaded (list? (member "http" (string-split (get-option ctx "GNUNETD" "TRANSPORTS") #\  ) ) ) )
1536      (smtp-loaded (list? (member "smtp" (string-split (get-option ctx "GNUNETD" "TRANSPORTS") #\  ) ) ) )
1537    )
1538   (begin 
1539     (main
1540      (lambda (a b c d e f g h i) 
1541         (begin 
1542           (cond
1543             ((eq? i 'advanced)     (change-visible ctx a b advanced))
1544             ((eq? i 'rare)         (change-visible ctx a b (and advanced rare)))
1545             ((eq? i 'experimental) (change-visible ctx a b (and advanced experimental)))
1546             ((eq? i 'f2f)          (change-visible ctx a b f2f))
1547             ((eq? i 'ipv6)         (change-visible ctx a b ipv6))
1548             ((eq? i 'f2fr)         (change-visible ctx a b f2fr))
1549             ((eq? i 'mysql)        (change-visible ctx a b mysql))
1550             ((eq? i 'fs-loaded)    (change-visible ctx a b fs-loaded))
1551             ((eq? i 'hostlist-loaded)    (change-visible ctx a b hostlist-loaded))
1552             ((eq? i 'nat-unlimited)(change-visible ctx a b nat-unlimited))
1553             ((eq? i 'tcp-port-nz)  (change-visible ctx a b tcp-port-nz))
1554             ((eq? i 'udp-port-nz)  (change-visible ctx a b udp-port-nz))
1555             ((eq? i 'nat-loaded)   (change-visible ctx a b nat-loaded))
1556             ((eq? i 'udp-loaded)   (change-visible ctx a b udp-loaded))
1557             ((eq? i 'tcp-loaded)   (change-visible ctx a b tcp-loaded))
1558             ((eq? i 'http-loaded)  (change-visible ctx a b http-loaded))
1559             ((eq? i 'smtp-loaded)  (change-visible ctx a b smtp-loaded))
1560             ((eq? i 'nobasiclimit) (change-visible ctx a b nobasiclimit))
1561             (else 'nothing)
1562           )
1563    ) ) ) 
1564    (change-visible ctx "NETWORK" "PORT" (and advanced (not (get-option ctx "TCPSERVER" "DISABLE"))))
1565    (change-visible ctx "NETWORK" "TRUSTED" (and advanced (not (get-option ctx "TCPSERVER" "DISABLE"))))
1566   )
1567 ) )
1568