You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.2 KiB
64 lines
1.2 KiB
1 year ago
|
package zones
|
||
|
|
||
|
import (
|
||
|
"io/fs"
|
||
|
"path/filepath"
|
||
|
|
||
|
"darvaza.org/resolver"
|
||
|
"github.com/hack-pad/hackpadfs/os"
|
||
|
)
|
||
|
|
||
|
// A ScanOption preconfigures the Zones before scanning
|
||
|
type ScanOption func(*Zones, *ScanOptions) error
|
||
|
|
||
|
// ScanOptions contains flags used by the initial scan
|
||
|
type ScanOptions struct{}
|
||
|
|
||
|
func (*Zones) setDefaults(_ *ScanOptions) error {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// NewFS builds a [Zones] tree using the given directory
|
||
|
func NewFS(dir fs.FS, domain string, opts ...ScanOption) (*Zones, error) {
|
||
|
var scanOptions ScanOptions
|
||
|
|
||
|
lockuper := resolver.NewCloudflareLookuper()
|
||
|
|
||
|
z := &Zones{
|
||
|
dir: dir,
|
||
|
resolver: resolver.NewResolver(lockuper),
|
||
|
domain: domain,
|
||
|
}
|
||
|
|
||
|
for _, opt := range opts {
|
||
|
if err := opt(z, &scanOptions); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if err := z.setDefaults(&scanOptions); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if err := z.scan(&scanOptions); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return z, nil
|
||
|
}
|
||
|
|
||
|
// New builds a [Zones] tree using the given directory
|
||
|
func New(dir, domain string, opts ...ScanOption) (*Zones, error) {
|
||
|
dir, err := filepath.Abs(dir)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
base, err := os.NewFS().Sub(dir[1:])
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return NewFS(base, domain, opts...)
|
||
|
}
|