/* * Copyright (C) 2020-2022, IrineSistiana * * This file is part of mosdns. * * mosdns is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * mosdns is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package mikrotik_addresslist import ( "fmt" "strconv" "strings" "github.com/IrineSistiana/mosdns/v5/coremain" "github.com/IrineSistiana/mosdns/v5/plugin/executable/sequence" ) const PluginType = "mikrotik_addresslist" func init() { coremain.RegNewPluginFunc(PluginType, Init, func() any { return new(Args) }) sequence.MustRegExecQuickSetup(PluginType, QuickSetup) } type Args struct { Host string `yaml:"host"` // MikroTik 路由器 IP 地址 Port int `yaml:"port"` // API 端口,默认 8728 Username string `yaml:"username"` // 用户名 Password string `yaml:"password"` // 密码 UseTLS bool `yaml:"use_tls"` // 是否使用 TLS,默认 false Timeout int `yaml:"timeout"` // 连接超时时间(秒),默认 10 AddressList4 string `yaml:"address_list4"` // IPv4 address list 名称 AddressList6 string `yaml:"address_list6"` // IPv6 address list 名称 Mask4 int `yaml:"mask4"` // IPv4 掩码,默认 32(单个IP) Mask6 int `yaml:"mask6"` // IPv6 掩码,默认 128(单个IP) Comment string `yaml:"comment"` // 添加的地址的注释 TimeoutAddr int `yaml:"timeout_addr"` // 地址超时时间(秒),0 表示永久 CacheTTL int `yaml:"cache_ttl"` // 缓存 TTL(秒),默认 3600(1小时) VerifyAdd bool `yaml:"verify_add"` // 是否在添加后验证地址确实存在,默认 false AddAllIPs bool `yaml:"add_all_ips"` // 是否添加DNS响应中的所有IP地址,默认 true MaxIPs int `yaml:"max_ips"` // 每个域名最多添加的IP数量,0表示无限制,默认 0 } var _ sequence.Executable = (*mikrotikAddressListPlugin)(nil) // Init initializes the plugin from coremain func Init(bp *coremain.BP, args any) (any, error) { return newMikrotikAddressListPlugin(args.(*Args)) } // QuickSetup format: host:port:username:password:use_tls:timeout:address_list4:address_list6:mask4:mask6:comment:timeout_addr:cache_ttl:verify_add // e.g. "192.168.1.1:8728:admin:password:false:10:my_list4:my_list6:24:32:from_dns:3600:3600:true" func QuickSetup(_ sequence.BQ, s string) (any, error) { parts := strings.Split(s, ":") if len(parts) < 6 { return nil, fmt.Errorf("invalid args, expect at least 6 parts, got %d", len(parts)) } args := &Args{ Host: parts[0], Username: parts[2], Password: parts[3], UseTLS: false, Timeout: 10, Mask4: 32, // 默认单个IP,确保所有IP都被添加 Mask6: 128, // 默认单个IP,确保所有IP都被添加 AddAllIPs: true, // 默认添加所有IP MaxIPs: 0, // 默认无限制 } // 解析端口 if port, err := strconv.Atoi(parts[1]); err == nil { args.Port = port } else { args.Port = 8728 } // 解析 TLS 设置 if len(parts) > 4 { if useTLS, err := strconv.ParseBool(parts[4]); err == nil { args.UseTLS = useTLS } } // 解析超时时间 if len(parts) > 5 { if timeout, err := strconv.Atoi(parts[5]); err == nil { args.Timeout = timeout } } // 解析 address list 名称 if len(parts) > 6 { args.AddressList4 = parts[6] } if len(parts) > 7 { args.AddressList6 = parts[7] } // 解析掩码 if len(parts) > 8 { if mask4, err := strconv.Atoi(parts[8]); err == nil { args.Mask4 = mask4 } } if len(parts) > 9 { if mask6, err := strconv.Atoi(parts[9]); err == nil { args.Mask6 = mask6 } } // 解析注释 if len(parts) > 10 { args.Comment = parts[10] } // 解析地址超时时间 if len(parts) > 11 { if timeoutAddr, err := strconv.Atoi(parts[11]); err == nil { args.TimeoutAddr = timeoutAddr } } // 解析缓存 TTL if len(parts) > 12 { if cacheTTL, err := strconv.Atoi(parts[12]); err == nil { args.CacheTTL = cacheTTL } } // 解析验证开关 if len(parts) > 13 { if verifyAdd, err := strconv.ParseBool(parts[13]); err == nil { args.VerifyAdd = verifyAdd } } return newMikrotikAddressListPlugin(args) }