import $ from 'jquery'; import { JSONRPC } from '@/json-rpc.js'; const DNSMASQ_COMPONENT_NAME = 'ru.kirillius.pf.sdn.External.API.Components.DNSMASQ'; const FIELD_IDS = { container: 'dnsmasq-config-container', instancesList: 'dnsmasq-instances-list', addInstanceButton: 'dnsmasq-add-instance-btn', saveButton: 'save-dnsmasq-btn', status: 'dnsmasq-status-message' }; const CLASS_NAMES = { instance: 'dnsmasq-instance-entry', removeInstanceButton: 'dnsmasq-remove-instance-btn', host: 'dnsmasq-host', user: 'dnsmasq-user', password: 'dnsmasq-password', forwarder: 'dnsmasq-forwarder' }; const SELECTORS = { container: `#${FIELD_IDS.container}`, instancesList: `#${FIELD_IDS.instancesList}`, addInstanceButton: `#${FIELD_IDS.addInstanceButton}`, saveButton: `#${FIELD_IDS.saveButton}`, status: `#${FIELD_IDS.status}` }; let currentConfig = { instances: [] }; let statusTimeoutId = null; let instanceCounter = 0; const getStatusElement = () => $(SELECTORS.status); function normalizeConfig(config) { if (!config || !Array.isArray(config.instances)) { return { instances: [] }; } return { instances: config.instances.map(instance => ({ host: instance?.host || '127.0.0.1', user: instance?.user || '', password: instance?.password || '', forwarder: instance?.forwarder || '127.0.0.1' })) }; } function clearStatus() { const $status = getStatusElement(); if (!$status.length) { return; } if (statusTimeoutId) { clearTimeout(statusTimeoutId); statusTimeoutId = null; } $status.stop(true, true).hide().text('').removeClass('success-message error-message'); } function updateStatus(message, type) { const $status = getStatusElement(); if (!$status.length) { return; } if (statusTimeoutId) { clearTimeout(statusTimeoutId); } $status .removeClass('success-message error-message') .addClass(type === 'success' ? 'success-message' : 'error-message') .text(message) .show(); statusTimeoutId = window.setTimeout(() => { $status.fadeOut(); }, 5000); } async function runAction($button, pendingText, action, messages) { if (!$button.length) { return; } const originalText = $button.text(); $button.prop('disabled', true).text(pendingText); clearStatus(); try { const result = await action(); if (messages?.success) { const successMessage = typeof messages.success === 'function' ? messages.success(result) : messages.success; if (successMessage) { updateStatus(successMessage, 'success'); } } } catch (error) { console.error(messages?.log || 'Ошибка выполнения действия DNSMASQ:', error); if (messages?.error) { updateStatus(messages.error, 'error'); } } finally { $button.prop('disabled', false).text(originalText); } } function resetCounters() { instanceCounter = 0; } function getNextInstanceId() { instanceCounter += 1; return instanceCounter; } function createInstanceRow(instance = {}) { const instanceId = getNextInstanceId(); return `
Настройте параметры подключения к DNSMASQ для синхронизации списков серверов. Можно добавить несколько инстансов.
Загрузка конфигурации...