Project

General

Profile

set_spawners.sh

Roger Borrello, 12/09/2025 07:30 PM

Download (5.02 KB)

 
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