Index: /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/en/system.xml
===================================================================
--- /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/en/system.xml	(revision 38836)
+++ /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/en/system.xml	(working copy)
@@ -3355,6 +3355,10 @@
                 <verbose_name>NTP Servers</verbose_name>
                 <help_text/>
             </field>
+            <field name="ntp_key" type="asso">
+                <verbose_name>NTP Keys</verbose_name>
+                <help_text/>
+            </field>
         </fieldgrp>
         <fieldgrp name="ntp_stats">
             <verbose_name>NTP Statistics</verbose_name>
@@ -3434,30 +3438,47 @@
                         <verbose_name>IPv6</verbose_name>
                         <help_text/>
                     </field>
+                    <field name="hostname" type="string">
+                        <verbose_name>Hostname</verbose_name>
+                        <help_text/>
+                    </field>
                 </subfields>
             </field>
-            <field name="version" type="enum">
-                <verbose_name>NTP Server Version</verbose_name>
+            <field name="options" type="enum">
+                <verbose_name>NTP Server Options</verbose_name>
                 <help_text/>
                 <choices>
-                    <choice value="1">
-                        <verbose_name>1</verbose_name>
-                        <help_text/>
-                    </choice>
-                    <choice value="2">
-                        <verbose_name>2</verbose_name>
+                    <choice value="nts">
+                        <verbose_name>NTS</verbose_name>
                         <help_text/>
                     </choice>
-                    <choice value="3">
-                        <verbose_name>3</verbose_name>
-                        <help_text/>
-                    </choice>
-                    <choice value="4">
-                        <verbose_name>4</verbose_name>
+                    <choice value="iburst">
+                        <verbose_name>iBurst</verbose_name>
                         <help_text/>
                     </choice>
                 </choices>
             </field>
+            <field name="key_id" type="asso">
+                <verbose_name>Authentication Key</verbose_name>
+                <help_text/>
+            </field>
+        </fieldgrp>
+    </model>
+    <model name="NTPKey" status="NEW">
+        <verbose_name>NTP Key</verbose_name>
+        <help_text/>
+        <help_link/>
+        <fieldgrp name="default">
+            <verbose_name>Basic Settings</verbose_name>
+            <help_text/>
+            <field name="key_id" type="UnionField">
+                <verbose_name>Key ID</verbose_name>
+                <help_text/>
+            </field>
+            <field name="auth_key" type="string">
+                <verbose_name>Authentication Key</verbose_name>
+                <help_text/>
+            </field>
         </fieldgrp>
     </model>
     <model name="WAF" status="NEW">
Index: /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/ja/system.xml
===================================================================
--- /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/ja/system.xml	(revision 38836)
+++ /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/ja/system.xml	(working copy)
@@ -3355,6 +3355,10 @@
                 <verbose_name>NTPサーバ</verbose_name>
                 <help_text/>
             </field>
+            <field name="ntp_key" type="asso">
+                <verbose_name>NTPキー</verbose_name>
+                <help_text/>
+            </field>
         </fieldgrp>
         <fieldgrp name="ntp_stats">
             <verbose_name>NTP統計</verbose_name>
@@ -3434,30 +3438,47 @@
                         <verbose_name>IPv6</verbose_name>
                         <help_text/>
                     </field>
+                    <field name="hostname" type="string">
+                        <verbose_name>ホスト名</verbose_name>
+                        <help_text/>
+                    </field>
                 </subfields>
             </field>
-            <field name="version" type="enum">
-                <verbose_name>NTPサーババージョン</verbose_name>
+            <field name="options" type="enum">
+                <verbose_name>NTPサーバーオプション</verbose_name>
                 <help_text/>
                 <choices>
-                    <choice value="1">
-                        <verbose_name>1</verbose_name>
-                        <help_text/>
-                    </choice>
-                    <choice value="2">
-                        <verbose_name>2</verbose_name>
+                    <choice value="nts">
+                        <verbose_name>NTS</verbose_name>
                         <help_text/>
                     </choice>
-                    <choice value="3">
-                        <verbose_name>3</verbose_name>
-                        <help_text/>
-                    </choice>
-                    <choice value="4">
-                        <verbose_name>4</verbose_name>
+                    <choice value="iburst">
+                        <verbose_name>iBurst</verbose_name>
                         <help_text/>
                     </choice>
                 </choices>
             </field>
+            <field name="key_id" type="asso">
+                <verbose_name>認証キー</verbose_name>
+                <help_text/>
+            </field>
+        </fieldgrp>
+    </model>
+    <model name="NTPKey" status="NEW">
+        <verbose_name>NTPキー</verbose_name>
+        <help_text/>
+        <help_link/>
+        <fieldgrp name="default">
+            <verbose_name>基本設定</verbose_name>
+            <help_text/>
+            <field name="key_id" type="UnionField">
+                <verbose_name>キーID</verbose_name>
+                <help_text/>
+            </field>
+            <field name="auth_key" type="string">
+                <verbose_name>認証キー</verbose_name>
+                <help_text/>
+            </field>
         </fieldgrp>
     </model>
     <model name="WAF" status="NEW">
