From 7379d2bb259e72f13f4d196c2e3777230430194e Mon Sep 17 00:00:00 2001 From: Russ Fish <fish@flux.utah.edu> Date: Fri, 5 Nov 2004 19:21:45 +0000 Subject: [PATCH] Small details. --- tmcd/cygwinxp/GNUmakefile.in | 2 ++ tmcd/cygwinxp/emount | 16 ++++++++++-- tmcd/cygwinxp/eumount | 13 +++++++--- tmcd/cygwinxp/rc.cygwinxp | 9 ++++--- tmcd/cygwinxp/rc.cygwinxp-user | 24 ++++++++++++++---- tmcd/cygwinxp/startsshd | 45 ++++++++++++++++++++++++++++++++++ tmcd/cygwinxp/stopsshd | 29 ++++++++++++++++++++++ 7 files changed, 124 insertions(+), 14 deletions(-) create mode 100755 tmcd/cygwinxp/startsshd create mode 100755 tmcd/cygwinxp/stopsshd diff --git a/tmcd/cygwinxp/GNUmakefile.in b/tmcd/cygwinxp/GNUmakefile.in index 4d3bb00e5c..77c105c04d 100644 --- a/tmcd/cygwinxp/GNUmakefile.in +++ b/tmcd/cygwinxp/GNUmakefile.in @@ -70,6 +70,8 @@ script-install: dir-install $(SCRIPTS) $(INSTALL) -m 755 $(SRCDIR)/liblocsetup.pm $(BINDIR)/liblocsetup.pm $(INSTALL) -m 755 $(SRCDIR)/emount $(BINDIR)/emount $(INSTALL) -m 755 $(SRCDIR)/eumount $(BINDIR)/eumount + $(INSTALL) -m 755 $(SRCDIR)/startsshd $(BINDIR)/startsshd + $(INSTALL) -m 755 $(SRCDIR)/stopsshd $(BINDIR)/stopsshd sfs-install: diff --git a/tmcd/cygwinxp/emount b/tmcd/cygwinxp/emount index 1a39a3a1e6..c5b2893616 100755 --- a/tmcd/cygwinxp/emount +++ b/tmcd/cygwinxp/emount @@ -1,5 +1,4 @@ #!/usr/bin/perl -w -#!/usr/bin/perl -wT # # EMULAB-COPYRIGHT # Copyright (c) 2000-2004 University of Utah and the Flux Group. @@ -12,7 +11,13 @@ use Getopt::Std; # Emulab NFS mount command, called by rc.mounts . # # Args are the remote and local mount points, for example: -# eumount fs.emulab.net:/q/proj/testbed /proj/testbed +# emount fs.emulab.net:/q/proj/testbed /proj/testbed +# +# One arg is just the username, with the rest defaulted in for convenience. +# emount russ +# is equivalent to: +# emount fs.emulab.net:/users/russ /users/russ +# # With no args, reports the current mounts with "net use". # # Since this is Windows, mounts go through drive letters, like this: @@ -32,6 +37,7 @@ use Getopt::Std; sub usage() { print "Usage: emount [-v] [-d driveletter:] remotehost:path localpath\n"; + print " or: emount [-v] [-d driveletter:] username\n"; print " or: emount\n"; exit(1); } @@ -40,6 +46,7 @@ my $verbose = 0; my $driveletter = ""; my $remote = ""; my $local = ""; +my $username = ""; # Drag in path stuff so we can find emulab stuff. BEGIN { require "/etc/emulab/paths.pm"; import emulabpaths; } @@ -74,6 +81,11 @@ if (@ARGV == 0 ) { system("$NET use"); exit(0); } +elsif (@ARGV == 1) { + $username = $ARGV[0]; + $local = "/users/$username"; + $remote = "fs.emulab.net:$local"; +} elsif (@ARGV == 2) { $remote = $ARGV[0]; $local = $ARGV[1]; diff --git a/tmcd/cygwinxp/eumount b/tmcd/cygwinxp/eumount index 82abe51911..015b975fca 100755 --- a/tmcd/cygwinxp/eumount +++ b/tmcd/cygwinxp/eumount @@ -1,5 +1,4 @@ #!/usr/bin/perl -w -#!/usr/bin/perl -wT # # EMULAB-COPYRIGHT # Copyright (c) 2000-2004 University of Utah and the Flux Group. @@ -11,15 +10,18 @@ use Getopt::Std; # # Emulab NFS unmount command, called by rc.mounts . See emount for more info. # -# Arg is the local mount points, for example: -# eumount /proj/testbed +# Arg is the local mount point or user name, for example: +# eumount /users/russ +# or: +# eumount russ # # The Services For Unix (SFU 3.5) NFS client commands are used underneath, and the # CygWin symlink pointing to the /cygdrive/driveletter mount are cleaned up. sub usage() { - print "Usage: eumount [-v] localpath\n"; + print "Usage: eumount [-v] /local/path\n"; + print " or: eumount [-v] username\n"; exit(1); } my $optlist = "v"; @@ -54,6 +56,9 @@ if (defined($options{"v"})) { } if (@ARGV == 1) { $local = $ARGV[0]; + if ($local !~ m|/|) { + $local = "/users/$local"; + } } else { usage(); diff --git a/tmcd/cygwinxp/rc.cygwinxp b/tmcd/cygwinxp/rc.cygwinxp index b96e477ee8..be5f74b200 100755 --- a/tmcd/cygwinxp/rc.cygwinxp +++ b/tmcd/cygwinxp/rc.cygwinxp @@ -4,15 +4,18 @@ # Copyright (c) 2004 University of Utah and the Flux Group. # All rights reserved. # -# CygWin startup. +# CygWin startup. Run as a service named EmulabStartup. # Make sure the node name is right. nodeid=`/usr/local/etc/emulab/tmcc.bin nodeid` hostname=`/bin/hostname` +# Do some logging. +logfile=/var/log/EmulabStartup.log +datehost="`date`: Host name '$hostname'" if [ $nodeid == $hostname ]; then - echo "Host name '$hostname' matches nodeid '$nodeid'." > /tmp/wsname + echo "$datehost matches nodeid '$nodeid'." >> $logfile else - echo "Host name '$hostname' and nodeid '$nodeid' differ." > /tmp/wsname + echo "$datehost differs from nodeid '$nodeid'." >> $logfile # Change hostname and computername, rename My Computer, reboot on success. /usr/local/etc/emulab/WSName /N:$nodeid /REBOOT /MCN diff --git a/tmcd/cygwinxp/rc.cygwinxp-user b/tmcd/cygwinxp/rc.cygwinxp-user index 66508738c7..d349362e8a 100644 --- a/tmcd/cygwinxp/rc.cygwinxp-user +++ b/tmcd/cygwinxp/rc.cygwinxp-user @@ -4,26 +4,34 @@ # Copyright (c) 2004 University of Utah and the Flux Group. # All rights reserved. # -# CygWin user setup for each login. +# CygWin user setup for each rdesktop login. This gets run from a Registry key: +# HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\EmulabLogin +# with value: +# C:\cygwin\bin\bash /usr/local/etc/emulab/rc/rc.cygwinxp-user PATH=/usr/local/etc/emulab:$PATH -set -x # Mounts are local to the Win32 login session context. if [ -e /cygdrive/s ]; then /cygdrive/c/SFU/common/umount S: > /dev/null; fi +echo emount fs.emulab.net:/share /share emount fs.emulab.net:/share /share if [ -e /cygdrive/p ]; then /cygdrive/c/SFU/common/umount P: > /dev/null ; fi proj=`tmcc.bin status | sed 's|ALLOCATED=\([^/]*\)/.*|\1|'` +echo emount fs.emulab.net:/q/proj/$proj /proj/$proj emount fs.emulab.net:/q/proj/$proj /proj/$proj +# Where do we find out the group information for an optional Q: mount? + if [ -e /cygdrive/h ]; then /cygdrive/c/SFU/common/umount H: > /dev/null ; fi creator=`tmcc.bin creator | sed 's|.*CREATOR=\([^ ]*\).*|\1|'` +echo emount fs.emulab.net:/users/$creator /users/$creator emount fs.emulab.net:/users/$creator /users/$creator if [ -e /cygdrive/i ]; then /cygdrive/c/SFU/common/umount I: > /dev/null ; fi swapper=`tmcc.bin creator | sed 's|.*SWAPPER=\([^ ]*\).*|\1|'` if [ $swapper != $creator ]; then + echo emount fs.emulab.net:/users/$swapper /users/$swapper emount fs.emulab.net:/users/$swapper /users/$swapper fi @@ -31,10 +39,16 @@ fi if [ -e /cygdrive/j ]; then /cygdrive/c/SFU/common/umount J: > /dev/null ; fi user=`id -un` if [[ $user != $creator && $user != $swapper && $user != root ]]; then + echo emount -d J: fs.emulab.net:/users/$user /users/$user emount -d J: fs.emulab.net:/users/$user /users/$user fi -set +x -echo "Hit <Enter> to dismiss." -sed 1q +# Run the SSH daemon in the Win32 login session context, so ssh client sessions +# will see the same set of mounts when they come in AS THIS SAME USER. +echo "" +startsshd + +echo "" +echo "Hit <Enter> to dismiss this window." +read diff --git a/tmcd/cygwinxp/startsshd b/tmcd/cygwinxp/startsshd new file mode 100755 index 0000000000..be77b6ff3b --- /dev/null +++ b/tmcd/cygwinxp/startsshd @@ -0,0 +1,45 @@ +#!/bin/bash +# +# EMULAB-COPYRIGHT +# Copyright (c) 2004 University of Utah and the Flux Group. +# All rights reserved. +# +# Run the SSH daemon in the Win32 login session context, so ssh client sessions +# will see the same set of mounts when they come in AS THIS SAME USER. +# +# Other users need to come is as rdesktop first if they want ssh sessions with +# their remote homedirs mounted. Doing this disconnects the first rdesktop session +# after 20 seconds, but reconnecting as the original user gets it right back. +# Microsoft cripples Citrix/Hydra on XP to only allow one rdesktop session at a time. +# +# Do "ssh pcNNN qwinsta" (Query WINdows STAtion) to show the sessions remotely. +# Use "ssh pcNNN rwinsta ID" to kill a session by session ID. +# If you're logged in via rdesktop, see the Users tab in Task Manager. + +pidfile=/var/run/sshd.pid +running= +if [ -e $pidfile ]; then + # Check that the process ID actually refers to a running process. + pid=`cat $pidfile` + if ( kill -0 $pid >& /dev/null ); then + running=yes + fi +fi +if [ $running ]; then + # Kill a previous copy of sshd, so we can run one as this user. + echo "Killing previous sshd daemon." + ps -ef | awk '$2=='$pid'{print}' + kill $pid +fi + +# Hijack the file permissions needed for sshd to run as this user. +user=`id -un` +chown $user /etc/ssh*key +chmod o-r /etc/ssh*key +chown $user /var/empty +chmod go-w /var/empty + +# Start sshd in the background, orphaned so it doesn't get SIGINT from here. +# The pidfile is updated by sshd itself. +echo "Starting new sshd daemon as $user." +(CYGWIN="ntsec tty" /usr/sbin/sshd &) diff --git a/tmcd/cygwinxp/stopsshd b/tmcd/cygwinxp/stopsshd new file mode 100755 index 0000000000..0c3ddcaa63 --- /dev/null +++ b/tmcd/cygwinxp/stopsshd @@ -0,0 +1,29 @@ +#!/bin/bash +# +# EMULAB-COPYRIGHT +# Copyright (c) 2004 University of Utah and the Flux Group. +# All rights reserved. +# +# Stop the current the SSH daemon. + +pidfile=/var/run/sshd.pid +running= +if [ -e $pidfile ]; then + # Check that the process ID actually refers to a running process. + pid=`cat $pidfile` + if ( kill -0 $pid >& /dev/null ); then + running=yes + fi +fi +if [ $running ]; then + echo "Killing sshd daemon." + ps -ef | awk '$2=='$pid'{print}' + kill $pid +fi + +# Restore the file permissions needed for sshd to run as a service. +user=`id -un` +chown SYSTEM /etc/ssh*key +chmod o-r /etc/ssh*key +chown SYSTEM /var/empty +chmod go-w /var/empty -- GitLab