diff options
Diffstat (limited to 'fml/doc/en')
39 files changed, 1140 insertions, 182 deletions
diff --git a/fml/doc/en/tutorial/command/chapter.sgml b/fml/doc/en/tutorial/command/chapter.sgml index c47cb8b9..2662b58a 100644 --- a/fml/doc/en/tutorial/command/chapter.sgml +++ b/fml/doc/en/tutorial/command/chapter.sgml @@ -1,9 +1,9 @@ <!-- - $FML: chapter.sgml,v 1.2 2003/07/26 09:10:40 fukachan Exp $ + $FML: chapter.sgml,v 1.3 2003/08/02 03:05:53 fukachan Exp $ $jaFML: chapter.sgml,v 1.7 2002/12/25 11:50:42 fukachan Exp $ --> -<chapter> +<chapter id="fml.command.modules"> <title> Command (command mail, CUI and GUI) </title> diff --git a/fml/doc/en/tutorial/command/dataflow.sgml b/fml/doc/en/tutorial/command/dataflow.sgml index ff3750d3..37d1976b 100644 --- a/fml/doc/en/tutorial/command/dataflow.sgml +++ b/fml/doc/en/tutorial/command/dataflow.sgml @@ -1,5 +1,5 @@ <!-- - $FML: dataflow.sgml,v 1.2 2003/07/26 09:10:40 fukachan Exp $ + $FML: dataflow.sgml,v 1.3 2003/08/02 03:05:53 fukachan Exp $ $jaFML: dataflow.sgml,v 1.1 2002/12/25 11:50:42 fukachan Exp $ --> @@ -10,6 +10,93 @@ </title> -<graphic entityref="image.command.dataflow"></graphic> +<!-- + <graphic entityref="image.command.dataflow"></graphic> +--> + +<para> +All command processing calls FML::Command::MODE::COMMAND class via +FML::Command class. GUI, CUI and command mail has different pre +processing stage. +</para> + + +<sect2> + <title> + command mail procssing + </title> + +<caution> +<para> +We adopt new frame work after 2004/03/05. +</para> +</caution> + +<para> +Firstly, parse and analyze each line. +</para> + +<para> +An empty line is ignored. +The buffer is clean up. +After them, check if the command line is allowed in our context. +</para> + +<para> +For example, +</para> + +<para> +1) if anonymous command such as "guide" or "subscribe", call command +processor. Allowd list of commands are defined in +$anonymous_command_mail_allowed_commands. +</para> + +<para> +2) if a normal command which are allowd for a member, check other +conditions based on rules of $command_mail_restrictions. Allowd list +of commands are defined in $user_command_mail_allowed_commands. +</para> + +<para> +Command dispatcher checks the return path dependent on the command and +the syntax, finally execute the command via FML::Command class. +This process runs as normal user priviledge. +</para> + +<para> +"admin" command needs administrator priviledge. So an exception. If +"admin" command is given, process user priviledged "admin" command and +execute FML::Command::User::admin class. +<footnote> +<para> +admin command is defined in $user_command_mail_allowed_commands +as a normal user command. +</para> +</footnote> +In this user command class, checks the context by +$admin_command_mail_restrictions to see that the current context has +remote administrator priveledge. If enough priviledge is satisfied, +execute FML::Command::Admin::COMMAND class via FML::Command again. +FML::Command::Admin::COMMAND needs admin priviledge. +</para> + +</sect2> + + +<sect2> + <title> + CUI (makefml/fml) + </title> + +<para> +If you use this program, you can have priveledge to login the mailing +list server host and switch user to the user "fml". So please use CUI +as you like. +In this case, CUI calls FML::Command::Admin::COMMAND directly. +</para> + +</sect2> + </sect1> diff --git a/fml/doc/en/tutorial/command/extension.sgml b/fml/doc/en/tutorial/command/extension.sgml index 53f7018e..3c10fa11 100644 --- a/fml/doc/en/tutorial/command/extension.sgml +++ b/fml/doc/en/tutorial/command/extension.sgml @@ -1,5 +1,5 @@ <!-- - $FML: extension.sgml,v 1.1 2003/07/24 15:37:35 fukachan Exp $ + $FML: extension.sgml,v 1.2 2003/08/02 03:05:53 fukachan Exp $ $jaFML: extension.sgml,v 1.10 2003/04/15 14:51:36 fukachan Exp $ --> @@ -18,7 +18,7 @@ you need to put the module you wrote at /usr/local/lib/fml/site_local/ </screen> . -If you permit the command is used only for the specifiec ML +If the command is allowed only for the specifiec ML (e.g. elena ML), put it at the ML local library path <screen> /var/spool/ml/elena/local/lib/ @@ -26,10 +26,6 @@ If you permit the command is used only for the specifiec ML where $ml_home_dir = /var/spool/ml/elena. </para> -<para> -In this section, we consider the former case. In both cases, the way -of writing the module codes are same. Only path differs. -</para> </warning> @@ -40,18 +36,22 @@ of writing the module codes are same. Only path differs. <para> Consider to make a new user command "uja". -Pick up a command at FML::Command, cut and paste it. +Pick up a command at FML::Command::User, cut and paste it. Please put it at <screen> /usr/local/lib/fml/site_local/FML/Command/User/uja.pm </screen> -Edit site_default_config.cf to add it into $commands_for_user +To permit the use of it for all ML's, +edit site_default_config.cf to add it into $commands_for_user to permit the user of "uja" command. <screen> -commands_for_user += uja +user_command_mail_allowed_commands += uja </screen> It you allow the command only for the specific elena ML, edit /var/spool/ml/elena/config.cf in the same way. +<screen> +user_command_mail_allowed_commands += uja +</screen> </para> </sect2> @@ -59,7 +59,7 @@ edit /var/spool/ml/elena/config.cf in the same way. <sect2> <title> - Create a new admin command "admin uja" + Create a new admin command such as "admin uja" </title> <para> @@ -69,10 +69,11 @@ Put it at the FML::Command::Admin:: class. For example <screen> /usr/local/lib/fml/site_local/FML/Command/Admin/uja.pm </screen> -Edit site_default_config.cf to add it into $commands_for_privileged_user -to permit the use of "admin uja" command. +Edit site_default_config.cf to add it into +$user_command_mail_allowed_commands to permit the use of "admin uja" +command. <screen> -commands_for_privileged_user += uja +admin_command_mail_allowed_commands += uja </screen> </para> @@ -129,6 +130,10 @@ of CUI implies administrator use. <warning> <para> +You need another work to create a menu screen. +</para> + +<para> To make a new command usable for all ML's on this host, put the module you wrote at <screen> @@ -155,10 +160,10 @@ Craete a module "uja" and put it at <screen> /usr/local/lib/fml/site_local/FML/Command/Admin/uja.pm </screen> -Edit site_default_config.cf to add it into $commands_for_admin_cgi +Edit site_default_config.cf to add it into $admin_cgi_allowed_commands to permit the use of "uja" command. <screen> -commands_for_admin_cgi += uja +admin_cgi_allowed_commands += uja </screen> </para> diff --git a/fml/doc/en/tutorial/command/internal.sgml b/fml/doc/en/tutorial/command/internal.sgml index f6b4ccc9..eb17c87d 100644 --- a/fml/doc/en/tutorial/command/internal.sgml +++ b/fml/doc/en/tutorial/command/internal.sgml @@ -1,5 +1,5 @@ <!-- - $FML: internal.sgml,v 1.2 2003/08/02 03:05:53 fukachan Exp $ + $FML: internal.sgml,v 1.3 2004/03/12 14:05:04 fukachan Exp $ $jaFML: internal.sgml,v 1.6 2003/04/15 14:51:36 fukachan Exp $ --> @@ -9,19 +9,39 @@ </title> <para> -Consider "help" command an an example of command, +Consider "help" command as an example of an fml command, which sends back help message to the sender. </para> <para> -In the case of &fmldevel;, the main code of help command locates at +In the case of &fml4;, +prepare myProcHelpFileSendBack() function and +register it at %LocalProcedure hash to enable it. +<screen> +%LocalProcedure = ( + 'help', 'myProcHelpFileSendBack', + ); +</screen> +myProcHelpFileSendBack as follows: +<screen> +sub myProcHelpFileSendBack +{ + local($proc, *Fld, *e, *misc) = @_; + my $UJA_FILE = "/some/where/help"; + &SendFile($Envelope{'Addr2Reply:'}, "UJA $ML_FN", $UJA_FILE); +} +</screen> +</para> + +<para> +In the case of &fml8;, the main code of help command locates at FML::Command::User::help class. This class is called by FML::Process::Command via AUTOLOAD of FML::Command. </para> <warning> <para> -All commands are implemented at either of FML::Command::User +All &fml8; commands are implemented at either of FML::Command::User or FML::Command::Admin classes. Both CUI (makefml, fml) and GUI (CGI) uses FML::Command::Admin class. Instead command mail users both classes according to the context. @@ -36,7 +56,7 @@ sub process { my ($self, $curproc, $optargs) = @_; my $config = $curproc->{ config }; - my $charset = $config->{ reply_message_charset_en }; + my $charset = $config->{ report_mail_charset_ja }; my $help_file = $config->{ help_file }; # template substitution: kanji code, $varname expansion et. al. @@ -44,7 +64,7 @@ sub process src => $help_file, charset_out => $charset, }; - my $help_template = $curproc->prepare_file_to_return( $params ); + my $help_template = $curproc->reply_message_prepare_template( $params ); if (-f $help_template) { $curproc->reply_message( { @@ -66,8 +86,14 @@ For exmple, variable $config is an object holding configuration variables. </para> <para> -prepare_file_to_return() converts the message language and expands the -arguments in the message templates. +All variables of &fml4; are global. +Instead variables of &fml8; locates within configuration space +accessed via $config object. +</para> + +<para> +reply_message_prepare_template() converts the message language and +expands the arguments in the message templates. </para> <para> @@ -79,18 +105,19 @@ message queue of this process on memory. The error/log messages queued in on memory are aggergated to one message at the last of the current process. Mail::Delivery class handles the aggregation and send it. If needed, the aggregator handles -text strings and multipart properly to build one message. +text strings or multipart properly to build one message. </para> <para> This mechanism is same as Notify() of &fml4; but the last aggregator -is different. +which handles all at the last is different. </para> <para> FYI: commands such as "get" for the file manipulation uses the same -message queuing mechanism. Notify() sends back immediately. This is -different from &fml4;'s Notify() fundamentally. +message queuing mechanism. &fml4;'s Notify() sends back +immediately. Instead &fml8;'s mechanism is queuing based always. This +&fml8; mechanism is different from &fml4;'s Notify() fundamentally. </para> </sect1> diff --git a/fml/doc/en/tutorial/command/module.sgml b/fml/doc/en/tutorial/command/module.sgml index aed20036..9493df06 100644 --- a/fml/doc/en/tutorial/command/module.sgml +++ b/fml/doc/en/tutorial/command/module.sgml @@ -1,5 +1,5 @@ <!-- - $FML: module.sgml,v 1.1 2003/07/24 15:37:35 fukachan Exp $ + $FML: module.sgml,v 1.2 2003/08/02 03:05:53 fukachan Exp $ $jaFML: module.sgml,v 1.4 2003/04/15 14:51:36 fukachan Exp $ --> @@ -18,7 +18,7 @@ administrative ones by the priviledge. <para> FML::Command class consists of the following classes: <screen> -FML::Command entrance into FML::Command +FML::Command entrance into FML::Command. command dispatcher. FML::Command::User command for general ML users. FML::Command::Admin command for remote administrators. </screen> diff --git a/fml/doc/en/tutorial/customize/autoreply.sgml b/fml/doc/en/tutorial/customize/autoreply.sgml index 4c891b83..e957baec 100644 --- a/fml/doc/en/tutorial/customize/autoreply.sgml +++ b/fml/doc/en/tutorial/customize/autoreply.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: autoreply.sgml,v 1.1 2003/07/26 07:31:27 fukachan Exp $ $jaFML: autoreply.sgml,v 1.2 2003/01/05 08:00:59 fukachan Exp $ --> @@ -10,14 +10,14 @@ <para> Modify delivery process ( libexec/distribute ) to send back -/etc/fml/help file. For example, when a user can send anything to +/some/where/help file. For example, when a user can send anything to help@fml.org, fml sends back help file to the sender. </para> <para> In this case, set at config.cf <screen> -post_restrictions = permit_anyone +article_post_restrictions = permit_anyone </screen> and define the following hook after =cut line. <screen> @@ -25,15 +25,25 @@ $distribute_run_start_hook = q{ $curproc->reply_message( { type => "text/plain; charset=iso-2022-jp", - path => "/etc/fml/help", + path => "/some/where/help", filename => "help", disposition => "help example", }); - $curproc->refuse_further_processing(); + $curproc->stop_this_process(); }; </screen> +The last +<screen> +$curproc->stop_this_process(); +</screen> +method of &fml8; corresponds to the statement +<screen> +$DO_NOTHING = 1; +</screen> +of &fml4;. +After this statement, the normal processing stops. </para> </sect1> diff --git a/fml/doc/en/tutorial/customize/case_studies.sgml b/fml/doc/en/tutorial/customize/case_studies.sgml index 4294cdd9..421ea077 100644 --- a/fml/doc/en/tutorial/customize/case_studies.sgml +++ b/fml/doc/en/tutorial/customize/case_studies.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: case_studies.sgml,v 1.1 2003/07/26 07:31:27 fukachan Exp $ $jaFML: case_studies.sgml,v 1.4 2003/04/15 14:51:36 fukachan Exp $ --> @@ -10,15 +10,22 @@ </title> <para> +Edit /usr/local/etc/fml/site_default_config.cf to apply the effect to +all ML's. +</para> + +<para> no tag of subject. <footnote> <para> -This is default in &fml8;. +This is default in &fml8; (default site_default_config.cf includes +this configuration). </para> </footnote> <screen> article_header_rewrite_rules -= rewrite_article_subject_tag </screen> +This means header rewrite rules minus "adding subject tag" operation. </para> <para> @@ -26,18 +33,23 @@ Prepend office# at X-ML-Name:. That is, mlname is changed to office#mlname. <screen> # office#$mlname -x_ml_name = office#$ml_name +outgoing_mail_header_x_ml_name = office#$ml_name </screen> </para> <para> -Anybody can post to this ML since customers send mail to here. +Anybody can post to this ML since customers send mails to this address. <screen> post_restrictions = permit_anyone </screen> -Disale almost all filters. +In this case, anybody including system special accounts e.g. root, +postmaster can post. +</para> + +<para> +Disale almost all filters since a lot of customer messsages looks +something wrong. <screen> -use_body_filter = no use_article_body_filter = no use_article_non_mime_filter = no use_article_mime_component_filter = no @@ -56,10 +68,11 @@ spool_type = subdir <para> disable command mail. <screen> -use_command_mail_program = no +use_command_mail_function = no </screen> -To enable the use of command mail by CGI, we use this variable. -It is recommended to remove proper alias entries if could. +If somenoby want to use command mail (e.g. by CGI), we use this +variable. It is recommended to remove proper alias entries if could to +ensure the command mail is prohibited. </para> </sect1> @@ -71,7 +84,8 @@ It is recommended to remove proper alias entries if could. </title> <para> -Edit /etc/fml/site_default_config.cf and reflects all ML's. +Edit /usr/local/etc/fml/site_default_config.cf to apply the effect to +all ML's. </para> <para> diff --git a/fml/doc/en/tutorial/customize/chapter.command.sgml b/fml/doc/en/tutorial/customize/chapter.command.sgml index 7af1cf35..98d6db37 100644 --- a/fml/doc/en/tutorial/customize/chapter.command.sgml +++ b/fml/doc/en/tutorial/customize/chapter.command.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: chapter.command.sgml,v 1.1 2003/07/26 07:31:27 fukachan Exp $ $jaFML: chapter.command.sgml,v 1.1 2002/09/15 01:46:30 fukachan Exp $ --> @@ -15,8 +15,7 @@ </title> <para> -To extend help command of elena ML. -Create help.pm perl module at +To extend help command of elena ML, create help.pm perl module at <screen> /var/spool/ml/elena/local/lib/FML/Command/User/help.pm </screen> diff --git a/fml/doc/en/tutorial/customize/chapter.config.sgml b/fml/doc/en/tutorial/customize/chapter.config.sgml index 72a3b25c..2d49b288 100644 --- a/fml/doc/en/tutorial/customize/chapter.config.sgml +++ b/fml/doc/en/tutorial/customize/chapter.config.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: chapter.config.sgml,v 1.1 2003/07/26 07:31:27 fukachan Exp $ $jaFML: chapter.config.sgml,v 1.3 2003/04/15 14:51:36 fukachan Exp $ --> @@ -20,7 +20,7 @@ The format is same as config.cf. </para> <para> -This file corresponds to site_init.ph of &fml4;. +This file corresponds to site_force.ph of &fml4;. </para> </sect1> diff --git a/fml/doc/en/tutorial/customize/chapter.ml_style.sgml b/fml/doc/en/tutorial/customize/chapter.ml_style.sgml index b43ab7bb..d2d8b2f7 100644 --- a/fml/doc/en/tutorial/customize/chapter.ml_style.sgml +++ b/fml/doc/en/tutorial/customize/chapter.ml_style.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: chapter.ml_style.sgml,v 1.1 2003/07/26 07:31:28 fukachan Exp $ $jaFML: chapter.ml_style.sgml,v 1.4 2003/02/16 13:07:15 fukachan Exp $ --> <chapter id="cuctomize"> @@ -13,6 +13,8 @@ §.config.command.rejectall; §.config.mailmagazine; §.config.post.permit.anyone; +§.config.post.check.article.thread; +§.config.post.check.pgp; §.config.ml.hier; <!-- procmail --> diff --git a/fml/doc/en/tutorial/customize/command_permit_anyone.sgml b/fml/doc/en/tutorial/customize/command_permit_anyone.sgml index b33fd0b9..1f41c8a7 100644 --- a/fml/doc/en/tutorial/customize/command_permit_anyone.sgml +++ b/fml/doc/en/tutorial/customize/command_permit_anyone.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: command_permit_anyone.sgml,v 1.1 2003/07/26 07:31:28 fukachan Exp $ $jaFML: command_permit_anyone.sgml,v 1.2 2003/01/05 08:00:59 fukachan Exp $ --> @@ -9,11 +9,11 @@ </title> <para> -$command_restrictions defines who can use command mail. +$command_mail_restrictions defines who can use command mail. By default user registerd as a poster can use command mail. To set anyone can use command mail, set <screen> -command_restrictions = permit_anyone +command_mail_restrictions = permit_anyone </screen> </para> diff --git a/fml/doc/en/tutorial/customize/command_rejectall.sgml b/fml/doc/en/tutorial/customize/command_rejectall.sgml index aaf44c69..2d35c24d 100644 --- a/fml/doc/en/tutorial/customize/command_rejectall.sgml +++ b/fml/doc/en/tutorial/customize/command_rejectall.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: command_rejectall.sgml,v 1.1 2003/07/26 07:31:28 fukachan Exp $ $jaFML: command_rejectall.sgml,v 1.3 2003/04/15 14:51:36 fukachan Exp $ --> @@ -13,20 +13,28 @@ It is most safe to remove entries from aliases. </para> <para> +Another 2nd best solution follows: <screen> -use_command_mail_program = no +use_command_mail_function = no </screen> -In this case, /usr/local/libexec/fml/command is kicked off once but -does not work and exit as soon as possible. +In this case, /usr/local/libexec/fml/command runs once but does not +work and ends as soon as possible. </para> <para> -In another level of rejection, this configuration is possible: +This solution may be possible. <screen> -command_restrictions = reject +use_command_mail_function = yes + +command_mail_restrictions = reject </screen> -When fml receives the command mail, +When fml receives the incoming command mail, it inform the rejection to the sender. </para> +<para> +This configuration works but it evalutates each line. +It is useless. +</para> + </sect1> diff --git a/fml/doc/en/tutorial/customize/filter.sgml b/fml/doc/en/tutorial/customize/filter.sgml index 5baf6c30..631565d5 100644 --- a/fml/doc/en/tutorial/customize/filter.sgml +++ b/fml/doc/en/tutorial/customize/filter.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: filter.sgml,v 1.1 2003/07/26 07:31:28 fukachan Exp $ $jaFML: filter.sgml,v 1.2 2003/04/13 04:36:11 fukachan Exp $ --> @@ -11,6 +11,8 @@ <qandaset> &recipe.filter.notice; +&recipe.filter.spamassassin; +&recipe.filter.attachments; </qandaset> diff --git a/fml/doc/en/tutorial/customize/mailmagazine.sgml b/fml/doc/en/tutorial/customize/mailmagazine.sgml index 542344f7..d8bbf738 100644 --- a/fml/doc/en/tutorial/customize/mailmagazine.sgml +++ b/fml/doc/en/tutorial/customize/mailmagazine.sgml @@ -1,33 +1,57 @@ <!-- - $FML: mailmagazine.sgml,v 1.1 2003/07/26 07:31:28 fukachan Exp $ + $FML: mailmagazine.sgml,v 1.2 2003/07/27 17:47:06 fukachan Exp $ $jaFML: mailmagazine.sgml,v 1.3 2003/07/27 17:45:30 fukachan Exp $ --> -<sect1 id="config.mailmagazine"> + +<sect1 id="config.mailmagazine.1"> <title> - case study: mail magazine + case study: mail magazine (1) </title> +<warning> +<para> +Please use +<link linkend="config.post.check.pgp"> +PGP auth +</link> +if could, though we describe header based auth here. +Also please set up MTA properly e.g. to disable smtp interfaces as +could as possible. +</para> + +<para> +It is a problem that PGP auth requires user's skill at some level. +</para> + +</warning> + <para> -Consider asymmetric case of member list (list of persons who can post) -and recipient list. +In the case of header based auth, you can create a mail magazine by +using the asymmetirc member list. Consider asymmetric case of member +list (list of persons who can post) and recipient list below. </para> <para> -Firstly, remove primary_member_maps from $member_maps. Instead, add +Firstly, remove $primary_member_map from $member_maps. Instead, define $ml_home_dir/members-mailmag who can post to $member_maps. <screen> member_maps = $ml_home_dir/members-mailmag </screen> +The use of "subscribe" command is same as default one since +"subscribe" command changes $primary_member_map not $member_maps. It +is a little tricky but crafty use of $primary_XXX_map and $XX_maps +enhances &fml8; configuration. </para> <para> In this case, when a new user is subscribed, the user address is added -to both $ml_home_dir/members and $ml_home_dir/recipinets. -But $member_maps is defined as $ml_home_dir/members-mailmag. -$ml_home_dir/members is not used. -Hence, recipients is updated but the list of posters is unchanged. +to both $ml_home_dir/members ($primary_member_map) and +$ml_home_dir/recipinets ($primary_recipient_map). But $member_maps is +defined as $ml_home_dir/members-mailmag. $ml_home_dir/members is not +used. Hence, only the list of recipients is updated but the list of +posters is NOT changed. </para> <warning> @@ -36,9 +60,68 @@ Strictly speaking, this configuration is not enough safe. If somebody fakes From: address, he/she can post since fml checks only From: address. </para> + +<para> +So, pgp auth is recommended. +</para> + </warning> <para> +Another solution. +<screen> +primary_member_map = $tmp_dir/members-dummy +</screen> +and use $member_maps (member_maps = $ml_home_dir/members) for normal +use. It has only poster's addresses. +</para> + +</sect1> + + +<sect1 id="config.mailmagazine.2"> + <title> + CASE STUDY: mail magazine (2) + </title> +<para> +After 2004/06, &fml8; supports the queuing system. So the outgoing +mail fails once, after the confirmation of content, you flush again to +deliver if the content is ok. +</para> + +<para> +The queuing system support enables "queue once, dequeue after content +confirmation". It avoids delivery of wrong content. +</para> + +<para> +The configuration is as follows. +</para> + +<para> +Specify irrelevant port at config.cf. +<screen> +smtp_servers = IRRELEVANT_PORT + +[Example] + +smtp_servers = 127.0.0.1:2025 +</screen> +This makes the delivery fail. The message is queued. +</para> + +<para> +Check the content. If the content is correct and delivery is ready, +runs the following command by specifying the correct transport. +<screen> +% fml -o smtp_servers=TRANSPORT ML_NAME flushq + +[Example] + +% fml -o smtp_servers=127.0.0.1:25 ML_NAME flushq +</screen> +"flush" and "flushq" command are same. +</para> </sect1> diff --git a/fml/doc/en/tutorial/customize/ml.hier.ml b/fml/doc/en/tutorial/customize/ml.hier.ml index 6aeb282a..ca2a3854 100644 --- a/fml/doc/en/tutorial/customize/ml.hier.ml +++ b/fml/doc/en/tutorial/customize/ml.hier.ml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: ml.hier.ml,v 1.1 2003/08/02 01:19:10 fukachan Exp $ $jaFML: ml.hier.ml,v 1.1 2002/07/29 12:16:19 fukachan Exp $ --> @@ -46,4 +46,13 @@ post_restrictions = permit_anyone </screen> </para> +<para> +This example is simplest. It is easy to use this style. +</para> + +<para> +If you need to use SQL e.g. MySQL, it is modern. +It needs a lot of preparions and operation know-how. +</para> + </sect1> diff --git a/fml/doc/en/tutorial/customize/post_check_article_thread.sgml b/fml/doc/en/tutorial/customize/post_check_article_thread.sgml new file mode 100644 index 00000000..32af61b5 --- /dev/null +++ b/fml/doc/en/tutorial/customize/post_check_article_thread.sgml @@ -0,0 +1,133 @@ +<!-- + $FML$ + $jaFML: post_check_article_thread.sgml,v 1.3 2005/06/25 14:12:52 fukachan Exp $ +--> + + +<sect1 id="config.post.check.article.thread"> + <title> + CASE STUDY: article posting allowd if it is a reply to the former one. + </title> + +<para> +From time to time we can find that a posted article is denied due to +posting from not a member. +</para> + +<para> +One reason is that the member who replied some article forgot to +notify changes of his/her mail address to the mailing list +administrator. Another reason that his/her mail address is changed +from @DOMAIN to @SUB.DOMAIN vice versa. Yet another reason is that +he/she replied it from other location which recieved the article via +mail forwarding at some other host. +</para> + +<para> +After 2004/10/28 &fml8; current, &fml8; supports "allow article post +irrespective of the From: address if some condition satisfied" at +article_post_restrictions. +</para> + +<para> +The current implementation suppors the condition that "if the reply +refers a known message-id within some time limit". Precisely +speaking, "knonw mesage-is" implies the id is found at the database +which holds In-Reply-To: and References: of old articles within some +time limit (e.g. one week). +</para> + + +<sect2> + <title> + Examles + </title> + +<para> +"check_article_thread" is the keyword to support this check. +<screen> +article_post_restrictions = reject_system_special_accounts + check_article_thread + permit_member_maps + reject +</screen> +not used by default. +To use it, specify it at article_post_restrictions. +</para> + +</sect2> + + +<sect2> + <title> + Discussion + </title> + +<para> +Hmm, this is similar to a cookie. +There are some problems. +</para> + +<para> +1) what is proper time scale ? +$article_post_article_thread_lifetime controlls it. one day by default. +<screen> +article_post_article_thread_lifetime = 86400 +</screen> +</para> + +<para> +Also, boundary of the time scale ? When starts the allowd window ? It +starts from the first article of the specific thread ? Or from the +last article ? +</para> + +<para> +2) more restricted condition support required ? +If so, we should check the corelation between subject: and the thread? +</para> + +</sect2> + + +<sect2> + <title> + Applied example: small persons can starts article thread. + </title> + +<para> +<screen> +member_maps = $tmp_dir/members-thread-init + +article_post_restrictions = reject_system_special_accounts + check_article_thread + permit_member_maps + reject + + +</screen> +Persons registered at members-thread-init can post article always. +Other persons can post the article if the article is a reply to some +other article. +</para> + +<para> +Hmm, it looks a variation of moderator system ? +</para> + +<para> +Better if they use PGP auth. +<screen> +member_maps = $tmp_dir/members-thread-init + +article_post_restrictions = reject_system_special_accounts + check_article_thread + check_pgp_signature + reject + +</screen> +</para> + +</sect2> + +</sect1> diff --git a/fml/doc/en/tutorial/customize/post_check_pgp_signature.sgml b/fml/doc/en/tutorial/customize/post_check_pgp_signature.sgml new file mode 100644 index 00000000..c41a2ff0 --- /dev/null +++ b/fml/doc/en/tutorial/customize/post_check_pgp_signature.sgml @@ -0,0 +1,95 @@ +<!-- + $FML: post_check_pgp_signature.sgml,v 1.2 2005/06/25 15:11:29 fukachan Exp $ +--> + + +<sect1 id="config.post.check.pgp"> + <title> + CASE STUDY: PGP/PGP based authentication in posting + </title> + +<caution> +<para> +Please install Crypt::OpenPGP perl module. It is better to use OS +dependent pacakge system since it depends a lot of other packages. +</para> +</caution> + +<sect2> + <title> + Configuration Example + </title> + +<para> +check_pgp_signature options supports PGP/GPG based auth. +If the degital signature is confirmed, the user can post articles. +<screen> +article_post_restrictions = reject_system_special_accounts + check_pgp_signature + reject +</screen> +disabled by default. +change article_post_restrictions if use. +</para> + +</sect2> + + +<sect2> + <title> + Key operations + </title> + +<para> +PGP KEY RING directories are separeted. For example, the keyring dir +for article pgp auth is $ml_home_dir/etc/pgp-article-post-auth/ +directory, the keyring dir for remote administration by command mail +is $ml_home_dir/etc/pgp-admin-command-mail-auth/ directory. +</para> + +<para> +Use pgp2, pgp5 and gpg commands to edit keys under them +It is useful to use the following fmlpgp wrapper command. +The wrapper sets up proper environment variables. +<screen> +Example: elena ML + +fmlpgp elena --article-post-auth -kg +</screen> +the command line options available: +<screen> +--article-post-auth (auth for post article) +--command-mail-auth (auth for command mail) +--admin-command-mail-auth (auth for admin command mail) +--article-post-encrypt (article encryption) +</screen> +</para> + +<para> +Available wrappers follow: +</para> + +<para> +pgp2: +fmlpgp +</para> + +<para> +pgp5: +fmlpgp5 +fmlpgpe +fmlpgpk +fmlpgps +fmlpgpv +</para> + +<para> +gpg: +fmlgpg +fmlgpgv +</para> + +</sect2> + + +</sect1> diff --git a/fml/doc/en/tutorial/customize/post_permit_anyone.sgml b/fml/doc/en/tutorial/customize/post_permit_anyone.sgml index 56d66f6c..b498d33e 100644 --- a/fml/doc/en/tutorial/customize/post_permit_anyone.sgml +++ b/fml/doc/en/tutorial/customize/post_permit_anyone.sgml @@ -1,5 +1,5 @@ <!-- - $FML: post_permit_anyone.sgml,v 1.1 2003/07/26 07:31:28 fukachan Exp $ + $FML: post_permit_anyone.sgml,v 1.2 2003/11/30 10:01:13 fukachan Exp $ $jaFML: post_permit_anyone.sgml,v 1.3 2003/04/15 14:51:37 fukachan Exp $ --> @@ -10,21 +10,32 @@ <para> <screen> -post_restrictions = permit_anyone +article_post_restrictions = permit_anyone </screen> -$post_restrictions parameter controls who can post to this ML. -To set this as "permit_anyone", anybody can post. +$post_restrictions parameter controls who can post to this ML. To set +this as "permit_anyone", anybody (including system special account +e.g. root, postmaster) can post. </para> <para> -By default, +By default, for &fml4; compatibility, <screen> -post_restrictions = reject_system_special_accounts - permit_member_maps - reject +article_post_restrictions = reject_system_special_accounts + permit_member_maps + reject </screen> -"reject_system_special_accounts" denys post if +"reject_system_special_accounts" denies post if From: looks like system accounts e.g. root, postmaster. </para> +<para> +This configuration means that +system special accounts cannot post and +the user contained in $member_maps can post article. +</para> + +<para> +Attention that reject_XXX and permit_XXX statement is first match. +</para> + </sect1> diff --git a/fml/doc/en/tutorial/customize/recipe.filter.attachments.sgml b/fml/doc/en/tutorial/customize/recipe.filter.attachments.sgml new file mode 100644 index 00000000..b8fd40bc --- /dev/null +++ b/fml/doc/en/tutorial/customize/recipe.filter.attachments.sgml @@ -0,0 +1,96 @@ +<qandaentry> + +<question> +<para> +HOOK to reject a message with danger attachment +</para> +</question> + +<answer> + +<para> +&fml8; analyzed the incoming message firstly and creates a chain of +Mail::Message objects on the memory. It is easy for &fml8; to analyze +the chain to check the message content. +</para> + +<para> +The following examples uses hooks. In all cases, if matched, call +stop_this_process() to stop further processing. Pay attension that +these examples do not try to return error messsages. +</para> + +<para> +If you need to return error messages, use reply_message(). It is +better not to return it since this message must be a virus or a spam. +</para> + +<para> +Here is an example to check attachment keywords e.g. .exe in mesages. +Before &fml8; 2004/12/08 current, it follows: +<screen> +$distribute_verify_request_start_hook = q{ + my $msg = $curproc->incoming_message() || undef; + for (my $m = $msg; $m ; $m = $m->{ next } ) { + my $hs = $m->message_fields() || ''; + if ($hs =~ /filename=.*\.(com|vbs|vbe|wsh|wse|js|exe|doc|rtf)/o) { + $curproc->log("attachment \.$1 found"); + $curproc->stop_this_process(); + } + } +}; +</screen> +After &fml8; 2004/12/08 current, it follows: +<screen> +$distribute_verify_request_start_hook = q{ + my $msg = $curproc->incoming_message() || undef; + my $list = $msg->message_chain_as_array_ref(); + for my $m (@$list) { + my $hs = $m->message_fields() || ''; + if ($hs =~ /filename=.*\.(com|vbs|vbe|wsh|wse|js|exe|doc|rtf)/o) { + $curproc->log("[new] attachment \.$1 found"); + $curproc->stop_this_process(); + } + } +}; +</screen> +</para> + +<para> +Another solution is to trap +<screen> +Content-Disposition: attachment; +</screen> +to detect the existence of attachments. +Before &fml8; 2004/12/08 current, it follows: +<screen> +$distribute_verify_request_start_hook = q{ + my $msg = $curproc->incoming_message() || undef; + for (my $m = $msg; $m ; $m = $m->{ next } ) { + my $hs = $m->message_fields() || ''; + if ($hs =~ /Content-Disposition:.*attachment;/o) { + $curproc->log("attachment \.$1 found"); + $curproc->stop_this_process(); + } + } +}; +</screen> +After &fml8; 2004/12/08 current, it follows: +<screen> +$distribute_verify_request_start_hook = q{ + my $msg = $curproc->incoming_message() || undef; + my $list = $msg->message_chain_as_array_ref(); + for my $m (@$list) { + my $hs = $m->message_fields() || ''; + if ($hs =~ /Content-Disposition:.*attachment;/o) { + $curproc->log("[new] attachment \.$1 found"); + $curproc->stop_this_process(); + } + } +}; +</screen> +</para> + +</answer> + +</qandaentry> diff --git a/fml/doc/en/tutorial/customize/recipe.filter.notice.sgml b/fml/doc/en/tutorial/customize/recipe.filter.notice.sgml index 919ec236..34c4a7d9 100644 --- a/fml/doc/en/tutorial/customize/recipe.filter.notice.sgml +++ b/fml/doc/en/tutorial/customize/recipe.filter.notice.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: recipe.filter.notice.sgml,v 1.1 2003/07/26 07:31:28 fukachan Exp $ $jaFML: recipe.filter.notice.sgml,v 1.2 2003/04/15 14:51:37 fukachan Exp $ --> @@ -21,7 +21,7 @@ use_article_filter_reject_notice = yes article_filter_reject_notice_recipient = maintainer sender </screen> When the filter system rejects the request, -fml sends back it to the ML maintainer not the sender. +fml sends back it to both the ML maintainer and the sender. </para> diff --git a/fml/doc/en/tutorial/customize/recipe.filter.spamassassin.sgml b/fml/doc/en/tutorial/customize/recipe.filter.spamassassin.sgml new file mode 100644 index 00000000..57bd7af7 --- /dev/null +++ b/fml/doc/en/tutorial/customize/recipe.filter.spamassassin.sgml @@ -0,0 +1,85 @@ +<qandaentry> + +<question> +<para> +reject SPAM messages using spamassassin by a &fml8; hook. +</para> +</question> + +<answer> + +<para> +<caution> +<para> +In this case, &fml8; use not spamassassin internal filter but use a +hook. +</para> +</caution> +</para> + +<para> +<screen> +$distribute_verify_request_end_hook = q{ + my $spamassassin = '/usr/pkg/bin/spamc -c'; + + use FileHandle; + my $wh = new FileHandle "| $spamassassin"; + + if (defined $wh) { + $wh->autoflush(1); + my $msg = $curproc->incoming_message(); + $msg->print($wh); + $wh->close(); + if ($?) { + $curproc->log("spam: (code = $?)"); + $curproc->stop_this_process(); + } + } +}; +</screen> +</para> + +</answer> + +</qandaentry> + + +<qandaentry> +<question> +<para> +Add X-Spam-Status: Yes header field +if spamassassin determines the message as a spam. +</para> +</question> + +<answer> +<para> +<screen> +$distribute_verify_request_end_hook = q{ + my $spamassassin = '/usr/pkg/bin/spamc -c'; + + use FileHandle; + my $wh = new FileHandle "| $spamassassin"; + + if (defined $wh) { + $wh->autoflush(1); + my $msg = $curproc->incoming_message(); + $msg->print($wh); + $wh->close(); + if ($?) { + $curproc->log("spam: (code = $?)"); + my $hdr = $curproc->incoming_message_header(); + $hdr->add('X-Spam-Status', 'Yes'); + } + } +}; +</screen> +</para> + +<para> +This is a little tricky but it works well. +</para> + +</answer> + +</qandaentry> diff --git a/fml/doc/en/tutorial/customize/recipe.header.tag.lowercase.sgml b/fml/doc/en/tutorial/customize/recipe.header.tag.lowercase.sgml index 5089baf5..c8afeac1 100644 --- a/fml/doc/en/tutorial/customize/recipe.header.tag.lowercase.sgml +++ b/fml/doc/en/tutorial/customize/recipe.header.tag.lowercase.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: recipe.header.tag.lowercase.sgml,v 1.1 2003/07/26 07:31:28 fukachan Exp $ $jaFML: recipe.header.tag.lowercase.sgml,v 1.1 2002/10/29 03:32:21 fukachan Exp $ --> @@ -17,6 +17,7 @@ lower the tag in article Subject: <screen> article_subject_tag = [\L$ml_name\E:%05d] </screen> +(available after 2002/10/29 snapshot) </para> </answer> diff --git a/fml/doc/en/tutorial/customize/recipe.header.tag.uppercase.sgml b/fml/doc/en/tutorial/customize/recipe.header.tag.uppercase.sgml index 7c0a6af9..8eee8beb 100644 --- a/fml/doc/en/tutorial/customize/recipe.header.tag.uppercase.sgml +++ b/fml/doc/en/tutorial/customize/recipe.header.tag.uppercase.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: recipe.header.tag.uppercase.sgml,v 1.1 2003/07/26 07:31:29 fukachan Exp $ $jaFML: recipe.header.tag.uppercase.sgml,v 1.1 2002/10/29 03:32:21 fukachan Exp $ --> @@ -17,6 +17,7 @@ upper the tag in article Subject: <screen> article_subject_tag = [\U$ml_name\E:%05d] </screen> +(available after 2002/10/29 snapshot) </para> </answer> diff --git a/fml/doc/en/tutorial/delivery/chapter.sgml b/fml/doc/en/tutorial/delivery/chapter.sgml index 2b5cc36a..11f916b2 100644 --- a/fml/doc/en/tutorial/delivery/chapter.sgml +++ b/fml/doc/en/tutorial/delivery/chapter.sgml @@ -1,20 +1,20 @@ <!-- - $FML$ + $FML: chapter.sgml,v 1.1 2003/08/02 01:19:11 fukachan Exp $ $jaFML: chapter.sgml,v 1.12 2003/04/15 14:51:37 fukachan Exp $ --> <chapter id="delivery"> <TITLE> - &fmldevel; mail delivery system + &fml8; mail delivery system </TITLE> -<sect1 id="fmldevel-delivery"> +<sect1 id="fml8-delivery"> <title> - The difference between &fml4; and &fmldevel; + The difference between &fml4; and &fml8; </title> <para> -One of puposes of &fmldevel; is unification and abstraction of member +One of puposes of &fml8; is unification and abstraction of member list operations. Mail distribution is based on the following module Mail::Delivery. </para> @@ -84,6 +84,19 @@ class provides such data structure described above. §.mailqueue; +<sect1 id="delivery.qmgr"> + <title> + Queue Management System + </title> + +<para> +Since 2004 summer, delivery system of &fml8; is under queue management +system like MTA. Now fml8 can deliver again messages by itself. +</para> + +</sect1> + + <sect1> <title> Discussion: FML::Mailer is apropriate ? diff --git a/fml/doc/en/tutorial/delivery/queue.sgml b/fml/doc/en/tutorial/delivery/queue.sgml index 5436ed46..639adb79 100644 --- a/fml/doc/en/tutorial/delivery/queue.sgml +++ b/fml/doc/en/tutorial/delivery/queue.sgml @@ -1,9 +1,39 @@ <!-- - $FML$ + $FML: queue.sgml,v 1.1 2003/08/02 01:19:11 fukachan Exp $ $jaFML: queue.sgml,v 1.3 2003/04/15 14:51:37 fukachan Exp $ --> -<sect1 id="message.reply"> +<sect1 id="message.queue.incoming"> + <TITLE> + incoming queuing + </TITLE> + +<para> +MTA kicks off a fml process. It reads a message from STDIN. +</para> + +<para> +The fml process reads a message once and write it onto the hard disk +(write it into the incoming queue). After the queuing succeeded, the +process starts to analyze a message. For this logic, the original mail +is saved after that. +</para> + +<para> +If the queuing fails, call exit(EX_TEMPFAIL). In almost cases, +exit(75). If MTA receives this exit code, MTA tries to deliver again +later. +</para> + +<para> +Mail::Delivery::Queue class processes the incoming queue. +The queus is removed when the process ends. +</para> + +</sect1> + + +<sect1 id="message.queue.outgoing"> <TITLE> fml sends back a mail message </TITLE> @@ -14,14 +44,20 @@ mail queue. Later FML::Process::QueueManager handles the real delivery process. </para> +<para> +article delivery processing is a little diffferent but based on +queueing by Mail::Delivery::Queue. If someting error occurs in +delivery, another fml process tries to deliver it later. +</para> + <sect2> <title> - How to write + Coding in &fml8; sources. </title> <para> -use like this: +Code like this to send back a message: <screen> $curproc->reply_message( "you are not a ML member." ); </screen> @@ -60,9 +96,9 @@ $curproc->reply_message( { </TITLE> <para> -FML::Process::QueueManager pick up one queue from the queue directory. +FML::Process::QueueManager picks up one queue from the queue directory. Mail::Message parses it. -Mail::Delivery process the real delivery via FML::Mailer. +Mail::Delivery processes the real delivery via FML::Mailer. <screen> Mail::Delivery::Queue | @@ -79,6 +115,10 @@ Mail::Delivery </screen> </para> +<para> +In manipulating queue, we should lock the target queue by flock(2). +</para> + </sect1> @@ -92,15 +132,18 @@ The queue directory consists of the following plural directories: <screen> new/ active/ +incoming/ deferred/ info/sender/ info/recipients/ +info/transport/ </screen> -info/ stores envelope information +info/ stores envelope information. +incoming/ holds incoming queue, others hold outgoing information. </para> <para> -In creating a new queue file, +In creating a new outgoing queue file, make a temporary file in new/ once. When the delivery preparation is ended, move the queue from new/ to active/. @@ -115,7 +158,7 @@ Hence files under active/ is delivery ready. <para> When we need to handle the specific queue file, use lock()/unlock() method for each $queue_id object. -lock algorithm is based on flock(2) for the file. +The lock algorithm is based on flock(2) for the file. </para> </sect2> diff --git a/fml/doc/en/tutorial/digest/chapter.sgml b/fml/doc/en/tutorial/digest/chapter.sgml index d7093d22..3ef5a64e 100644 --- a/fml/doc/en/tutorial/digest/chapter.sgml +++ b/fml/doc/en/tutorial/digest/chapter.sgml @@ -1,5 +1,5 @@ <!-- - $FML: chapter.sgml,v 1.1 2003/07/28 15:20:17 fukachan Exp $ + $FML: chapter.sgml,v 1.2 2003/08/02 14:53:25 fukachan Exp $ $jaFML: chapter.sgml,v 1.3 2003/04/15 14:51:39 fukachan Exp $ --> @@ -120,7 +120,6 @@ admin digest $address off </title> <para> -(not yet implemented). <screen> digest on digest off @@ -142,7 +141,6 @@ as could as possible. </title> <para> -(not yet implemented). <screen> digeston digestoff diff --git a/fml/doc/en/tutorial/include/bookinfo.sgml b/fml/doc/en/tutorial/include/bookinfo.sgml index 142f8f9b..7911733c 100644 --- a/fml/doc/en/tutorial/include/bookinfo.sgml +++ b/fml/doc/en/tutorial/include/bookinfo.sgml @@ -1,5 +1,5 @@ <!-- - $FML: bookinfo.sgml,v 1.1 2003/07/24 15:37:36 fukachan Exp $ + $FML: bookinfo.sgml,v 1.2 2003/07/25 14:06:49 fukachan Exp $ $jaFML: bookinfo.sgml,v 1.11 2003/02/11 13:54:11 fukachan Exp $ --> @@ -7,7 +7,6 @@ <bookbiblio> <title> fml 8 tutorial - ( under being translated ... ) </title> <author> @@ -27,7 +26,7 @@ </author> <copyright> - <year> 2001,2002,2003 </year> + <year> 2001,2002,2003,2004,2005 </year> <holder> Ken'ichi Fukamachi </holder> </copyright> @@ -41,22 +40,38 @@ <para> + The current status of fml8 is PRE ALPHA. + The version is 7.98.x. + We plan to assign version 7.99.x to fml 8 ALPHA through fml 8 + RC (release candidate). + </para> + + <para> The current TODO is seen at <ulink url="../../../fml/doc/ja/todo/STATUS.html"> http://www.fml.org/software/fml-devel/fml/doc/ja/todo/STATUS.html </ulink> (Japanese only now, sorry). + See + <link linkend="changes"> + <xref linkend="changes"> + </link> + on the changes between fml 4 and fml8. </para> <para> It is verified that &fml8; works on the following environemnt now. <screen> + perl 5.8.5 on NetBSD 2.0 + perl 5.8.5 on NetBSD 1.6 perl 5.6.1 on NetBSD 1.5.x (1.5 stable) perl 5.6.1 on NetBSD 1.6 + perl 5.6.1 on FreeBSD 5.2.1 perl 5.00503 on FreeBSD 4.3 STABLE perl ? on FreeBSD 4.6 RELEASE perl 5.00503 on FreeBSD 4.7 RELEASE-p3 perl 5.00503 on FreeBSD 4.6.2 RELEASE + perl 5.6.1 on Turbolinux Server 8 (qmail) perl 5.6.1 on Redhat Linux 7.2 (postfix) perl 5.00503 on Redhat Linux 6.2 (sendmail8.11.6) postfix + perl 5.6.1 on Solaris 7 diff --git a/fml/doc/en/tutorial/include/chapters.ent b/fml/doc/en/tutorial/include/chapters.ent index 258f7bce..d2a6069c 100644 --- a/fml/doc/en/tutorial/include/chapters.ent +++ b/fml/doc/en/tutorial/include/chapters.ent @@ -1,5 +1,5 @@ <!-- - $FML: chapters.ent,v 1.1 2003/07/24 15:37:36 fukachan Exp $ + $FML: chapters.ent,v 1.2 2003/07/26 04:35:41 fukachan Exp $ $jaFML: chapters.ent,v 1.75 2003/06/20 22:03:12 fukachan Exp $ --> @@ -45,8 +45,11 @@ <!entity sect.setup.postfix SYSTEM "setup/postfix.sgml"> <!entity sect.setup.qmail SYSTEM "setup/qmail.sgml"> <!entity sect.setup.config.cf SYSTEM "setup/config.cf.sgml"> +<!entity sect.setup.newml.recipes SYSTEM "setup/newml.recipes.sgml"> +<!entity chapter.setup.apache SYSTEM "setup/apache.sgml"> <!entity chapter.setup.cgi SYSTEM "setup/cgi.sgml"> <!entity chapter.setup.test SYSTEM "setup/test.sgml"> +<!entity chapter.merge.fml4to8 SYSTEM "setup/merge.fml4to8.sgml"> <!-- part III: customize --> @@ -63,6 +66,9 @@ <!entity sect.config.command.rejectall SYSTEM "customize/command_rejectall.sgml"> <!entity sect.config.mailmagazine SYSTEM "customize/mailmagazine.sgml"> <!entity sect.config.post.permit.anyone SYSTEM "customize/post_permit_anyone.sgml"> +<!entity sect.config.post.check.article.thread SYSTEM "customize/post_check_article_thread.sgml"> +<!entity sect.config.post.check.pgp SYSTEM "customize/post_check_pgp_signature.sgml"> + <!entity sect.config.ml.hier SYSTEM "customize/ml.hier.ml"> @@ -76,6 +82,8 @@ <!-- filter --> <!entity chapter.customize.filter SYSTEM "customize/filter.sgml"> <!entity recipe.filter.notice SYSTEM "customize/recipe.filter.notice.sgml"> +<!entity recipe.filter.spamassassin SYSTEM "customize/recipe.filter.spamassassin.sgml"> +<!entity recipe.filter.attachments SYSTEM "customize/recipe.filter.attachments.sgml"> <!entity chapter.filter SYSTEM "internals/filter.sgml"> <!entity var.filter.rules SYSTEM "variables/filter.rules.sgml"> <!entity var.filter.size SYSTEM "variables/filter.size.sgml"> @@ -120,6 +128,7 @@ <!entity chapter.userctl SYSTEM "internals/userctl.sgml"> +<!entity chapter.merge.internal SYSTEM "internals/merge.sgml"> <!-- delivery --> @@ -137,6 +146,7 @@ <!entity chapter.bootloader SYSTEM "internals/bootloader.sgml"> <!entity sect.main.cf SYSTEM "internals/main.cf.sgml"> <!entity chapter.internal.cgi SYSTEM "internals/cgi.sgml"> +<!entity sect.internal.cgi.examples SYSTEM "internals/cgi.examples.sgml"> <!entity chapter.programingstyle SYSTEM "internals/style.sgml"> <!entity chapter.design SYSTEM "internals/design.sgml"> <!entity chapter.config.cf SYSTEM "internals/config.cf.sgml"> @@ -144,6 +154,8 @@ <!entity chapter.credential SYSTEM "internals/credential.sgml"> <!entity chapter.lock SYSTEM "internals/lock.sgml"> <!entity chapter.io.abstraction SYSTEM "internals/io_abstraction.sgml"> +<!entity chapter.errormail SYSTEM "internals/errormail.sgml"> +<!entity chapter.language SYSTEM "internals/language.sgml"> <!entity chapter.virtual SYSTEM "virtual/chapter.sgml"> @@ -154,7 +166,7 @@ <!-- --> <!entity chapter.struct SYSTEM "internals/struct.sgml"> <!entity struct.curproc SYSTEM "internals/CURPROC.sgml"> - +<!entity list.pcb SYSTEM "internals/PCB.sgml"> <!-- message --> @@ -171,6 +183,11 @@ <!entity chapter.program.create SYSTEM "devel/create_program.sgml"> +<!-- operations --> +<!entity chapter.op.log SYSTEM "operations/log.sgml"> +<!entity chapter.op.backup SYSTEM "operations/backup.sgml"> + + <!-- misc --> <!entity chapter.threadtrack SYSTEM "threadtrack/chapter.sgml"> <!entity sect.threadtrack.states SYSTEM "threadtrack/states.sgml"> @@ -193,8 +210,15 @@ <!-- trouble shoot --> -<!entity chapter.troubleshoot SYSTEM "troubleshoot/chapter.sgml"> +<!entity chapter.troubleshoot SYSTEM "troubleshoot/chapter.sgml"> +<!entity recipe.version SYSTEM "troubleshoot/recipe.version.sgml"> +<!entity recipe.listup.addresses SYSTEM "troubleshoot/recipe.listup.addresses.sgml"> +<!entity recipe.listup.aliases SYSTEM "troubleshoot/recipe.listup.aliases.sgml"> +<!entity sect.troubleshoot.filesystem SYSTEM "troubleshoot/filesystem.sgml"> + + +<!-- changes --> +<!entity chapter.changes SYSTEM "changes/chapter.sgml"> +<!entity table.changes.cui SYSTEM "changes/table.cui.sgml"> + -<!entity recipe.version SYSTEM "troubleshoot/recipe.version.sgml"> -<!entity recipe.listup.addresses SYSTEM "troubleshoot/recipe.listup.addresses.sgml"> -<!entity recipe.listup.aliases SYSTEM "troubleshoot/recipe.listup.aliases.sgml"> diff --git a/fml/doc/en/tutorial/include/terms.sgml b/fml/doc/en/tutorial/include/terms.sgml index 7d2380e5..a48e351c 100644 --- a/fml/doc/en/tutorial/include/terms.sgml +++ b/fml/doc/en/tutorial/include/terms.sgml @@ -1,32 +1,112 @@ <!-- - $FML$ - $jaFML: terms.sgml,v 1.3 2002/07/02 10:39:34 fukachan Exp $ + $FML: terms.sgml,v 1.3 2003/07/27 15:31:52 fukachan Exp $ + $jaFML: terms.sgml,v 1.5 2003/04/15 14:51:35 fukachan Exp $ --> <sect1 id="terms"> + <title> + Technical terms in this tutorial + </title> -<title> terms in tutorial </title> +<para> +See +<link linkend="glossary"> +<xref linkend="glossary"> +</link> +also. +</para> <variablelist> <varlistentry> <term> % </term> <listitem> - <para> user prompt </para> + <para> user prompt on the shell </para> </listitem> </varlistentry> <varlistentry> <term> # </term> <listitem> - <para> root prompt </para> + <para> root user prompt on the shell </para> + </listitem> + </varlistentry> + + <varlistentry> + <term> ~ </term> + <listitem> + <para> user's home directory </para> + </listitem> + </varlistentry> + + <varlistentry> + <term> CUI </term> + <listitem> + <para> + command line tool such as makefml or fml. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term> fml </term> + <listitem> + <para> + fml software in general use. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term> fml (command) </term> + <listitem> + <para> + fml command included in &fml8; software. + fml is same as makefml command except for the argument order. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term> user fml </term> + <listitem> + <para> + a user called as fml. + a user account for &fml8; software. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term> fml4 </term> + <listitem> + <para> &fml4; series. </para> + </listitem> + </varlistentry> + + <varlistentry> + <term> fml8 </term> + <listitem> + <para> &fml8; series. </para> + </listitem> + </varlistentry> + + <varlistentry> + <term> GUI </term> + <listitem> + <para> + CGI interface. + </para> </listitem> </varlistentry> <varlistentry> - <term> fml4 </term> + <term> makefml (command) </term> <listitem> - <para> &fml4; series </para> + <para> + configuration helper tool included in &fml4; and &fml8;. + You can use them when you login the mailing list server. + </para> </listitem> </varlistentry> diff --git a/fml/doc/en/tutorial/module/create.sgml b/fml/doc/en/tutorial/module/create.sgml index 688b4674..30da7477 100644 --- a/fml/doc/en/tutorial/module/create.sgml +++ b/fml/doc/en/tutorial/module/create.sgml @@ -1,5 +1,5 @@ <!-- - $FML: create.sgml,v 1.1 2003/07/28 15:20:18 fukachan Exp $ + $FML: create.sgml,v 1.2 2003/08/03 01:47:17 fukachan Exp $ $jaFML: create.sgml,v 1.2 2003/04/15 14:51:42 fukachan Exp $ --> @@ -28,7 +28,8 @@ framework. Here the program name is "fmlsch" and the cgi is </title> <para> -Add fmlsch into $bin_programs in fml/etc/install.cf.in. +Prepare fml/bin/fmlsch.in, +add fmlsch into $bin_programs in fml/etc/install.cf.in. Run configreu to re-create fml/etc/install.cf. </para> @@ -42,7 +43,7 @@ Run configreu to re-create fml/etc/install.cf. <para> -Write fml/lib/Calender/Lite.pm as the main library of fmlsch. +Write fml/lib/FML/Demo/Calendar.pm as the main library of fmlsch. </para> <para> @@ -65,9 +66,9 @@ Also, install Date-Calc if your system has not it. </title> <para> -Calender::Lite works mainly but we build the machanism how &fml8; +FML::Demo::Calendar works mainly but we build the machanism how &fml8; loads and runs it. We modify FML::Process class for &fml8; bootloader -to call Calender::Lite. +to call FML::Demo::Calendar. </para> <para> diff --git a/fml/doc/en/tutorial/usage/chaddr.sgml b/fml/doc/en/tutorial/usage/chaddr.sgml index c3bbdc27..b146c579 100644 --- a/fml/doc/en/tutorial/usage/chaddr.sgml +++ b/fml/doc/en/tutorial/usage/chaddr.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: chaddr.sgml,v 1.1 2003/07/26 04:29:12 fukachan Exp $ $jaFML: chaddr.sgml,v 1.2 2003/04/15 14:51:45 fukachan Exp $ --> @@ -24,9 +24,10 @@ You can send this mail from both OLD-ADDRESS and NEW-ADDRESS. <para> &fml8; sends back confirmation to both addresses. -Please send back the confirmation to elena-ctl again. +Please reply the confirmation and send back it to elena-ctl again. When you request is confirmed to be valid, -&fml8; remove OLD-ADDRESS and add NEW-ADDRESS to member lists. +&fml8; remove OLD-ADDRESS and add NEW-ADDRESS to the recipient and +member list. </para> </sect1> diff --git a/fml/doc/en/tutorial/usage/chapter.onhost.sgml b/fml/doc/en/tutorial/usage/chapter.onhost.sgml index 83c33898..e35b30f4 100644 --- a/fml/doc/en/tutorial/usage/chapter.onhost.sgml +++ b/fml/doc/en/tutorial/usage/chapter.onhost.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: chapter.onhost.sgml,v 1.1 2003/07/26 04:29:12 fukachan Exp $ $jaFML: chapter.onhost.sgml,v 1.8 2003/04/15 14:51:46 fukachan Exp $ --> @@ -10,13 +10,26 @@ <para> -On the host which serves ML driver, -you can use CUI and edit all configuration files as you like. -It implies you are the greatest administrator :) +On the host which serves ML driver, you can use CUI (makefml and fml) +and edit all configuration files as you like. It implies you are the +greatest administrator :) +</para> + +<para> +makefml of fml8 is same as fml4 as could as possible to preserve +compatibility. +</para> + +<para> +See +<link linkend="changes.cui"> +<xref linkend="changes.cui"> +</link> +on the detail of the difference. </para> -<sect1> +<sect1 id="usage.onhost.priviledge"> <title> On the host </title> @@ -26,14 +39,17 @@ You need no confirmation in using makefml. </para> <para> -Person who can login the host of mailing list server has all -priviledge for all ML's on the host. -So, He/She can edit all configuration files. +Person who can login the host of mailing list server has priviledge +for all ML's on the host. So, He/She can edit all configuration +files. +</para> + +<para> But He/She may do wrong operations. </para> <para> -To avoid careless miss operations, in usual cases you should use CUI +To avoid careless wrong operations, in usual cases you should use CUI (makefml or fml) to configure fml. Of course you can edit files directly if you can understand fml structures. By default we recommend you should use CUI even on the host. @@ -57,9 +73,10 @@ Please either as you like. </title> <para> -&fmldevel; provides command for each function. Except for some -special cases, we should unify all functions into makefml/fml command -since such commands can be shared among CUI, GUI and commmnd mail. +&fmldevel; provides a different command for each function. Its policy +makes the number of commands infinite. So, except for some special +cases, we should unify all functions into makefml/fml command since +such commands can be shared among CUI, GUI and commmnd mail. </para> @@ -69,7 +86,7 @@ since such commands can be shared among CUI, GUI and commmnd mail. </title> <para> -We should implement sub-command of makefml when some operation may +We should implement sub-command of makefml/fml when some operation may modify the specific ML. </para> @@ -82,7 +99,7 @@ modify the specific ML. </title> <para> -you should implement it as a makefml command since it is related to +We should implement it as a makefml/fml command since it is related to the specific ML. </para> @@ -98,7 +115,7 @@ the specific ML. If the data is not related to the specific ML, for example, see the module manual, aliases on the host, we implement specific commands other than makefml/fml. -This command begins with ^fml. +This command name begins with "fml" prefix. <screen> fmladdr [-n] fmlalias [-n] @@ -112,12 +129,25 @@ fmlconf [-n] ML <sect2> <title> + ML specific but a command wrapper + </title> + +<para> +PGP / GPG related command (e.g. fmlpgp) is very command speicific. +So, it is difficult to incorporate them into makefml/fml. +We implement it as another command such as fmlpgp, fmlgpg, ... +</para> + +</sect2> + +<sect2> + <title> misc </title> <para> -we implement specific commands other than makefml/fml. -This command begins with ^fml. +We implement specific commands other than makefml/fml. +This command name begins with fml prefix. </para> <para> @@ -134,6 +164,31 @@ fmlhtmlify [-I DIR] $src_dir $dst_dir </sect1> +<sect1 id="usage.command.line.options"> + <title> + Common Command Line Options + </title> + +<para> +Programs under libexec/ and bin/ supports +the following common command line options. +<screen> +--debug +--help +-c file +-o key=value +</screen> +Use -c to specify non default main.cf path. +-o overwrites configuration variables. +Plural -o are acceptable. +<screen> +-o key1=value1 -o key2=value2 +</screen> +</para> + +</sect1> + + §.usage.makefml; §.usage.fml; §.usage.fmladdr; diff --git a/fml/doc/en/tutorial/usage/get.sgml b/fml/doc/en/tutorial/usage/get.sgml index a433da4e..7bf7d875 100644 --- a/fml/doc/en/tutorial/usage/get.sgml +++ b/fml/doc/en/tutorial/usage/get.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: get.sgml,v 1.1 2003/07/26 04:29:13 fukachan Exp $ $jaFML: get.sgml,v 1.2 2003/04/15 14:51:46 fukachan Exp $ --> @@ -18,4 +18,17 @@ NUMBER is the article number. fml sends back articles by mime/multipart form to the sender. </para> +<para> +You can use MH style arguments as NUMBER. +<screen> +Example: + +get 100 +get 1-100 +get first:3 +get last:3 +get 1-100,first:3,last:3 +</screen> +</para> + </sect1> diff --git a/fml/doc/en/tutorial/usage/guide.sgml b/fml/doc/en/tutorial/usage/guide.sgml index 0582b19e..3eb83e91 100644 --- a/fml/doc/en/tutorial/usage/guide.sgml +++ b/fml/doc/en/tutorial/usage/guide.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: guide.sgml,v 1.1 2003/07/26 04:29:13 fukachan Exp $ $jaFML: guide.sgml,v 1.1 2002/07/28 12:20:20 fukachan Exp $ --> @@ -17,4 +17,9 @@ to elena-ctl@fml.org address. fml sends back the guide file to the sender. </para> +<para> +If a file named "guide" is found at $ml_home_dir, it is used as a +template. +</para> + </sect1> diff --git a/fml/doc/en/tutorial/usage/help.sgml b/fml/doc/en/tutorial/usage/help.sgml index 5d76669e..01a2a8a1 100644 --- a/fml/doc/en/tutorial/usage/help.sgml +++ b/fml/doc/en/tutorial/usage/help.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: help.sgml,v 1.1 2003/07/26 04:29:13 fukachan Exp $ $jaFML: help.sgml,v 1.1 2002/07/28 12:20:20 fukachan Exp $ --> @@ -17,4 +17,9 @@ to elena-ctl@fml.org address. sends back the help file to the sender. </para> +<para> +If a file named "help" is found at $ml_home_dir, it is used as a +template. +</para> + </sect1> diff --git a/fml/doc/en/tutorial/usage/makefml.sgml b/fml/doc/en/tutorial/usage/makefml.sgml index 322d3b0b..3ad3a588 100644 --- a/fml/doc/en/tutorial/usage/makefml.sgml +++ b/fml/doc/en/tutorial/usage/makefml.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: makefml.sgml,v 1.1 2003/07/26 04:29:13 fukachan Exp $ $jaFML: makefml.sgml,v 1.7 2003/04/15 14:51:46 fukachan Exp $ --> @@ -187,11 +187,24 @@ For example, <screen> % makefml list elena </screen> -It shows addresses who can post this ML. Instead +It shows recipients of this ML. Also, <screen> % makefml list elena recipient </screen> -lists up recipients of this ML. +lists up recipients of this ML. Instead +<screen> +% makefml list elena member +</screen> +shows the list who can post this ML. +</para> + +<para> +You can specify arbitrary MAP as an argument to show it. +<screen> +% makefml list elena MAP +</screen> +MAP can be an abbrebiation. For example, +you can use "xxx" as MAP to imply "primary_xxx_map" or "xxx_maps". </para> </sect1> @@ -204,7 +217,10 @@ lists up recipients of this ML. <para> Edit config.cf directly now. -Tools are not yet implemented. +</para> + +<para> +Tools are incompletely implemented. </para> </sect1> diff --git a/fml/doc/en/tutorial/usage/post.sgml b/fml/doc/en/tutorial/usage/post.sgml index 70d544f7..7ea3f904 100644 --- a/fml/doc/en/tutorial/usage/post.sgml +++ b/fml/doc/en/tutorial/usage/post.sgml @@ -1,5 +1,5 @@ <!-- - $FML$ + $FML: post.sgml,v 1.1 2003/07/26 04:29:13 fukachan Exp $ $jaFML: post.sgml,v 1.7 2003/04/15 14:51:46 fukachan Exp $ --> @@ -16,9 +16,8 @@ finally kicks off </para> <para> -distribute recieves the message from STDIN, -rewrites the header, save it in spool and -pass it back to MTA. +distribute recieves the message from STDIN, rewrites the header, save +it in the spool directory and pass it back to MTA for delivery. </para> @@ -28,7 +27,7 @@ pass it back to MTA. </title> <para> -add a tag to sufbject, update the article number. +add a tag to subject, update the article sequence number. <screen> Example: @@ -68,7 +67,7 @@ not yet written. <sect2> <title> - boot sequence + Boot Sequence </title> <para> @@ -78,20 +77,24 @@ fml boot loader boots off in this way. </para> +<para> +/usr/local/libexec/fml/distribute is symlink-ed to +/usr/local/libexec/fml/loader. These files are same. +</para> <para> -libexec/loader reads etc/fml/main.cf firstly. -Suppose $fml_vesrion is defined as current-20010501 in main.cf. -&fml8; resolves $fml_version from it and determines the library path -as /usr/local/lib/fml/current-20010501/. -&fml8; loads perl modules under it. +/usr/local/libexec/fml/loader reads /usr/local/etc/fml/main.cf +firstly. $fml_vesrion such as "current-20010501" is defined + in the main.cf. &fml8; resolves $fml_version from it and determines the +library path as /usr/local/lib/fml/current-20010501/. &fml8; loads +perl modules under it. </para> <para> &fml8; sets up @INC properly, fml loader loads FML::Process::Switch -module and check $0. fml knowns the role from $0. In this case of -distribute, fml loads FML::Process::Distribute module and processes -distribution. +module and check $0 (process name). fml knows the process role from +$0. In this case of distribute, fml loads FML::Process::Distribute +module, switch itself to it and processes distribution. </para> </sect2> diff --git a/fml/doc/en/tutorial/usage/unsubscribe.sgml b/fml/doc/en/tutorial/usage/unsubscribe.sgml index 001e5152..7ad289f1 100644 --- a/fml/doc/en/tutorial/usage/unsubscribe.sgml +++ b/fml/doc/en/tutorial/usage/unsubscribe.sgml @@ -1,5 +1,5 @@ -!-- - $FML$ +<!-- + $FML: unsubscribe.sgml,v 1.1 2003/07/26 04:29:14 fukachan Exp $ $jaFML: unsubscribe.sgml,v 1.1 2002/07/28 12:20:20 fukachan Exp $ --> diff --git a/fml/doc/en/tutorial/virtual/chapter.sgml b/fml/doc/en/tutorial/virtual/chapter.sgml index 90a18be0..9264a693 100644 --- a/fml/doc/en/tutorial/virtual/chapter.sgml +++ b/fml/doc/en/tutorial/virtual/chapter.sgml @@ -1,5 +1,5 @@ <!-- - $FML: chapter.sgml,v 1.1 2003/07/27 15:04:27 fukachan Exp $ + $FML: chapter.sgml,v 1.2 2003/08/02 14:53:25 fukachan Exp $ $jaFML: chapter.sgml,v 1.2 2003/04/15 14:51:47 fukachan Exp $ --> @@ -9,15 +9,18 @@ </title> <para> +2003/10: We enhanced fml8 to handle virtual domains handling. +</para> + +<para> It is difficult to handle virtual domains and the default domain in the same way. </para> <para> -You can use "user@domain" as an argument if needed, for example, -ambiguous. So, use "user@domain" form for the ML name if it is an ML -of a virtual domain. For example, for a virtual domain, use makefml -like this +One proper enhancement is using "user@domain" form for the ML name as +an argument of commands. For example, for a virtual domain, use +makefml like this <screen> % makefml newml mlname@virtualdomain </screen> @@ -28,8 +31,19 @@ but both syntaxes are acceptable for the default domain. </screen> Fml treats these properly as could as possible. But fml needs some hints such as ml home directory information. You need to prepare -/usr/local/etc/fml/virtual file for a hint on mappping between domain -and directory. This file name is defined as $virtual_maps in main.cf. +/usr/local/etc/fml/ml_home_prefix file for a hint on mappping between +domain and directory. +</para> + +<para> +This file name is defined as $ml_home_prefix_maps (formerly +$virtual_maps) in main.cf. $virtual_maps is obsolete but effective +now for compatibility. +</para> + +<para> +To handle $ml_home_prefix_maps, you can use "makefml newdomain" and +"makefml rmdomain". </para> @@ -39,12 +53,16 @@ and directory. This file name is defined as $virtual_maps in main.cf. </title> <para> -It is easy in use. -Edit +It is easy in use. +For the first time, use "newdomain" command to add {domain => +directory} relation to <link linkend="install.virtual"> -/usr/local/etc/fml/virtual +ml_home_prefix_maps </link> -file and define it as $virtual_maps in main.cf. +(precisely primary_ml_home_prefix_map). +</para> + +<para> After that, you can use "user@domain" form in makefml arguments in handling virtual domains. <screen> @@ -68,7 +86,7 @@ http://lists/~fml/cgi-bin/fml/$domain/admin/config.cgi <para> The domain name is hard-coded within config.cgi since makefml injects the domain name in creating config.cgi when "makefml newml" runs. -"config.cgi" does not resolve its domain by URL. +"config.cgi" does not resolve its domain by the URL. </para> </warning> |
