#! @im_path_perl@
################################################################
###
### imsetup: setup command for IM
###
### Author: Internet Message Group
### Created: May 9, 1997
### Revised: Mar 8, 2005
###
BEGIN {
@im_my_siteperl@
@im_src_siteperl@
};
$Prog = 'imsetup';
my $VERSION_DATE = "20050308";
my $VERSION_NUMBER = "148";
my $VERSION = "${Prog} version ${VERSION_DATE}(IM${VERSION_NUMBER})";
my $VERSION_INFORMATION = "${Prog} (IM ${VERSION_NUMBER}) ${VERSION_DATE}
Copyright (C) 1999 IM developing team
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
";
##
## Require packages
##
use File::Copy;
use Sys::Hostname;
use IM::Config qw(init_opt read_opt read_cfg use_cl no_sync help);
use IM::Util;
use IM::Address qw(extract_addr);
use integer;
use strict;
use vars qw($Prog $EXPLANATION @OptConfig
$opt_fromdomain $opt_noharm $opt_usecl $opt_nosync
$opt_help $opt_version);
##
## Environments
##
my $imdir = ".im";
my $config = "Config";
my $alias = "Aliases";
my $home = $ENV{'HOME'};
my $address;
my $username;
my $mail = "Mail";
my $news = "News";
my $usecl;
my $nosync;
my $src = "local";
my $mailbox_style = "mbox";
my $auth = "";
my($user, $host) = split(/\@/, $address);
my $keep = 0;
my $smtpserver = "localhost";
my($mhdir, $mhalias, $domain, $nntpservers);
$EXPLANATION = "$VERSION
setup for IM
Usage: $Prog [Options]
";
@OptConfig = (
'FromDomain;s;;' => 'Default domain name for mail address',
'noharm;b;;' => "Do execute setup, show what will be performed",
'help;b;;' => "Display this help and exit",
'version,V;b;;' => "Output version information and exit",
);
##
## Profile and option processing
##
init_opt(\@OptConfig);
read_cfg();
read_opt(\@ARGV); # help?
print("${VERSION_INFORMATION}") && exit $EXIT_SUCCESS if $opt_version;
help($EXPLANATION) && exit $EXIT_SUCCESS if $opt_help;
##
## Main
##
if ($opt_fromdomain =~ /\./) {
$address = im_getlogin() . "\@" . $opt_fromdomain;
} else {
$address = im_getlogin() . "\@" . get_domain_name();
}
$usecl = use_cl() ? 'yes' : 'no';
$nosync = no_sync() ? 'yes' : 'no';
&read_conf();
&check_im_directory();
&make_conf_file();
©_alias_file();
sub get_domain_name() {
my $hostname = hostname();
unless ($hostname =~ /\./) {
my($h) = gethostbyname($hostname);
$hostname = $h if ($h);
}
$hostname =~ s/^[^.]+\.//;
return $hostname;
}
sub read_conf() {
$home = &input_config("Where is your home directory?", $home);
&scan_mh_conf();
my $mymail = "$home/$mail";
my $mynews = "$home/$news";
my $qhome = quotemeta($home);
do {
do {
$mymail = &input_config("Where is your Mail directory?", $mymail);
} until (($mail = $mymail) =~ s!^$qhome/!!
|| &input_confirm("Sure to use $mail which is not beneath "
. "your home directory?"));
} while (! &check_and_create_directory($mymail));
do {
do {
$mynews = &input_config("Where is your News directory?", $mynews);
} until (($news = $mynews) =~ s!^$qhome/!!
|| &input_confirm("Sure to use $news which is not beneath "
. "your home directory?"));
} while (! &check_and_create_directory($mynews));
$address = &input_config("What is your E-mail address(es)?", $address);
do {
$src = &input_config("What kind of mail spool do you use? (local/POP/IMAP)", $src);
} while (! ($src =~ /^local$|^pop$|^imap$/i));
if ($src =~ /^local/i) {
do {
$mailbox_style = &input_config("What kind of mailbox style do you use? (mbox/maildir)", $mailbox_style);
} while (! ($mailbox_style =~ /^mbox$|^maildir$/i));
}
if ($src =~ /^pop|^imap/i) {
my $a = extract_addr($address);
if ($src =~ /^pop/i) {
$auth = "POP";
do {
$auth = &input_config("What kind of POP authentication mechanism? (POP/APOP/RPOP)", $auth);
} while (! ($auth =~ /^pop$|^apop$|^rpop$/i));
} else {
$auth = "AUTH";
do {
$auth = &input_config("What kind of IMAP authentication mechanism? (AUTH/LOGIN)", $auth);
} while (! ($auth =~ /^auth$|^login$/i));
}
($user, $host) = split(/\@/, $a);
$host = "mail." . $host;
$user = &input_config("What is your $src account name?", $user);
$host = &input_config("What is your $src server name or IP address?", $host);
}
if ($src =~ /^pop/i) {
$keep = &input_config("Do you want to preserve messages?\n"
. "0 (delete immediately), -1 (preserve forever),\n"
. "N > 0 (delete messages after N days) "
, $keep);
}
if ($src =~ /^pop|^imap/i) { $smtpserver = $host; }
$smtpserver = &input_config("What is your SMTP server name or IP address?", $smtpserver);
$usecl = &input_config("Do you want to use value of Content-Length"
. " header for delimitation for local\nmail?"
. " (Answer yes if your OS supports Content-Length"
. " header like Solaris 2.x,\notherwise answer no.)"
, $usecl);
if ($nosync ne 'yes') {
$nosync =
&input_config("Does your system can detect write errors without"
. " fsync(2)? (You can answer yes,\n"
. "if your home directory is on local file system,"
. " otherwise answer no.)"
, $nosync eq 'undefined' ? 'no' : $nosync);
}
print "\n";
}
sub input_config($$) {
my($msg, $default) = @_;
my $ret;
print "$msg [$default] ";
chomp($ret = );
$ret = $default if ($ret =~ /^\s*$/);
return $ret;
}
sub input_confirm($;$) {
my($msg, $default) = @_;
my $ret;
$default = "yes" if $default eq "";
print "$msg [$default] ";
chomp($ret = );
$ret = $default if ($ret =~ /^\s*$/);
return $ret =~ m/^y/i;
}
sub scan_mh_conf() {
my $mh_profile = "$home/.mh_profile";
if (-f $mh_profile) {
open(MH_PROFILE, $mh_profile);
while () {
chomp;
if (/^Path:\s*(.*)/i) {
$mhdir = $mail = $1;
$mail =~ s/($home|~)\///;
}
if (/^Aliasfile:\s*(.*)/i) {
$mhalias = $1;
}
if (!$mhalias && /^ali:\s*-alias\s*(.*)/i) {
$mhalias = $1;
}
if (/^Alternate-Mailboxes:\s*(.*)/i) {
$address = $1;
}
}
} else {
$mhdir = $mail;
$mhalias = 'aliases';
}
}
sub check_im_directory() {
if (-x "$home/$imdir") {
print "$home/$imdir is already exist.\n";
} else {
if (!$opt_noharm) {
if (mkdir("$home/$imdir", 0700) == 0) {
die "Fail to create $home/$imdir directory: $!\n";
}
print "Directory $home/$imdir created.\n";
}
}
}
sub check_and_create_directory($) {
my $dir = shift;
if (! -x $dir) {
if (&input_confirm("$dir does not exist. Create it?")) {
print "Creating $dir directory.\n";
if (!$opt_noharm) {
if (mkdir("$dir", 0700) == 0) {
die "Fail to create $dir directory: $!\n";
}
print "Directory $dir created.\n";
}
return 1;
}
else {
return 0;
}
}
return 1;
}
sub copy_alias_file() {
my $im_alias = "$home/$imdir/$alias";
my $mh_alias = "$home/$mhdir/$mhalias";
if (! -f $mh_alias) {
$mh_alias = $mhalias;
}
if (-f $mh_alias && ! -f $im_alias) {
print "Copy $mh_alias to $im_alias.\n";
if (!$opt_noharm) {
copy($mh_alias, $im_alias);
}
}
}
sub make_conf_file() {
my $im_config = "$home/$imdir/$config";
if (-f $im_config) {
print "Backup $im_config to $im_config.bak.\n";
if (!$opt_noharm) {
rename ("$im_config", "$im_config.bak");
}
}
print "Setup $im_config.\n";
if (!$opt_noharm) {
my $a = extract_addr($address);
($username, $domain) = split(/\@/, $a);
$nntpservers = $ENV{'NNTPSERVER'} || "localhost";
open(CONFIG, ">$im_config");
print CONFIG <<"---";
################################################################
###
### Sample ~/.im/Config
###
### Syntax::
### key=value
###
### * "key=value" is equivalent to "--key=value" style command option.
### * "key" must start at the beginning of the line.
### * "=" must follow after "key" without white spaces.
### * White spaces are allowed between "=" and "value".
### * ":" can be used instead of "=".
### * Characters after "#" are ignored.
###
### The following examples are all the same:
### key=value
### key= value
### key:value
### key: value
###
### \$variable will be expanded.
### '~' will be expanded.
###
##
## Individual information
##
Address=$address
FromDomain=$domain
ToDomain=$domain
#Name=Full Name # commentary name for my mail address
# should not contain 8bit characters
#AddrRegex=
#Org=The Mew Organization # for news posting
User=$username
##
## Default global parameters
##
### Directories (relative to ~/)
MailDir=$mail
NewsDir=$news # for saved news
### Folders in \$MailDir
#InboxFolder=+inbox # default destination of imget
#DraftFolder=+draft
#TrashFolder=+trash # default destination of message removal in Mew
### Folder style in \$NewsDir (saved news articles)
#PreserveDot=off # off: /news/group/, on: /news.group/
### Mode for creation
#FolderMode=0700
#MsgMode=0600
### To keep state of IM commands (CurrentFolder, etc.)
#ContextFile=Context # relative to ~/.im/
##
## Default settings
##
## Address Book
#AddrBookFile=Addrbook # relative to ~/.im/
#AddrBookFile=\${HOME}/Mail/Addrbook # if you share Addrbook with Mew 2
## Mail address aliases
#AliasesFile=Aliases # relative to ~/.im/
## PetName: mail address aliases for displaying
#PetnameFile=Petnames # relative to ~/.im/
## Message-ID database
#MsgDBFile=msgiddb # location (relative to ~/.im/)
#MsgDBType=DB # type of database (DB, NDBM, SDBM)
## To call user defined subroutines (relative to ~/.im/)
#GetChkSbr=getchk.sbr # hooks for imget
#GetSbr=get.sbr # hooks for imget
#ScanSbr=scan.sbr # hooks for imget/imls
## Working folders
#Src=\$InboxFolder # default source of most commands
#Imrm.Src=\$TrashFolder # default source for message cleanups
## imget/imls specific
#ScanSbr=scan.sbr # hook for special processing (rel. to ~/.im/)
#Form=%+5n %m%d %-14A %S || %b # default format for scanning
#AllowCRLF=no # saved messages may contain CRLF (DOS style)
#Width=80 # default width for scanning
#JisSafe=on # escape seq. of JIS char. should be managed
#Indent=2 # indent step for threading
## Servers
Smtpservers=$smtpserver
#Smtpservers=localhost # default server for SMTP
#EmgSmtpSvrs=12.34.56.78,localhost # SMTP server just for error return
#NntpServers=localhost # default server for NNTP
## imget specific
#GetSbr=get.sbr # hook for special processing (rel. to ~/.im/)
---
if ($src =~ /^local/i) {
if ($mailbox_style =~ /^maildir/i) {
print CONFIG <<"---";
MBoxStyle=qmail
Imget.Src=local:\${HOME}/Maildir
keep=$keep
---
} else {
print CONFIG <<"---";
Imget.Src=local
keep=$keep
---
}
}
print CONFIG <<"---";
#Imget.Src=local # default source of imget (local mailbox)
#lock=flock # locking style of local mailbox
#rpath=append # conversion of UNIX From into Return-Path:
#PopHistory=pophist-{POPSERVERID} # to save last state (relative to ~/.im/)
#NntpHistory=newshist # to save last state (relative to ~/.im/)
#MboxFilter=bogofilter -p -M -I # filter for mbox file
#MboxFilter=spamoracle mark
#MBoxFilter=bsfilter --spam-cutoff 0.85 --pipe --insert-flag --mbox 2>/dev/null
#MBoxStyle=qmail # in case of qmail (maildir format)
#Imget.Src=local:\${HOME}/Maildir
UseCL=$usecl # Use value of Content-Length header
NoSync=$nosync # Do not need fsync(2) on writing file
#FsyncNumber=0 # if 0, system call number of fsync is guessed
#SshPath=/usr/bin/ssh # Path name of SSH program
---
if ($src =~ /^pop/i) {
print CONFIG <<"---";
Imget.Src=pop
PopAccount=/$auth:$user\@$host
keep=$keep
---
}
print CONFIG <<"---";
#Imget.Src=pop
#PopAccount=/APOP\@localhost # account info for POP access
#PopAccount=/APOP:user\@host # account info with user name
#PopAccount=/APOP:user\@host/110 # account info with user name and port number
#Keep=7 # preserve read messages on server
#ProtoKeep=UIDL # how to know which message is unread
# (UIDL, LAST, STATUS, MSGID)
#IgnorePostPet=yes # leave messages for PostPet on POP server
---
if ($src =~ /^imap/i) {
print CONFIG <<"---";
Imget.Src=imap%INBOX
ImapAccount=/$auth:$user\@$host
keep=$keep
---
}
print CONFIG <<"---";
#Imget.Src=imap%INBOX
#ImapAccount=/AUTH\@localhost # account info for IMAP access
#ImapAccount=/AUTH:user\@host # account info with user name
#HttpProxy=proxy-server:8080 # proxy server for HTTP access
#NoProxy=http://.*my.domain/ # URL regex not to use Proxy server
#UsePwAgent=yes # use password agent
#PwAgentPort=0 # Port to connect pwagent with TCP/IP
# 0 to use UNIX domain socket
# NOTE: non-0 (e.g. 6543) is insecure
# on multi-user system
#PwAgentTmpDir=pwagtmp # temporary directory (relative to ~/.im/)
# be careful on security if you wish to use PwFiles!
#UsePwFiles=yes # use password files
#PwFiles=password # password files (relative to ~/.im/)
#MailFoldersFile=~/Mail/.folders
#UseTouchFile=yes # use time-stamp file
#TouchFile=.mew-touch # time-stamp file for message folders
#NamazuV2=yes # use Namazu version 2 (1.9.x or late)
#NamazuDir=Namazu # relative to ~/
#NamazuLockDir=nmzlock # lock directory (relative to ~/.im/)
#MknmzIncludeFile=~/Namazu/mknmz-inc.pl # mknmz -I
#MknmzIgnoreFoldersRegex=\+(attach|draft|trash|queue|postq|schedule)
## imput specific
#FccDir=\$MailDir # directory for FCC folders
#QueueDir=queue # directory for to store messages to be sent
#UseXDispatcher=yes # use X-Dispatcher field
#MsgIdUser=\${USER} # user part for creation of Message-Id:
#MsgIdDomain=\${HOST} # if you want to use FQDN of dispatching host
#ObeyMTAdomain=yes # do not append domainpart to addresses by imput
#NoMsgIdForNews=yes # do not insert Message-Id: when posting as news
#NewsGMTdate=yes # use GMT for Date: when posting as news
#UseLines=yes # generate Lines header line
#JPheader=yes # encode ISO-2022-JP with RFC2047
#Defcode=EUC # default code in case no way to judge SJIS/EUCj
#JPconv=yes # convert SJIS/EUCj to ISO-2022-JP
#NoHdrFolding=yes # do not fold long header line when encoding
#HdrQEncoding=yes # use Q-encoding to encode ISO-2022-JP
#NameInComment=yes # yes: (Full Name) Addr, no: Full Name
#Lines=3000 # unit to split a message to partial
#Annotate=yes # annotate on parent messages (MsgDB required)
# Common operational settings
#Help=no
#Quiet=no
#Noharm=no
#Verbose=no
#Debug=
#case mew
#FromDomain=mew.org
#case queue
#JustQueuing=yes
#Queuing=yes
#case news
#Assoc= +inbox=nntp:fj.mail.system.sendmail;\\
# +inbox=nntp:fj.mail
#Count=10
#case default
# -- global setting again --
---
}
}
__END__
=head1 NAME
imsetup - setup for IM
=head1 SYNOPSIS
B [OPTIONS]
=head1 DESCRIPTION
The I command is a setup program for IM.
This command is provided by IM (Internet Message).
=head1 OPTIONS
=over 5
=item I<-f, --fromdomain=STRING>
Default domain name for mail address.
=item I<-n, --noharm={on,off}>
Do execute setup, show what will be performed.
=item I<-h, --help>
Display help message and exit.
=item I<--version>
Output version information and exit.
=back
=head1 COPYRIGHT
IM (Internet Message) is copyrighted by IM developing team.
You can redistribute it and/or modify it under the modified BSD
license. See the copyright file for more details.
=cut
### Copyright (C) 1997, 1998, 1999 IM developing team
### All rights reserved.
###
### Redistribution and use in source and binary forms, with or without
### modification, are permitted provided that the following conditions
### are met:
###
### 1. Redistributions of source code must retain the above copyright
### notice, this list of conditions and the following disclaimer.
### 2. Redistributions in binary form must reproduce the above copyright
### notice, this list of conditions and the following disclaimer in the
### documentation and/or other materials provided with the distribution.
### 3. Neither the name of the team nor the names of its contributors
### may be used to endorse or promote products derived from this software
### without specific prior written permission.
###
### THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND
### ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
### IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
### PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE
### LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
### CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
### SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
### BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
### WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
### OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
### IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
### Local Variables:
### mode: perl
### End: