summaryrefslogtreecommitdiff
path: root/setup-timezone.in
blob: 5c5b139db56feb59303a7514f02e56c256a0692b (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
#!/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

$MOCK apk add --quiet $pkg

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


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

	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

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