#!/usr/bin/perl -wT # # Copyright (c) 2006 University of Utah and the Flux Group. # # {{{EMULAB-LICENSE # # This file is part of the Emulab network testbed software. # # This file is free software: you can redistribute it and/or modify it # under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or (at # your option) any later version. # # This file is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public # License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this file. If not, see . # # }}} # use English; # # smbpasswd_setup.proxy - This is run remotely on Fs as root, with stdin piped # from smbpasswd_setup on Boss. # # It sets the Samba password on Fs for each active user to specified (Emulab # Windows) password. # # usage: smbpasswd_setup.proxy [debug_level] # my $dbg = 0; if ($#ARGV+1 > 0) { $dbg = $ARGV[0]; } if ($dbg =~ /^([-\w]+)$/i) { $dbg = $1; } else { die("Tainted argument: $dbg\n"); } # # Configure variables. # my $WINSUPPORT = @WINSUPPORT@; my $SMBPASSWD = "/usr/local/bin/smbpasswd"; # # We don't want to run this script unless its the real version (or debugging.) # if ($EUID != 0 and !$dbg) { die("*** $0:\n". " Must be root! Maybe its a development version?\n"); } die("*** $0:\n". " Nothing to do if no Windows support in this copy of Emulab.\n") if (!$WINSUPPORT); # un-taint path $ENV{'PATH'} = '/bin:/usr/bin:/usr/sbin:/usr/local/bin'; delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; my $log = "/tmp/smbpasswd_setup_proxy.log"; open(LOG, "> $log") || fatal("Couldn't open $log.\n"); { local $SIG{PIPE} = sub { die "$SMBPASSWD pipe broke" }; # Each line on stdin is "uid w_pswd". my ($uid, $w_pwd); while () { if (! (($uid, $w_pswd) = m/^(\S+) (.+)/)) { print LOG "BAD LINE: $_\n"; } else { print LOG "$uid, '$w_pswd'\n"; } if (! $dbg) { # Tell smbpasswd the password, and again to confirm. # -s == Silent: no prompts, read from stdin. # -a == Add the uid if necessary. my $cmd = "| $SMBPASSWD -s -a $uid"; open(PWD, $cmd ); print PWD "$w_pswd\n$w_pswd\n"; my $stat = close PWD; if (0 && $stat) { # XXX it's succeeding, but returning 1. print LOG "FAILED, closing: '$cmd', $stat\n"; exit($stat); } } } } close(LOG); exit(0);