Index: /branches/rel_avx_2_7_5/src/webui/webui/htdocs/new/src/avx/models/system/system_mgmt/__init__.py
===================================================================
--- /branches/rel_avx_2_7_5/src/webui/webui/htdocs/new/src/avx/models/system/system_mgmt/__init__.py	(revision 9188)
+++ /branches/rel_avx_2_7_5/src/webui/webui/htdocs/new/src/avx/models/system/system_mgmt/__init__.py	(working copy)
@@ -5,7 +5,7 @@
 from avx.company import *
 import re
 from django.utils.importlib import import_module
-from hive.utils import get_sysctl_int, dict_combine, andebug
+from hive.utils import get_sysctl_int, dict_combine, andebug, is_ipv4, is_ip_or_hostname
 import subprocess
 from djproject.an_settings import FAST_CLI_CMD
 __=_
@@ -1082,20 +1082,30 @@
             else:
                 result = cli_parse(cmd_output, BlankParser(nonblank_exception=CLICmdError, supplement=True))
             return
-        
+
 class EmailSettings(ANModel):
     from_string = CharField(verbose_name=_('From String'), length='0..64',optional=True,default='')
-    
+
+    class DeleteAll(Action):
+        verbose_name = _('Clear System Mail Configurations')
+        action_name = _('Clear')
+        btn_class = 'btn-danger slow-action'
+        alert_msg = ""
+        process_title = ""
+        forever = False
+        config_change = True
+
     class Meta:
         profile = True
         verbose_name = _('Email Settings')
-    
+
     class Manager(CLIManager):
         def _get_query_set(self):
             self.cli.set_enable()
-            output = self.cli.cmd('show ha config', RegexParser('system mail from "(?P<from_string>.*?)"', MATCHONE))
+            output = self.cli.cmd('show system mail',
+                                  RegexParser('system mail from "(?P<from_string>.*?)"', MATCHONE))
             return QuerySet(self._model, [output])
-            
+
         def _update_from_string(self, instance):
             self.cli.set_config()
             if instance.from_string:
@@ -1104,11 +1114,311 @@
             else:
                 result = self.cli.cmd('no system mail from',
                                   BlankParser(nonblank_exception=CLICmdError, supplement=True))
