Marc Haber
2005-Feb-05 12:48 UTC
[Adduser-devel] r192 - in trunk: debian examples examples/examples examples/examples/skel examples/examples/skel.other
Author: zugschlus Date: 2005-02-05 13:48:53 +0100 (Sat, 05 Feb 2005) New Revision: 192 Added: trunk/examples/examples/ trunk/examples/examples/adduser.conf trunk/examples/examples/bash.bashrc trunk/examples/examples/profile trunk/examples/examples/skel.other/ trunk/examples/examples/skel.other/index.html trunk/examples/examples/skel/ trunk/examples/examples/skel/dot.bash_logout trunk/examples/examples/skel/dot.bash_profile trunk/examples/examples/skel/dot.bashrc Modified: trunk/debian/changelog trunk/debian/copyright trunk/examples/INSTALL trunk/examples/README trunk/examples/adduser.local trunk/examples/adduser.local.conf Log: * Add new adduser.local examples directory by John Zaitseff. (mh) Closes: #273010. Modified: trunk/debian/changelog ==================================================================--- trunk/debian/changelog 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/debian/changelog 2005-02-05 12:48:53 UTC (rev 192) @@ -14,9 +14,11 @@ * Fix adduser manpage: Adding an already-existing system user issues a warning. The manpage claims adduser will exit silently. (mh) * Add Basque program and debconf translation. Thanks to Piarres Beobide - Egaña. (mh) Closes: #279659. + Egaña. (mh) Closes: #279659. + * Add new adduser.local examples directory by John Zaitseff. (mh) + Closes: #273010. - -- Marc Haber <mh+debian-packages@zugschlus.de> Sat, 5 Feb 2005 13:41:54 +0100 + -- Marc Haber <mh+debian-packages@zugschlus.de> Sat, 5 Feb 2005 13:48:15 +0100 adduser (3.59) unstable; urgency=low Modified: trunk/debian/copyright ==================================================================--- trunk/debian/copyright 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/debian/copyright 2005-02-05 12:48:53 UTC (rev 192) @@ -21,6 +21,9 @@ adduser is Copyright (C) 1995 Ted Hajek <tedhajek@boombox.micro.umn.edu> with portions Copyright (C) 1994 Debian Association, Inc. +The examples directory has been contributed by John Zaitseff, and is +GPL V2 as well. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or Modified: trunk/examples/INSTALL ==================================================================--- trunk/examples/INSTALL 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/INSTALL 2005-02-05 12:48:53 UTC (rev 192) @@ -2,11 +2,12 @@ be done to install the ADDUSER Local System Additions program. In brief: # cp ./adduser.local /usr/local/sbin +# chmod 755 /usr/local/sbin/adduser.local # cp ./adduser.local.conf /etc # editor /etc/adduser.local.conf # The important step! # mkdir /etc/skel.other # cp ./examples/skel.other/index.html /etc/skel.other -IMPORTANT: Do NOT just perform the above steps without knowing what you -are doing! In particular, the third step is very important for you to do +IMPORTANT: Do NOT just perform the above steps without knowing what you +are doing! In particular, the fourth step is very important for you to do correctly. Modified: trunk/examples/README ==================================================================--- trunk/examples/README 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/README 2005-02-05 12:48:53 UTC (rev 192) @@ -1,7 +1,7 @@ ************************************************************************** * * -* ADDUSER Local System Additions v4.3 * -* Copyright (C) 1999-2001, John Zaitseff * +* ADDUSER Local System Additions v4.6 * +* Copyright (C) 1999-2004, John Zaitseff * * * ************************************************************************** @@ -17,11 +17,11 @@ "ftp" and "www" groups and so on. All, naturally, without forgetting any vital step! -The adduser.local program automates all this for you. By modifying the -program''s configuration file, /etc/adduser.local.conf, to match your local -requirements, this program can automatically add a user to supplementary -groups, create directories and symbolic links and copy skeleton files to -the newly-created directories. +The adduser.local program automates much of this for you. By modifying +the program''s configuration file, /etc/adduser.local.conf, to match your +local requirements, this program can automatically add a user to +supplementary groups, create directories and symbolic links and copy +skeleton files to the newly-created directories. Note that once you install this program (and edit the configuration file), you will never need to directly run adduser.local: the Debian adduser(8) @@ -69,7 +69,7 @@ - the file "/etc/skel.other/index.html" is copied to this directory, owned by the user "john" and with group owner "www". -For more details, just read through the sample configuration file! +For more details, just read through the sample configuration file. INSTALLATION @@ -81,6 +81,7 @@ 1. Copy the actual program to the correct location: # cp ./adduser.local /usr/local/sbin + # chmod 755 /usr/local/sbin/adduser.local 2. Copy the configuration file to the correct location: @@ -98,7 +99,7 @@ # mkdir /etc/skel.other # cp ./examples/skel.other/index.html /etc/skel.other -5. You are finished! +5. You are finished. The main reason you have to install this program manually is so that you do not forget to do Step 3, the most important one! @@ -128,10 +129,10 @@ welcome! Please send these to: Postal: John Zaitseff, - 4 McCabe Close, - Menai, NSW, 2234, + Unit 6, 116 Woodburn Road, + Berala, NSW, 2141, Australia. E-mail: J.Zaitseff@zap.org.au -Web: http://www.zap.org.au/software/adduser.local/ -FTP: ftp://ftp.zap.org.au/pub/adduser.local/adduser.local.tar.gz +Web: http://www.zap.org.au/software/utils/adduser.local/ +FTP: ftp://ftp.zap.org.au/pub/utils/adduser.local/adduser.local.tar.gz Modified: trunk/examples/adduser.local ==================================================================--- trunk/examples/adduser.local 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/adduser.local 2005-02-05 12:48:53 UTC (rev 192) @@ -2,14 +2,14 @@ ######################################################################### # # -# ADDUSER Local System Additions v4.3 # -# Copyright (C) 1999-2001, John Zaitseff # +# ADDUSER Local System Additions v4.6 # +# Copyright (C) 1999-2004, John Zaitseff # # # ######################################################################### # Author: John Zaitseff <J.Zaitseff@zap.org.au> -# Date: 17th April, 2001 -# Version: 4.3 +# Date: 23rd September, 2004 +# Version: 4.6 # This program, once installed as /usr/local/sbin/adduser.local, is auto- # matically called by the adduser(8) system program on a Debian system. @@ -53,101 +53,105 @@ ######################################################################### # Configuration parameters and default values -($O = $0) =~ s,^.*/,,; # adduser.local script name (without path) -$version = ''4.3''; # Script version +use strict; -@adduser = (''/usr/sbin/adduser'', ''--quiet''); # Location of adduser(8) -@chown = (''/bin/chown''); # Location of chown(1) -@install = (''/usr/bin/install'', ''-p''); # Location of install(1) -$procmounts = ''/proc/mounts''; # List of current mounts -$s_false = ''false''; # False string value, in lower case -$s_true = ''true''; # True string value, in lower case +(our $O = $0) =~ s,^.*/,,; # adduser.local script name (without path) +our $version = ''4.6''; # Script version +our @adduser = (''/usr/sbin/adduser'', ''--quiet''); # adduser(8) +our @chown = (''/bin/chown''); # chown(1) +our @install = (''/usr/bin/install'', ''-p''); # install(1) + +our $procmounts = ''/proc/mounts''; # List of current mounts + +our $s_false = ''false''; # False string value, in lower case +our $s_true = ''true''; # True string value, in lower case + # These default values are extensively documented in adduser.local.conf. -$d_conffile = ''/etc/adduser.local.conf''; # Configuration file location -$d_skelother = ''/etc/skel.other''; # Location of skeleton files -$d_dirmode = ''2755''; # Octal mode for directories -$d_filemode = ''0644''; # Octal mode for files +our $d_conffile = ''/etc/adduser.local.conf''; # Configuration file location +our $d_skelother = ''/etc/skel.other''; # Location of skeleton files +our $d_dirmode = ''2755''; # Octal mode for directories +our $d_filemode = ''0644''; # Octal mode for files -$d_user = ''''; # Default service user name -$d_group = ''''; # Default service group name -$d_addtogroup = $s_false; # Default for addtogroup variable -$d_homedir = ''''; # Default home directory -$d_subdir = ''''; # Default subdirectory -$d_althome = $s_false; # Default for using alternate home directory -$d_mounted = $s_false; # Default for checking if mounted -$d_mkdir = $s_false; # Default for creating directory -$d_chgrpdir = $s_false; # Default for chgrpdir variable -$d_mklink = $s_false; # Default for creating symbolic link -$d_linkname = ''''; # Default for symbolic link name -$d_skelfile = ''''; # Default for skeleton file -$d_chgrpskel = $s_false; # Default for chgrpskel variable +our $d_user = ''''; # Default service user name +our $d_group = ''''; # Default service group name +our $d_addtogroup = $s_false; # Default for addtogroup variable +our $d_homedir = ''''; # Default home directory +our $d_subdir = ''''; # Default subdirectory +our $d_althome = $s_false; # Default for use alternate home directory +our $d_mounted = $s_false; # Default for checking if mounted +our $d_mkdir = $s_false; # Default for creating directory +our $d_chgrpdir = $s_false; # Default for chgrpdir variable +our $d_mklink = $s_false; # Default for creating symbolic link +our $d_linkname = ''''; # Default for symbolic link name +our $d_skelfile = ''''; # Default for skeleton file +our $d_chgrpskel = $s_false; # Default for chgrpskel variable # Various strings appearing in the configuration file. While they are # case insensitive in the configuration file, they must appear in lower # case here. -$s_skelother = ''skelother''; -$s_dirmode = ''dirmode''; -$s_filemode = ''filemode''; +our $s_skelother = ''skelother''; +our $s_dirmode = ''dirmode''; +our $s_filemode = ''filemode''; -$s_service = ''service''; +our $s_service = ''service''; -$s_user = ''user''; -$s_group = ''group''; -$s_addtogroup = ''addtogroup''; -$s_homedir = ''homedir''; -$s_subdir = ''subdir''; -$s_althome = ''althome''; -$s_mounted = ''mounted''; -$s_mkdir = ''mkdir''; -$s_chgrpdir = ''chgrpdir''; -$s_mklink = ''mklink''; -$s_linkname = ''linkname''; -$s_skelfile = ''skelfile''; -$s_chgrpskel = ''chgrpskel''; +our $s_user = ''user''; +our $s_group = ''group''; +our $s_addtogroup = ''addtogroup''; +our $s_homedir = ''homedir''; +our $s_subdir = ''subdir''; +our $s_althome = ''althome''; +our $s_mounted = ''mounted''; +our $s_mkdir = ''mkdir''; +our $s_chgrpdir = ''chgrpdir''; +our $s_mklink = ''mklink''; +our $s_linkname = ''linkname''; +our $s_skelfile = ''skelfile''; +our $s_chgrpskel = ''chgrpskel''; -@s_false = ($s_false, ''f'', ''no'', ''n'', ''0''); -@s_true = ($s_true, ''t'', ''yes'', ''y'', ''1''); +our @s_false = ($s_false, ''f'', ''no'', ''n'', ''0''); +our @s_true = ($s_true, ''t'', ''yes'', ''y'', ''1''); # Strings internal to this program (as used by the %cv hash) -$s_svcuid = ''.svcuid''; # Storage for UID of service''s user name -$s_svcgid = ''.svcgid''; # GID of service''s user name or group name -$s_actualdir = ''.actualdir''; # Actual directory: homedir + subdir + username -$s_actuallink = ''.actuallink''; # Actual symbolic link: user homedir + linkname -$s_actualsrcf = ''.actualsrcf''; # Actual source file: skelother + skelfile -$s_actualdstf = ''.actualdstf''; # Actual destination file: actualdir + skelfile +our $s_svcuid = ''.svcuid''; # Storage for UID of service''s user name +our $s_svcgid = ''.svcgid''; # GID of service''s user name or group name +our $s_actualdir = ''.actualdir''; # Actual dir: homedir + subdir + username +our $s_actuallink = ''.actuallink''; # Actual sym link: user homedir + linkname +our $s_actualsrcf = ''.actualsrcf''; # Actual source file: skelother + skelfile +our $s_actualdstf = ''.actualdstf''; # Actual dest file: actualdir + skelfile -$s_addtogroupB = ''.addtogroupB''; # Boolean versions of variables -$s_althomeB = ''.althomeB''; -$s_mountedB = ''.mountedB''; -$s_mkdirB = ''.mkdirB''; -$s_chgrpdirB = ''.chgrpdirB''; -$s_mklinkB = ''.mklinkB''; -$s_chgrpskelB = ''.chgrpskelB''; +our $s_addtogroupB = ''.addtogroupB''; # Boolean versions of variables +our $s_althomeB = ''.althomeB''; +our $s_mountedB = ''.mountedB''; +our $s_mkdirB = ''.mkdirB''; +our $s_chgrpdirB = ''.chgrpdirB''; +our $s_mklinkB = ''.mklinkB''; +our $s_chgrpskelB = ''.chgrpskelB''; ######################################################################### # Initialise global variables -$conffile = $d_conffile; # Default configuration file -$verbose = 1; # Be verbose by default -$dryrun = 0; # NOT a dry run by default +our $conffile = $d_conffile; # Default configuration file +our $verbose = 1; # Be verbose by default +our $dryrun = 0; # NOT a dry run by default -$sep = ''.''; # Service-specific separator +our @services = (); # No services to install by default -@services = (); # No services to install by default - # %cv is a hash for all configuration variables read in from the # configuration file. Global variables are represented by their strings, # eg, $cv{"skelother"}. Service-specific variables are represented by the -# service string value, then $sep, then their string, eg, $cv{"www.user"}. +# service string value, a comma, then their string, eg, $cv{"www","user"}. # The %cl hash plays a similar role, but contains the line number of the # configuration. +our (%cv, %cl); + $cv{$s_skelother} = $d_skelother; $cl{$s_skelother} = 0; $cv{$s_dirmode} = $d_dirmode; $cl{$s_dirmode} = 0; $cv{$s_filemode} = $d_filemode; $cl{$s_filemode} = 0; @@ -156,7 +160,14 @@ $ENV{PATH} = ''/usr/sbin:/usr/bin:/sbin:/bin''; +# Declare some global variables +our $username; # Username for which adduser.local was called +our $uid; # User''s UID +our $gid; # User''s GID +our $homedir; # User''s home directory + + ######################################################################### # Process command-line arguments @@ -228,7 +239,7 @@ $username = $ARGV[0]; - ($t_name, my $t1, $uid, $gid, my $t2, my $t3, my $t4, $homedir) + (my $t_name, my $t1, $uid, $gid, my $t2, my $t3, my $t4, $homedir) = getpwnam($username); die "$O: No such user: $username\n" if ! $t_name; @@ -242,7 +253,7 @@ $homedir = $ARGV[3]; $homedir =~ s,/$,,; # Remove trailing ''/'' if present - ($t_name, my $t1, $t_uid, $t_gid) = getpwnam($username); + (my $t_name, my $t1, my $t_uid, my $t_gid) = getpwnam($username); die "$O: No such user: $username\n" if ! $t_name; die "$O: No such UID: $uid\n" if ! getpwuid($uid); @@ -293,47 +304,44 @@ if ($lcvar eq $s_service) { # Special global configuration variable "service" - my $svc; + my $svc = $lcval; - if (grep((lc $_) eq $lcval, @services)) { + if (grep((lc $_) eq $svc, @services)) { warn "$O: Service \"$val\" redefined at $conffile:$.\n"; next; } push @services, $val; - # Set up default values. See the note later on as to why $svc - # is defined in the following way. + # Set up default values - $svc = $lcval . $sep; + $cv{$svc,$s_user} = $d_user; + $cv{$svc,$s_group} = $d_group; + $cv{$svc,$s_addtogroup} = $d_addtogroup; + $cv{$svc,$s_homedir} = $d_homedir; + $cv{$svc,$s_subdir} = $d_subdir; + $cv{$svc,$s_althome} = $d_althome; + $cv{$svc,$s_mounted} = $d_mounted; + $cv{$svc,$s_mkdir} = $d_mkdir; + $cv{$svc,$s_chgrpdir} = $d_chgrpdir; + $cv{$svc,$s_mklink} = $d_mklink; + $cv{$svc,$s_linkname} = $d_linkname; + $cv{$svc,$s_skelfile} = $d_skelfile; + $cv{$svc,$s_chgrpskel} = $d_chgrpskel; - $cv{$svc.$s_user} = $d_user; - $cv{$svc.$s_group} = $d_group; - $cv{$svc.$s_addtogroup} = $d_addtogroup; - $cv{$svc.$s_homedir} = $d_homedir; - $cv{$svc.$s_subdir} = $d_subdir; - $cv{$svc.$s_althome} = $d_althome; - $cv{$svc.$s_mounted} = $d_mounted; - $cv{$svc.$s_mkdir} = $d_mkdir; - $cv{$svc.$s_chgrpdir} = $d_chgrpdir; - $cv{$svc.$s_mklink} = $d_mklink; - $cv{$svc.$s_linkname} = $d_linkname; - $cv{$svc.$s_skelfile} = $d_skelfile; - $cv{$svc.$s_chgrpskel} = $d_chgrpskel; - - $cl{$svc.$s_user} = 0; - $cl{$svc.$s_group} = 0; - $cl{$svc.$s_addtogroup} = 0; - $cl{$svc.$s_homedir} = 0; - $cl{$svc.$s_subdir} = 0; - $cl{$svc.$s_althome} = 0; - $cl{$svc.$s_mounted} = 0; - $cl{$svc.$s_mkdir} = 0; - $cl{$svc.$s_chgrpdir} = 0; - $cl{$svc.$s_mklink} = 0; - $cl{$svc.$s_linkname} = 0; - $cl{$svc.$s_skelfile} = 0; - $cl{$svc.$s_chgrpskel} = 0; + $cl{$svc,$s_user} = 0; + $cl{$svc,$s_group} = 0; + $cl{$svc,$s_addtogroup} = 0; + $cl{$svc,$s_homedir} = 0; + $cl{$svc,$s_subdir} = 0; + $cl{$svc,$s_althome} = 0; + $cl{$svc,$s_mounted} = 0; + $cl{$svc,$s_mkdir} = 0; + $cl{$svc,$s_chgrpdir} = 0; + $cl{$svc,$s_mklink} = 0; + $cl{$svc,$s_linkname} = 0; + $cl{$svc,$s_skelfile} = 0; + $cl{$svc,$s_chgrpskel} = 0; } else { # Ordinary global variable @@ -358,19 +366,18 @@ my $lcvar = lc $var; my $lcsvc = lc $svc; - my $svcvar = $lcsvc . $sep . $lcvar; if (! grep((lc $_) eq $lcsvc, @services)) { warn "$O: Undefined service \"$svc\" at $conffile:$.\n"; next; } - if (! defined($cv{$svcvar})) { + if (! defined($cv{$lcsvc,$lcvar})) { warn "$O: Unknown service variable \"$var\" at $conffile:$.\n"; next; } - $cv{$svcvar} = $val; - $cl{$svcvar} = $.; + $cv{$lcsvc,$lcvar} = $val; + $cl{$lcsvc,$lcvar} = $.; } # Otherwise, it is an error in the configuration file @@ -417,88 +424,88 @@ ######################################################################### # Actually perform what is required, with appropriate error checking -foreach $service (@services) { +foreach my $service (@services) { - # Note that defining $svc in the following way is rather clever; it - # allows access to the %cv and %cl hashes to be more aesthetically - # pleasing, especially to a C programmer! For example, the "mkdir" - # component would be accessed by $cv{$svc.$s_mkdir} instead of the - # more cumbersome (but equivalent) $cv{lc($service) . $sep . $s_mkdir}. - - my $svc = lc($service) . $sep; + my $svc = lc $service; my ($t_user, $t_group, $t_homedir); print "Processing service \"$service\"\n" if $verbose; # Check validity of all boolean variables and convert them to true bools - &chkbool($svc.$s_addtogroup, $svc.$s_addtogroupB, $d_addtogroup, "$s_addtogroup\[$service\]"); - &chkbool($svc.$s_althome, $svc.$s_althomeB, $d_althome, "$s_althome\[$service\]"); - &chkbool($svc.$s_mounted, $svc.$s_mountedB, $d_mounted, "$s_mounted\[$service\]"); - &chkbool($svc.$s_mkdir, $svc.$s_mkdirB, $d_mkdir, "$s_mkdir\[$service\]"); - &chkbool($svc.$s_chgrpdir, $svc.$s_chgrpdirB, $d_chgrpdir, "$s_chgrpdir\[$service\]"); - &chkbool($svc.$s_mklink, $svc.$s_mklinkB, $d_mklink, "$s_mklink\[$service\]"); - &chkbool($svc.$s_chgrpskel, $svc.$s_chgrpskelB, $d_chgrpskel, "$s_chgrpskel\[$service\]"); + # Note that the notation $hash{$idx1,$idx2} is exactly the same as the + # expression $hash{$idx1 . $; . $idx2}. It is for this reason that + # $svcc is defined. + my $svcc = $svc . $;; # $svc concatenated with $; ($SUBSEP) + + &chkbool($svcc.$s_addtogroup, $svcc.$s_addtogroupB, $d_addtogroup, "$s_addtogroup\[$service\]"); + &chkbool($svcc.$s_althome, $svcc.$s_althomeB, $d_althome, "$s_althome\[$service\]"); + &chkbool($svcc.$s_mounted, $svcc.$s_mountedB, $d_mounted, "$s_mounted\[$service\]"); + &chkbool($svcc.$s_mkdir, $svcc.$s_mkdirB, $d_mkdir, "$s_mkdir\[$service\]"); + &chkbool($svcc.$s_chgrpdir, $svcc.$s_chgrpdirB, $d_chgrpdir, "$s_chgrpdir\[$service\]"); + &chkbool($svcc.$s_mklink, $svcc.$s_mklinkB, $d_mklink, "$s_mklink\[$service\]"); + &chkbool($svcc.$s_chgrpskel, $svcc.$s_chgrpskelB, $d_chgrpskel, "$s_chgrpskel\[$service\]"); + # Process the "user" configuration variable - if ($cv{$svc.$s_user} ne '''') { + if ($cv{$svc,$s_user} ne '''') { # Retrieve information about the specified service''s user name - ($t_user, my $t1, $cv{$svc.$s_svcuid}, $cv{$svc.$s_svcgid}, - my $t2, my $t3, my $t4, $t_homedir) - = getpwnam $cv{$svc.$s_user}; + (my $t_user, my $t1, $cv{$svc,$s_svcuid}, $cv{$svc,$s_svcgid}, + my $t2, my $t3, my $t4, my $t_homedir) + = getpwnam $cv{$svc,$s_user}; if (! $t_user) { - warn "$O: Illegal user name \"$cv{$svc.$s_user}\" at $conffile:$cl{$svc.$s_user}\n"; + warn "$O: Illegal user name \"$cv{$svc,$s_user}\" at $conffile:$cl{$svc,$s_user}\n"; } else { - $cv{$svc.$s_user} = $t_user; + $cv{$svc,$s_user} = $t_user; } # Only set home directory information if not specified by user - if ($cv{$svc.$s_homedir} eq '''') { - if ($cv{$svc.$s_althomeB}) { - $cv{$svc.$s_homedir} = $homedir; # From command line + if ($cv{$svc,$s_homedir} eq '''') { + if ($cv{$svc,$s_althomeB}) { + $cv{$svc,$s_homedir} = $homedir; # From command line } else { - $cv{$svc.$s_homedir} = $t_homedir; # From service''s home + $cv{$svc,$s_homedir} = $t_homedir; # From service''s home } } # If the group parameter is not specified, get the appropriate info # from the user information - if ($cv{$svc.$s_svcgid} && ($cv{$svc.$s_group} eq '''')) { - ($cv{$svc.$s_group}) = getgrgid $cv{$svc.$s_svcgid}; + if ($cv{$svc,$s_svcgid} && ($cv{$svc,$s_group} eq '''')) { + ($cv{$svc,$s_group}) = getgrgid $cv{$svc,$s_svcgid}; } } # Process the "group" configuration variable - if ($cv{$svc.$s_group} ne '''') { + if ($cv{$svc,$s_group} ne '''') { # Retrieve info about the group. Yes, it may have been done # above, but specifying "group" can be done without specifying # "user". In addition, a different group can be specified from # that used by "user". - ($t_group, my $t1, $cv{$svc.$s_svcgid}) = getgrnam $cv{$svc.$s_group}; + ($t_group, my $t1, $cv{$svc,$s_svcgid}) = getgrnam $cv{$svc,$s_group}; if (! $t_group) { - warn "$O: Illegal group name \"$cv{$svc.$s_group}\" at $conffile:$cl{$svc.$s_group}\n"; + warn "$O: Illegal group name \"$cv{$svc,$s_group}\" at $conffile:$cl{$svc,$s_group}\n"; - $cv{$svc.$s_addtogroup} = $s_false; $cv{$svc.$s_addtogroupB} = 0; - $cv{$svc.$s_chgrpdir} = $s_false; $cv{$svc.$s_chgrpdirB} = 0; - $cv{$svc.$s_chgrpskel} = $s_false; $cv{$svc.$s_chgrpskelB} = 0; + $cv{$svc,$s_addtogroup} = $s_false; $cv{$svc,$s_addtogroupB} = 0; + $cv{$svc,$s_chgrpdir} = $s_false; $cv{$svc,$s_chgrpdirB} = 0; + $cv{$svc,$s_chgrpskel} = $s_false; $cv{$svc,$s_chgrpskelB} = 0; } else { - $cv{$svc.$s_group} = $t_group; + $cv{$svc,$s_group} = $t_group; } } # Process the "addtogroup" configuration variable - if ($cv{$svc.$s_addtogroupB} && ($cv{$svc.$s_group} ne '''')) { + if ($cv{$svc,$s_addtogroupB} && ($cv{$svc,$s_group} ne '''')) { - my $t = $cv{$svc.$s_group}; - ($t_group, my $t1, $t_gid, $t_members) = getgrnam $t; + my $t = $cv{$svc,$s_group}; + (my $t_group, my $t1, my $t_gid, my $t_members) = getgrnam $t; # Check if the user is already a member of that group @@ -514,11 +521,11 @@ # Process the "mounted" configuration variable - $cv{$svc.$s_homedir} =~ s,/$,,; # Remove trailing / on homedir - $cv{$svc.$s_subdir} =~ s,^/,,; # Remove leading / on subdir - $cv{$svc.$s_subdir} =~ s,/$,,; # Remove trailing / on subdir + $cv{$svc,$s_homedir} =~ s,/$,,; # Remove trailing / on homedir + $cv{$svc,$s_subdir} =~ s,^/,,; # Remove leading / on subdir + $cv{$svc,$s_subdir} =~ s,/$,,; # Remove trailing / on subdir - if (($cv{$svc.$s_homedir} ne '''') && $cv{$svc.$s_mountedB}) { + if (($cv{$svc,$s_homedir} ne '''') && $cv{$svc,$s_mountedB}) { # Need to check for "mounted" before checking for the existence of # of the service''s home directory. @@ -527,7 +534,7 @@ } else { my ($t_dev, $t_mntpoint, $t_type, $t_options); my $ismounted = 0; - my $t_dir = $cv{$svc.$s_homedir} . ''/''; + my $t_dir = $cv{$svc,$s_homedir} . ''/''; # Open mounts table and process it @@ -548,60 +555,60 @@ close(MOUNTS) || die "$O: $procmounts: $!\n"; if (! $ismounted) { - print " Directory $cv{$svc.$s_homedir} not mounted\n" + print " Directory $cv{$svc,$s_homedir} not mounted\n" if $verbose; - $cv{$svc.$s_homedir} = ''''; + $cv{$svc,$s_homedir} = ''''; } } } # Process the "homedir" and "subdir" configuration variables - if ($cv{$svc.$s_homedir} ne '''') { - if (! -d $cv{$svc.$s_homedir}) { - warn "$O: Directory $cv{$svc.$s_homedir} does not exist\n"; - $cv{$svc.$s_homedir} = ''''; + if ($cv{$svc,$s_homedir} ne '''') { + if (! -d $cv{$svc,$s_homedir}) { + warn "$O: Directory $cv{$svc,$s_homedir} does not exist\n"; + $cv{$svc,$s_homedir} = ''''; } - elsif (($cv{$svc.$s_subdir} ne '''') && (! $cv{$svc.$s_althomeB})) { - my $t = $cv{$svc.$s_homedir} . ''/'' . $cv{$svc.$s_subdir}; + elsif (($cv{$svc,$s_subdir} ne '''') && (! $cv{$svc,$s_althomeB})) { + my $t = $cv{$svc,$s_homedir} . ''/'' . $cv{$svc,$s_subdir}; if (! -d $t) { warn "$O: Directory $t does not exist\n"; - $cv{$svc.$s_subdir} = ''''; - $cv{$svc.$s_homedir} = ''''; + $cv{$svc,$s_subdir} = ''''; + $cv{$svc,$s_homedir} = ''''; } } } # Calculate the actual directory to create (if necessary) - if ($cv{$svc.$s_homedir} ne '''') { - $cv{$svc.$s_actualdir} = $cv{$svc.$s_homedir}; - if ($cv{$svc.$s_subdir} ne '''') { - $cv{$svc.$s_actualdir} .= ''/'' . $cv{$svc.$s_subdir}; + if ($cv{$svc,$s_homedir} ne '''') { + $cv{$svc,$s_actualdir} = $cv{$svc,$s_homedir}; + if ($cv{$svc,$s_subdir} ne '''') { + $cv{$svc,$s_actualdir} .= ''/'' . $cv{$svc,$s_subdir}; } - if (! $cv{$svc.$s_althomeB}) { - $cv{$svc.$s_actualdir} .= ''/'' . $username; + if (! $cv{$svc,$s_althomeB}) { + $cv{$svc,$s_actualdir} .= ''/'' . $username; } } # Process the "mkdir" and "chgrpdir" configuration variables - if (($cv{$svc.$s_homedir} ne '''') && $cv{$svc.$s_mkdirB}) { - my $t = $cv{$svc.$s_actualdir}; + if (($cv{$svc,$s_homedir} ne '''') && $cv{$svc,$s_mkdirB}) { + my $t = $cv{$svc,$s_actualdir}; if (-d $t) { print " Directory $t already exists\n" if $verbose; } elsif (-e $t) { warn "$O: $t is not a directory\n"; - $cv{$svc.$s_homedir} = ''''; + $cv{$svc,$s_homedir} = ''''; } else { print " Directory $t created\n" if $verbose; mkdir($t, oct($cv{$s_dirmode})) if ! $dryrun; # Note that this newly-created directory will inherit the # SGID (set group ID) bit from its parent directory. This # IS desired, hence, do NOT do a separate chmod()! - if ($cv{$svc.$s_chgrpdirB}) { - chown($uid, $cv{$svc.$s_svcgid}, $t) if ! $dryrun; + if ($cv{$svc,$s_chgrpdirB}) { + chown($uid, $cv{$svc,$s_svcgid}, $t) if ! $dryrun; } else { chown($uid, $gid, $t) if ! $dryrun; } @@ -610,22 +617,22 @@ # Process the "mklink" and "linkname" configuration variables - if (($cv{$svc.$s_homedir} ne '''') && $cv{$svc.$s_mklinkB} - && (-d $cv{$svc.$s_actualdir})) { + if (($cv{$svc,$s_homedir} ne '''') && $cv{$svc,$s_mklinkB} + && (-d $cv{$svc,$s_actualdir})) { # Calculate the actual link name - $cv{$svc.$s_linkname} =~ s,/$,,; # Remove trailing ''/'' + $cv{$svc,$s_linkname} =~ s,/$,,; # Remove trailing ''/'' - if ($cv{$svc.$s_linkname} eq '''') { - $cv{$svc.$s_actuallink} = $homedir . ''/'' . $service; + if ($cv{$svc,$s_linkname} eq '''') { + $cv{$svc,$s_actuallink} = $homedir . ''/'' . $service; } else { - $cv{$svc.$s_actuallink} = $homedir . ''/'' . $cv{$svc.$s_linkname}; + $cv{$svc,$s_actuallink} = $homedir . ''/'' . $cv{$svc,$s_linkname}; } # Create the symbolic link, if needed - my $t = $cv{$svc.$s_actuallink}; + my $t = $cv{$svc,$s_actuallink}; if (-l $t) { print " Symbolic link $t already exists\n" if $verbose; @@ -633,9 +640,9 @@ warn "$O: $t is not a symbolic link\n"; } else { print " Symbolic link $t created\n" if $verbose; - symlink($cv{$svc.$s_actualdir}, $t) if ! $dryrun; - if ($cv{$svc.$s_chgrpdirB}) { - &lchown($uid, $cv{$svc.$s_svcgid}, $t) if ! $dryrun; + symlink($cv{$svc,$s_actualdir}, $t) if ! $dryrun; + if ($cv{$svc,$s_chgrpdirB}) { + &lchown($uid, $cv{$svc,$s_svcgid}, $t) if ! $dryrun; } else { &lchown($uid, $gid, $t) if ! $dryrun; } @@ -647,28 +654,28 @@ # Process the "skelfile" and "chgrpskel" configuration variables - if (($cv{$svc.$s_homedir} ne '''') && ($cv{$svc.$s_skelfile} ne '''') - && (-d $cv{$svc.$s_actualdir})) { + if (($cv{$svc,$s_homedir} ne '''') && ($cv{$svc,$s_skelfile} ne '''') + && (-d $cv{$svc,$s_actualdir})) { - my $t = $cv{$svc.$s_skelfile}; - $cv{$svc.$s_actualsrcf} = $cv{$s_skelother} . ''/'' . $t; - $cv{$svc.$s_actualdstf} = $cv{$svc.$s_actualdir} . ''/'' . $t; + my $t = $cv{$svc,$s_skelfile}; + $cv{$svc,$s_actualsrcf} = $cv{$s_skelother} . ''/'' . $t; + $cv{$svc,$s_actualdstf} = $cv{$svc,$s_actualdir} . ''/'' . $t; - if (-e $cv{$svc.$s_actualdstf}) { - print " File $cv{$svc.$s_actualdstf} already exists\n" + if (-e $cv{$svc,$s_actualdstf}) { + print " File $cv{$svc,$s_actualdstf} already exists\n" if $verbose; - } elsif (! -r $cv{$svc.$s_actualsrcf}) { - warn "$O: $cv{$svc.$s_actualsrcf}: $!\n"; + } elsif (! -r $cv{$svc,$s_actualsrcf}) { + warn "$O: $cv{$svc,$s_actualsrcf}: $!\n"; } else { - print " File $cv{$svc.$s_actualdstf} created\n" if $verbose; - if ($cv{$svc.$s_chgrpskelB}) { + print " File $cv{$svc,$s_actualdstf} created\n" if $verbose; + if ($cv{$svc,$s_chgrpskelB}) { system(@install, ''-m'', $cv{$s_filemode}, ''-o'', $uid, - ''-g'', $cv{$svc.$s_svcgid}, - $cv{$svc.$s_actualsrcf}, $cv{$svc.$s_actualdstf}) + ''-g'', $cv{$svc,$s_svcgid}, + $cv{$svc,$s_actualsrcf}, $cv{$svc,$s_actualdstf}) if ! $dryrun; } else { system(@install, ''-m'', $cv{$s_filemode}, ''-o'', $uid, ''-g'', - $gid, $cv{$svc.$s_actualsrcf}, $cv{$svc.$s_actualdstf}) + $gid, $cv{$svc,$s_actualsrcf}, $cv{$svc,$s_actualdstf}) if ! $dryrun; } } @@ -757,15 +764,15 @@ print <<"DATAEND" $O v$version --- adduser(8) local system additions. -Copyright (C) 1999-2001, John Zaitseff. +Copyright (C) 1999-2004, John Zaitseff. This program, once installed as /usr/local/sbin/adduser.local, is auto- matically called by the adduser(8) system program on a Debian system. This script completes the creation of a user account in a system- dependent way. -This script is automatically called by adduser with arguments "username -uid gid homedir". See adduser(8) for more details. In addition, this +This script is automatically called by adduser with arguments \"username +uid gid homedir\". See adduser(8) for more details. In addition, this script may be called manually. In this case, the following syntax applies: @@ -775,7 +782,7 @@ --dry-run -n - Pretend to fulfil everything required, without doing anything. - --quiet -q - Don''t show extraneous information. + --quiet -q - Don\''t show extraneous information. --verbose -v - Show information about what was done (default). --help -h - Show a brief command-line summary. --version -V - Show the version of the adduser.local script. @@ -794,7 +801,7 @@ print <<"DATAEND" $O v$version --- adduser(8) local system additions. -Copyright (C) 1999-2001, John Zaitseff. +Copyright (C) 1999-2004, John Zaitseff. This program, including associated files, is distributed under the GNU General Public License. See /usr/share/common-licenses/GPL for more information. Modified: trunk/examples/adduser.local.conf ==================================================================--- trunk/examples/adduser.local.conf 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/adduser.local.conf 2005-02-05 12:48:53 UTC (rev 192) @@ -2,7 +2,7 @@ # /etc/adduser.local.conf: Configuration for /usr/local/sbin/adduser.local # ############################################################################ -# [JNZ] Modified 17-Apr-2001 +# [JNZ] Modified 23-Sep-2004 # This file configures the local system additions to adduser(8) and should # be modified to suit local conditions. @@ -39,6 +39,20 @@ filemode = 0644 +##################### +# USERS service # +##################### + +# Add the user to the Unix group "users". Every user on this machine +# should be a member of this group. This is already done if the file +# /etc/adduser.conf includes the setting "USERGROUPS=no". If USERGROUPS +# is set to "yes", you should uncomment the following three lines. + +# service = users +# group[users] = users +# addtogroup[users] = true + + ################### # WWW service # ################### @@ -122,23 +136,60 @@ # ZIP service # ################### -# Create the directory /mnt/zip/home/$USER, owned by the user. This is -# only done if /mnt/zip exists and some device is mounted on it at the +# Create the directory /media/zip/home/$USER, owned by the user. This is +# only done if /media/zip exists and some device is mounted on it at the # time the adduser.local script is run. service = zip -homedir[zip] = "/mnt/zip" +homedir[zip] = "/media/zip" subdir[zip] = "home" mounted[zip] = true mkdir[zip] = true +##################### +# CDROM service # +##################### + +# Add the user to the Unix group "cdrom" (if it exists). This allows the +# user to access the CD-ROM hardware on the machine. + +service = cdrom +group[cdrom] = cdrom +addtogroup[cdrom] = true + + +###################### +# FLOPPY service # +###################### + +# Add the user to the Unix group "floppy" (if it exists). This allows the +# user to access the floppy drive on the machine. + +service = floppy +group[floppy] = floppy +addtogroup[floppy] = true + + +##################### +# AUDIO service # +##################### + +# Add the user to the Unix group "audio" (if it exists). This allows the +# user to access the audio hardware on the machine. + +service = audio +group[audio] = audio +addtogroup[audio] = true + + ################### # DIP service # ################### -# Add the user to the Unix group "dip" (if it exists) +# Add the user to the Unix group "dip" (if it exists). This allows the +# user to dial out using the local modem. service = dip group[dip] = dip @@ -326,13 +377,13 @@ # the user''s name (for whom adduser.local was called). For example, # if the following were to be specified: # -# homedir[svc] = /mnt/zip +# homedir[svc] = /media/zip # subdir[svc] = home # althome[svc] = false # mkdir[svc] = true # # and the user''s name (for whom adduser.local was called) was "james", -# the directory "/mnt/zip/home/james" would be created. +# the directory "/media/zip/home/james" would be created. # # If, on the other hand, the "althome" variable was set to true, the # subdirectory is used only in conjunction with the home directory; it @@ -348,7 +399,7 @@ # would be created. # # and the user''s name (for whom adduser.local was called) was "james", -# the directory "/mnt/zip/home/james" would be created. +# the directory "/media/zip/home/james" would be created. # # If this variable is not specified, blank is assumed. # Added: trunk/examples/examples/adduser.conf ==================================================================--- trunk/examples/examples/adduser.conf 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/examples/adduser.conf 2005-02-05 12:48:53 UTC (rev 192) @@ -0,0 +1,68 @@ +# /etc/adduser.conf: `adduser'' configuration. +# See adduser(8) and adduser.conf(5) for full documentation. + +# [JNZ] Modified 23-Sep-2004 + +# Modified from the version shipped with adduser(8) by John Zaitseff. +# These modifications are released into the public domain. + +# The DSHELL variable specifies the default login shell on your +# system. +DSHELL=/bin/bash + +# The DHOME variable specifies the directory containing users'' home +# directories. +DHOME=/home + +# If GROUPHOMES is "yes", then the home directories will be created as +# /home/groupname/user. +GROUPHOMES=no + +# If LETTERHOMES is "yes", then the created home directories will have +# an extra directory - the first letter of the user name. For example: +# /home/u/user. +LETTERHOMES=no + +# The SKEL variable specifies the directory containing "skeletal" user +# files; in other words, files such as a sample .profile that will be +# copied to the new user''s home directory when it is created. +SKEL=/etc/skel + +# FIRST_SYSTEM_[GU]ID to LAST_SYSTEM_[GU]ID inclusive is the range for UIDs +# for dynamically allocated administrative and system accounts/groups. +FIRST_SYSTEM_UID=100 +LAST_SYSTEM_UID=999 +FIRST_SYSTEM_GID=100 +LAST_SYSTEM_GID=999 + +# FIRST_[GU]ID to LAST_[GU]ID inclusive is the range of UIDs of dynamically +# allocated user accounts/groups. +FIRST_UID=1000 +LAST_UID=29999 +FIRST_GID=1000 +LAST_GID=29999 + +# The USERGROUPS variable can be either "yes" or "no". If "yes" each +# created user will be given their own group to use as a default, and +# their home directories will be g+s. If "no", each created user will +# be placed in the group whose gid is USERS_GID (see below). +USERGROUPS=no + +# If USERGROUPS is "no", then USERS_GID should be the GID of the group +# `users'' (or the equivalent group) on your system. +USERS_GID=100 + +# If QUOTAUSER is set, a default quota will be set from that user with +# `edquota -p QUOTAUSER newuser'' +QUOTAUSER="" + +# If DIR_MODE is set, directories will be created with the specified +# mode. Otherwise the default mode 0755 will be used. +DIR_MODE=0755 + +# If SETGID_HOME is "yes" home directories for users with their own +# group the setgid bit will be set. This was the default for +# versions << 3.13 of adduser. Because it has some bad side effects we +# no longer do this per default. If you want it nevertheless you can +# still set it here. +SETGID_HOME=no Added: trunk/examples/examples/bash.bashrc ==================================================================--- trunk/examples/examples/bash.bashrc 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/examples/bash.bashrc 2005-02-05 12:48:53 UTC (rev 192) @@ -0,0 +1,32 @@ +######################################################################### +# /etc/bash.bashrc: System-wide initialisation file for bash # +######################################################################### + +# This script file is executed by bash(1) for interactive shells. +# +# [JNZ] Modified 23-Sep-2004 +# +# Written by John Zaitseff and released into the public domain. + +umask 022 + +shopt -s checkwinsize expand_aliases +set -P + +# Terminal type modifications + +if [ "$TERM" = teraterm ]; then + export TERM=linux +fi + +# Set the complete path, as /etc/login.defs does not seem to be consulted + +if [ $(id -u) -eq 0 ]; then + export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11 +else + export PATH=/usr/local/bin:/bin:/usr/bin:/usr/bin/X11:/usr/games +fi + +if [ -d ${HOME}/bin ]; then + export PATH=${HOME}/bin:${PATH} +fi Added: trunk/examples/examples/profile ==================================================================--- trunk/examples/examples/profile 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/examples/profile 2005-02-05 12:48:53 UTC (rev 192) @@ -0,0 +1,31 @@ +######################################################################### +# /etc/profile: System-wide initialisation file for bash # +######################################################################### + +# This script file is executed by bash(1) for login shells. By default, +# it executes /etc/bash.bashrc and ~/.bashrc, as well as performing login- +# only functions. +# +# [JNZ] Modified 23-Sep-2004 +# +# Written by John Zaitseff and released into the public domain. + +if [ -r /etc/bash.bashrc ]; then . /etc/bash.bashrc; fi +if [ -r $HOME/.bashrc ]; then . $HOME/.bashrc; fi + +# Display a verse from the Bible using verse(1) + +if [ ! -f $HOME/.hushlogin -a ! -f $HOME/.hushverse ]; then + if [ $(type -p verse) ]; then + echo + verse + fi +fi + +# Turn on talk(1) messages, unless the user does not want this + +if [ ! -f $HOME/.hushlogin -a ! -f $HOME/.hushtalk ]; then + mesg y +fi + +echo Added: trunk/examples/examples/skel/dot.bash_logout ==================================================================--- trunk/examples/examples/skel/dot.bash_logout 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/examples/skel/dot.bash_logout 2005-02-05 12:48:53 UTC (rev 192) @@ -0,0 +1,10 @@ +######################################################################### +# .bash_logout: Log-out script for bash # +######################################################################### + +# This script file is executed by bash(1) when the login shell terminates. +# By default, no action is taken. +# +# [JNZ] Modified 23-Sep-2004 +# +# Written by John Zaitseff and released into the public domain. Added: trunk/examples/examples/skel/dot.bash_profile ==================================================================--- trunk/examples/examples/skel/dot.bash_profile 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/examples/skel/dot.bash_profile 2005-02-05 12:48:53 UTC (rev 192) @@ -0,0 +1,10 @@ +######################################################################### +# .bash_profile: Personal initialisation file for bash # +######################################################################### + +# This script file is executed by bash(1) for login shells. By default, +# it does nothing, as ~/.bashrc is already sourced by /etc/profile. +# +# [JNZ] Modified 23-Sep-2004 +# +# Written by John Zaitseff and released into the public domain. Added: trunk/examples/examples/skel/dot.bashrc ==================================================================--- trunk/examples/examples/skel/dot.bashrc 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/examples/skel/dot.bashrc 2005-02-05 12:48:53 UTC (rev 192) @@ -0,0 +1,62 @@ +######################################################################### +# .bashrc: Personal initialisation file for bash # +######################################################################### + +# This file is executed by interactive shells (ie, shells for which you +# are able to provide keyboard input). It is the best place to put shell +# aliases, etc. +# +# [JNZ] Modified 23-Sep-2004 +# +# Written by John Zaitseff and released into the public domain. + + +# Variable settings for your convenience + +export LANG=en_AU.UTF-8 # We are in Australia +export LC_ALL=en_AU.UTF-8 +export TIME_STYLE=$''+%b %e %Y\n%b %e %H:%M'' # As used by ls(1) +export EDITOR=emacs # Everyone''s favourite editor +export CVSROOT=:ext:cvs.zap.org.au:/data/cvs +export CVS_RSH=ssh + +# Useful aliases, defined whether or not this shell is interactive + +alias cls=clear +alias ls="ls -v" +alias dir="ls -laF" +alias lock="clear; vlock -a; clear" +alias e="emacs -nw" + + +# Run the following only if this shell is interactive + +if [ "$PS1" ]; then + + export IGNOREEOF=5 # Disallow accidental Ctrl-D + + # Set options, depending on terminal type + if [ -z "$TERM" -o "$TERM" = "dumb" ]; then + # Not a very smart terminal + export PS1="[ \u@\h | \w ] " + else + # Assume a smart VT100-based terminal with colour + + # Make sure the terminal is in UTF-8 mode. This is a hack! + /bin/echo -n -e ''\033%G'' + + # Make ls(1) use colour in its listings + if [ -x /usr/bin/dircolors ]; then + alias ls="ls -v --color=auto" + eval $(/usr/bin/dircolors --sh) + fi + + # Set the terminal prompt + if [ $(id -u) -ne 0 ]; then + export PS1="\[\e[7m\][ \u@\h | \w ]\[\e[0m\] " + else + # Root user gets a nice RED prompt! + export PS1="\[\e[41;30m\][ \u@\h | \w ]\[\e[0m\] " + fi + fi +fi Added: trunk/examples/examples/skel.other/index.html ==================================================================--- trunk/examples/examples/skel.other/index.html 2005-02-05 12:42:37 UTC (rev 191) +++ trunk/examples/examples/skel.other/index.html 2005-02-05 12:48:53 UTC (rev 192) @@ -0,0 +1,31 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html lang="en"> + +<!-- This document is a place-holder for the home page until the user + gets around to replacing it with his or her own. + + [JNZ] Modified 23-Sep-2004 + + Written by John Zaitseff and released into the public domain. --> + +<head> + <title>My Home Page</title> + <meta name="Author" content="The user"> + <meta name="Description" content="The user''s default home page"> + <meta name="Keywords" content="home, homepage, default"> + <meta name="Language" content="English"> + <link rev="made" href="mailto:webmaster@zap.org.au"> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <meta http-equiv="Content-Language" content="en"> +</head> +<body text="#000000" bgcolor="#FFFFFF" + link="#0000FF" vlink="#330066" alink="#FF0000"> + +<h1>My Home Page</h1> + +<p>Welcome to my home page on the World Wide Web! This page, like many +others, is under construction. I’ll be replacing this page +soon… I hope.</p> + +</body> +</html>