Index: /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/zh-cn/system.xml
===================================================================
--- /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/zh-cn/system.xml	(revision 38836)
+++ /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/zh-cn/system.xml	(working copy)
@@ -3355,6 +3355,10 @@
                 <verbose_name>NTP服务器</verbose_name>
                 <help_text/>
             </field>
+            <field name="ntp_key" type="asso">
+                <verbose_name>NTP 密钥</verbose_name>
+                <help_text/>
+            </field>
         </fieldgrp>
         <fieldgrp name="ntp_stats">
             <verbose_name>NTP统计信息</verbose_name>
@@ -3434,30 +3438,47 @@
                         <verbose_name>IPv6</verbose_name>
                         <help_text/>
                     </field>
+                    <field name="hostname" type="string">
+                        <verbose_name>主机名</verbose_name>
+                        <help_text/>
+                    </field>
                 </subfields>
             </field>
-            <field name="version" type="enum">
-                <verbose_name>服务器版本</verbose_name>
+            <field name="options" type="enum">
+                <verbose_name>NTP 服务器选项</verbose_name>
                 <help_text/>
                 <choices>
-                    <choice value="1">
-                        <verbose_name>1</verbose_name>
-                        <help_text/>
-                    </choice>
-                    <choice value="2">
-                        <verbose_name>2</verbose_name>
+                    <choice value="nts">
+                        <verbose_name>NTS</verbose_name>
                         <help_text/>
                     </choice>
-                    <choice value="3">
-                        <verbose_name>3</verbose_name>
-                        <help_text/>
-                    </choice>
-                    <choice value="4">
-                        <verbose_name>4</verbose_name>
+                    <choice value="iburst">
+                        <verbose_name>iBurst</verbose_name>
                         <help_text/>
                     </choice>
                 </choices>
             </field>
+            <field name="key_id" type="asso">
+                <verbose_name>认证密钥</verbose_name>
+                <help_text/>
+            </field>
+        </fieldgrp>
+    </model>
+    <model name="NTPKey" status="NEW">
+        <verbose_name>NTP 密钥</verbose_name>
+        <help_text/>
+        <help_link/>
+        <fieldgrp name="default">
+            <verbose_name>基本设置</verbose_name>
+            <help_text/>
+            <field name="key_id" type="UnionField">
+                <verbose_name>密钥ID</verbose_name>
+                <help_text/>
+            </field>
+            <field name="auth_key" type="string">
+                <verbose_name>认证密钥</verbose_name>
+                <help_text/>
+            </field>
         </fieldgrp>
     </model>
     <model name="WAF" status="NEW">
Index: /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/zh-tw/system.xml
===================================================================
--- /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/zh-tw/system.xml	(revision 38836)
+++ /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/doc/zh-tw/system.xml	(working copy)
@@ -3355,6 +3355,10 @@
                 <verbose_name>NTP服務器</verbose_name>
                 <help_text/>
             </field>
+            <field name="ntp_key" type="asso">
+                <verbose_name>NTP 密鑰</verbose_name>
+                <help_text/>
+            </field>
         </fieldgrp>
         <fieldgrp name="ntp_stats">
             <verbose_name>NTP統計資訊</verbose_name>
@@ -3434,30 +3438,47 @@
                         <verbose_name>IPv6</verbose_name>
                         <help_text/>
                     </field>
+                    <field name="hostname" type="string">
+                        <verbose_name>主機名稱</verbose_name>
+                        <help_text/>
+                    </field>
                 </subfields>
             </field>
-            <field name="version" type="enum">
-                <verbose_name>服務器版本</verbose_name>
+            <field name="options" type="enum">
+                <verbose_name>NTP 伺服器選項</verbose_name>
                 <help_text/>
                 <choices>
-                    <choice value="1">
-                        <verbose_name>1</verbose_name>
-                        <help_text/>
-                    </choice>
-                    <choice value="2">
-                        <verbose_name>2</verbose_name>
+                    <choice value="nts">
+                        <verbose_name>NTS</verbose_name>
                         <help_text/>
                     </choice>
-                    <choice value="3">
-                        <verbose_name>3</verbose_name>
-                        <help_text/>
-                    </choice>
-                    <choice value="4">
-                        <verbose_name>4</verbose_name>
+                    <choice value="iburst">
+                        <verbose_name>iBurst</verbose_name>
                         <help_text/>
                     </choice>
                 </choices>
             </field>
