83 lines
3.4 KiB
Go
83 lines
3.4 KiB
Go
// Package automation implements the `ssm:` automation block that can be
|
|
// added to core-config.yaml, letting users declaratively:
|
|
//
|
|
// 1. build a new proxy-group from proxies matching a subscription/keyword
|
|
// filter ("proxy-groups"),
|
|
// 2. build a new proxy-group from proxies whose name encodes a rate/
|
|
// multiplier extracted via regexp, filtered by a comparator
|
|
// ("rate-filters"), and
|
|
// 3. append/prepend/replace an arbitrary path in the generated config
|
|
// ("patches").
|
|
//
|
|
// The `ssm:` key itself is metadata for this tool, not a real mihomo/clash
|
|
// config key, so it's always stripped out of the generated config before
|
|
// writing (see internal/corecfg.Apply).
|
|
package automation
|
|
|
|
// ProxyRef describes a single proxy in the pool merged from every active
|
|
// subscription.
|
|
type ProxyRef struct {
|
|
// OriginalName is the proxy's name as it appeared in its subscription,
|
|
// before subscription-name prefixing. Keyword and rate-pattern matching
|
|
// both operate on this.
|
|
OriginalName string
|
|
// DisplayName is OriginalName prefixed with its source subscription's
|
|
// name (e.g. "home-sub | HK 01"), which is what actually appears in the
|
|
// generated config's proxies list and must be used when referencing
|
|
// this proxy from a built proxy-group.
|
|
DisplayName string
|
|
// Subscription is the name of the subscription this proxy came from.
|
|
Subscription string
|
|
}
|
|
|
|
// MatchRule narrows which proxies a proxy-groups/rate-filters rule
|
|
// considers. Both fields are optional; an empty/omitted field imposes no
|
|
// restriction on that dimension. Multiple entries within a field are OR'd
|
|
// together.
|
|
type MatchRule struct {
|
|
Subscriptions []string `yaml:"subscriptions"`
|
|
NameContains []string `yaml:"name-contains"`
|
|
}
|
|
|
|
// ProxyGroupRule defines a new proxy-group built from every proxy matching
|
|
// Match. Any YAML fields beyond name/type/match (e.g. url, interval,
|
|
// tolerance) are passed through verbatim onto the generated proxy-group.
|
|
type ProxyGroupRule struct {
|
|
Name string `yaml:"name"`
|
|
Type string `yaml:"type"`
|
|
Match MatchRule `yaml:"match"`
|
|
Extra map[string]interface{} `yaml:",inline"`
|
|
}
|
|
|
|
// RateFilterRule defines a new proxy-group built from proxies whose
|
|
// (pre-prefix) name matches Pattern — a regexp whose first capture group is
|
|
// parsed as a float rate — and whose rate satisfies "rate Operator Value".
|
|
// Proxies whose name doesn't match Pattern at all are excluded. Any YAML
|
|
// fields beyond the recognized ones are passed through onto the generated
|
|
// proxy-group, same as ProxyGroupRule.
|
|
type RateFilterRule struct {
|
|
Name string `yaml:"name"`
|
|
Type string `yaml:"type"`
|
|
Pattern string `yaml:"pattern"`
|
|
Operator string `yaml:"operator"`
|
|
Value float64 `yaml:"value"`
|
|
Match MatchRule `yaml:"match"`
|
|
Extra map[string]interface{} `yaml:",inline"`
|
|
}
|
|
|
|
// PatchRule appends/prepends/replaces Value at Path (a dot/bracket path
|
|
// like "dns.nameserver" or "proxy-groups[0].proxies") in the generated
|
|
// config.
|
|
type PatchRule struct {
|
|
Path string `yaml:"path"`
|
|
Op string `yaml:"op"`
|
|
Value interface{} `yaml:"value"`
|
|
}
|
|
|
|
// Config is the full `ssm:` automation block parsed from core-config.yaml.
|
|
type Config struct {
|
|
ProxyGroups []ProxyGroupRule `yaml:"proxy-groups"`
|
|
RateFilters []RateFilterRule `yaml:"rate-filters"`
|
|
Patches []PatchRule `yaml:"patches"`
|
|
}
|