diff --git a/README.md b/README.md index f14e684..54ffcbf 100644 --- a/README.md +++ b/README.md @@ -84,8 +84,6 @@ we can set up local listeners as proxy servers, and forward requests to internet ## Usage -**Run:** - ```bash glider -config CONFIG_PATH ``` @@ -93,10 +91,10 @@ glider -config CONFIG_PATH glider -verbose -listen :8443 -forward SCHEME://HOST:PORT ``` -**Help:** +#### Help
-`glider -help` click to see details +`glider -help` (click to see details) ```bash Usage: glider [-listen URL]... [-forward URL]... [OPTION]... @@ -224,10 +222,10 @@ glider 0.16.0, https://github.com/nadoo/glider
-**Schemes:** +#### Schemes
-`glider -scheme all` click to see details +`glider -scheme all` (click to see details) ```bash KCP scheme: @@ -339,39 +337,42 @@ TLS and Websocket with a specified proxy protocol:
-**Examples:** +#### Examples
-`glider -example` click to see details +`glider -example` (click to see details) ```bash Examples: glider -config glider.conf -run glider with specified config file. - + glider -listen :8443 -verbose -listen on :8443, serve as http/socks5 proxy on the same port, in verbose mode. + glider -listen socks5://:1080 -listen http://:8080 -verbose + -multiple listeners: listen on :1080 as socks5 proxy server, and on :8080 as http proxy server. + glider -listen :8443 -forward direct://#interface=eth0 -forward direct://#interface=eth1 - -listen on 8443 and forward requests via interface eth0 and eth1 in round robin mode. - + -multiple forwarders: listen on 8443 and forward requests via interface eth0 and eth1 in round robin mode. + glider -listen tls://:443?cert=crtFilePath&key=keyFilePath,http:// -verbose - -listen on :443 as a https(http over tls) proxy server. - + -protocol chain: listen on :443 as a https(http over tls) proxy server. + glider -listen http://:8080 -forward socks5://serverA:1080,socks5://serverB:1080 - -listen on :8080 as a http proxy server, forward all requests via forward chain. - + -proxy chain: listen on :8080 as a http proxy server, forward all requests via forward chain. + glider -listen :8443 -forward socks5://serverA:1080 -forward socks5://serverB:1080#priority=10 -forward socks5://serverC:1080#priority=10 - -serverA will only be used when serverB and serverC are not available. - + -forwarder priority: serverA will only be used when serverB and serverC are not available. + glider -listen tcp://:80 -forward tcp://serverA:80 -tcp tunnel: listen on :80 and forward all requests to serverA:80. - + glider -listen udp://:53 -forward socks5://serverA:1080,udp://8.8.8.8:53 - -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote socks5 server. - - glider -verbose -listen -dns=:53 -dnsserver=8.8.8.8:53 -forward socks5://serverA:1080 -dnsrecord=www.example.com/1.2.3.4 - -listen on :53 as dns server, forward to 8.8.8.8:53 via socks5 server. + -udp tunnel: listen on :53 and forward all udp requests to 8.8.8.8:53 via remote socks5 server. + + glider -verbose -listen -dns=:53 -dnsserver=8.8.8.8:53 -forward socks5://serverA:1080 -dnsrecord=abc.com/1.2.3.4 + -dns over proxy: listen on :53 as dns server, forward to 8.8.8.8:53 via socks5 server. ```
diff --git a/config.go b/config.go index d032ba9..53e3576 100644 --- a/config.go +++ b/config.go @@ -224,25 +224,28 @@ Examples: glider -listen :8443 -verbose -listen on :8443, serve as http/socks5 proxy on the same port, in verbose mode. + + glider -listen socks5://:1080 -listen http://:8080 -verbose + -multiple listeners: listen on :1080 as socks5 proxy server, and on :8080 as http proxy server. glider -listen :8443 -forward direct://#interface=eth0 -forward direct://#interface=eth1 - -listen on 8443 and forward requests via interface eth0 and eth1 in round robin mode. + -multiple forwarders: listen on 8443 and forward requests via interface eth0 and eth1 in round robin mode. glider -listen tls://:443?cert=crtFilePath&key=keyFilePath,http:// -verbose - -listen on :443 as a https(http over tls) proxy server. + -protocol chain: listen on :443 as a https(http over tls) proxy server. glider -listen http://:8080 -forward socks5://serverA:1080,socks5://serverB:1080 - -listen on :8080 as a http proxy server, forward all requests via forward chain. + -proxy chain: listen on :8080 as a http proxy server, forward all requests via forward chain. glider -listen :8443 -forward socks5://serverA:1080 -forward socks5://serverB:1080#priority=10 -forward socks5://serverC:1080#priority=10 - -serverA will only be used when serverB and serverC are not available. + -forwarder priority: serverA will only be used when serverB and serverC are not available. glider -listen tcp://:80 -forward tcp://serverA:80 -tcp tunnel: listen on :80 and forward all requests to serverA:80. glider -listen udp://:53 -forward socks5://serverA:1080,udp://8.8.8.8:53 - -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote socks5 server. + -udp tunnel: listen on :53 and forward all udp requests to 8.8.8.8:53 via remote socks5 server. - glider -verbose -listen -dns=:53 -dnsserver=8.8.8.8:53 -forward socks5://serverA:1080 -dnsrecord=www.example.com/1.2.3.4 - -listen on :53 as dns server, forward to 8.8.8.8:53 via socks5 server. + glider -verbose -listen -dns=:53 -dnsserver=8.8.8.8:53 -forward socks5://serverA:1080 -dnsrecord=abc.com/1.2.3.4 + -dns over proxy: listen on :53 as dns server, forward to 8.8.8.8:53 via socks5 server. ` diff --git a/go.mod b/go.mod index 3c8094d..f3fe182 100644 --- a/go.mod +++ b/go.mod @@ -12,15 +12,15 @@ require ( github.com/nadoo/ipset v0.4.1-0.20220218075046-ca3cdce74266 github.com/xtaci/kcp-go/v5 v5.6.1 golang.org/x/crypto v0.0.0-20220214200702-86341886e292 - golang.org/x/sys v0.0.0-20220209214540-3681064d5158 + golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c ) require ( github.com/ebfe/rc2 v0.0.0-20131011165748-24b9757f5521 // indirect github.com/klauspost/cpuid/v2 v2.0.11 // indirect github.com/klauspost/reedsolomon v1.9.16 // indirect - github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7 // indirect - github.com/mdlayher/raw v0.0.0-20211126142749-4eae47f3d54b // indirect + github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118 // indirect + github.com/mdlayher/raw v0.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/templexxx/cpu v0.0.10-0.20211111114238-98168dcec14a // indirect github.com/templexxx/xorsimd v0.4.1 // indirect diff --git a/go.sum b/go.sum index 97c9fc2..aa7574f 100644 --- a/go.sum +++ b/go.sum @@ -34,13 +34,15 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -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/insomniacslk/dhcp v0.0.0-20220119180841-3c283ff8b7dd h1:efcJu2Vzz6DoSq245deWNzTz6l/gsqdphm3FjmI88/g= github.com/insomniacslk/dhcp v0.0.0-20220119180841-3c283ff8b7dd/go.mod h1:h+MxyHxRg9NH3terB1nfRIUaQEcI0XOVkdR9LNBlp8E= +github.com/josharian/native v1.0.0 h1:Ts/E8zCSEsG17dUqv7joXJFybuMLjQfWE04tsBODTxk= +github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ= github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok= @@ -54,16 +56,21 @@ github.com/klauspost/cpuid/v2 v2.0.11/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuOb github.com/klauspost/reedsolomon v1.9.9/go.mod h1:O7yFFHiQwDR6b2t63KPUpccPtNdp5ADgh1gg4fd12wo= github.com/klauspost/reedsolomon v1.9.16 h1:mR0AwphBwqFv/I3B9AHtNKvzuowI1vrj8/3UX4XRmHA= github.com/klauspost/reedsolomon v1.9.16/go.mod h1:eqPAcE7xar5CIzcdfwydOEdcmchAKAP/qs14y4GCBOk= -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/ethernet v0.0.0-20220221185849-529eae5b6118 h1:2oDp6OOhLxQ9JBoUuysVz9UZ9uI6oLUbvAZu0x8o+vE= +github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118/go.mod h1:ZFUnHIVchZ9lJoWoEGUg8Q3M4U8aNNWA3CVSUTkW4og= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o= +github.com/mdlayher/packet v1.0.0 h1:InhZJbdShQYt6XV2GPj5XHxChzOfhJJOMbvnGAmOfQ8= +github.com/mdlayher/packet v1.0.0/go.mod h1:eE7/ctqDhoiRhQ44ko5JZU2zxB88g+JH/6jmnjzPjOU= github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= -github.com/mdlayher/raw v0.0.0-20211126142749-4eae47f3d54b h1:MHcTarUMC4sFA7eiyR8IEJ6j2PgmgXR+B9X2IIMjh7A= -github.com/mdlayher/raw v0.0.0-20211126142749-4eae47f3d54b/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= +github.com/mdlayher/raw v0.1.0 h1:K4PFMVy+AFsp0Zdlrts7yNhxc/uXoPVHi9RzRvtZF2Y= +github.com/mdlayher/raw v0.1.0/go.mod h1:yXnxvs6c0XoF/aK52/H5PjsVHmWBCFfZUfoh/Y5s9Sg= +github.com/mdlayher/socket v0.2.1 h1:F2aaOwb53VsBE+ebRS9bLd7yPOfYUMC8lOODdCBDY6w= +github.com/mdlayher/socket v0.2.1/go.mod h1:QLlNPkFR88mRUNQIzRBMfXxwKal8H7u1h3bL1CV+f0E= github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104/go.mod h1:wqKykBG2QzQDJEzvRkcS8x6MiSJkF52hXZsXcjaB3ls= github.com/nadoo/conflag v0.3.1 h1:4pHkLIz8PUsfg6ajNYRRSY3bt6m2LPsu6KOzn5uIXQw= github.com/nadoo/conflag v0.3.1/go.mod h1:dzFfDUpXdr2uS2oV+udpy5N2vfNOu/bFzjhX1WI52co= @@ -118,6 +125,7 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r 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-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/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/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -136,6 +144,8 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -152,8 +162,10 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c h1:sSIdNI2Dd6vGv47bKc/xArpfxVmEz2+3j0E6I484xC4= +golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/pkg/sockopt/bind_darwin.go b/pkg/sockopt/bind_darwin.go new file mode 100644 index 0000000..2088d3d --- /dev/null +++ b/pkg/sockopt/bind_darwin.go @@ -0,0 +1,21 @@ +package sockopt + +import ( + "net" + "syscall" + + "golang.org/x/sys/unix" +) + +func BindControl(iface *net.Interface) func(network, address string, c syscall.RawConn) error { + return func(network, address string, c syscall.RawConn) (err error) { + return c.Control(func(fd uintptr) { + switch network { + case "tcp4", "udp4": + err = unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_BOUND_IF, iface.Index) + case "tcp6", "udp6": + err = unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_BOUND_IF, iface.Index) + } + }) + } +} diff --git a/pkg/sockopt/bind_linux.go b/pkg/sockopt/bind_linux.go index ed9e067..91cc025 100644 --- a/pkg/sockopt/bind_linux.go +++ b/pkg/sockopt/bind_linux.go @@ -8,9 +8,9 @@ import ( ) func BindControl(iface *net.Interface) func(network, address string, c syscall.RawConn) error { - return func(network, address string, c syscall.RawConn) error { + return func(network, address string, c syscall.RawConn) (err error) { return c.Control(func(fd uintptr) { - unix.BindToDevice(int(fd), iface.Name) + err = unix.BindToDevice(int(fd), iface.Name) }) } } diff --git a/pkg/sockopt/bind_others.go b/pkg/sockopt/bind_others.go index ad42ffb..c5262e0 100644 --- a/pkg/sockopt/bind_others.go +++ b/pkg/sockopt/bind_others.go @@ -1,5 +1,5 @@ -//go:build !linux -// +build !linux +//go:build !linux && !darwin +// +build !linux,!darwin package sockopt diff --git a/rule/group.go b/rule/group.go index 7d3272a..7aaf391 100644 --- a/rule/group.go +++ b/rule/group.go @@ -267,8 +267,8 @@ func (p *FwdrGroup) check(fwdr *Forwarder, checker Checker) { wait = 1 p.setLatency(fwdr, elapsed) - log.F("[check] %s: %s(%d), SUCCESS. elapsed: %s, Latency: %s", - p.name, fwdr.Addr(), fwdr.Priority(), elapsed, time.Duration(fwdr.Latency())) + log.F("[check] %s: %s(%d), SUCCESS. Elapsed: %dms, Latency: %dms.", + p.name, fwdr.Addr(), fwdr.Priority(), elapsed.Milliseconds(), time.Duration(fwdr.Latency()).Milliseconds()) fwdr.Enable() } } diff --git a/service/dhcpd/cilent.go b/service/dhcpd/cilent.go new file mode 100644 index 0000000..ce8e26a --- /dev/null +++ b/service/dhcpd/cilent.go @@ -0,0 +1,56 @@ +package dhcpd + +import ( + "context" + "net" + "runtime" + "time" + + "github.com/insomniacslk/dhcp/dhcpv4" + + "github.com/nadoo/glider/pkg/log" + "github.com/nadoo/glider/pkg/sockopt" +) + +func existsServer(intf *net.Interface) (exists bool) { + lc := &net.ListenConfig{} + lc.Control = sockopt.BindControl(intf) + + addr := "0.0.0.0:68" + if runtime.GOOS == "linux" || runtime.GOOS == "android" { + addr = "255.255.255.255:68" + } + + pc, err := lc.ListenPacket(context.Background(), "udp4", addr) + if err != nil { + log.F("[dhcpd] failed in dhcp client ListenPacket: %s", err) + return + } + defer pc.Close() + + discovery, err := dhcpv4.NewDiscovery(intf.HardwareAddr, dhcpv4.WithBroadcast(true)) + if err != nil { + log.F("[dhcpd] failed in dhcp client NewDiscovery: %s", err) + return + } + + _, err = pc.WriteTo(discovery.ToBytes(), &net.UDPAddr{IP: net.IPv4bcast, Port: 67}) + if err != nil { + log.F("[dhcpd] failed in dhcp client WriteTo: %s", err) + return + } + + var buf [dhcpv4.MaxMessageSize]byte + pc.SetReadDeadline(time.Now().Add(time.Second * 3)) + n, _, err := pc.ReadFrom(buf[:]) + if err != nil { + return + } + + msg, err := dhcpv4.FromBytes(buf[:n]) + if err != nil || msg.TransactionID != discovery.TransactionID { + return + } + + return true +} diff --git a/service/dhcpd/cilent_linux.go b/service/dhcpd/cilent_linux.go deleted file mode 100644 index 18556c7..0000000 --- a/service/dhcpd/cilent_linux.go +++ /dev/null @@ -1,27 +0,0 @@ -package dhcpd - -import ( - "context" - "time" - - "github.com/insomniacslk/dhcp/dhcpv4/nclient4" - - "github.com/nadoo/glider/pkg/log" -) - -func existsServer(iface string) (exists bool) { - client, err := nclient4.New(iface) - if err != nil { - log.F("[dhcpd] failed in dhcp client creation: %s", err) - return - } - defer client.Close() - - ctx, _ := context.WithTimeout(context.Background(), 3*time.Second) - _, err = client.Request(ctx) - if err != nil { - return - } - - return true -} diff --git a/service/dhcpd/client_others.go b/service/dhcpd/client_others.go deleted file mode 100644 index 2d58100..0000000 --- a/service/dhcpd/client_others.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build !linux -// +build !linux - -package dhcpd - -func existsServer(iface string) (exists bool) { - return false -} diff --git a/service/dhcpd/dhcpd.go b/service/dhcpd/dhcpd.go index 85ae303..9d096f1 100644 --- a/service/dhcpd/dhcpd.go +++ b/service/dhcpd/dhcpd.go @@ -35,13 +35,13 @@ func (*dpcpd) Run(args ...string) { leaseTime = time.Duration(i) * time.Minute } - ip, mask, _, err := ifaceAddr(iface) + intf, ip, mask, err := ifaceAddr(iface) if err != nil { log.F("[dhcpd] get ip of interface '%s' error: %s", iface, err) return } - if existsServer(iface) { + if existsServer(intf) { log.F("[dhcpd] found existing dhcp server on interface %s, service exiting", iface) return } @@ -146,7 +146,7 @@ func handleDHCP(serverIP net.IP, mask net.IPMask, pool *Pool) server4.Handler { } } -func ifaceAddr(iface string) (net.IP, net.IPMask, net.HardwareAddr, error) { +func ifaceAddr(iface string) (*net.Interface, net.IP, net.IPMask, error) { intf, err := net.InterfaceByName(iface) if err != nil { return nil, nil, nil, err @@ -154,19 +154,19 @@ func ifaceAddr(iface string) (net.IP, net.IPMask, net.HardwareAddr, error) { addrs, err := intf.Addrs() if err != nil { - return nil, nil, intf.HardwareAddr, err + return intf, nil, nil, err } for _, addr := range addrs { if ipnet, ok := addr.(*net.IPNet); ok { if ipnet.IP.IsLoopback() { - return nil, nil, intf.HardwareAddr, errors.New("can't use loopback interface") + return intf, nil, nil, errors.New("can't use loopback interface") } if ip4 := ipnet.IP.To4(); ip4 != nil { - return ip4, ipnet.Mask, intf.HardwareAddr, nil + return intf, ip4, ipnet.Mask, nil } } } - return nil, nil, intf.HardwareAddr, errors.New("no ip/mask defined on this interface") + return intf, nil, nil, errors.New("no ip/mask defined on this interface") }