aboutsummaryrefslogtreecommitdiff
path: root/lib/util.bash
blob: 1cf84f44c987e71bb105233b14026b5a1c4949f1 (plain)
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
#!/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"

	for util in curl wget
	do
		command -v "$util" > /dev/null || continue
		"fetch_http_$util" "$1" "$buffer" || continue
		local exit_code=$?

		printf "%s" "$buffer"
		return $exit_code
	done

	die "Unable to download file over HTTP!"
}

fetch_http_curl() {
	curl -Ls "$1" > "$2"
}

fetch_http_wget() {
	wget --quiet --output-document "$2" "$1"
}

# 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 file

	file="$(mktemp)"

	# 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"
}