-            return 
+            return
+
+        def _perform_DeleteAll(self, options):
+            self.cli.set_config()
+            result = self.cli.cmd('clear system mail',
+                                  BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            mark_expire_all(self._model)
+            return result
+
+class AlertMail(ANModel):
+    host_string = CharField(verbose_name=_('Hostname'), length='0..128', default='', optional=True)
+    is_send_alert_msg = BooleanField(verbose_name=_('Is Send Alert Messages'), default=False, optional=True)
+
+    class Meta:
+        profile = True
+        verbose_name = _('Alert Mail Settings')
+
+    class Manager(CLIManager):
+        def _get_query_set(self):
+            self.cli.set_enable()
+            output = self.cli.cmd('show system mail',
+                                  RegexParser('system mail hostname "(?P<host_string>.*?)" (?P<is_send_alert_msg>\S+)', MATCHONE))
+            return QuerySet(self._model, [output])
+
+        def _update(self, instance):
+            self.cli.set_config()
+            if instance.host_string:
+                result = self.cli.cmd('system mail hostname "{host}" {ssl}'
+                                      .format(host=instance.host_string, ssl='1' if instance.is_send_alert_msg else '0'),
+                                  BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            else:
+                result = self.cli.cmd('no system mail hostname',
+                                  BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            return
+
+class ExternalMailServer(ANModel):
+    status = BooleanField(verbose_name=_('External Mail Server status'), default=False, optional=True)
+    server_address = CharField(verbose_name=_('Server Address'), length='1..64', default='', optional=True)
+    server_port = PortField(verbose_name=_('Server Port'), default=25, optional=True)
+    is_ssl = BooleanField(verbose_name=_('Use SSL/TLS'), default=False, optional=True)
+
+    class UpdateStatus(Action):
+        verbose_name = _('Update External Mail Server Status')
+        action_name = _('Update Status')
+        alert_msg = ""
+        process_title = ""
+        forever = False
+        config_change = True
+
+    class DeleteServer(Action):
+        verbose_name = _('Delete External Mail Server')
+        action_name = _('Delete')
+        btn_class = 'btn-danger slow-action'
+        alert_msg = ""
+        process_title = ""
+        forever = False
+        config_change = True
+
+    class Meta:
+        profile = True
+        verbose_name = _('External SNMP Mail Server')
+
+    class Manager(CLIManager):
+        def _get_query_set(self):
+            self.cli.set_enable()
+            output = self.cli.cmd('show system mail',
+                                  RegexParser('system mail external (?P<status>on|off)', MATCHONE),
+                                  RegexParser('system mail external server "(?P<server_address>.*?)" (?P<server_port>\d+) (?P<is_ssl>\d+)', MATCHONE))
+            result = {
+                'status': False,
+                'server_address': '',
+                'server_port': 25,
+                'is_ssl': False
+            }
+            if output[0]:
+                result['status'] = True if output[0]['status'] == 'on' else False
+            if len(output) > 1 and output[1]:
+                result['server_address'] = output[1]['server_address']
+                result['server_port'] = int(output[1]['server_port'])
+                result['is_ssl'] = True if output[1]['is_ssl'] == '1' else False
+            return QuerySet(self._model, [result])
+
+        def _update(self, instance):
+            self.cli.set_config()
+            if not instance.server_address.strip():
+                return cli_parse("server_address cannot be empty",
+                                    BlankParser(nonblank_exception=CLICmdError,
+                                                nonblank_msg=__('The External Mail Server address cannot be empty.')))
+            parse = instance.server_address.strip().split(':')
+            if not is_ipv4(parse[0]):
+                return cli_parse("server_address is invalid",
+                                    BlankParser(nonblank_exception=CLICmdError,
+                                                nonblank_msg=__('The External Mail Server address is invalid.')))
+            port = instance.server_port
+            if len(parse) == 2:
+                if int(parse[1]) > 0:
+                    port = int(parse[1])
+                else:
+                    return cli_parse("server_port is invalid",
+                                        BlankParser(nonblank_exception=CLICmdError,
+                                                    nonblank_msg=__('The External Mail Server Port is invalid.')))
+            result = self.cli.cmd('system mail external server "{address}" {port} {ssl}'
+                                    .format(address=parse[0],
+                                            port=port,
+                                            ssl='1' if instance.is_ssl else '0'),
+                                BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            return
+
+        def _perform_UpdateStatus(self, options):
+            self.cli.set_config()
+            if "value" not in options:
+                return cli_parse("status cannot be empty",
+                                     BlankParser(nonblank_exception=CLICmdError,
+                                                 nonblank_msg=__('The value cannot be empty.')))
+            status = "on" if options["value"] else "off"
+            result = self.cli.cmd('system mail external {status}'.format(status=status),
+                                  BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            mark_expire_all(self._model)
+            return result
+
+        def _perform_DeleteServer(self, options):
+            self.cli.set_config()
+            result = self.cli.cmd('no system mail external server',
+                                  BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            mark_expire_all(self._model)
+            return result
+
+class ExternalSenderMail(ANModel):
+    email = EmailField(verbose_name=_('Sender Email Address'), length='1..32', default='', optional=True)
+    password = PasswordField(verbose_name=_('Sender Email Password'), length='1..64', default='', optional=True)
+
+    class DeleteEmail(Action):
+        verbose_name = _('Delete External Sender Email')
+        action_name = _('Delete')
+        btn_class = 'btn-danger slow-action'
+        alert_msg = ""
+        process_title = ""
+        forever = False
+        config_change = True
+
+    class Meta:
+        profile = True
+        verbose_name = _('External SNMP Sender Mail')
+
+    class Manager(CLIManager):
+        def _get_query_set(self):
+            self.cli.set_enable()
+            output = self.cli.cmd('show system mail',
+                                  RegexParser('system mail external user "(?P<email>.*?)" "(?P<password>.*?)"', MATCHONE))
+            result = {
+                'email': '',
+                'password': '',
+            }
+            if output:
+                result['email'] = output['email']
+                result['password'] = "********" if output['password'] else ""
+            return QuerySet(self._model, [result])
+
+        def _update(self, instance):
+            self.cli.set_config()
+            if not instance.email.strip():
+                return cli_parse("email cannot be empty",
+                                    BlankParser(nonblank_exception=CLICmdError,
+                                                nonblank_msg=__('The External Sender email cannot be empty.')))
+            if not instance.password.strip():
+                return cli_parse("password cannot be empty",
+                                    BlankParser(nonblank_exception=CLICmdError,
+                                                nonblank_msg=__('The External Sender password cannot be empty.')))
+            result = self.cli.cmd('system mail external user "{email}" "{password}"'
+                                    .format(email=instance.email,
+                                            password=instance.password),
+                                BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            return
+
+        def _perform_DeleteEmail(self, options):
+            self.cli.set_config()
+            result = self.cli.cmd('no system mail external user',
+                                  BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            mark_expire_all(self._model)
+            return result
+
+class RelayServer(ANModel):
+    host_name = CharField(verbose_name=_('Domain name'), length='1..50', primary_key=True)
+    relay_server = CharField(verbose_name=_('IP or Hostname'), length='1..30')
+
+    class GetStatus(Action):
+        verbose_name = _('Get Relay Server Status')
+        action_name = _('Get Status')
+        alert_msg = ""
+        process_title = ""
+        forever = False
+        config_change = False
+
+    class UpdateStatus(Action):
+        verbose_name = _('Update Relay Server Status')
+        action_name = _('Update Status')
+        alert_msg = ""
+        process_title = ""
+        forever = False
+        config_change = True
+
+    class ClearServer(Action):
+        verbose_name = _('Clear Relay Server Configuration')
+        action_name = _('Clear')
+        btn_class = 'btn-danger slow-action'
+        alert_msg = ""
+        process_title = ""
+        forever = False
+        config_change = True
+
+    class DeleteHost(Action):
+        verbose_name = _('Delete Relay Server Domain Name')
+        action_name = _('Delete')
+        btn_class = 'btn-danger slow-action'
+        alert_msg = ""
+        process_title = ""
+        forever = False
+        config_change = True
+
+    class Meta:
+        verbose_name = _('Relay Server')
+
+    class Manager(CLIManager):
+        def _get_query_set(self):
+            self.cli.set_enable()
+            output = self.cli.cmd('show system relay',
+                                  RegexParser('(?P<hostname>\S+)(\s*)----->(\s*)(?P<server>\S+)', MATCHALL, reflags=re.M))
+            result = []
+            for each in output:
+                self._model._meta.mark_delay_query(each)
+                result.append({
+                    'host_name': each['hostname'],
+                    'relay_server': each['server']
+                })
+            return QuerySet(self._model, result)
+
+        def _insert(self, instance):
+            self.cli.set_config()
+            if not instance.host_name.strip():
+                return cli_parse("host_name cannot be empty",
+                                    BlankParser(nonblank_exception=CLICmdError,
+                                                nonblank_msg=__('The Relay Server Hostname cannot be empty.')))
+            if not instance.relay_server.strip():
+                return cli_parse("relay_server cannot be empty",
+                                    BlankParser(nonblank_exception=CLICmdError,
+                                                nonblank_msg=__('The Relay Server address cannot be empty.')))
+            if not is_ip_or_hostname(instance.relay_server.strip()):
+                return cli_parse("relay_server is invalid",
+                                    BlankParser(nonblank_exception=CLICmdError,
+                                                nonblank_msg=__('The Relay Server address is invalid.')))
+
+            result = self.cli.cmd('system mail relay server "{hostname}" "{server}"'
+                                    .format(hostname=instance.host_name.strip(),
+                                            server=instance.relay_server.strip()),
+                                BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            return
+
+        def _perform_GetStatus(self, options):
+            self.cli.set_enable()
+            output = self.cli.cmd('show system relay',
+                                  RegexParser('Mail relay module is (?P<status>on|off)', MATCHONE))
+            result = {
+                'status': False,
+            }
+            if output:
+                result['status'] = True if output['status'] == 'on' else False
+            return result
+
+        def _perform_UpdateStatus(self, options):
+            self.cli.set_config()
+            if "value" not in options:
+                return cli_parse("status cannot be empty",
+                                     BlankParser(nonblank_exception=CLICmdError,
+                                                 nonblank_msg=__('The value cannot be empty.')))
+            if options["value"] not in [True, False]:
+                return cli_parse("status is invalid",
+                                     BlankParser(nonblank_exception=CLICmdError,
+                                                 nonblank_msg=__('The value is invalid.')))
+            status = "on" if options["value"] else "off"
+            result = self.cli.cmd('system mail relay {status}'.format(status=status),
+                                  BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            mark_expire_all(self._model)
+            return result
+
+        def _perform_ClearServer(self, options):
+            self.cli.set_config()
+            result = self.cli.cmd('clear system relay',
+                                  BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            mark_expire_all(self._model)
+            return result
+
+        def _perform_DeleteHost(self, options):
+            self.cli.set_config()
+            if "hostname" not in options or not options["hostname"].strip():
+                return cli_parse("hostname cannot be empty",
+                                     BlankParser(nonblank_exception=CLICmdError,
+                                                 nonblank_msg=__('The hostname cannot be empty.')))
+            result = self.cli.cmd('no system mail relay server {host_name}'.format(host_name=options["hostname"].strip()),
+                                  BlankParser(nonblank_exception=CLICmdError, supplement=True), timeout=120)
+            mark_expire_all(self._model)
+            return result
 
 class SysMgmtInterfaceVLAN(ANModel):
     vlan_tag = CharField(verbose_name='VLAN Tag', default='', optional=True)
-    
+
     class Meta:
         profile = True
         verbose_name = 'Management Interface VLAN'
