Stan R created DIRSERVER-2175:
---------------------------------
Summary: apacheds.sh startup script: support for more shells
Key: DIRSERVER-2175
URL: https://issues.apache.org/jira/browse/DIRSERVER-2175
Project: Directory ApacheDS
Issue Type: Improvement
Affects Versions: 2.0.0-M23
Environment: Linux, Busybox Ash shell
Reporter: Stan R
Priority: Trivial
Attempting to start ApacheDS via the apacheds.sh startup script with a shell
other than bash, such as busybox Ash shell, results in the following error:
{noformat}
$ sh apacheds.sh run
apacheds.sh: line 113: syntax error: unexpected "(" (expecting ")")
{/noformat}
The offending line 113 (and 1 previous) for reference:
{noformat}
# Build the classpath (http://stackoverflow.com/a/4729899/516433)
CLASSPATH=$(JARS=("$ADS_HOME"/lib/*.jar); IFS=:; echo "${JARS[*]}")
{/noformat}
Analyzing the offending line reveals that the classpath is built using a
bash-specific syntax/feature for arrays -- functionality not found in other
shells. Following the helpful link on line 112 to stackoverflow for further
explanation reveals that while the manual classpath creation methodology via
bash arrays used to be the "best" available, it is now deprecated. According to
the stackoverflow page, building the classpath manually is no longer a
necessity as of at least 2012; the classpath can now contain wildcards, and
Java will kindly resolve the wildcards on its own. Further investigation of the
classpath wildcard resolution functionality reveals that the feature has been
present in Java 1.7 since release 1 (I downloaded the first release and looked
at the manpage "java.1") in 2011.
Since ApacheDS requires Java 1.7 as a prerequisite, and the wildcard classpath
resolution functionality is present in all versions of Java 1.7 and up, I
propose eliminating the bash-only manual classpath creation, and instead take
advantage of the 5-year-old enhancement present in Java, so that other shells
may be supported when executing the apacheds.sh script.
The largest benefit to supporting shells other than bash, is for situations in
which ApacheDS is deployed in minimalized container environments for security
reasons, where attempts are made to reduce potential attack surface by removing
all unnecessary features, libraries, and software. To this end, bash is a prime
candidate for removal as a dependency (see shellshock).
Given the above, changing line 113 to the following allows the script to be
executed, and ApacheDS to be launched, without error in busybox's ash shell and
bash shell (and perhaps others):
{noformat}
CLASSPATH="$ADS_HOME/lib/*"
{/noformat}
I will attempt to attach a patchfile if I can.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)