2022-12-04 14:37:52 +08:00
|
|
|
package config
|
2022-12-04 13:37:14 +08:00
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"net/netip"
|
|
|
|
|
|
|
|
C "github.com/Dreamacro/clash/constant"
|
2022-12-06 09:04:30 +08:00
|
|
|
|
2022-12-04 13:37:14 +08:00
|
|
|
"gopkg.in/yaml.v3"
|
|
|
|
)
|
|
|
|
|
|
|
|
type ListenPrefix netip.Prefix
|
|
|
|
|
|
|
|
func (p ListenPrefix) MarshalJSON() ([]byte, error) {
|
|
|
|
prefix := netip.Prefix(p)
|
|
|
|
if !prefix.IsValid() {
|
|
|
|
return json.Marshal(nil)
|
|
|
|
}
|
|
|
|
return json.Marshal(prefix.String())
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p ListenPrefix) MarshalYAML() (interface{}, error) {
|
|
|
|
prefix := netip.Prefix(p)
|
|
|
|
if !prefix.IsValid() {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
return prefix.String(), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *ListenPrefix) UnmarshalJSON(bytes []byte) error {
|
|
|
|
var value string
|
|
|
|
err := json.Unmarshal(bytes, &value)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
prefix, err := netip.ParsePrefix(value)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
*p = ListenPrefix(prefix)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *ListenPrefix) UnmarshalYAML(node *yaml.Node) error {
|
|
|
|
var value string
|
|
|
|
err := node.Decode(&value)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
prefix, err := netip.ParsePrefix(value)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
*p = ListenPrefix(prefix)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p ListenPrefix) Build() netip.Prefix {
|
|
|
|
return netip.Prefix(p)
|
|
|
|
}
|
|
|
|
|
2022-12-05 17:43:50 +08:00
|
|
|
func StringSliceToListenPrefixSlice(ss []string) ([]ListenPrefix, error) {
|
|
|
|
lps := make([]ListenPrefix, 0, len(ss))
|
|
|
|
for _, s := range ss {
|
|
|
|
prefix, err := netip.ParsePrefix(s)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
lps = append(lps, ListenPrefix(prefix))
|
|
|
|
}
|
|
|
|
return lps, nil
|
|
|
|
}
|
|
|
|
|
2022-12-04 13:37:14 +08:00
|
|
|
type Tun struct {
|
2022-12-06 09:04:30 +08:00
|
|
|
Enable bool `yaml:"enable" json:"enable"`
|
|
|
|
Device string `yaml:"device" json:"device"`
|
|
|
|
Stack C.TUNStack `yaml:"stack" json:"stack"`
|
|
|
|
DNSHijack []string `yaml:"dns-hijack" json:"dns-hijack"`
|
|
|
|
AutoRoute bool `yaml:"auto-route" json:"auto-route"`
|
|
|
|
AutoDetectInterface bool `yaml:"auto-detect-interface" json:"auto-detect-interface"`
|
|
|
|
RedirectToTun []string `yaml:"-" json:"-"`
|
2022-12-04 13:37:14 +08:00
|
|
|
|
2022-12-06 09:04:30 +08:00
|
|
|
MTU uint32 `yaml:"mtu" json:"mtu,omitempty"`
|
|
|
|
Inet4Address []ListenPrefix `yaml:"inet4-address" json:"inet4-address,omitempty"`
|
|
|
|
Inet6Address []ListenPrefix `yaml:"inet6-address" json:"inet6-address,omitempty"`
|
|
|
|
StrictRoute bool `yaml:"strict-route" json:"strict-route,omitempty"`
|
|
|
|
Inet4RouteAddress []ListenPrefix `yaml:"inet4-route-address" json:"inet4-route-address,omitempty"`
|
|
|
|
Inet6RouteAddress []ListenPrefix `yaml:"inet6-route-address" json:"inet6-route-address,omitempty"`
|
|
|
|
IncludeUID []uint32 `yaml:"include-uid" json:"include-uid,omitempty"`
|
|
|
|
IncludeUIDRange []string `yaml:"include-uid-range" json:"include-uid-range,omitempty"`
|
|
|
|
ExcludeUID []uint32 `yaml:"exclude-uid" json:"exclude-uid,omitempty"`
|
|
|
|
ExcludeUIDRange []string `yaml:"exclude-uid-range" json:"exclude-uid-range,omitempty"`
|
|
|
|
IncludeAndroidUser []int `yaml:"include-android-user" json:"include-android-user,omitempty"`
|
|
|
|
IncludePackage []string `yaml:"include-package" json:"include-package,omitempty"`
|
|
|
|
ExcludePackage []string `yaml:"exclude-package" json:"exclude-package,omitempty"`
|
|
|
|
EndpointIndependentNat bool `yaml:"endpoint-independent-nat" json:"endpoint-independent-nat,omitempty"`
|
|
|
|
UDPTimeout int64 `yaml:"udp-timeout" json:"udp-timeout,omitempty"`
|
2023-03-15 23:43:58 +08:00
|
|
|
FileDescriptor int `yaml:"file-descriptor" json:"file-descriptor"`
|
2022-12-04 13:37:14 +08:00
|
|
|
}
|