477 lines
20 KiB
Plaintext
477 lines
20 KiB
Plaintext
|
This file contains instructions for how to complete the installation
|
|||
|
of mailman after you have installed the Red Hat mailman RPM. There are
|
|||
|
certain items you will need to manually configure as the RPM is not
|
|||
|
capable of doing every installation and confirguration task.
|
|||
|
|
|||
|
First, you should note that the RPM has installed mailman in the
|
|||
|
following directory:
|
|||
|
@prefix@
|
|||
|
You may want to examine this directory to find additional mailman
|
|||
|
documentation, or other mailman files.
|
|||
|
|
|||
|
IMPORTANT NOTE FOR USERS UPGRADING FROM A PREVIOUS RED HAT MAILMAN
|
|||
|
INSTALLATION OR THOSE FAMILAR WITH "STANDARD MAILMAN INSTALLATIONS"
|
|||
|
|
|||
|
Earlier Red Hat mailman rpms installed all of the mailman files under
|
|||
|
/var/mailman. This did not conform to the Filesystem Hierarchy
|
|||
|
Standard (FHS) and created security violations when SELinux is
|
|||
|
enabled. As of mailman-2.1.5-21 the following directory and file
|
|||
|
changes occurred:
|
|||
|
|
|||
|
variable data (e.g. lists) is in @VAR_PREFIX@, library code,
|
|||
|
executables, and scripts are located in @prefix@, lock files are in
|
|||
|
@LOCK_DIR@, the pid file is in @PID_DIR@, qfiles are in @QUEUE_DIR@,
|
|||
|
and configuration files have been moved to the new @CONFIG_DIR@.
|
|||
|
|
|||
|
If you previously had mailman installed and have edited files in
|
|||
|
/var/mailman (e.g. configuration) you will need to move those changes
|
|||
|
to their new locations.
|
|||
|
|
|||
|
A script has been provided to aid in the task of migrating your
|
|||
|
mailman datafiles, it is contrib/migrate-fhs, run with -h for help
|
|||
|
information.
|
|||
|
|
|||
|
The mapping of old locations to new locations is as follows:
|
|||
|
|
|||
|
Directory Mapping:
|
|||
|
/var/mailman --> /var/lib/mailman
|
|||
|
/var/mailman/Mailman --> /usr/lib/mailman/Mailman
|
|||
|
/var/mailman/archives --> /var/lib/mailman/archives
|
|||
|
/var/mailman/bin --> /usr/lib/mailman/bin
|
|||
|
/var/mailman/cgi-bin --> /usr/lib/mailman/cgi-bin
|
|||
|
/var/mailman/cron --> /usr/lib/mailman/cron
|
|||
|
/var/mailman/data --> /var/lib/mailman/data
|
|||
|
/var/mailman/lists --> /var/lib/mailman/lists
|
|||
|
/var/mailman/locks --> /var/lock/mailman
|
|||
|
/var/mailman/logs --> /var/log/mailman
|
|||
|
/var/mailman/mail --> /usr/lib/mailman/mail
|
|||
|
/var/mailman/messages --> /usr/lib/mailman/messages
|
|||
|
/var/mailman/pythonlib --> /usr/lib/mailman/pythonlib
|
|||
|
/var/mailman/qfiles --> /var/spool/mailman
|
|||
|
/var/spool/mailman/qfiles --> /var/spool/mailman
|
|||
|
/var/mailman/scripts --> /usr/lib/mailman/scripts
|
|||
|
/var/mailman/spam --> /var/lib/mailman/spam
|
|||
|
/var/mailman/templates --> /usr/lib/mailman/templates
|
|||
|
/var/mailman/tests --> /usr/lib/mailman/tests
|
|||
|
|
|||
|
File Mapping:
|
|||
|
/var/mailman/data/adm.pw --> /etc/mailman/adm.pw
|
|||
|
/var/mailman/data/creator.pw --> /etc/mailman/creator.pw
|
|||
|
/var/mailman/data/aliases --> /etc/mailman/aliases
|
|||
|
/var/mailman/data/virtual-mailman --> /etc/mailman/virtual-mailman
|
|||
|
/var/mailman/data/sitelist.cfg --> /etc/mailman/sitelist.cfg
|
|||
|
/var/mailman/data/master-qrunner.pid --> /var/run/mailman/master-qrunner.pid
|
|||
|
|
|||
|
Discussion of directory and file relocation:
|
|||
|
|
|||
|
Two new directories were created and three existing directories which
|
|||
|
were hardcoded are now configurable.
|
|||
|
|
|||
|
PID_DIR is used to hold the process id and is new because FHS wants
|
|||
|
pid files to be located in /var/run. The FHS says when there is only a
|
|||
|
single pid file it should be located in /var/run/<name>.pid, and when
|
|||
|
there are multiple pid's files they should be located together in a
|
|||
|
subdirectory, /var/run/<name>/. Currently mailman only has a single
|
|||
|
pid file, but it does have multiple processes (qrunners). Also SELinux
|
|||
|
security policy is easier to write if processes are segregated into
|
|||
|
individual subdirectories. Therefore we elected to place the mailman
|
|||
|
pid file in its own subdirectory, there is some debate if this is 100%
|
|||
|
FHS compliant because there is only currently a single pid file, but
|
|||
|
this gives us greater future flexibility and is in the spirit of FHS.
|
|||
|
|
|||
|
CONFIG_DIR is used to hold the site configuration files. FHS wants
|
|||
|
configuration files stored in /etc/mailman. Previously configuration
|
|||
|
files were mixed in with data files in DATA_DIR and with the run-time
|
|||
|
code (e.g. Mailman/mm_cfg.py). CONFIG_DIR continues to exist but is
|
|||
|
now restricted to data files (e.g. python pickle files). The password
|
|||
|
files, alias files, and .cfg (e.g. sitelist.cfg) files have been moved
|
|||
|
to CONFIG_DIR. mm_cfg.py which is the primary mailman configuration
|
|||
|
file was presented a bit of a dilemma. In theory it should be located
|
|||
|
in /etc/mailman, however it is executable code which argues it should
|
|||
|
be located with the other executable files, it has traditionally lived
|
|||
|
in $PREFIX/Mailman and experienced mailman admins will expect to find
|
|||
|
it there. Modifying all the mm_cfg import statements and paths.py was
|
|||
|
believed to be too invasive a change, and technically its part of the
|
|||
|
"Mailman" package and moving it would take it out of the package
|
|||
|
(although currently I don't think that presents any known
|
|||
|
issues). Instead a compromise approach was adopted, mm_cfg.py is
|
|||
|
symbolically linked into the /etc/mailman directory pointing to
|
|||
|
$PREFIX/Mailman/mm_cfg.py. Thus mm_cfg.py "appears" in the
|
|||
|
configuration directory but retains its traditional location, this was
|
|||
|
deemed a reasonable compromise for the mailman 2.1.x timeframe.
|
|||
|
|
|||
|
sitelist.cfg has a symbolic link in its old location in the DATA_DIR
|
|||
|
pointing to its new location in the CONFIG_DIR.
|
|||
|
|
|||
|
New Directories (can be specified as parameter to configure):
|
|||
|
|
|||
|
CONFIG_DIR: default=$VAR_PREFIX/data FHS=/etc/mailman
|
|||
|
PID_DIR default=$VAR_PREFIX/data FHS=/var/run/mailman
|
|||
|
|
|||
|
Existing directories that can now be specified as parameter to configure:
|
|||
|
|
|||
|
LOCK_DIR: default=$VAR_PREFIX/locks FHS=/var/lock/mailman
|
|||
|
LOG_DIR: default=$VAR_PREFIX/logs FHS=/var/log/mailman
|
|||
|
QUEUE_DIR default=$VAR_PREFIX/qfiles FHS=/var/spool/mailman
|
|||
|
|
|||
|
You can find addition documentation in the
|
|||
|
@DOC_DIR@/README.* files and/or
|
|||
|
@prefix@/README.* files.
|
|||
|
|
|||
|
Mailman is an open source project and full documentation, current
|
|||
|
sources, patches, etc. can be found at the following official mailman
|
|||
|
web sites:
|
|||
|
|
|||
|
http://www.gnu.org/software/mailman/mailman.html
|
|||
|
http://www.list.org
|
|||
|
|
|||
|
1. Final installation instructions:
|
|||
|
|
|||
|
Congratulations! You've installed the Mailman software. To get
|
|||
|
everything running you need to hook Mailman up to both your web
|
|||
|
server and your mail system.
|
|||
|
|
|||
|
- If you plan on running your MTA and web server on different
|
|||
|
machines, sharing Mailman installations via NFS, be sure that
|
|||
|
the clocks on those two machines are synchronized closely. You
|
|||
|
might take a look at the file Mailman/LockFile.py; the constant
|
|||
|
CLOCK_SLOP helps the locking mechanism compensate for clock skew
|
|||
|
in this type of environment.
|
|||
|
|
|||
|
- Configure your web server. The RPM has made the assumption you
|
|||
|
are running the apache web server (httpd). The RPM has installed
|
|||
|
a mailman config file (@HTTPD_CONF_FILE@) in @HTTPD_CONF_DIR@.
|
|||
|
You should edit the file to set your domain, see the
|
|||
|
instructions in the config file.
|
|||
|
|
|||
|
Now restart your web server so the new settings take effect:
|
|||
|
|
|||
|
% /sbin/service httpd restart
|
|||
|
|
|||
|
- Create the site password using:
|
|||
|
|
|||
|
% @prefix@/bin/mmsitepass <your-site-password>
|
|||
|
|
|||
|
This password can be used anywhere that individual user or
|
|||
|
mailing list administrator passwords are required, giving the
|
|||
|
mailman site administrator the ability to adjust these things
|
|||
|
when necessary.
|
|||
|
|
|||
|
You may also want to create a password for the site-wide "list
|
|||
|
creator" role (someone other than the site administrator who as
|
|||
|
privileges to create and remove lists through the web). Use the
|
|||
|
-c option to mmsitepass to set this.
|
|||
|
|
|||
|
- Set the values for DEFAULT_EMAIL_HOST and DEFAULT_URL_HOST in
|
|||
|
@prefix@/Mailman/mm_cfg.py file if the fqdn of the host you are
|
|||
|
running mailman on is not the email and url host you need to use.
|
|||
|
|
|||
|
- Update Mailman list files to new verson by running:
|
|||
|
@prefix@/bin/update
|
|||
|
|
|||
|
Users upgrading from previous releases of this package may need
|
|||
|
to move their data or adjust the configuration files to point to
|
|||
|
the locations where their data is.
|
|||
|
|
|||
|
- Create a "site-wide" mailing list (Note: this must be done
|
|||
|
before starting the mailman daemon). This is the one that
|
|||
|
password reminders will appear to come from. Usually this
|
|||
|
should be the "mailman" mailing list, but if you need to change
|
|||
|
this, be sure to change the MAILMAN_SITE_LIST variable in
|
|||
|
mm_cfg.py (see below).
|
|||
|
|
|||
|
% @prefix@/bin/newlist mailman
|
|||
|
|
|||
|
Follow the prompts, and see the README file for more
|
|||
|
information.
|
|||
|
|
|||
|
- Start the Mailman qrunner daemon
|
|||
|
|
|||
|
As of mailman version 2.1 mailman requires a service (daemon) to be
|
|||
|
run for mailman to operate. RedHat does not ship RPM's that enable
|
|||
|
services as part of package installation. You will need to enable
|
|||
|
the mailman service if you want mailman to run.
|
|||
|
|
|||
|
To enable the mailman service after package installation you may run
|
|||
|
the "serviceconf" GUI tool, or you may do the following on the
|
|||
|
command line as root.
|
|||
|
|
|||
|
/sbin/service mailman start
|
|||
|
|
|||
|
To have the mailman service automatically start at certain run
|
|||
|
levels (replace the runlevel below with your desired run levels, for
|
|||
|
example to start mailman at run levels 3 and 5 runlevel would be 35:
|
|||
|
|
|||
|
/sbin/chkconfig --level runlevel mailman on
|
|||
|
|
|||
|
- You should then subscribe yourself to the mailman list.
|
|||
|
|
|||
|
|
|||
|
2. Customize Mailman
|
|||
|
|
|||
|
You should do these steps using the account you installed Mailman
|
|||
|
under in section 2 above.
|
|||
|
|
|||
|
- The file @prefix@/Mailman/Defaults.py contains a number of
|
|||
|
defaults for your installation. If any of these are incorrect,
|
|||
|
override them in @prefix@/Mailman/mm_cfg.py.
|
|||
|
|
|||
|
DO NOT EDIT Defaults.py!
|
|||
|
|
|||
|
Note: If you have upgraded your mailman installation RPM will
|
|||
|
save a copy of your previous version of mm_cfg.py in
|
|||
|
mm_cfg.py.rpmsave.
|
|||
|
|
|||
|
See the comments in Defaults.py for details. Once a list is
|
|||
|
created, editing many of these variables will have no effect.
|
|||
|
At that point, you'll need to configure your lists through the
|
|||
|
web admin interface or through the command line script
|
|||
|
@prefix@/bin/withlist or @prefix@/bin/config_list.
|
|||
|
|
|||
|
Note: Do *not* change HOME_DIR or MAILMAN_DIR. These are set
|
|||
|
automatically by the configure script when the RPM was created.
|
|||
|
|
|||
|
- Create the site password using:
|
|||
|
|
|||
|
% @prefix@/bin/mmsitepass <your-site-password>
|
|||
|
|
|||
|
This password can be used anywhere that individual user or
|
|||
|
mailing list administrator passwords are required, giving the
|
|||
|
mailman site administrator the ability to adjust these things
|
|||
|
when necessary.
|
|||
|
|
|||
|
You may also want to create a password for the site-wide "list
|
|||
|
creator" role (someone other than the site administrator who as
|
|||
|
privileges to create and remove lists through the web). Use the
|
|||
|
-c option to mmsitepass to set this.
|
|||
|
|
|||
|
|
|||
|
3. Troubleshooting
|
|||
|
|
|||
|
If you encounter problems with running Mailman, first check the
|
|||
|
"Common Problems" section, below. If your problem is not covered
|
|||
|
there, check both the FAQ file and the online FAQ Wizard.
|
|||
|
Check for errors in the mailman log files which can be found in
|
|||
|
|
|||
|
@LOG_DIR@
|
|||
|
|
|||
|
Mailman logs errors to this file:
|
|||
|
|
|||
|
@LOG_DIR@/error
|
|||
|
|
|||
|
If you encounter an error, send an error report to
|
|||
|
mailman-users@python.org. Include a description of what you're
|
|||
|
doing to cause the problem, and the relevant lines from your
|
|||
|
syslog. Also include information on your operating system, which
|
|||
|
version of Python you're using, and which version of Mailman
|
|||
|
you're installing.
|
|||
|
|
|||
|
|
|||
|
4. Common Problems
|
|||
|
|
|||
|
Problem: All Mailman web pages give a 404 File not found error.
|
|||
|
|
|||
|
Solution: Your web server has not been set up properly for handling
|
|||
|
Mailman's cgi commands. Make sure you've:
|
|||
|
|
|||
|
1) Configured the web server to give permissions to
|
|||
|
@prefix@/cgi-bin
|
|||
|
2) Restarted the web server properly.
|
|||
|
|
|||
|
Consult your web server's documentation for instructions
|
|||
|
on how to do these things.
|
|||
|
|
|||
|
|
|||
|
Problem: All Mailman web pages give an "Internal Server Error".
|
|||
|
|
|||
|
Solution: The likely problem is that you are using the wrong GID or
|
|||
|
UID for CGI scripts. Check your syslog. If you see, for
|
|||
|
example, a line like:
|
|||
|
|
|||
|
Attempt to exec script with invalid gid 51, expected 99
|
|||
|
|
|||
|
You need to reinstall Mailman, and specify $CGI_GID to be 51,
|
|||
|
as described in the installation instructions.
|
|||
|
|
|||
|
|
|||
|
Problem: I send mail to the list, and get back mail saying the
|
|||
|
list is not found!
|
|||
|
|
|||
|
Solution: You probably didn't add the necessary aliases to the system
|
|||
|
alias database, given to you when you ran the newlist
|
|||
|
command. If you did add them, you likely did not update
|
|||
|
the alias database, or your system requires you to run
|
|||
|
newaliases explicitly. Refer to section 5 above for
|
|||
|
more information.
|
|||
|
|
|||
|
|
|||
|
Problem: I send mail to the list, and get back mail saying,
|
|||
|
"unknown mailer error".
|
|||
|
|
|||
|
Solution: The likely problem is that you are using the wrong GID or
|
|||
|
UID for mail. Check your syslog. If you see, for
|
|||
|
example, a line like:
|
|||
|
|
|||
|
Attempt to exec script with invalid gid 51, expected 99
|
|||
|
|
|||
|
You need to reinstall Mailman, and specify $MAIL_GID to
|
|||
|
be 51, as described in the installation
|
|||
|
instructions. see notes on Postfix below, as by default
|
|||
|
it will create these problems on installation.
|
|||
|
|
|||
|
|
|||
|
Problem: I use Postfix for my MTA and the mail wrapper programs
|
|||
|
are logging complaints about the wrong GID.
|
|||
|
|
|||
|
Solution: Create a separate aliases file for Postfix in its
|
|||
|
main.cf config file under the variable "alias_maps". Put
|
|||
|
the file somewhere in Mailman's home directory, or
|
|||
|
somewhere else where the user mailman has write access
|
|||
|
to it; *as user mailman* call Postfix's "postalias" on the
|
|||
|
alias file.
|
|||
|
|
|||
|
% postalias <the alias file>
|
|||
|
|
|||
|
Also as user mailman, run
|
|||
|
|
|||
|
% python -c'import os; print os.getgid()'
|
|||
|
|
|||
|
This should print out the group id that Mailman should
|
|||
|
be configured to expect when the mail wrapper programs
|
|||
|
are run. Call it "thegid". Rebuild Mailman with
|
|||
|
|
|||
|
% ./configure --with-mail-gid=thegid
|
|||
|
|
|||
|
See also the "Using the Postfix mail server" section of
|
|||
|
the mailman installation manual for more information on
|
|||
|
connecting Postfix and Mailman. The manual is available
|
|||
|
in several formats at /usr/share/doc/mailman-*/admin/www.
|
|||
|
|
|||
|
|
|||
|
Problem: I send mail to the list, and get back mail saying,
|
|||
|
"sh: mailman not available for sendmail programs"
|
|||
|
|
|||
|
Solution: Your system uses sendmail restricted shell (smrsh). You
|
|||
|
need to configure smrsh by creating a symbolic link from
|
|||
|
the mail wrapper (@prefix@/mail/mailman) to the directory
|
|||
|
identifying executables allowed to run under smrsh.
|
|||
|
|
|||
|
Some common names for this directory are
|
|||
|
/var/admin/sm.bin, /usr/admin/sm.bin or /etc/smrsh.
|
|||
|
|
|||
|
Note that on Debian Linux, the system makes
|
|||
|
/usr/lib/sm.bin, which is wrong, you will need to create
|
|||
|
the directory /usr/admin/sm.bin and add the link there.
|
|||
|
Note further any aliases newaliases spits out will need
|
|||
|
to be adjusted to point to the secure link to the
|
|||
|
wrapper.
|
|||
|
|
|||
|
|
|||
|
Problem: I messed up when I called configure. How do I clean
|
|||
|
things up and re-install?
|
|||
|
|
|||
|
Solution: % make clean
|
|||
|
% ./configure --with-the-right-options
|
|||
|
% make install
|
|||
|
|
|||
|
|
|||
|
-------------------- Other Useful Information -----------------
|
|||
|
|
|||
|
RPM Preserves User Modified Files
|
|||
|
---------------------------------
|
|||
|
|
|||
|
The rpm during installation will preserve changes you have made to
|
|||
|
configuration files and templates from a previous installation. This
|
|||
|
is almost always what is desired. However you may want to check for
|
|||
|
the existence of files with either the .rpmsave or the .rpmnew
|
|||
|
extension and verify if any of these backup files created during the
|
|||
|
RPM install exist and if you are indeed using the version of the file
|
|||
|
you desire.
|
|||
|
|
|||
|
Note: The installation directory for non-data files changed from
|
|||
|
@VAR_PREFIX@ to @prefix@ in mailman-2.1.5-20. Configuration files and
|
|||
|
templates that were user modified in a previous installation will need
|
|||
|
to manually move those changes from the earlier @VAR_PREFIX@ to the
|
|||
|
new @prefix@ installation directory.
|
|||
|
|
|||
|
Here are a few commands that will aid you in this process:
|
|||
|
|
|||
|
List any rpm backup files in the mailman installation directory:
|
|||
|
|
|||
|
% find @prefix@ @VAR_PREFIX@ -name '*.rpm*'
|
|||
|
|
|||
|
List any configuration files NOT in the mailman installation directory
|
|||
|
you might miss with the above command which also have the potental for
|
|||
|
backup copies. Given this short list you'll have to look for a
|
|||
|
matching backup file.
|
|||
|
|
|||
|
% rpm -qc mailman | egrep -v '@prefix@|@VAR_PREFIX@'
|
|||
|
|
|||
|
When rpm preserves a user modified file it installs the newest version
|
|||
|
of the file by appending the .rpmnew extension to the file name thus
|
|||
|
preserving the file but making the latest version avialable. If rpm
|
|||
|
replaces a user modified file the file being replaced is renamed to
|
|||
|
have the .rpmsave extension. RPM only performs these backup operations
|
|||
|
if the file is marked as being a configuration file in the rpm spec
|
|||
|
file, it is not performed in general on all files in the package.
|
|||
|
|
|||
|
|
|||
|
Mailman Cron Jobs:
|
|||
|
------------------
|
|||
|
|
|||
|
Mailman relies on the cron daemon to schedule periodic actions. These
|
|||
|
are contained in a crontab file. Previous versions of the mailman RPM
|
|||
|
from Red Hat created the cron jobs by running the crontab(1) command
|
|||
|
during the RPM installation phase. The cron jobs are now handled
|
|||
|
slightly differently. Rather than invoking crontab which loaded the
|
|||
|
cron jobs into a private cron file a mailman crontab file is installed
|
|||
|
into /etc/cron.d. The crontab file and the commands it runs were
|
|||
|
modified from the upstream distribution so these commands would run
|
|||
|
under the correct SELinux security profile.
|
|||
|
|
|||
|
Previously the cron jobs were installed when the RPM was
|
|||
|
installed. This was less than optimal because the act of having the
|
|||
|
mailman RPM installed on a system should not cause the cron jobs to
|
|||
|
run. A better solution is to only run the mailman cron jobs if the
|
|||
|
mailman service is enabled. This is accomplished by installing the
|
|||
|
mailman crontab file in /etc/cron.d when the mailman service is
|
|||
|
started by mailman init.d script (e.g. either at boot time or via
|
|||
|
/sbin/service). When the mailman service is stopped the crontab file
|
|||
|
is removed from /etc/cron.d. The crontab file is copied from
|
|||
|
@prefix@/cron/crontab.in to /etc/cron.d/mailman. Thus if you edit the
|
|||
|
cron jobs you will need to edit the master copy in @prefix@/cron
|
|||
|
otherwise your edits will be lost the next time the mailman service is
|
|||
|
started or restarted. To pick up any changes made to the crontab file
|
|||
|
edit the master copy in @prefix@/cron and then use /sbin/service to
|
|||
|
restart mailman (e.g. /sbin/service mailman restart). Some may wonder
|
|||
|
why the crontab file in /etc/cron.d is not symbolically linked to the
|
|||
|
master copy when the service starts and unlinked when it stops. The
|
|||
|
reason is because newer versions of cron will refuse for security
|
|||
|
reasons to run any crontabs which are links to other files or
|
|||
|
writeable by anybody else except root.
|
|||
|
|
|||
|
Choosing your MTA (sendmail or postfix) on Red Hat Systems:
|
|||
|
-----------------------------------------------------------
|
|||
|
|
|||
|
Red Hat ships two different MTA's, sendmail and postfix. Because the
|
|||
|
sendmail and postfix rpms's share file names when installed the
|
|||
|
conflict is accomodated by utilizing the "alternatives" mechanism
|
|||
|
which manages a set of links. When one of the MTA's is selected via
|
|||
|
/usr/sbin/alternatives links are established which point to the
|
|||
|
correct files for that MTA. There are two ways to select your MTA:
|
|||
|
The system-switch-mail package contains a GUI front end to the
|
|||
|
alternatives mechanism and /usr/bin/system-switch-mail is an easy way
|
|||
|
to select your MTA, or you can invoke alternatives directly like this:
|
|||
|
|
|||
|
% /usr/sbin/alternatives --config mta
|
|||
|
|
|||
|
Note: Selecting your preferred MTA is distinct from configuring the
|
|||
|
MTA, you will need to consult the documentation for the MTA you
|
|||
|
selected for information on how to configure it.
|
|||
|
|
|||
|
|
|||
|
Local Variables:
|
|||
|
mode: indented-text
|
|||
|
indent-tabs-mode: nil
|
|||
|
End:
|