github.com/swiftstack/proxyfs@v0.0.0-20201223034610-5434d919416e/cookbooks/proxyfs/templates/default/usr/bin/start_and_mount_pfs.erb (about) 1 #!/bin/bash 2 3 # A simple script to start the services and mount the sample mount point 4 # The PATH, etc should already be setup by systemctl environment 5 6 function await_proxyfsd_startup { 7 /usr/bin/systemctl -q is-active proxyfsd 8 if [ $? -ne 0 ]; then 9 echo "ProxyFS failed to start. Exiting..." 10 exit 1 11 fi 12 while true; do 13 curl http://127.0.0.1:15346/ 2>/dev/null >/dev/null 14 if [ $? -eq 0 ]; then 15 break 16 fi 17 echo "Waiting for ProxyFS to be started..." 18 sleep 1 19 done 20 } 21 22 function await_pfsagentd_startup { 23 /usr/bin/systemctl -q is-active pfsagentd 24 if [ $? -ne 0 ]; then 25 echo "PFSAgent failed to start. Exiting..." 26 exit 1 27 fi 28 while true; do 29 curl http://127.0.0.1:9090/version 2>/dev/null >/dev/null 30 if [ $? -eq 0 ]; then 31 # Service is active and curl to the HTTP server succeeded. 32 # We're go to go. 33 break 34 fi 35 echo "Waiting for PFSAgent to be started..." 36 sleep 1 37 done 38 } 39 40 function await_swift_startup { 41 while true 42 do 43 curl http://127.0.0.1:8090/info 2>/dev/null >/dev/null 44 if [ $? -eq 0 ] 45 then 46 break 47 fi 48 echo "Waiting for Swift to be started..." 49 sleep 1 50 done 51 } 52 53 function format_volume_if_necessary { 54 sudo $GOPATH/bin/mkproxyfs -I $1 /etc/proxyfsd/saioproxyfsd0.conf SwiftClient.RetryLimit=1 55 if [ $? -ne 0 ] 56 then 57 echo "Could not pre-format $1" 58 exit 1 59 fi 60 } 61 62 function containsElement () { 63 local e match="$1" 64 shift 65 for e; do [[ "$e" == "$match" ]] && return 0; done 66 return 1 67 } 68 69 help() { 70 echo "Usage: $0 [mount type]" 71 echo "Mount type options:" 72 echo " all: NFS v3 and SMB v3.0 (default option)" 73 echo " keepmounts: don't umount/mount any mountpoints" 74 echo " nfs: NFS v3" 75 echo " smb: SMB v3.0" 76 echo " smb1: SMB v1.0" 77 echo " smb2: SMB v2.1" 78 echo " smb3: SMB v3.0" 79 echo " pfsa: PFSAgent" 80 } 81 82 MOUNT_OPTIONS=() 83 if [ $# -gt 0 ]; then 84 while [[ $# -gt 0 ]]; do 85 key="$1" 86 case $key in 87 -h|--help) 88 help 89 exit 0 90 ;; 91 all|keepmounts|smb|smb1|smb2|smb3|nfs|pfsa) 92 if containsElement "$key" "${MOUNT_OPTIONS[@]}"; then 93 echo "Error: duplicated option '${key}'." 94 echo 95 help 96 exit 1 97 fi 98 MOUNT_OPTIONS+=("$1") 99 shift 100 ;; 101 *) 102 echo "Invalid argument '$key'." 103 echo 104 help 105 exit 1 106 esac 107 done 108 109 # Now that we allow more than one mount option to be passed, we have to check 110 # for incompatible options. 111 if [ ${#MOUNT_OPTIONS[@]} -gt 1 ] && containsElement "all" "${MOUNT_OPTIONS[@]}"; then 112 echo "Error: no other options are allowed while using 'all'." 113 echo 114 help 115 exit 1 116 fi 117 118 if [ ${#MOUNT_OPTIONS[@]} -gt 1 ] && containsElement "keepmounts" "${MOUNT_OPTIONS[@]}"; then 119 echo "Error: no other options are allowed while using 'keepmounts'." 120 echo 121 help 122 exit 1 123 fi 124 125 # I know the next 4 'if' clauses are gross, but I don't have the patience to 126 # find out the proper way to do it in bash. 127 if [ ${#MOUNT_OPTIONS[@]} -gt 1 ] && containsElement "smb" "${MOUNT_OPTIONS[@]}"; then 128 if containsElement "smb1" "${MOUNT_OPTIONS[@]}" || containsElement "smb2" "${MOUNT_OPTIONS[@]}" || containsElement "smb3" "${MOUNT_OPTIONS[@]}"; then 129 echo "Error: only one SMB option can be specified at a time." 130 echo 131 help 132 exit 1 133 fi 134 fi 135 136 if [ ${#MOUNT_OPTIONS[@]} -gt 1 ] && containsElement "smb1" "${MOUNT_OPTIONS[@]}"; then 137 if containsElement "smb" "${MOUNT_OPTIONS[@]}" || containsElement "smb2" "${MOUNT_OPTIONS[@]}" || containsElement "smb3" "${MOUNT_OPTIONS[@]}"; then 138 echo "Error: only one SMB option can be specified at a time." 139 echo 140 help 141 exit 1 142 fi 143 fi 144 145 if [ ${#MOUNT_OPTIONS[@]} -gt 1 ] && containsElement "smb2" "${MOUNT_OPTIONS[@]}"; then 146 if containsElement "smb1" "${MOUNT_OPTIONS[@]}" || containsElement "smb" "${MOUNT_OPTIONS[@]}" || containsElement "smb3" "${MOUNT_OPTIONS[@]}"; then 147 echo "Error: only one SMB option can be specified at a time." 148 echo 149 help 150 exit 1 151 fi 152 fi 153 154 if [ ${#MOUNT_OPTIONS[@]} -gt 1 ] && containsElement "smb3" "${MOUNT_OPTIONS[@]}"; then 155 if containsElement "smb1" "${MOUNT_OPTIONS[@]}" || containsElement "smb2" "${MOUNT_OPTIONS[@]}" || containsElement "smb" "${MOUNT_OPTIONS[@]}"; then 156 echo "Error: only one SMB option can be specified at a time." 157 echo 158 help 159 exit 1 160 fi 161 fi 162 else 163 MOUNT_OPTIONS+=("all") 164 fi 165 166 if containsElement "all" "${MOUNT_OPTIONS[@]}"; then 167 NFS_VERS=3 168 SMB_VERS=3.0 169 else 170 if containsElement "nfs" "${MOUNT_OPTIONS[@]}"; then 171 NFS_VERS=3 172 fi 173 174 if containsElement "smb1" "${MOUNT_OPTIONS[@]}"; then 175 SMB_VERS=1.0 176 elif containsElement "smb2" "${MOUNT_OPTIONS[@]}"; then 177 SMB_VERS=2.1 178 elif containsElement "smb" "${MOUNT_OPTIONS[@]}" || containsElement "smb3" "${MOUNT_OPTIONS[@]}"; then 179 SMB_VERS=3.0 180 fi 181 fi 182 183 MOUNT_POINT_NFS=127.0.0.1:/CommonMountPoint 184 SHARE_NFS=/mnt/nfs_proxyfs_mount/ 185 186 MOUNT_POINT_SMB=//127.0.0.1/proxyfs 187 SHARE_SMB=/mnt/smb_proxyfs_mount/ 188 189 # Making sure $GOPATH contains something: 190 source ~/.bashrc 191 if [ -z "$GOPATH" ]; then 192 GOPATH=/home/swift/code/ProxyFS 193 fi 194 195 UID_SMB=`id -u` 196 GID_SMB=`id -g` 197 198 sudo mount -a 199 200 # "keepmounts" means "keep everything as it was", but PFSAgent works differently, 201 # so just preserving the mount points is not enough. What we'll do is check if 202 # it's running before trying to stop it, and if it is, save it as a "MOUNT_OPTION" 203 if [ -f /usr/bin/systemctl ] && containsElement "keepmounts" "${MOUNT_OPTIONS[@]}"; then 204 /usr/bin/systemctl is-active --quiet pfsagentd && MOUNT_OPTIONS+=("pfsa") 205 fi 206 207 if containsElement "keepmounts" "${MOUNT_OPTIONS[@]}"; then 208 echo "Shutting down services..." 209 /usr/bin/unmount_and_stop_pfs keepmounts 210 else 211 echo "Shutting down services and mount points..." 212 /usr/bin/unmount_and_stop_pfs 213 fi 214 echo 215 216 echo "Bringing up services..." 217 if [ -f /usr/bin/systemctl ]; then 218 # Centos 219 MOUNT=/usr/bin/mount 220 sudo /usr/bin/systemctl start memcached 221 sudo /usr/bin/swift-init main start 222 await_swift_startup 223 format_volume_if_necessary CommonVolume 224 sudo /usr/bin/systemctl start proxyfsd 225 await_proxyfsd_startup 226 echo "ProxyFS successfully started" 227 sudo /usr/bin/systemctl start nmb 228 sudo /usr/bin/systemctl start smb 229 sudo /usr/bin/systemctl start rpcbind 230 sudo /usr/bin/systemctl start nfs-server 231 sudo /usr/bin/systemctl start nfs-lock 232 sudo /usr/bin/systemctl start nfs-idmap 233 if containsElement "all" "${MOUNT_OPTIONS[@]}" || containsElement "pfsa" "${MOUNT_OPTIONS[@]}"; then 234 echo "Starting PFSAgent..." 235 sudo /usr/bin/systemctl start pfsagentd 236 await_pfsagentd_startup 237 fi 238 else 239 # Ubuntu (not tested!) 240 MOUNT=/bin/mount 241 sudo /usr/sbin/service memcached start 242 sudo /usr/bin/swift-init main start 243 await_swift_startup 244 format_volume_if_necessary CommonVolume 245 sudo /usr/sbin/service proxyfsd start 246 await_proxyfsd_startup 247 echo "ProxyFS successfully started" 248 sudo /usr/sbin/service nmbd start 249 sudo /usr/sbin/service smbd start 250 sudo /usr/sbin/service rpcbind start 251 sudo /usr/sbin/service nfs-server start 252 sudo /usr/sbin/service nfs-lock start 253 sudo /usr/sbin/service nfs-idmap start 254 # Here we should start pfsagentd (if 'all' or 'pfsa' are present in 255 # $MOUNT_OPTIONS), but we don't support Ubuntu 256 fi 257 echo 258 259 if containsElement "all" "${MOUNT_OPTIONS[@]}" || containsElement "nfs" "${MOUNT_OPTIONS[@]}"; then 260 mountpoint -q $SHARE_NFS 261 if [ $? -ne 0 ]; then 262 for i in $(seq 5); do 263 sleep 5 264 sudo $MOUNT -t nfs -o vers=$NFS_VERS $MOUNT_POINT_NFS $SHARE_NFS && break 265 echo "Mount of $SHARE_NFS failed. Retrying..." 266 done 267 fi 268 269 mountpoint -q $SHARE_NFS 270 if [ $? -ne 0 ]; then 271 echo "ERROR: Could not mount $SHARE_NFS." 272 exit 1 273 else 274 echo "$SHARE_NFS successfully mounted" 275 fi 276 fi 277 278 if containsElement "all" "${MOUNT_OPTIONS[@]}" || containsElement "smb" "${MOUNT_OPTIONS[@]}" || containsElement "smb1" "${MOUNT_OPTIONS[@]}" || containsElement "smb2" "${MOUNT_OPTIONS[@]}" || containsElement "smb3" "${MOUNT_OPTIONS[@]}"; then 279 mountpoint -q $SHARE_SMB 280 if [ $? -ne 0 ]; then 281 for i in $(seq 5); do 282 sleep 5 283 sudo $MOUNT -t cifs -o user=<%= @swift_user %>,password=<%= @swift_user %>,domain=LOCALHOST,uid=$UID_SMB,gid=$GID_SMB,vers=$SMB_VERS,iocharset=utf8,actimeo=0 $MOUNT_POINT_SMB $SHARE_SMB && break 284 echo "Mount of $SHARE_SMB failed. Retrying..." 285 done 286 fi 287 288 mountpoint -q $SHARE_SMB 289 if [ $? -ne 0 ]; then 290 echo "ERROR: Could not mount $SHARE_SMB." 291 exit 1 292 else 293 echo "$SHARE_SMB successfully mounted" 294 fi 295 fi