export const ntpSchema = { id: 'ntp', name: 'NTP', icon: 'Timer', category: '系统服务', description: 'NTP 网络时间协议服务配置', format: 'conf', fileName: 'ntp.conf', groups: [ { title: '时间服务器', fields: [ { key: 'server', label: 'NTP 服务器', type: 'text', default: 'pool.ntp.org', tip: '主 NTP 服务器地址', }, { key: 'server2', label: '备用 NTP 服务器', type: 'text', default: 'cn.ntp.org.cn', tip: '备用 NTP 服务器地址', }, ], }, { title: '访问控制', fields: [ { key: 'restrict', label: 'IPv4 访问限制', type: 'text', default: '-4 default kod notrap nomodify nopeer noquery limited', tip: 'IPv4 默认访问控制规则', }, { key: 'restrict6', label: 'IPv6 访问限制', type: 'text', default: '-6 default kod notrap nomodify nopeer noquery limited', tip: 'IPv6 默认访问控制规则', }, ], }, { title: '文件路径', fields: [ { key: 'driftfile', label: '漂移文件路径', type: 'text', default: '/var/lib/ntp/drift', tip: '频率补偿文件路径', }, { key: 'logfile', label: '日志文件路径', type: 'text', default: '/var/log/ntp.log', tip: 'NTP 日志文件路径', }, ], }, { title: '认证配置', fields: [ { key: 'enableAuth', label: '启用认证', type: 'switch', default: false, tip: '启用 NTP 认证机制', }, { key: 'keysFile', label: '密钥文件路径', type: 'text', default: '/etc/ntp/keys', dependsOn: { key: 'enableAuth', value: true }, tip: 'NTP 认证密钥文件', }, ], }, { title: '性能调优', fields: [ { key: 'tinkerPanic', label: 'Tinker Panic 阈值', type: 'number', min: 0, max: 1000, default: 0, tip: '0=永不 panic,超过此秒数偏移将 panic', }, { key: 'burst', label: '启用 Burst 模式', type: 'switch', default: false, tip: '在网络正常时发送一批请求以提高精度', }, { key: 'minpoll', label: '最小轮询间隔 (2^n 秒)', type: 'number', min: 3, max: 17, default: 6, tip: '最小轮询间隔指数,3=8秒', }, { key: 'maxpoll', label: '最大轮询间隔 (2^n 秒)', type: 'number', min: 3, max: 17, default: 10, tip: '最大轮询间隔指数,10=1024秒', }, ], }, ], } export function generateNtpConf(config) { const lines = [] lines.push(`# NTP 配置文件 - 由 ConfTemplate 生成`) lines.push(`# 生成时间: ${new Date().toLocaleString('zh-CN')}`) lines.push(``) // Time servers lines.push(`# ======================== 时间服务器 ========================`) lines.push(`server ${config.server} iburst minpoll ${config.minpoll} maxpoll ${config.maxpoll}`) lines.push(`server ${config.server2} iburst minpoll ${config.minpoll} maxpoll ${config.maxpoll}`) lines.push(``) // Access control lines.push(`# ======================== 访问控制 ========================`) lines.push(`restrict ${config.restrict}`) lines.push(`restrict ${config.restrict6}`) lines.push(`restrict 127.0.0.1`) lines.push(`restrict ::1`) lines.push(``) // File paths lines.push(`# ======================== 文件路径 ========================`) lines.push(`driftfile ${config.driftfile}`) lines.push(`logfile ${config.logfile}`) lines.push(``) // Authentication if (config.enableAuth) { lines.push(`# ======================== 认证配置 ========================`) lines.push(`enable auth`) lines.push(`keys ${config.keysFile}`) lines.push(``) } // Performance lines.push(`# ======================== 性能调优 ========================`) if (config.tinkerPanic > 0) { lines.push(`tinker panic ${config.tinkerPanic}`) } else { lines.push(`tinker panic 0`) } if (config.burst) { lines.push(`burst`) } lines.push(``) // Leap second lines.push(`# ======================== 其他 ========================`) lines.push(`# 闰秒文件(如需要)`) lines.push(`# leapfile /usr/share/zoneinfo/leap-seconds.list`) return lines.join('\n') }