|
1
|
#!/usr/bin/env bash
|
|
2
|
set -eo pipefail
|
|
3
|
|
|
4
|
function usage()
|
|
5
|
{
|
|
6
|
cat <<EOF
|
|
7
|
Usage: $0 [-d] [-x <bootstrap xml>] [-p<path to FWD libraries>] [-f<slf4j-impl.jar file>] [-n<path to native spawner>] [-c<srv-certs.store file>] [-t<postbuild.sh tool>]
|
|
8
|
|
|
9
|
Position spawner as needed by current configuration
|
|
10
|
|
|
11
|
Where:
|
|
12
|
-d = dryrun (just display commands)
|
|
13
|
-x <bootstrap xml> = use <bootstrap xml> as the bootstrap file (def=server.xml)
|
|
14
|
-p = Location of FWD libraries p2j.jar and fwd-slf4j.jar (if no -f specified). \"FWD_LIB\" will be used as a fallback if default is not valid. (def=${p2j_lib})
|
|
15
|
-f = Location of file to be placed in slf4j-impl.jar destination (def=fwd-slf4j.jar in -p location or FWD_LIB)
|
|
16
|
-n = Location of built native spawner (def=${spawn_prog}, unless -p specified, which will change the default location)
|
|
17
|
-c = Location of srv-certs.store file (def=${srv_certs})
|
|
18
|
-t = Location of postbuild.sh tool (def=${postbuild}, unless -p specified, which will change the default location)
|
|
19
|
|
|
20
|
-? or -h or --help = show usage.
|
|
21
|
EOF
|
|
22
|
}
|
|
23
|
|
|
24
|
# defaults
|
|
25
|
BOOTSTRAP="server.xml"
|
|
26
|
pwd=$PWD
|
|
27
|
p2j_lib=${pwd}/p2j/build/lib
|
|
28
|
deploy_home=${pwd}/deploy
|
|
29
|
srv_certs=${deploy_home}/server/srv-certs.store
|
|
30
|
build_home=${pwd}/build
|
|
31
|
p2j_root=${pwd}/p2j
|
|
32
|
postbuild=${p2j_root}/src/native/postbuild.sh
|
|
33
|
spawn_prog=${p2j_root}/build/native/spawn
|
|
34
|
|
|
35
|
while getopts ":h?d-x:p:f:n:c:t:" opt; do
|
|
36
|
case "$opt" in
|
|
37
|
d ) mycmd="echo" ;;
|
|
38
|
x ) BOOTSTRAP=$OPTARG ;;
|
|
39
|
p ) p2j_passed=true
|
|
40
|
p2j_lib=$OPTARG ;;
|
|
41
|
f ) slf4j_impl=$OPTARG ;;
|
|
42
|
n ) spawn_passed=true
|
|
43
|
spawn_prog=$OPTARG ;;
|
|
44
|
c ) srv_certs=$OPTARG ;;
|
|
45
|
t ) postbuild_passed=true
|
|
46
|
postbuild=$OPTARG ;;
|
|
47
|
- ) case ${OPTARG} in
|
|
48
|
"help" ) usage
|
|
49
|
exit 1 ;;
|
|
50
|
* ) echo "Unknown option: --${OPTARG}"
|
|
51
|
usage
|
|
52
|
exit 1 ;;
|
|
53
|
esac
|
|
54
|
;;
|
|
55
|
h | \? ) if [[ "$OPTARG" == "?" || "$opt" == "h" ]]; then
|
|
56
|
usage
|
|
57
|
exit 1
|
|
58
|
else
|
|
59
|
echo "Unknown option: -${OPTARG}"
|
|
60
|
usage
|
|
61
|
exit 1
|
|
62
|
fi
|
|
63
|
;;
|
|
64
|
esac
|
|
65
|
done
|
|
66
|
shift $(($OPTIND - 1))
|
|
67
|
|
|
68
|
# --- Step 1: Extract directory filename from bootstrap ---
|
|
69
|
if [[ ! -f "$BOOTSTRAP" ]]; then
|
|
70
|
echo "ERROR: Bootstrap XML '$BOOTSTRAP' not found"
|
|
71
|
exit 1
|
|
72
|
fi
|
|
73
|
|
|
74
|
DIR_XML=$(xmlstarlet sel -t -v '/node/directory/xml/@filename' -n "$BOOTSTRAP")
|
|
75
|
if [[ -z "$DIR_XML" ]]; then
|
|
76
|
echo "ERROR: Could not find <directory><xml filename=\"...\"/> in $BOOTSTRAP"
|
|
77
|
exit 1
|
|
78
|
elif [[ ! -f "$DIR_XML" ]]; then
|
|
79
|
echo "ERROR: Directory XML '$DIR_XML' does not exist"
|
|
80
|
exit 1
|
|
81
|
fi
|
|
82
|
|
|
83
|
# --- Step 2: Extract all configured spawners ---
|
|
84
|
# These are values like /opt/spawner/spawn
|
|
85
|
readarray -t SPAWNERS < <(
|
|
86
|
xmlstarlet sel -t \
|
|
87
|
-m '//node[@name="clientConfig"]/node[@name="spawner"]/node-attribute[@name="value"]' \
|
|
88
|
-v '@value' -n \
|
|
89
|
"$DIR_XML"
|
|
90
|
)
|
|
91
|
|
|
92
|
if [[ ${#SPAWNERS[@]} -eq 0 ]]; then
|
|
93
|
echo "No spawners found in directory XML."
|
|
94
|
exit 0
|
|
95
|
fi
|
|
96
|
|
|
97
|
# --- Step 3: Extract unique parent directories ---
|
|
98
|
# example: /opt/spawner/spawn -> /opt/spawner
|
|
99
|
declare -A UNIQUE_DIRS=()
|
|
100
|
for sp in "${SPAWNERS[@]}"; do
|
|
101
|
parent=$(dirname "$sp")
|
|
102
|
UNIQUE_DIRS["$parent"]=1
|
|
103
|
done
|
|
104
|
|
|
105
|
# Set new p2j root, if path to lib is passed
|
|
106
|
[ -n "$p2j_passed" ] && p2j_root=$(dirname "$p2j_lib")
|
|
107
|
|
|
108
|
# Set defaults when no options passed and spawn/postbuild.sh are not found (or bail)
|
|
109
|
if [ -f "/opt/fwd-deploy/spawner/spawn" ] && [ -z "$p2j_passed" ] && [ -z "$spawn_passed" ] && [ ! -f "$spawn_prog" ]; then
|
|
110
|
spawn_prog=/opt/fwd-deploy/spawner/spawn
|
|
111
|
fi
|
|
112
|
if [ ! -f "$spawn_prog" ]; then
|
|
113
|
echo "Error: $spawn_prog not found. Exiting."
|
|
114
|
exit 1
|
|
115
|
fi
|
|
116
|
if [ -f "/opt/fwd-deploy/spawner/postbuild.sh" ] && [ -z "$p2j_passed" ] && [ -z "$postbuild_passed" ] && [ ! -f "$postbuild" ]; then
|
|
117
|
postbuild=/opt/fwd-deploy/spawner/postbuild.sh
|
|
118
|
fi
|
|
119
|
if [ ! -f "$postbuild" ]; then
|
|
120
|
echo "Error: $postbuild not found. Exiting."
|
|
121
|
exit 1
|
|
122
|
fi
|
|
123
|
|
|
124
|
# Find default locations when using FWD_LIB and not overridden by -p
|
|
125
|
if [ -n "$FWD_LIB" ] && [ -z "$p2j_passed" ]; then
|
|
126
|
if [ ! -d "${p2j_root}/build/lib" ]; then
|
|
127
|
p2j_lib=$FWD_LIB/build/lib
|
|
128
|
if [ -f "$FWD_LIB/lib/p2j.jar" ]; then
|
|
129
|
p2j_lib=$FWD_LIB/lib
|
|
130
|
fi
|
|
131
|
[ -z "$spawn_passed" ] && spawn_prog=${p2j_root}/build/native/spawn
|
|
132
|
[ -z "$postbuild_passed" ] && postbuild=${p2j_root}/src/native/postbuild.sh
|
|
133
|
fi
|
|
134
|
fi
|
|
135
|
# Set the additional parameters to postbuild for p2j and fwd-slf4j
|
|
136
|
p2j_jar=${p2j_lib}/p2j.jar
|
|
137
|
[ -z "$slf4j_impl" ] && slf4j_impl=${p2j_lib}/fwd-slf4j.jar
|
|
138
|
|
|
139
|
# --- This is where we would copy the spawn to each of the unique directories found ---
|
|
140
|
for fspawn in "${!UNIQUE_DIRS[@]}"; do
|
|
141
|
echo "Processing $fspawn ..."
|
|
142
|
# Use sudo if elevation is required (destination for spawn is outside $HOME and we are *not* root)
|
|
143
|
[[ "$fspawn"* != "$HOME"* ]] && [[ $(whoami) != "root" ]] && mysudo="sudo"
|
|
144
|
|
|
145
|
# Position the spawner files
|
|
146
|
$mycmd $mysudo $postbuild $fspawn $spawn_prog $srv_certs $p2j_jar $slf4j_impl
|
|
147
|
$mycmd $mysudo chmod gou+rx $fspawn
|
|
148
|
done
|