summaryrefslogtreecommitdiff
path: root/setup-timezone.in
blob: 2be9321a0e120b8470f5e1cc512b3ce3cc5a5961 (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
#!/bin/sh

PREFIX=@PREFIX@
: ${LIBDIR=$PREFIX/lib}
. "$LIBDIR/libalpine.sh"

zroot="$ROOT"/usr/share/zoneinfo

usage() {
	cat <<-__EOF__
		usage: setup-timezone [-h] [-k|-i] [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

		TIMEZONE is relative $zroot.

		If TIMEZONE is not specified user will be prompted.
	__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 0;;
		i) INSTALL_TZDATA=true;;
		k) KEEP_TZDATA=true;;
		z) ZONE="$OPTARG";;  # backwards compat
		'?') usage "1" >&2;;
	esac
done
shift $(( $OPTIND - 1))

if [ -z "$ZONE" ]; then
	ZONE="$1"
fi

if [ "$ZONE" = "none" ]; then
	exit 0
fi

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

apk add --no-progress --quiet $pkg || die "Failed to install tzdata package"

if [ -n "$apkdel" ]; then
	trap "apk del --no-progress --quiet $apkdel" EXIT HUP INT TERM
fi

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

if [ -n "$ZONE" ]; then
	[ -f "$zroot/$ZONE" ] || die "'$ZONE' is not a valid timezone on this system"
	setup_tz "$zroot"/"$ZONE"
else
	while true; do
		ask "Which timezone are you in? ('?' for list)" "$default_timezone"
		timezone="$resp"
		case "$timezone" in
		"") continue;;
		"?") show_tz_list; continue;;
		esac

		while [ -d "$zroot/$timezone" ]; do
			ask "What sub-timezone of '$timezone' are you in? ('?' for list)"
			zone="$resp"
			case "$zone" in
			"?") show_tz_list "$timezone"; continue;;
			esac
			default_timezone="$timezone"
			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
fi