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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
#!/usr/bin/env bash
# Change the working directory. In usage, this is the same as using cd,
# however, it will make additional checks to ensure everything is going fine.
chgdir() {
cd -- "$1" || die "Failed to change directory to $1"
}
# Read a particular value from a key/value configuration file. Using this
# function introduces a dependency on awk.
config_etc_kv() {
local file="$BASEDIR/etc/$1"
shift
if [[ ! -f $file ]]
then
crit "Tried to read value for $1 from $file, but $file does not exist"
return
fi
debug "Reading value for $1 from $file"
awk -F= '$1 == "'"$1"'" { print $NF }' "$file"
}
# Log a message as error, and exit the program. This is intended for serious
# issues that prevent the script from running correctly. The exit code can be
# specified with -i, or will default to 1.
die() {
local OPTIND
local code
while getopts ":i:" opt
do
case "$opt" in
i) code=$OPTARG ;;
*) alert "Unused argument specified: $opt" ;;
esac
done
shift $(( OPTIND -1 ))
alert "$@"
exit "${code:-1}"
}
# Fetch a file from an URL. Using this function introduces a dependency on curl.
fetch_http() {
local OPTIND
local buffer
while getopts ":o:" opt
do
case "$opt" in
o) buffer=$OPTARG ;;
*) alert "Unused argument specified: $opt" ;;
esac
done
shift $(( OPTIND -1 ))
[[ -z $buffer ]] && buffer="$(tmpfile)"
notice "Downloading $1 to $buffer"
# TODO: Switch to the most appropriate downloading tool, depending on
# what is available.
curl -Ls "$1" > "$buffer"
local exit_code=$?
printf "%s" "$buffer"
return $exit_code
}
# Pretty print a duration between a starting point (in seconds) and an end
# point (in seconds). If no end point is given, the current time will be used.
# A good way to get a current timestamp in seconds is through date's "%s"
# format.
pp_duration() {
local start=$1
local end=$2
local diff
if [[ -z "$end" ]]
then
end="$(date +%s)"
fi
diff=$((end - start))
printf "%dh %02dm %02ds\n" \
"$((diff / 60 / 60))" \
"$((diff / 60))" \
"$((diff % 60))"
}
# Create a temporary directory. Similar to tempfile, but you'll get a directory
# instead.
tmpdir() {
local dir
dir="$(mktemp -d)"
# Ensure the file was created succesfully
if [[ ! -d "$dir" ]]
then
die "Failed to create a temporary directory at $dir"
fi
debug "Temporary file created at $dir"
printf "%s" "$dir"
}
# Create a temporary file. In usage, this is no different from mktemp itself,
# however, it will apply additional checks to ensure everything is going
# correctly, and the files will be cleaned up automatically at the end.
tmpfile() {
local OPTIND
local extension="tmp"
local file
while getopts ":x:" opt
do
case "$opt" in
x) extension=$OPTARG ;;
*) alert "Unused argument specified: $opt" ;;
esac
done
shift $(( OPTIND -1 ))
file="$(mktemp --suffix ".$extension")"
# Ensure the file was created succesfully
if [[ ! -f "$file" ]]
then
die "Failed to create a temporary file at $file"
fi
debug "Temporary file created at $file"
printf "%s" "$file"
}
|