+            <field name="key_id" type="asso">
+                <verbose_name>認證密鑰</verbose_name>
+                <help_text/>
+            </field>
+        </fieldgrp>
+    </model>
+    <model name="NTPKey" status="NEW">
+        <verbose_name>NTP 密鑰</verbose_name>
+        <help_text/>
+        <help_link/>
+        <fieldgrp name="default">
+            <verbose_name>基本設定</verbose_name>
+            <help_text/>
+            <field name="key_id" type="UnionField">
+                <verbose_name>密鑰ID</verbose_name>
+                <help_text/>
+            </field>
+            <field name="auth_key" type="string">
+                <verbose_name>認證密鑰</verbose_name>
+                <help_text/>
+            </field>
         </fieldgrp>
     </model>
     <model name="WAF" status="NEW">
Index: /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/models/system/ntp.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/models/system/ntp.py	(revision 38836)
+++ /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/apv/models/system/ntp.py	(working copy)
@@ -3,11 +3,8 @@
 
 class NTPSettings(ANModel):
     enable_ntp = BooleanField(verbose_name=_('Enable NTP'))
-    method = EnumField(condition=ValueCondition('enable_ntp',True), verbose_name = _('Method'), default=0, optional=True, values=(
-                    (0,'ntpd'),
-                    (1,'ntpdate')
-                    ))
     ntp_server = AssoField2(verbose_name=_('NTP Servers'), tgt='system.NTPServer.asso', mul=1, pos='left', optional=True)
