/* Copyright (C) 2021-2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-ddns-go */ 'use strict'; 'require view'; 'require fs'; 'require ui'; 'require uci'; 'require form'; 'require poll'; function checkProcess() { return fs.exec('/bin/pidof', ['ddns-go']).then(function(res) { return { running: res.code === 0, pid: res.code === 0 ? res.stdout.trim() : null }; }).catch(function() { return { running: false, pid: null }; }); } function renderStatus(isRunning, listen_port, noweb) { var statusText = isRunning ? _('RUNNING') : _('NOT RUNNING'); var color = isRunning ? 'green' : 'red'; var icon = isRunning ? '✓' : '✗'; var html = String.format( '%s %s %s', color, icon, _('DDNS-Go'), statusText ); if (isRunning && res.pid) { html += ' (PID: ' + res.pid + ')'; } if (isRunning && noweb !== '1') { html += String.format( ' %s', window.location.origin, listen_port, _('Open Web Interface') ); } return html; } return view.extend({ load: function() { return Promise.all([ uci.load('ddns-go') ]); }, render: function(data) { var m, s, o; var listen_port = (uci.get(data[0], 'basic', 'port') || '[::]:9876').split(':').slice(-1)[0]; var noweb = uci.get(data[0], 'basic', 'noweb') || '0'; m = new form.Map('ddns-go', _('DDNS-GO'), _('DDNS-GO automatically obtains your public IPv4 or IPv6 address and resolves it to the corresponding domain name service.')); // 状态显示部分 s = m.section(form.TypedSection); s.anonymous = true; s.render = function() { var statusView = E('p', { id: 'control_status' }, ' ' + _('Checking status...')); var pollInterval = poll.add(function() { return checkProcess() .then(function(res) { statusView.innerHTML = renderStatus(res.running, listen_port, noweb); }) .catch(function(err) { console.error('Status check failed:', err); statusView.innerHTML = '⚠ ' + _('Status check error') + ''; }); }, 5); // 每5秒检查一次 return E('div', { class: 'cbi-section', id: 'status_bar' }, [ statusView, E('div', { 'style': 'text-align: right; font-style: italic;' }, [ E('span', {}, [ _('© github '), E('a', { 'href': 'https://github.com/sirpdboy', 'target': '_blank', 'style': 'text-decoration: none;' }, 'by sirpdboy') ]) ]) ]); } s = m.section(form.NamedSection, 'config', 'basic'); o = s.option(form.Flag, 'enabled', _('Enable')); o.default = o.disabled; o.rmempty = false; o = s.option(form.Value, 'port', _('Listen port')); o.default = '[::]:9876'; o.rmempty = false; o = s.option(form.Value, 'time', _('Update interval')); o.default = '300'; o = s.option(form.Value, 'ctimes', _('Compare with service provider N times intervals')); o.default = '5'; o = s.option(form.Value, 'skipverify', _('Skip verifying certificates')); o.default = '0'; o = s.option(form.Value, 'dns', _('Specify DNS resolution server')); o.value('223.5.5.5', _('Ali DNS 223.5.5.5')); o.value('223.6.6.6', _('Ali DNS 223.6.6.6')); o.value('119.29.29.29', _('Tencent DNS 119.29.29.29')); o.value('1.1.1.1', _('CloudFlare DNS 1.1.1.1')); o.value('8.8.8.8', _('Google DNS 8.8.8.8')); o.value('8.8.4.4', _('Google DNS 8.8.4.4')); o.datatype = 'ipaddr'; o = s.option(form.Flag, 'noweb', _('Do not start web services')); o.default = '0'; o = s.option(form.Value, 'delay', _('Delayed Start (seconds)')); o.default = '60'; return m.render(); } });