From a96c79e41c61d25822fb16e7dfba28182a5fd2e9 Mon Sep 17 00:00:00 2001
From: An-Cheng Huang <ancheng@vyatta.com>
Date: Thu, 6 Nov 2008 18:44:40 -0800
Subject: fix for bug 2313: add support for "Region/City" timezone
 specification.

---
 templates/system/time-zone/node.def | 79 +++++++++++++++++++++++--------------
 1 file changed, 49 insertions(+), 30 deletions(-)

(limited to 'templates/system/time-zone/node.def')

diff --git a/templates/system/time-zone/node.def b/templates/system/time-zone/node.def
index e271e3e6..00179850 100644
--- a/templates/system/time-zone/node.def
+++ b/templates/system/time-zone/node.def
@@ -1,35 +1,54 @@
 type: txt
 help: Set local timezone
 default: "GMT"
-update:expression: "LTF=\"/usr/share/zoneinfo\" && \
-case \"$VAR(@)\" in \
-  [Ll][Oo][Ss]*) LTF=\"$LTF/US/Pacific\" ;; \
-  [Dd][Ee][Nn]*) LTF=\"$LTF/US/Mountain\" ;; \
-  [Hh][Oo][Nn]*) LTF=\"$LTF/US/Hawaii\" ;; \
-  [Nn][Ee][Ww]*) LTF=\"$LTF/US/Eastern\" ;; \
-  [Cc][Hh][Ii]*) LTF=\"$LTF/US/Central\" ;; \
-  [Aa][Nn][Cc]*) LTF=\"$LTF/US/Alaska\" ;; \
-  [Pp][Hh][Oo]*) LTF=\"$LTF/US/Arizona\" ;; \
-  *) LTF=\"$LTF/Etc/$VAR(@)\" ;; \
-esac && \
-if [ -e \"$LTF\" ]; then \
-   sudo ln -fs $LTF /etc/localtime; \
-else \
-   echo \"Invalid timezone\"; \
-   exit 1; \
-fi"
+update: LTF="/usr/share/zoneinfo"
+  case "$VAR(@)" in
+    [Ll][Oo][Ss]*) LTF="$LTF/US/Pacific" ;;
+    [Dd][Ee][Nn]*) LTF="$LTF/US/Mountain" ;;
+    [Hh][Oo][Nn][Oo]*) LTF="$LTF/US/Hawaii" ;;
+    [Nn][Ee][Ww]*) LTF="$LTF/US/Eastern" ;;
+    [Cc][Hh][Ii][Cc]*) LTF="$LTF/US/Central" ;;
+    [Aa][Nn][Cc]*) LTF="$LTF/US/Alaska" ;;
+    [Pp][Hh][Oo]*) LTF="$LTF/US/Arizona" ;;
+    GMT*) LTF="$LTF/Etc/$VAR(@)" ;;
+    *) LTF="$LTF/$VAR(@)" ;;
+  esac
+  if [ -f "$LTF" ]; then
+     sudo ln -fs $LTF /etc/localtime
+  else
+     echo "Invalid timezone"
+     exit 1
+  fi
 delete:expression: "sudo ln -fs /usr/share/zoneinfo/GMT /etc/localtime"
-allowed: local -a list=( "Los Angeles" "New York" "Denver" "Chicago" \
-                         "Anchorage" "Honolulu" "Phoenix" "GMT" )
-         for (( i = -1; i > -13; i-- )); do
-           list[${#list[@]}]="GMT$i";
+allowed: word=${COMP_WORDS[$COMP_CWORD]}
+         if [[ $word == */* ]]; then
+           marr=($(ls -d /usr/share/zoneinfo/$word*))
+         else
+           marr=($(find /usr/share/zoneinfo/ -maxdepth 1 -type d \
+                   -name "$word*"))
+         fi
+         if (( ${#marr[@]} == 1 )); then
+           word=${marr[0]#/usr/share/zoneinfo/}
+         fi
+         if [ -n "$word" ] && [[ $word != */ ]]; then
+           marr=($(ls -d /usr/share/zoneinfo/$word*))
+           if (( ${#marr[@]} == 1 )) \
+               && [ -d "/usr/share/zoneinfo/$word" ]; then
+             word=$word/
+           elif [[ $word == */* ]]; then
+             word=${word%/*}/
+           fi
+         fi
+         for z in $(ls -d /usr/share/zoneinfo/$word* \
+                      2>/dev/null | egrep '^/usr/share/zoneinfo/[A-Z]'); do
+           zz=${z#/usr/share/zoneinfo/}
+           if [ -d $z ] || [[ $zz == */* ]]; then
+             echo \"$zz\"
+           fi
          done
-         for (( i = 1; i < 13; i++ )); do
-           list[${#list[@]}]="GMT+$i";
-         done
-         for zone in "${list[@]}"; do
-           echo \"$zone\"
-         done
-comp_help:Enter one of the following time zones:
-  Honolulu   Anchorage   Los Angeles   Phoenix   Denver   Chicago   New York
-  GMT   GMT-1 ... GMT-12   GMT+1 ... GMT+12 
+comp_help:Enter the local timezone by specifying "Region/City"
+  Use auto-completion to see available regions and cities.
+  Start with one of these regions:
+    Africa      America   Antarctica   Arctic   Asia     Atlantic
+    Australia   Brazil    Canada       Chile    Europe   Indian
+    Mexico      Mideast   Pacific      US
-- 
cgit v1.2.3

