v4
This commit is contained in:
@@ -47,6 +47,7 @@ type ServerConfig struct {
|
|||||||
// 0: disable
|
// 0: disable
|
||||||
ICMPTimeout uint32 `json:"icmp_timeout_msec" yaml:"icmp_timeout_msec"`
|
ICMPTimeout uint32 `json:"icmp_timeout_msec" yaml:"icmp_timeout_msec"`
|
||||||
|
|
||||||
|
Conf4 V4ServerConf `json:"-" yaml:"dhcpv4"`
|
||||||
Conf6 V6ServerConf `json:"-" yaml:"dhcpv6"`
|
Conf6 V6ServerConf `json:"-" yaml:"dhcpv6"`
|
||||||
|
|
||||||
WorkDir string `json:"-" yaml:"-"`
|
WorkDir string `json:"-" yaml:"-"`
|
||||||
@@ -88,9 +89,7 @@ type Server struct {
|
|||||||
leaseTime time.Duration // parsed from config LeaseDuration
|
leaseTime time.Duration // parsed from config LeaseDuration
|
||||||
leaseOptions dhcp4.Options // parsed from config GatewayIP and SubnetMask
|
leaseOptions dhcp4.Options // parsed from config GatewayIP and SubnetMask
|
||||||
|
|
||||||
// IP address pool -- if entry is in the pool, then it's attached to a lease
|
srv4 *V4Server
|
||||||
IPpool map[[4]byte]net.HardwareAddr
|
|
||||||
|
|
||||||
srv6 *V6Server
|
srv6 *V6Server
|
||||||
|
|
||||||
conf ServerConfig
|
conf ServerConfig
|
||||||
@@ -135,6 +134,12 @@ func Create(config ServerConfig) *Server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
s.srv4, err = v4Create(config.Conf4)
|
||||||
|
if s.srv4 == nil {
|
||||||
|
log.Error("%s", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
s.srv6, err = v6Create(config.Conf6)
|
s.srv6, err = v6Create(config.Conf6)
|
||||||
if s.srv6 == nil {
|
if s.srv6 == nil {
|
||||||
log.Error("%s", err)
|
log.Error("%s", err)
|
||||||
@@ -240,35 +245,6 @@ func (s *Server) setConfig(config ServerConfig) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) start4(iface net.Interface) error {
|
|
||||||
// TODO: don't close if interface and addresses are the same
|
|
||||||
if s.conn != nil {
|
|
||||||
_ = s.closeConn()
|
|
||||||
}
|
|
||||||
|
|
||||||
c, err := newFilterConn(iface, ":67") // it has to be bound to 0.0.0.0:67, otherwise it won't see DHCP discover/request packets
|
|
||||||
if err != nil {
|
|
||||||
return wrapErrPrint(err, "Couldn't start listening socket on 0.0.0.0:67")
|
|
||||||
}
|
|
||||||
log.Info("DHCP: listening on 0.0.0.0:67")
|
|
||||||
|
|
||||||
s.conn = c
|
|
||||||
s.cond = sync.NewCond(&s.mutex)
|
|
||||||
|
|
||||||
s.running = true
|
|
||||||
go func() {
|
|
||||||
// operate on c instead of c.conn because c.conn can change over time
|
|
||||||
err := dhcp4.Serve(c, s)
|
|
||||||
if err != nil && !s.stopping {
|
|
||||||
log.Printf("dhcp4.Serve() returned with error: %s", err)
|
|
||||||
}
|
|
||||||
_ = c.Close() // in case Serve() exits for other reason than listening socket closure
|
|
||||||
s.running = false
|
|
||||||
s.cond.Signal()
|
|
||||||
}()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start will listen on port 67 and serve DHCP requests.
|
// Start will listen on port 67 and serve DHCP requests.
|
||||||
func (s *Server) Start() error {
|
func (s *Server) Start() error {
|
||||||
iface, err := net.InterfaceByName(s.conf.InterfaceName)
|
iface, err := net.InterfaceByName(s.conf.InterfaceName)
|
||||||
@@ -276,7 +252,7 @@ func (s *Server) Start() error {
|
|||||||
return wrapErrPrint(err, "Couldn't find interface by name %s", s.conf.InterfaceName)
|
return wrapErrPrint(err, "Couldn't find interface by name %s", s.conf.InterfaceName)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = s.start4(*iface)
|
err = s.srv4.Start(*iface)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -291,9 +267,10 @@ func (s *Server) Start() error {
|
|||||||
|
|
||||||
// Stop closes the listening UDP socket
|
// Stop closes the listening UDP socket
|
||||||
func (s *Server) Stop() error {
|
func (s *Server) Stop() error {
|
||||||
|
s.srv4.Stop()
|
||||||
s.srv6.Stop()
|
s.srv6.Stop()
|
||||||
|
|
||||||
if s.conn == nil {
|
/* if s.conn == nil {
|
||||||
// nothing to do, return silently
|
// nothing to do, return silently
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -311,7 +288,7 @@ func (s *Server) Stop() error {
|
|||||||
for s.running {
|
for s.running {
|
||||||
s.cond.Wait()
|
s.cond.Wait()
|
||||||
}
|
}
|
||||||
s.mutex.Unlock()
|
s.mutex.Unlock() */
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -825,8 +802,6 @@ func (s *Server) FindMACbyIP(ip net.IP) net.HardwareAddr {
|
|||||||
|
|
||||||
// Reset internal state
|
// Reset internal state
|
||||||
func (s *Server) reset() {
|
func (s *Server) reset() {
|
||||||
s.leasesLock.Lock()
|
s.srv4.Reset()
|
||||||
s.leases = nil
|
s.srv6.Reset()
|
||||||
s.IPpool = make(map[[4]byte]net.HardwareAddr)
|
|
||||||
s.leasesLock.Unlock()
|
|
||||||
}
|
}
|
||||||
|
|||||||
101
dhcpd/v4.go
Normal file
101
dhcpd/v4.go
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
package dhcpd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/AdguardTeam/golibs/log"
|
||||||
|
"github.com/insomniacslk/dhcp/dhcpv4/server4"
|
||||||
|
"github.com/krolaw/dhcp4"
|
||||||
|
)
|
||||||
|
|
||||||
|
// V4Server - DHCPv4 server
|
||||||
|
type V4Server struct {
|
||||||
|
srv *server4.Server
|
||||||
|
leasesLock sync.Mutex
|
||||||
|
leases []*Lease
|
||||||
|
// IP address pool -- if entry is in the pool, then it's attached to a lease
|
||||||
|
IPpool map[[4]byte]net.HardwareAddr
|
||||||
|
|
||||||
|
conf V4ServerConf
|
||||||
|
}
|
||||||
|
|
||||||
|
// V4ServerConf - server configuration
|
||||||
|
type V4ServerConf struct {
|
||||||
|
Enabled bool `yaml:"enabled"`
|
||||||
|
// RangeStart string `yaml:"range_start"`
|
||||||
|
LeaseDuration uint32 `yaml:"lease_duration"` // in seconds
|
||||||
|
|
||||||
|
// ipStart net.IP
|
||||||
|
leaseTime time.Duration
|
||||||
|
// dnsIPAddrs []net.IP // IPv6 addresses to return to DHCP clients as DNS server addresses
|
||||||
|
// sid dhcpv6.Duid
|
||||||
|
|
||||||
|
// notify func(uint32)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start - start server
|
||||||
|
func (s *V4Server) Start(iface net.Interface) error {
|
||||||
|
if s.conn != nil {
|
||||||
|
_ = s.closeConn()
|
||||||
|
}
|
||||||
|
|
||||||
|
c, err := newFilterConn(iface, ":67") // it has to be bound to 0.0.0.0:67, otherwise it won't see DHCP discover/request packets
|
||||||
|
if err != nil {
|
||||||
|
return wrapErrPrint(err, "Couldn't start listening socket on 0.0.0.0:67")
|
||||||
|
}
|
||||||
|
log.Info("DHCP: listening on 0.0.0.0:67")
|
||||||
|
|
||||||
|
s.conn = c
|
||||||
|
s.cond = sync.NewCond(&s.mutex)
|
||||||
|
|
||||||
|
s.running = true
|
||||||
|
go func() {
|
||||||
|
// operate on c instead of c.conn because c.conn can change over time
|
||||||
|
err := dhcp4.Serve(c, s)
|
||||||
|
if err != nil && !s.stopping {
|
||||||
|
log.Printf("dhcp4.Serve() returned with error: %s", err)
|
||||||
|
}
|
||||||
|
_ = c.Close() // in case Serve() exits for other reason than listening socket closure
|
||||||
|
s.running = false
|
||||||
|
s.cond.Signal()
|
||||||
|
}()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset - stop server
|
||||||
|
func (s *V4Server) Reset() {
|
||||||
|
s.leasesLock.Lock()
|
||||||
|
s.leases = nil
|
||||||
|
s.IPpool = make(map[[4]byte]net.HardwareAddr)
|
||||||
|
s.leasesLock.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop - stop server
|
||||||
|
func (s *V4Server) Stop() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create DHCPv6 server
|
||||||
|
func v4Create(conf V4ServerConf) (*V4Server, error) {
|
||||||
|
s := &V4Server{}
|
||||||
|
s.conf = conf
|
||||||
|
|
||||||
|
if !conf.Enabled {
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// s.conf.ipStart = net.ParseIP(conf.RangeStart)
|
||||||
|
// if s.conf.ipStart == nil {
|
||||||
|
// return nil, fmt.Errorf("DHCPv6: invalid range-start IP: %s", conf.RangeStart)
|
||||||
|
// }
|
||||||
|
|
||||||
|
if conf.LeaseDuration == 0 {
|
||||||
|
s.conf.leaseTime = time.Hour * 2
|
||||||
|
s.conf.LeaseDuration = uint32(s.conf.leaseTime.Seconds())
|
||||||
|
} else {
|
||||||
|
s.conf.leaseTime = time.Second * time.Duration(conf.LeaseDuration)
|
||||||
|
}
|
||||||
|
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
@@ -466,6 +466,13 @@ func (s *V6Server) Start(iface net.Interface) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reset - stop server
|
||||||
|
func (s *V6Server) Reset() {
|
||||||
|
s.leasesLock.Lock()
|
||||||
|
s.leases = nil
|
||||||
|
s.leasesLock.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
// Stop - stop server
|
// Stop - stop server
|
||||||
func (s *V6Server) Stop() {
|
func (s *V6Server) Stop() {
|
||||||
if s.srv == nil {
|
if s.srv == nil {
|
||||||
|
|||||||
3
go.mod
3
go.mod
@@ -9,10 +9,13 @@ require (
|
|||||||
github.com/NYTimes/gziphandler v1.1.1
|
github.com/NYTimes/gziphandler v1.1.1
|
||||||
github.com/fsnotify/fsnotify v1.4.7
|
github.com/fsnotify/fsnotify v1.4.7
|
||||||
github.com/gobuffalo/packr v1.30.1
|
github.com/gobuffalo/packr v1.30.1
|
||||||
|
github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714 // indirect
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20200420235442-ed3125c2efe7
|
github.com/insomniacslk/dhcp v0.0.0-20200420235442-ed3125c2efe7
|
||||||
github.com/joomcode/errorx v1.0.1
|
github.com/joomcode/errorx v1.0.1
|
||||||
github.com/kardianos/service v1.0.0
|
github.com/kardianos/service v1.0.0
|
||||||
github.com/krolaw/dhcp4 v0.0.0-20180925202202-7cead472c414
|
github.com/krolaw/dhcp4 v0.0.0-20180925202202-7cead472c414
|
||||||
|
github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7 // indirect
|
||||||
|
github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065 // indirect
|
||||||
github.com/miekg/dns v1.1.29
|
github.com/miekg/dns v1.1.29
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/sparrc/go-ping v0.0.0-20190613174326-4e5b6552494c
|
github.com/sparrc/go-ping v0.0.0-20190613174326-4e5b6552494c
|
||||||
|
|||||||
14
go.sum
14
go.sum
@@ -47,7 +47,12 @@ github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b
|
|||||||
github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg=
|
github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg=
|
||||||
github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk=
|
github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk=
|
||||||
github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw=
|
github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw=
|
||||||
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
|
github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714 h1:/jC7qQFrv8CrSJVmaolDVOxTfS9kc36uB6H40kdbQq8=
|
||||||
|
github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714/go.mod h1:2Goc3h8EklBH5mspfHFxBnEoURQCGzQQH1ga9Myjvis=
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20200420235442-ed3125c2efe7 h1:iaCm+9nZdYb8XCSU2TfIb0qYTcAlIv2XzyKR2d2xZ38=
|
github.com/insomniacslk/dhcp v0.0.0-20200420235442-ed3125c2efe7 h1:iaCm+9nZdYb8XCSU2TfIb0qYTcAlIv2XzyKR2d2xZ38=
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20200420235442-ed3125c2efe7/go.mod h1:CfMdguCK66I5DAUJgGKyNz8aB6vO5dZzkm9Xep6WGvw=
|
github.com/insomniacslk/dhcp v0.0.0-20200420235442-ed3125c2efe7/go.mod h1:CfMdguCK66I5DAUJgGKyNz8aB6vO5dZzkm9Xep6WGvw=
|
||||||
@@ -72,6 +77,11 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
|||||||
github.com/krolaw/dhcp4 v0.0.0-20180925202202-7cead472c414 h1:6wnYc2S/lVM7BvR32BM74ph7bPgqMztWopMYKgVyEho=
|
github.com/krolaw/dhcp4 v0.0.0-20180925202202-7cead472c414 h1:6wnYc2S/lVM7BvR32BM74ph7bPgqMztWopMYKgVyEho=
|
||||||
github.com/krolaw/dhcp4 v0.0.0-20180925202202-7cead472c414/go.mod h1:0AqAH3ZogsCrvrtUpvc6EtVKbc3w6xwZhkvGLuqyi3o=
|
github.com/krolaw/dhcp4 v0.0.0-20180925202202-7cead472c414/go.mod h1:0AqAH3ZogsCrvrtUpvc6EtVKbc3w6xwZhkvGLuqyi3o=
|
||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
|
github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7 h1:lez6TS6aAau+8wXUP3G9I3TGlmPFEq2CTxBaRqY6AGE=
|
||||||
|
github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7/go.mod h1:U6ZQobyTjI/tJyq2HG+i/dfSoFUt8/aZCM+GKtmFk/Y=
|
||||||
|
github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg=
|
||||||
|
github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065 h1:aFkJ6lx4FPip+S+Uw4aTegFMct9shDvP+79PsSxpm3w=
|
||||||
|
github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg=
|
||||||
github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg=
|
github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg=
|
||||||
github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
@@ -128,6 +138,8 @@ golang.org/x/crypto v0.0.0-20200403201458-baeed622b8d8/go.mod h1:LzIPMQfyMNhhGPh
|
|||||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
@@ -142,8 +154,10 @@ golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190418153312-f0ce4c0180be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0=
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0=
|
||||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
|||||||
Reference in New Issue
Block a user