aboutsummaryrefslogtreecommitdiffstats
path: root/setup-timezone.in
blob: 42e2a88dd416a3e379f9820416b316f4b4b2651c (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
#!/bin/sh

PREFIX=
. "$PREFIX/lib/libalpine.sh"


zroot=/usr/share/zoneinfo

usage() {
	cat <<-__EOF__
		usage: setup-timezone [-h] [-k|-i] [-z TIMEZONE]

		Sets the timezone for the system.

		options:
		 -h  Show this help
		 -i  Install tzdata and symlink instead of making a copy
		 -k  Keep previous copies of tzdata
		 -z  Set given timezone. (relative $zroot)
	__EOF__
	exit 1
}

show_tz_list() {
	local i z= list=
	local path="$zroot/$1"
	[ -d "$path" ] || return 1

	for i in $(find $path -maxdepth 1); do
		case $i in
		*.tab|*/) continue;;
		esac
		if [ -d "$i" ]; then
			z="$z ${i##*/}/"
		else
			z="$z ${i##*/}"
		fi
	done
	( cd $path && ls --color=never -Cd $z )
}

setup_tz() {
	local zonepath="$1"
	mkdir -p "${ROOT}"etc/zoneinfo
	if ! $INSTALL_TZDATA; then
		local zone="${zonepath#*/zoneinfo/}"
		local zdir="${zonepath%/*}"/
		zdir="${zdir#*/zoneinfo/}"
		if ! $KEEP_TZDATA; then
			rm -r "${ROOT}"/etc/zoneinfo
		fi
		mkdir -p "${ROOT}"etc/zoneinfo/$zdir
		cp "$zonepath" "${ROOT}"etc/zoneinfo/$zdir/
		zonepath=/etc/zoneinfo/$zone
	fi
	rm -f "${ROOT}"etc/localtime
	ln -s "$zonepath" "${ROOT}"etc/localtime
}

INSTALL_TZDATA=false
KEEP_TZDATA=false
while getopts "hikz:" opt; do
	case $opt in
		h) usage;;
		i) INSTALL_TZDATA=true;;
		k) KEEP_TZDATA=true;;
		z) ZONE="$OPTARG";;
	esac
done

if $INSTALL_TZDATA; then
	pkg=tzdata
	apkdel=
else
	pkg="--force --virtual .setup-timezone tzdata"
	apkdel=".setup-timezone"
fi

apk add --quiet $pkg

if [ -L "${ROOT}"etc/zoneinfo/localtime ]; then
	timezone=$(readlink "${ROOT}"etc/zoneinfo/localtime)
	timezone=${timezone#*/zoneinfo/}
else
	timezone=UTC
fi


while true; do
	if [ -n "$ZONE" ]; then
		setup_tz "$zroot"/"$ZONE"
		break
	fi

	echo -n "Which timezone are you in? ('?' for list) [$timezone] "
	default_read timezone "$timezone"
	case "$timezone" in
	"") continue;;
	"?") show_tz_list; continue;;
	esac

	while [ -d "$zroot/$timezone" ]; do
		zone=
		echo -n "What sub-timezone of '$timezone' are you in? ('?' for list) "
		default_read zone
		case "$zone" in
		"?") show_tz_list "$timezone"; continue;;
		esac
		timezone="$timezone/$zone"
	done

	if [ -f "$zroot/$timezone" ]; then
		setup_tz "$zroot/$timezone"
		break
	fi
	echo "'$timezone' is not a valid timezone on this system"
done

if [ -n "$apkdel" ]; then
	apk del --quiet $apkdel
fi