1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
#!/bin/bash
function help {
cat <<EOHELP
Usage: shared-ip-loc-manage.sh [--help|-h] [--timeout=<TIMEOUT>] --path=<PATH> <ACTION>
--path : Path to IP location
--timeout : Timeout in seconds for the operation to complete [Optional]
(Default: 1200)
--force : Force operation
--help -h : Shows this message.
ACTION : Choose from reserve, release
EOHELP
}
function wait_for_lock {
if [ -d "$ip_dir" ]; then
remaining=$(($timeout))
trap 'echo"";echo "BUILDER: Waiting for concurrent IP build to finish... (skipped)";break;' SIGINT; \
while [ -f "$ip_dir/.build_lock" ]; do
if [ $remaining -gt 0 ]; then
echo -ne "Waiting for concurrent IP build to finish... (${remaining}s [Ctrl-C to proceed])\033[0K\r"
sleep 1
: $((remaining--))
else
break
fi
done
trap - SIGINT; \
if [ $remaining -eq 0 ]; then
echo "BUILDER: Waiting for concurrent IP build to finish... (timeout)"
fi
fi
}
function lock {
if [ -d "$ip_dir" ]; then
touch $ip_dir/.build_lock
fi
}
function unlock {
rm -f $ip_dir/.build_lock
}
function reserve {
if [ -d "$ip_dir" ]; then
wait_for_lock
if [ $remaining -eq 0 ]; then
echo "Force creating new IP location: $ip_dir"
unlock
rm -rf $ip_dir
mkdir -p $ip_dir
fi
fi
if [ ! -d "$ip_dir" ]; then
mkdir -p $ip_dir
fi
echo "BUILDER: Reserving IP location: $ip_dir"
lock
}
function release {
echo "BUILDER: Releasing IP location: $ip_dir"
unlock
}
# Parse options
ip_dir=""
action=""
timeout=1800
remaining=0
force=0
for arg in "$@"; do
if [[ $arg == "--help" ]]; then
help
exit 0
elif [[ $arg == "--force" ]]; then
force=1
elif [[ $arg =~ "--path="(.+) ]]; then
ip_dir=`readlink -m ${BASH_REMATCH[1]}`
elif [[ $arg =~ "--timeout="(.+) ]]; then
timeout=${BASH_REMATCH[1]}
else
action=$arg
break
fi
done
# Validate inputs
if [ -z $ip_dir ]; then
echo "ERROR: Please specify a valid path using the --path option."
exit 1
fi
case $action in
reserve)
if [ $force -eq 1 ]; then
echo "Force creating new IP location: $ip_dir"
rm -rf $ip_dir
mkdir -p $ip_dir
lock
else
reserve
fi
;;
release)
release
;;
*)
echo "ERROR: Please specify a valid action (reserve, release)"
exit 1
;;
esac
|