+    ntp_key = AssoField2(verbose_name=_('NTP Keys'), tgt='system.NTPKey.setting_key', mul=1, pos='left', optional=True)
 
     ntp_stats = FieldGroup(writable=False, verbose_name=_('NTP Statistics'), level=STATS,
                         fields={
@@ -37,6 +34,7 @@
         related = 'ntp_server'
         config_change = True
         instance_mul = '*'
+        refresh_page = True
 
     class Meta:
         profile = True
@@ -46,15 +44,14 @@
         def _get_query_set(self):
             self.cli.set_enable()
             self.cli.set_enable()
-            result = self.cli.cmd('show ntp',
-                                   RegexParser('ntp (?P<enable_ntp>on|off) (?P<method>0|1)', MATCHONE, reflags=re.S))
+            result = self.cli.cmd('show ntp status',
+                                   RegexParser('Chrony daemon (?P<enable_ntp>is running|is not running)', MATCHONE, reflags=re.S))
             if result:
                 rtn_dict = {
-                            'enable_ntp':True if result['enable_ntp'] == 'on' else False,
-                            'method':result['method'] if result['method'] else 0
+                            'enable_ntp':True if result['enable_ntp'] == 'is running' else False
                             }
             else:
-                rtn_dict = { 'enable_ntp':False, 'method':0 }
+                rtn_dict = { 'enable_ntp':False }
             self._model._meta.mark_delay_query(rtn_dict)
 
             return QuerySet(self._model, [rtn_dict])
@@ -62,17 +59,15 @@
         def _get_stats(self):
             return self._get_query_set()
 
-        @UpdatingFields(['enable_ntp', 'method'])
-        def _update_enable_ntp_method(self, instance):
+        @UpdatingFields(['enable_ntp'])
+        def _update_enable_ntp(self, instance):
             self.cli.set_config()
             if instance.enable_ntp:
-                result = self.cli.cmd('ntp on %u\nYES\n' % instance.method,
-                                      RegexParser('Continue to turn on NTP', match_exception=CLICmdNormal, exclusive=True),
-                                      RegexParser('YES', match_exception=CLICmdNormal, exclusive=True),
+                result = self.cli.cmd('ntp on',
                                       BlankParser(nonblank_exception=CLICmdError, supplement=True))
             else:
                 result = self.cli.cmd('ntp off',
-                                      BlankParser(nonblank_exception=CLICmdError, supplement=True))                
+                                      BlankParser(nonblank_exception=CLICmdError, supplement=True))
             return
 
         def _perform_Clear_ntp(self, options):
@@ -83,16 +78,16 @@
 
         def _get_ntp_stats(self):
             self.cli.set_enable()
-            result = self.cli.cmd('show ntp')
+            result = self.cli.cmd('show ntp status')
             return result
 
 class NTPServer(ANModel):
-    ip = IPAddressField(verbose_name=_('NTP Server IP'), primary_key=True)
-    version = EnumField(verbose_name=_('NTP Server Version'), default=4, primary_key=True, optional=True, values=(
-                        (1, '1'),
-                        (2, '2'),
-                        (3, '3'),
-                        (4, '4')))
+    ip = CharField(verbose_name=_('NTP Server IP or Hostname'), primary_key=True)
+    options = MultiEnumField(verbose_name=_('NTP Server Options'), default=[], optional=True, values=(
+        ('nts', 'NTS'),
+        ('iburst', 'iBurst'),
+    ))
+    key_id = AssoField2(verbose_name=_('Authentication Key'), tgt='system.NTPKey.ntpserver_key', mul='*', pos='right', optional=True)
     asso = AssoField2(tgt='system.NTPSettings.ntp_server', mul='*', pos='right', hidden=True, default=[{}])
 
     class Meta:
@@ -101,24 +96,87 @@
     class Manager(CLIManager):
         def _get_query_set(self):
             self.cli.set_enable()
-            result = self.cli.cmd('show ntp\n',
-                        EasyParser('ntp server ', ['?ip', '?version']))           
+            output = self.cli.cmd('show ntp status')
+            result = re.findall(r"^server.*$", output, re.MULTILINE)
+            res = []
+            for each in result:
+                columns = each.split()
+                options = []
+                key_id = ""
+                if "nts" in each:
+                    options.append("nts")
+                if "iburst" in each:
+                    options.append("iburst")
+                if "key" in each:
+                    key_ind = columns.index("key")
+                    key_id = int(columns[key_ind + 1])
+                row = {
+                    "ip": columns[1],
+                    "options": options,
+                    "key_id": [{"key_id": key_id}]
+                }
+                res.append(row)
+            return QuerySet(self._model, res)
+
+        def _filter(self, filter_dict):
+            return self.all()
+
+        def _insert(self, instance):
+            data = instance.get_field_dict()
+            ip_str = data["ip"]
+            options_str = '""'
+            if "options" in data and data["options"]:
+                options_str = '"%s"' % " ".join(data["options"]) # ex: "nts iburst"
+            key_str = ""
+            if "key_id" in data and data["key_id"] and data["key_id"][0] and "key_id" in data["key_id"][0] and data["key_id"][0]["key_id"]:
+                key_str = data["key_id"][0]["key_id"]
+            self.cli.set_config()
+            result = self.cli.cmd('ntp server "%s" %s %s' % (ip_str, options_str, key_str),
+                                  BlankParser(nonblank_exception=CLICmdError, supplement=True))
+            return result
+
+        def _delete(self, pk_list):
+            self.cli.set_config()
+            for each_pk in pk_list:
+                each_pk['ip_str'] = each_pk['ip']
+                result = self.cli.cmd('no ntp server "%(ip_str)s"' % each_pk,
+                                      BlankParser(nonblank_exception=CLICmdError, supplement=True))
+            return
+
+class NTPKey(ANModel):
+    key_id = Uint32Field(verbose_name=_('Key ID'), primary_key=True)
+    auth_key = CharField(verbose_name=_('Authentication Key'), length='1..32')
+    tgt_fields = FieldGroup(level=ADVANCED, editable=False, fields={
+        'setting_key': AssoField2(verbose_name=_(''), tgt='system.NTPSettings.ntp_key', mul='*', pos='right', optional=True, hidden=True),
+        'ntpserver_key': AssoField2(verbose_name=_(''), tgt='system.NTPServer.key_id', mul='1', pos='left', optional=True, hidden=True),
+    })
+
+    class Meta:
+        verbose_name = _('NTP Key')
+
+    class Manager(CLIManager):
+        def _get_query_set(self):
+            self.cli.set_enable()
+            output = self.cli.cmd('show ntp keys\n')
+            split_newline = output.splitlines()
+            target_content = "\n".join(split_newline[2:])
+            result = cli_parse(target_content,
+                               RegexParser(r"(?P<key_id>[^\s]+)\s*(?P<auth_key>[^\s]+)\s*", MATCHALL, reflags=re.S))
             return QuerySet(self._model, result)
 
+        def _filter(self, filter_dict):
+            return self.all()
+
         def _insert(self, instance):
-            data = {
-                'ip':instance.ip.values()[0],
-                'version':instance.version,
-            }
+            data = instance.get_field_dict()
             self.cli.set_config()
-            result = self.cli.cmd('ntp server %(ip)s %(version)u' % data,
-                                  BlankParser(nonblank_exception=CLICmdError, supplement=True))       
+            result = self.cli.cmd('ntp key %s %s' % (data["key_id"], data["auth_key"]),
+                                BlankParser(nonblank_exception=CLICmdError, supplement=True))
             return result
 
         def _delete(self, pk_list):
             self.cli.set_config()
             for each_pk in pk_list:
-                each_pk['ip_str'] = each_pk['ip'].values()[0]
-                result = self.cli.cmd('no ntp server %(ip_str)s %(version)u' % each_pk,
-                                      BlankParser(nonblank_exception=CLICmdError, supplement=True))    
+                result = self.cli.cmd('no ntp key %s' % each_pk['key_id'],
+                                      BlankParser(nonblank_exception=CLICmdError, supplement=True))
             return
