Documentation
¶
Overview ¶
Package distro provides distribution-specific definitions and caching rules for apt-proxy. This package contains constants, types, and configurations for supported Linux distributions (Ubuntu, Debian, CentOS, Alpine).
Package distro provides distribution configuration loading from external files ¶
Package distro provides distribution registry for dynamic distribution management.
The Registry is a per-Server value type. Construct one with NewRegistry followed by RegisterBuiltins (or LoadFromConfig / Reload for runtime configuration). There is no package-level singleton; multiple Servers in the same process can hold independent registries.
Index ¶
- Constants
- Variables
- func DistributionName(distType int) string
- func GenerateAliasFromURL(url string) string
- func RegisterBuiltins(reg *Registry)
- type CacheRuleConfig
- type DistributionConfig
- type DistributionsConfig
- type Loader
- type MirrorListConfig
- type RegisteredDistribution
- type Registry
- func (r *Registry) Clear()
- func (r *Registry) GetAll() map[string]*RegisteredDistribution
- func (r *Registry) GetByID(id string) (*RegisteredDistribution, bool)
- func (r *Registry) GetByType(distType int) (*RegisteredDistribution, bool)
- func (r *Registry) HostPatternMap() map[*regexp.Regexp][]Rule
- func (r *Registry) LoadFromConfig(config *DistributionConfig) error
- func (r *Registry) Register(dist *RegisteredDistribution) error
- func (r *Registry) Reload(configPath string) error
- func (r *Registry) Unregister(id string) error
- type Rule
- type URLWithAlias
- func GenerateBuildInList(officialList []string, customList []string) []URLWithAliasdeprecated
- func GenerateBuildInMirorItem(url string, official bool) URLWithAliasdeprecated
- func GenerateBuiltinList(officialList []string, customList []string) (mirrors []URLWithAlias)
- func GenerateBuiltinMirrorItem(url string, official bool) URLWithAlias
Constants ¶
const ( DistroAll string = "all" DistroUbuntu string = "ubuntu" DistroUbuntuPorts string = "ubuntu-ports" DistroDebian string = "debian" DistroCentOS string = "centos" DistroAlpine string = "alpine" )
Distribution name constants
const ( TypeAllDistros int = 0 TypeUbuntu int = 1 TypeUbuntuPorts int = 2 TypeDebian int = 3 TypeCentOS int = 4 TypeAlpine int = 5 )
Distribution type constants
const ( UbuntuPortsGeoMirrorAPI = "http://mirrors.ubuntu.com/mirrors.txt" // Ubuntu Ports targets non-amd64 architectures. The previous // `dists/noble/InRelease/Release` value pointed to a path that does not // exist (InRelease is a file, not a directory) and made every benchmark // 404. Use the arm64 Release file which mirrors universally publish. UbuntuPortsBenchmarkURL = "dists/noble/main/binary-arm64/Release" )
const ( UbuntuGeoMirrorAPI = "http://mirrors.ubuntu.com/mirrors.txt" UbuntuBenchmarkURL = "dists/noble/main/binary-amd64/Release" )
const AlpineBenchmarkURL = "MIRRORS.txt"
const CentosBenchmarkURL = "TIME"
const (
DebianBenchmarkURL = "dists/bullseye/main/binary-amd64/Release"
)
Variables ¶
var AlpineCustomMirrors = []string{}
var AlpineDefaultCacheRules = []Rule{ {Pattern: regexp.MustCompile(`APKINDEX.tar.gz$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TypeAlpine}, {Pattern: regexp.MustCompile(`tar.gz$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TypeAlpine}, {Pattern: regexp.MustCompile(`apk$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TypeAlpine}, {Pattern: regexp.MustCompile(`.*`), CacheControl: `max-age=100000`, Rewrite: true, OS: TypeAlpine}, }
var AlpineHostPattern = regexp.MustCompile(`/alpine/(.+)$`)
var AlpineOfficialMirrors = []string{
"mirrors.tuna.tsinghua.edu.cn/alpine/",
"mirrors.ustc.edu.cn/alpine/",
"mirrors.nju.edu.cn/alpine/",
"mirrors.sjtug.sjtu.edu.cn/alpine/",
"mirrors.aliyun.com/alpine/",
}
https://mirrors.alpinelinux.org/ 2022.11.19 Sites that contain protocol headers, restrict access to resources using that protocol
var BuiltinAlpineMirrors = GenerateBuildInList(AlpineOfficialMirrors, AlpineCustomMirrors)
var BuiltinCentosMirrors = GenerateBuildInList(CentosOfficialMirrors, CentosCustomMirrors)
var BuiltinDebianMirrors = GenerateBuildInList(DebianOfficialMirrors, DebianCustomMirrors)
var BuiltinUbuntuMirrors = GenerateBuildInList(UbuntuOfficialMirrors, UbuntuCustomMirrors)
var BuiltinUbuntuPortsMirrors = GenerateBuildInList(UbuntuPortsOfficialMirrors, UbuntuPortsCustomMirrors)
var CentosCustomMirrors = []string{
"mirrors.aliyun.com/centos/",
}
var CentosDefaultCacheRules = []Rule{ {Pattern: regexp.MustCompile(`repomd.xml$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TypeCentOS}, {Pattern: regexp.MustCompile(`filelist.gz$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TypeCentOS}, {Pattern: regexp.MustCompile(`dir_sizes$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TypeCentOS}, {Pattern: regexp.MustCompile(`TIME$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TypeCentOS}, {Pattern: regexp.MustCompile(`timestamp.txt$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TypeCentOS}, {Pattern: regexp.MustCompile(`.*`), CacheControl: `max-age=100000`, Rewrite: true, OS: TypeCentOS}, }
var CentosHostPattern = regexp.MustCompile(`/centos/(.+)$`)
var CentosOfficialMirrors = []string{
"mirrors.bfsu.edu.cn/centos/",
"mirrors.cqu.edu.cn/CentOS/",
"http://mirrors.neusoft.edu.cn/centos/",
"mirrors.nju.edu.cn/centos/",
"mirrors.huaweicloud.com/centos/",
"mirror.lzu.edu.cn/centos/",
"http://mirrors.njupt.edu.cn/centos/",
"mirrors.163.com/centos/",
"mirrors.bupt.edu.cn/centos/",
"ftp.sjtu.edu.cn/centos/",
"mirrors.tuna.tsinghua.edu.cn/centos/",
"mirrors.ustc.edu.cn/centos/",
}
https://www.centos.org/download/mirrors/ 2022.11.19 Sites that contain protocol headers, restrict access to resources using that protocol
var DebianCustomMirrors = []string{
"repo.huaweicloud.com/debian/",
"mirrors.cloud.tencent.com/debian/",
"mirrors.hit.edu.cn/debian/",
"mirrors.aliyun.com/debian/",
"mirror.lzu.edu.cn/debian/",
"mirror.nju.edu.cn/debian/",
}
var DebianDefaultCacheRules = newDebStyleRules(TypeDebian)
var DebianHostPattern = regexp.MustCompile(`/debian(-security)?/(.+)$`)
var DebianOfficialMirrors = []string{
"http://ftp.cn.debian.org/debian/",
"mirror.bjtu.edu.cn/debian/",
"mirrors.163.com/debian/",
"mirrors.bfsu.edu.cn/debian/",
"mirrors.huaweicloud.com/debian/",
"http://mirrors.neusoft.edu.cn/debian/",
"mirrors.tuna.tsinghua.edu.cn/debian/",
"mirrors.ustc.edu.cn/debian/",
}
https://www.debian.org/mirror/list 2022.11.19 Sites that contain protocol headers, restrict access to resources using that protocol
var UbuntuCustomMirrors = []string{
"mirrors.163.com/ubuntu/",
}
var UbuntuDefaultCacheRules = newDebStyleRules(TypeUbuntu)
var UbuntuHostPattern = regexp.MustCompile(`/ubuntu/(.+)$`)
var UbuntuOfficialMirrors = []string{
"mirrors.cn99.com/ubuntu/",
"mirrors.tuna.tsinghua.edu.cn/ubuntu/",
"mirrors.cnnic.cn/ubuntu/",
"mirror.bjtu.edu.cn/ubuntu/",
"mirrors.cqu.edu.cn/ubuntu/",
"http://mirrors.skyshe.cn/ubuntu/",
"mirrors.yun-idc.com/ubuntu/",
"http://mirror.dlut.edu.cn/ubuntu/",
"mirrors.xjtu.edu.cn/ubuntu/",
"mirrors.huaweicloud.com/repository/ubuntu/",
"mirrors.bupt.edu.cn/ubuntu/",
"mirrors.hit.edu.cn/ubuntu/",
"http://mirrors.sohu.com/ubuntu/",
"mirror.nju.edu.cn/ubuntu/",
"mirrors.bfsu.edu.cn/ubuntu/",
"mirror.lzu.edu.cn/ubuntu/",
"mirrors.aliyun.com/ubuntu/",
"ftp.sjtu.edu.cn/ubuntu/",
"mirrors.njupt.edu.cn/ubuntu/",
"mirrors.cloud.tencent.com/ubuntu/",
"http://mirrors.dgut.edu.cn/ubuntu/",
"mirrors.ustc.edu.cn/ubuntu/",
"mirrors.sdu.edu.cn/ubuntu/",
"http://cn.archive.ubuntu.com/ubuntu/",
}
http://mirrors.ubuntu.com/mirrors.txt 2022.11.19 Sites that contain protocol headers, restrict access to resources using that protocol
var UbuntuPortsCustomMirrors = []string{
"mirrors.163.com/ubuntu-ports/",
}
var UbuntuPortsDefaultCacheRules = newDebStyleRules(TypeUbuntuPorts)
var UbuntuPortsHostPattern = regexp.MustCompile(`/ubuntu-ports/(.+)$`)
var UbuntuPortsOfficialMirrors = []string{
"mirrors.cn99.com/ubuntu-ports/",
"mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/",
"mirrors.cnnic.cn/ubuntu-ports/",
"mirror.bjtu.edu.cn/ubuntu-ports/",
"mirrors.cqu.edu.cn/ubuntu-ports/",
"http://mirrors.skyshe.cn/ubuntu-ports/",
"mirrors.yun-idc.com/ubuntu-ports/",
"http://mirror.dlut.edu.cn/ubuntu-ports/",
"mirrors.xjtu.edu.cn/ubuntu-ports/",
"mirrors.huaweicloud.com/repository/ubuntu-ports/",
"mirrors.bupt.edu.cn/ubuntu-ports/",
"mirrors.hit.edu.cn/ubuntu-ports/",
"http://mirrors.sohu.com/ubuntu-ports/",
"mirror.nju.edu.cn/ubuntu-ports/",
"mirrors.bfsu.edu.cn/ubuntu-ports/",
"mirror.lzu.edu.cn/ubuntu-ports/",
"mirrors.aliyun.com/ubuntu-ports/",
"ftp.sjtu.edu.cn/ubuntu-ports/",
"mirrors.njupt.edu.cn/ubuntu-ports/",
"mirrors.cloud.tencent.com/ubuntu-ports/",
"http://mirrors.dgut.edu.cn/ubuntu-ports/",
"mirrors.ustc.edu.cn/ubuntu-ports/",
"mirrors.sdu.edu.cn/ubuntu-ports/",
"http://cn.archive.ubuntu.com/ubuntu-ports/",
}
http://mirrors.ubuntu.com/mirrors.txt 2022.11.19 Sites that contain protocol headers, restrict access to resources using that protocol
Functions ¶
func DistributionName ¶
DistributionName returns the distribution ID string for the given type. Returns empty string for unknown types.
func GenerateAliasFromURL ¶
GenerateAliasFromURL generates an alias from a URL
func RegisterBuiltins ¶ added in v0.12.0
func RegisterBuiltins(reg *Registry)
RegisterBuiltins seeds reg with the compile-time built-in distributions.
Built-in entries are guaranteed to satisfy Register's invariants (non-empty ID, non-zero Type, no conflicts on a freshly-cleared registry), so any error here would indicate a programmer mistake. We surface it via panic during initialization rather than silently dropping registrations.
Types ¶
type CacheRuleConfig ¶
type CacheRuleConfig struct {
Pattern string `yaml:"pattern"`
CacheControl string `yaml:"cache_control"`
Rewrite bool `yaml:"rewrite"`
}
CacheRuleConfig represents a cache rule configuration
type DistributionConfig ¶
type DistributionConfig struct {
ID string `yaml:"id"`
Name string `yaml:"name"`
Type int `yaml:"type"`
URLPattern string `yaml:"url_pattern"`
BenchmarkURL string `yaml:"benchmark_url"`
GeoMirrorAPI string `yaml:"geo_mirror_api,omitempty"`
CacheRules []CacheRuleConfig `yaml:"cache_rules"`
Mirrors MirrorListConfig `yaml:"mirrors"`
Aliases map[string]string `yaml:"aliases,omitempty"`
}
DistributionConfig represents a distribution configuration loaded from YAML
type DistributionsConfig ¶
type DistributionsConfig struct {
Distributions []DistributionConfig `yaml:"distributions"`
}
DistributionsConfig represents the root configuration structure
type Loader ¶
type Loader struct {
// contains filtered or unexported fields
}
Loader handles loading distribution configurations
func (*Loader) GetConfig ¶
func (l *Loader) GetConfig() *DistributionsConfig
GetConfig returns the loaded configuration
func (*Loader) Load ¶
func (l *Loader) Load() (*DistributionsConfig, error)
Load loads distribution configurations from the configured file
func (*Loader) Reload ¶
func (l *Loader) Reload() (*DistributionsConfig, error)
Reload reloads the configuration from file
type MirrorListConfig ¶
type MirrorListConfig struct {
Official []string `yaml:"official"`
Custom []string `yaml:"custom"`
}
MirrorListConfig represents mirror list configuration
type RegisteredDistribution ¶
type RegisteredDistribution struct {
ID string
Name string
Type int
URLPattern *regexp.Regexp
BenchmarkURL string
GeoMirrorAPI string
CacheRules []Rule
Mirrors []URLWithAlias
Aliases map[string]string
}
RegisteredDistribution represents a registered distribution with its configuration.
type Registry ¶
type Registry struct {
// contains filtered or unexported fields
}
Registry manages distribution registrations for a single Server.
func NewBuiltinRegistry ¶ added in v0.12.0
func NewBuiltinRegistry() *Registry
NewBuiltinRegistry returns a registry pre-populated with the compile-time built-in distributions.
func NewRegistry ¶
func NewRegistry() *Registry
NewRegistry creates an empty registry. Call RegisterBuiltins to seed the built-in distributions, or use NewBuiltinRegistry as a one-step constructor.
func (*Registry) Clear ¶
func (r *Registry) Clear()
Clear removes all distributions from the registry.
func (*Registry) GetAll ¶
func (r *Registry) GetAll() map[string]*RegisteredDistribution
GetAll returns all registered distributions.
The returned map and each value are independent of the registry's internal state: the map is fresh, the *RegisteredDistribution structs are shallow copies, and the Mirrors / CacheRules / Aliases collections are duplicated at the top level. Callers may safely append to / mutate the headers of those collections without affecting concurrent registry reads.
Element-level data (URLWithAlias, Rule, *regexp.Regexp) is shared by reference; we treat those as immutable once registered, which is true for every code path today (registration always builds fresh values).
func (*Registry) GetByID ¶
func (r *Registry) GetByID(id string) (*RegisteredDistribution, bool)
GetByID returns a distribution by its ID.
func (*Registry) GetByType ¶
func (r *Registry) GetByType(distType int) (*RegisteredDistribution, bool)
GetByType returns a distribution by its type.
func (*Registry) HostPatternMap ¶ added in v0.12.0
HostPatternMap returns a map from URL pattern regex to cache rules for all distributions in r. Used by the proxy to match incoming requests and apply the matching cache rules.
func (*Registry) LoadFromConfig ¶
func (r *Registry) LoadFromConfig(config *DistributionConfig) error
LoadFromConfig loads a single DistributionConfig and registers it on r.
func (*Registry) Register ¶
func (r *Registry) Register(dist *RegisteredDistribution) error
Register registers a distribution in the registry.
func (*Registry) Reload ¶ added in v0.12.0
Reload resets r to the built-in distributions, then loads any distributions from configPath. When configPath is empty, the default search paths inside Loader.Load are used.
Errors loading or registering individual distributions are returned (joined) so callers can surface them to operators. The registry is only mutated after a successful YAML load: a parse/regex error preserves the previous registry state. Per-entry Register failures are accumulated but do not roll back previously-applied entries (which would require a deep clone of the registry); built-in entries are always reapplied first.
Safe to call at startup and on SIGHUP/API reload.
func (*Registry) Unregister ¶
Unregister removes a distribution from the registry.
type URLWithAlias ¶ added in v0.10.0
URLWithAlias represents a mirror URL with its alias and metadata. Scheme is "http", "https", or "" (unknown / let downstream pick the default).
func GenerateBuildInList
deprecated
func GenerateBuildInList(officialList []string, customList []string) []URLWithAlias
GenerateBuildInList is the original misspelt name kept for callers that haven't migrated.
Deprecated: use GenerateBuiltinList.
func GenerateBuildInMirorItem
deprecated
func GenerateBuildInMirorItem(url string, official bool) URLWithAlias
GenerateBuildInMirorItem is the original misspelt name kept for callers that haven't migrated. New code should use GenerateBuiltinMirrorItem.
Deprecated: use GenerateBuiltinMirrorItem.
func GenerateBuiltinList ¶ added in v0.10.0
func GenerateBuiltinList(officialList []string, customList []string) (mirrors []URLWithAlias)
GenerateBuiltinList generates a list of mirror URLs with aliases.
func GenerateBuiltinMirrorItem ¶ added in v0.10.0
func GenerateBuiltinMirrorItem(url string, official bool) URLWithAlias
GenerateBuiltinMirrorItem creates a URLWithAlias from a URL.
func (URLWithAlias) HTTP ¶ added in v0.10.0
func (u URLWithAlias) HTTP() bool
HTTP reports whether the URL was registered as an HTTP-only mirror. It is a thin convenience over Scheme retained so existing callers don't need to be updated. Prefer reading Scheme directly in new code.
func (URLWithAlias) HTTPS ¶ added in v0.10.0
func (u URLWithAlias) HTTPS() bool
HTTPS reports whether the URL was registered as an HTTPS mirror. See HTTP for the migration note.