#! @im_path_perl@
################################################################
###
### imsetup: setup command for IM
###
### Author: Internet Message Group
### Created: May 9, 1997
### Revised: Feb 28, 2000
###
BEGIN {
@im_my_siteperl@
@im_src_siteperl@
};
my $VERSION = "imsetup version 20000228(IM140)";
$Prog = 'imsetup';
##
## Require packages
##
use File::Copy;
use Sys::Hostname;
use IM::Config qw(init_opt read_opt read_cfg 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_help);
##
## Environments
##
my $imdir = ".im";
my $config = "Config";
my $alias = "Aliases";
my $home = $ENV{'HOME'};
my $address;
my $mail = "Mail";
my $news = "News";
my $usecl = "@im_usecl@";
my $nosync = "@im_nosync@";
my $src = "local";
my $auth = "";
my ($user, $host) = split(/\@/, $address);
my $keep = 0;
my $smtpserver = "localhost";
my ($mhdir, $mhalias, $domain, $nntpservers);
$EXPLANATION = "
$Prog :: Setup command for IM series
$VERSION
Usage :: $Prog [options]
";
@OptConfig = (
'FromDomain;s;;' => 'Default domain name for mail address.',
'noharm;b;;' => "Do execute setup, show what will be performed.",
'help;b;;' => "Show this message.",
);
##
## Profile and option processing
##
init_opt(\@OptConfig);
read_cfg();
read_opt(\@ARGV); # help?
help($EXPLANATION) && exit $EXIT_SUCCESS if $opt_help;
##
## Main
##
if ($opt_fromdomain =~ /\./) {
$address = im_getlogin() . "\@" . $opt_fromdomain;
} else {
$address = im_getlogin() . "\@" . get_domain_name();
}
&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/!!e
|| &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/!!e
|| &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 =~ /^pop|^imap/i) {
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(/\@/, $address);
$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);
$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)
if ($nosync ne 'yes');
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);
if ($a =~ /\@(.*)/) {
$domain = $1;
}
$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=user_name
##
## 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/
## 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 ) {
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/)
#MBoxStyle=qmail # if folder style mbox of qmail is used
#Imget.Src=local:\${HOME}/MailDir# in case of qmail
UseCL=$usecl # Use value of Content-Length header
NoSync=$nosync # Do not need fsync(2) on writing file
---
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 mbox (POP only)
---
if ($src =~ /^imap/i) {
print CONFIG <<"---";
Imget.Src=imap
ImapAccount=/$auth:$user\@$host
keep=$keep
---
}
print CONFIG <<"---";
#Imget.Src=imap
#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=6543 # Port to connect pwagent with TCP/IP
# (Insecure for multi-user system!)
# 0 to use UNIX domain socket (more secure)
# be careful on security if you wish to use PwFiles!
#UsePwFiles=yes # use password files
#PwFiles=password # password files (relative to ~/.im/)
## imput specific
#FccDir=\$MailDir # directory for FCC folders
#QueueDir=queue # directory for to store messages to be sent
#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 --
---
}
}
### 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: