mirror of
https://github.com/envmodules/modules.git
synced 2026-06-07 00:25:05 +08:00
189 lines
5.8 KiB
Perl
Executable File
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";
|
|
|