+ },
+
+ handleCounterReset: function(has_ip6tables, ev) {
+ return Promise.all([
+ fs.exec('/usr/sbin/iptables', [ '-Z' ])
+ .catch(function(err) { ui.addNotification(null, E('p', {}, _('Unable to reset iptables counters: %s').format(err.message))) }),
+ has_ip6tables ? fs.exec('/usr/sbin/ip6tables', [ '-Z' ])
+ .catch(function(err) { ui.addNotification(null, E('p', {}, _('Unable to reset ip6tables counters: %s').format(err.message))) }) : null
+ ]);
+ },
+
+ handleRestart: function(ev) {
+ return fs.exec_direct('/etc/init.d/firewall', [ 'restart' ])
+ .catch(function(err) { ui.addNotification(null, E('p', {}, _('Unable to restart firewall: %s').format(err.message))) });
+ },
+
+ render: function(has_ip6tables) {
+ var view = E([], [
+ E('style', { 'type': 'text/css' }, [
+ '.cbi-tooltip-container, span.jump { border-bottom:1px dotted #00f;cursor:pointer }',
+ 'ul { list-style:none }',
+ '.references { position:relative }',
+ '.references .cbi-tooltip { left:0!important;top:1.5em!important }',
+ 'h4>span { font-size:90% }'
+ ]),
+
+ E('h2', {}, [ _('Firewall Status') ]),
+ E('div', { 'class': 'right', 'style': 'margin-bottom:-1.5em' }, [
+ E('button', {
+ 'class': 'cbi-button',
+ 'data-hide-empty': false,
+ 'click': ui.createHandlerFn(this, 'handleHideEmpty')
+ }, [ _('Hide empty chains') ]),
+ ' ',
+ E('button', {
+ 'class': 'cbi-button',
+ 'click': ui.createHandlerFn(this, 'handleCounterReset', has_ip6tables)
+ }, [ _('Reset Counters') ]),
+ ' ',
+ E('button', {
+ 'class': 'cbi-button',
+ 'click': ui.createHandlerFn(this, 'handleRestart')
+ }, [ _('Restart Firewall') ])
+ ]),
+ E('div', {}, [
+ E('div', { 'data-tab': 'iptables', 'data-tab-title': has_ip6tables ? _('IPv4 Firewall') : null }, [
+ E('p', {}, E('em', { 'class': 'spinning' }, [ _('Collecting data...') ]))
+ ]),
+ has_ip6tables ? E('div', { 'data-tab': 'ip6tables', 'data-tab-title': _('IPv6 Firewall') }, [
+ E('p', {}, E('em', { 'class': 'spinning' }, [ _('Collecting data...') ]))
+ ]) : E([])
+ ])
+ ]);
+
+ if (has_ip6tables)
+ ui.tabs.initTabGroup(view.lastElementChild.childNodes);
+
+ this.pollFirewallLists(has_ip6tables);
+
+ return view;
+ },
+
+ handleSaveApply: null,
+ handleSave: null,
+ handleReset: null