Files
modules/contrib/scripts/resetenv
Kent Mein d081f55283 Added really old man pages, and a bunch of example things.
Still need to write some documentation for the contrib stuff and
update the man pages.
2013-03-04 07:42:13 -06:00

189 lines
5.8 KiB
Perl
Executable File

#!/usr/bin/bin/perl -w
#
# resetenv.pl v1.0
#
# (C)1998 University of Minnesota, Department of Computer Science
#
# Authors: Mark A. Bentley <bentlema@cs.umn.edu>
# Kent Mein <mein@cs.umn.edu>
# Scott M. Dier <sdier@cs.umn.edu>
#
# Description: resetenv is a simple perl script to restore a set of
# default dotfiles to users home directory. The dotfiles are stored
# in a ~template account, and when resetenv is envoked, it copies
# those dotfiles, as specified in the resetenv.conf, to the user's
# home directory (who executed resetenv), saving the old dotfiles to
# a unique directory. The user should use .resetenvrc for their
# configuration options.
#
# A sample resetenv.conf is as follows:
#
# .aliases N 600
# .cshrc Y 600
# .fvwm2rc Y 600
# .login Y 600
# .logout Y 600
# .xinitrc Y 755
# README.dotfiles Y 600
# .mailcap N 600
# .mime.types N 600
#
# The first field is the filename to move into the users home directory
# when resetenv is envoked. The second field is the "replace me?" field.
# This is a "Y" (Yes)or "N" (No) answering the question of weather to
# replace a particular dotfile that already exists in the users home
# directory. This is most useful to the user who creates their own
# config file (~/.resetenv) so that they have direct control over which
# dotfiles are replaced with defaults, and which ones are not touched.
# The third field is the permissions to apply to a newly copied dotfile.
#
################################################################################
#
# Modifications History:
#
# 10/30/1998 -- PATH is now set in case user's PATH doesn't have needed commands
# -- Now root can't run me
# 08/04/2009 -- Works with directories now
#
################################################################################
#
# Configuration
#
#
# This is the directory where old dotfiles will be saved
use Sys::Hostname;
$backupdir = "old-dotfiles";
# This is the path that is set so that the commands that resetenv uses
# (such as cp and mv) can be found even if the users PATH is foobared.
$ENV{PATH} = '/opt/gnu/bin:/opt/local/bin:/usr/bin:/bin';
print "PATH = ", $ENV{PATH}, "\n";
# find ~template
#
# Currently the default dotfiles are in a homedir. They can be located
# anywhere that is convenient really, however we use a cross-mounted home
# directory for ease of maintenance. Perhaps it might be nice to have
# different sets of dotfiles for different clusters, but this works
# fine for now. --Mark
#
# Note: getpw functions return ($name, $passwd, $uid, $gid, $quota,
# $comment, $gcos, $homedir, $shell)
@template = getpwnam("template");
$templatedir = $template[7];
unless ( -d $templatedir) { die "Can't find templatedir $templatedir: $!";}
print "Template dotfiles location: $templatedir\n\n";
unless ( -f "$templatedir/resetenv.conf" ) {
die "$templatedir/resetenv.conf does not exist: $!";
}
$configfile = "$templatedir/resetenv.conf";
# Find the homedir of the user
#
# Notes: $< is a special variable for the UID of the user running
# this process.
($name, $tmp, $uid, $gid, $tmp, $tmp, $gcos, $userdir, $tmp) = getpwuid($<);
print "Username: $name UID: $uid GID: $gid\n";
print " Name: $gcos Homedir: $userdir\n\n";
if ( $name eq "root" ) {
print "Idiot! Don't run resetenv as root! Bailing out!\n\n";
exit;
}
if (!($userdir =~ /\/home\/(.*)/)) {
print "resetenv can not be run on an account that has a " .
"homedir that is not in /home\n";
exit;
}
#
# Make a subdirectory in the user's home dir to keep old dotfiles
#
if ( ! -d "$userdir/$backupdir" ) {
print "Creating $userdir/$backupdir\n";
mkdir ("$userdir/$backupdir",477) or die "mkdir: $!\n";
}
($tmp,$tmp,$tmp,$dd,$mm,$yy,$tmp,$tmp,$tmp) = localtime(time);
#
# Create a directory to store old dotfiles
#
#$oldfilesdir = "$userdir/$backupdir/$mm-$dd-$yy";
my $mmddyyyy = sprintf '%02d-%02d-%04d', $mm + 1, $dd, $yy + 1900;
$oldfilesdir = "$userdir/$backupdir/$mmddyyyy";
$x=1;
$foo = "$oldfilesdir-$x";
while (-d $foo ) {
$x++;
$foo = "$oldfilesdir-$x";
}
$oldfilesdir = "$oldfilesdir-$x";
print "Creating $oldfilesdir\n\n";
mkdir ("$oldfilesdir",477);
#
# Determine which config file to use
#
if ( -f "$userdir/.resetenvrc" ) {
$configfile = "$userdir/.resetenvrc";
}
#
# okay, now do the actual copying and such...
#
print "Using config file: $configfile\n\n";
# added Wed, 19 Dec 2001 17:02:16 -0600
# -sdier
open LOG, ">$oldfilesdir/log";
print LOG "#resetenv log, ".`date`."#ran by euid:egid:uid:gid:ppid:host\n$>:$):$<:$(:".getppid().":".hostname()."\n";
close LOG;
open ( CONF, "$configfile" );
while ( <CONF> ) {
( $dotfile, $replace, $mode ) = split;
print "$dotfile: ";
# if the file exists in the default directory
if ((-f "$templatedir/$dotfile")||(-d "$templatedir/$dotfile")){
if (( -e "$userdir/$dotfile" ) && ( "$replace" eq "N" )) {
print "keeping current.\n";
} elsif ( -e "$userdir/$dotfile") {
print "installing default.\n";
system ("mv -f $userdir/$dotfile $oldfilesdir/$dotfile");
system ("cp -r $templatedir/$dotfile $userdir/$dotfile");
system ("chmod $mode $userdir/$dotfile");
} else {
system ("cp -r $templatedir/$dotfile $userdir/$dotfile");
system ("chmod $mode $userdir/$dotfile");
}
} else {
if (($dotfile ne ".") && ($dotfile ne "..")){
print "\nAlert! $dotfile not found in $templatedir\n\n";
}
}
}
close ( CONF );
print "\nYour old dotfiles can be found in:\n\t$oldfilesdir\n";