Hello,
<snipped-a-bunch/>
> >Tracking through the org.apache.avalon.util.env.Env.getUnixUserShell code,
> >it looks like
> >is won't work on systems like Solaris which use NIS for the password file,
> >where users
> >are not kept in the /etc/passwd file.
Yep you're right on. The problem here lies in the fact that shell
environment variables are based obviously on the shell used by
the UNIX users. This on vanilla boxes is stored in /etc/passwd.
Now NIS throws another problem our way. As you can see this Env
stuff is really a PITA.
For the time being I suggest just adding a local user account
if you can do that and run Merlin on the local account. This
is obviously a cop out but you can do this and fire things up
without having to wait on us to make a change.
Anyway there are a few ways to deal with this for the long
term:
1). Add a system property for the default shell to be used
by the env class. If the property exists then it overrides
the need to check the passwd file for the default shell.
If this property is not found and the user is a NIS user
then the EnvAccessException still needs to be handled
gracefully to inform the user about the need to specify
a default shell sys property: env.shell=/usr/bin/bash etc.
2). Add the ability to do a ypcat on the respective NIS map
using the correct domain to resolve the user's default
shell. This is not a good way to go because now we'll
need to read other files to see which NIS domain the user
is part of and so on. The problem grows and the PITA
becomes a RPITA (Royal PITA).
3a). Change the Env code to search for any shell it can find.
This is not a good idea because weird things will happen.
Namely if the user defines the MERLIN_HOME in .bashrc and
the Env class uses ksh then we've got a really confused
user on our hands pulling his/her hair out. We don't
want that.
3b+1). Use the shell script that fires up merlin to set the
shell system property (env.shell) defined in 1. This is
like 3a in that the shell used by the script may not be
the default shell of the user. This leads to similar
problems as option 3a hence the 3b+1 label for this option.
Also note that even though Claude is using the shell script
(I think), the shell script may not always be the manner
in which Merlin is fired up so this would not be a complete
solution for every case.
4). Look inside the users home directory for shell resource
and/or profile files to guess the shell used. This is
tricky as well since some users may use more than one
shell to work with. Perhaps we can expand this solution
to avoid a shell fork for reading environment variables and
just perform a scan of shell resource and profile files
in the sequence used by shells. Namely sourcing the users
~/.profile and other files it sources. However we would
do this for all resource files of all shells and take the
UNION of environment variables. So if MERLIN_HOME is
defined somewhere in some resource file like the system
resource file /etc/profile or the users resource file
~/.profile then we'll pick it up. The same goes for the
other shells like csh, bash, ksh or other exotic shells.
The only problem with this approach is the potential for
conflicts. If one shell resource file defines Merlin's
home in one place and the resource file of another shell
defines MERLIN_HOME in yet another install root then we
get confusion.
5). Do a ps and see which process is the Parent PID - meaning
look up the PPID of the current PID. Or just figure out
what shells the user is running currently and pick one to
use. Again this imposes problems if the user uses more
than one shell and is running both. Which one do you
use. Also getting the PPID of the current executing process
requires you to know the current process' PID and supposes
that all 'ps' implementations on all platforms offer this
PPID value. Most do but some require special switches and
that needs to be coded.
6). Change the API using an overloaded constructor to accept
a default shell in case the user's shell cannot be found
so an EnvAccessException does not result. This then
leaves the problem of specifying the default shell upto
the user of the API. In the end this would boil down to
a combination of #1 and #6.
If others have more ideas then please let me know. I think
my +1 goes to option #1 & #6 together. There really is no
good way to work with Env variables and this is probably why
Java does not offer a standard means to access them. Again
I appologize for any inconvenience this may have caused you.
Alex
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]