-
Notifications
You must be signed in to change notification settings - Fork 60
/
setup-timezone.in
137 lines (117 loc) · 2.79 KB
/
setup-timezone.in
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
#!/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"
if ! $INSTALL_TZDATA; then
local zone="${zonepath#*/zoneinfo/}"
local zdir="${zonepath%/*}"/
zdir="${zdir#*/zoneinfo/}"
if ! $KEEP_TZDATA; then
rm -rf "${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 "exit 1" INT TERM HUP
trap "apk del --no-progress --quiet $apkdel" EXIT
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
show_tz_list
echo ""
ask "Which timezone are you in? (or '?' or 'none')" "$default_timezone"
timezone=$(printf %s "$resp" | sed 's/\/\+/\//g; s/\/$//')
case "$timezone" in
none|abort) break;;
""|"?") continue;;
esac
while [ -d "$zroot/$timezone" ]; do
show_tz_list "$timezone"
echo ""
ask "What sub-timezone of '$timezone' are you in? (or '?')"
zone=$(printf %s "$resp" | sed 's/\/\+/\//g; s/\/$//')
case "$zone" in
""|"?") 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