Skip to content

Commit abd8c4f

Browse files
authored
Merge pull request #71 from sudosammy/dev
dependancy bump & tests
2 parents bc4ad2c + f6e534a commit abd8c4f

File tree

8 files changed

+183
-99
lines changed

8 files changed

+183
-99
lines changed

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.4.8
1+
3.4.9

go.mod

+14-13
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
module github.com/sudosammy/knary/v3
22

3-
go 1.21
3+
go 1.22
44

5-
toolchain go1.22.1
5+
toolchain go1.23.0
66

77
require (
88
github.com/blang/semver/v4 v4.0.0
9-
github.com/fatih/color v1.16.0
10-
github.com/go-acme/lego/v4 v4.16.1
9+
github.com/fatih/color v1.17.0
10+
github.com/go-acme/lego/v4 v4.17.4
1111
github.com/joho/godotenv v1.5.1
12-
github.com/miekg/dns v1.1.58
12+
github.com/miekg/dns v1.1.62
1313
github.com/radovskyb/watcher v1.0.7
14-
golang.org/x/net v0.22.0
14+
golang.org/x/net v0.28.0
1515
)
1616

1717
require (
18-
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
19-
github.com/go-jose/go-jose/v4 v4.0.1 // indirect
18+
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
19+
github.com/go-jose/go-jose/v4 v4.0.4 // indirect
2020
github.com/mattn/go-colorable v0.1.13 // indirect
2121
github.com/mattn/go-isatty v0.0.20 // indirect
22-
golang.org/x/crypto v0.21.0 // indirect
23-
golang.org/x/mod v0.16.0 // indirect
24-
golang.org/x/sys v0.18.0 // indirect
25-
golang.org/x/text v0.14.0 // indirect
26-
golang.org/x/tools v0.19.0 // indirect
22+
golang.org/x/crypto v0.26.0 // indirect
23+
golang.org/x/mod v0.20.0 // indirect
24+
golang.org/x/sync v0.8.0 // indirect
25+
golang.org/x/sys v0.24.0 // indirect
26+
golang.org/x/text v0.17.0 // indirect
27+
golang.org/x/tools v0.24.0 // indirect
2728
)

go.sum

+28-28
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,47 @@
11
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
22
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
3-
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
4-
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
3+
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
4+
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
55
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
66
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
7-
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
8-
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
9-
github.com/go-acme/lego/v4 v4.16.1 h1:JxZ93s4KG0jL27rZ30UsIgxap6VGzKuREsSkkyzeoCQ=
10-
github.com/go-acme/lego/v4 v4.16.1/go.mod h1:AVvwdPned/IWpD/ihHhMsKnveF7HHYAz/CmtXi7OZoE=
11-
github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U=
12-
github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY=
13-
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
14-
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
7+
github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
8+
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
9+
github.com/go-acme/lego/v4 v4.17.4 h1:h0nePd3ObP6o7kAkndtpTzCw8shOZuWckNYeUQwo36Q=
10+
github.com/go-acme/lego/v4 v4.17.4/go.mod h1:dU94SvPNqimEeb7EVilGGSnS0nU1O5Exir0pQ4QFL4U=
11+
github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q6/E=
12+
github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc=
13+
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
14+
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
1515
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
1616
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
1717
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
1818
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
1919
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
2020
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
2121
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
22-
github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4=
23-
github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY=
22+
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
23+
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
2424
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2525
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
2626
github.com/radovskyb/watcher v1.0.7 h1:AYePLih6dpmS32vlHfhCeli8127LzkIgwJGcwwe8tUE=
2727
github.com/radovskyb/watcher v1.0.7/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg=
28-
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
29-
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
30-
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
31-
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
32-
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
33-
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
34-
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
35-
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
36-
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
37-
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
28+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
29+
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
30+
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
31+
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
32+
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
33+
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
34+
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
35+
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
36+
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
37+
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
3838
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3939
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
40-
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
41-
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
42-
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
43-
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
44-
golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
45-
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
40+
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
41+
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
42+
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
43+
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
44+
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
45+
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
4646
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
4747
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

libknary/dns_test.go

+7-49
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,14 @@
11
package libknary
22

33
import (
4-
"github.com/miekg/dns"
5-
"net"
6-
"sync"
7-
"time"
4+
"testing"
85
)
96

10-
// code for 3 functions below here is taken and modified from
11-
// here: https://github.com/miekg/dns/blob/67373879ce327b5fd112d9301d0a4d62bad6b904/server_test.go
12-
func GokuServer(w dns.ResponseWriter, req *dns.Msg) {
13-
m := new(dns.Msg)
14-
m.SetReply(req)
7+
func TestInfoLog(t *testing.T) {
8+
ipaddr := "127.0.0.1"
9+
reverse := "example.com"
10+
name := "example"
11+
infoLog(ipaddr, reverse, name)
1512

16-
//no idea why m.Extra doesnt work but m.Answer does
17-
//m.Extra = make([]dns.RR, 1)
18-
m.Answer = make([]dns.RR, 1)
19-
m.Answer[0] = &dns.A{Hdr: dns.RR_Header{Name: m.Question[0].Name, Rrtype: dns.TypeA, Class: dns.ClassANY}, A: net.IPv4(127, 0, 0, 1)}
20-
w.WriteMsg(m)
21-
}
22-
23-
func RunLocalUDPServer(laddr string) (*dns.Server, string, error) {
24-
server, l, _, err := RunLocalUDPServerWithFinChan(laddr)
25-
26-
return server, l, err
27-
}
28-
29-
func RunLocalUDPServerWithFinChan(laddr string, opts ...func(*dns.Server)) (*dns.Server, string, chan error, error) {
30-
pc, err := net.ListenPacket("udp", laddr)
31-
if err != nil {
32-
return nil, "", nil, err
33-
}
34-
server := &dns.Server{PacketConn: pc, ReadTimeout: time.Hour, WriteTimeout: time.Hour}
35-
36-
waitLock := sync.Mutex{}
37-
waitLock.Lock()
38-
server.NotifyStartedFunc = waitLock.Unlock
39-
40-
// fin must be buffered so the goroutine below won't block
41-
// forever if fin is never read from. This always happens
42-
// in RunLocalUDPServer and can happen in TestShutdownUDP.
43-
fin := make(chan error, 1)
44-
45-
for _, opt := range opts {
46-
opt(server)
47-
}
48-
49-
go func() {
50-
fin <- server.ActivateAndServe()
51-
pc.Close()
52-
}()
53-
54-
waitLock.Lock()
55-
return server, pc.LocalAddr().String(), fin, nil
13+
// There are no assertions in this test at the moment
5614
}

libknary/webhooks_test.go

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package libknary
2+
3+
import (
4+
"net/http"
5+
"net/http/httptest"
6+
"os"
7+
"testing"
8+
)
9+
10+
func TestSendMsg(t *testing.T) {
11+
// Create a test server to capture HTTP requests
12+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
13+
// Verify the request URL and method
14+
switch r.URL.String() {
15+
case "/":
16+
if r.Method != http.MethodPost {
17+
t.Errorf("Expected POST request for Slack webhook, got %s", r.Method)
18+
}
19+
default:
20+
t.Errorf("Unexpected request to URL: %s", r.URL.String())
21+
}
22+
}))
23+
24+
defer server.Close()
25+
26+
// Override the Slack webhook URL with the test server URL
27+
os.Setenv("SLACK_WEBHOOK", server.URL)
28+
29+
// SLACK_WEBHOOK is set
30+
sendMsg("Test message for Slack")
31+
}

libknary/zones.go

+12-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package libknary
33
import (
44
"bufio"
55
"fmt"
6-
"log"
76
"os"
87
"strconv"
98
"strings"
@@ -44,11 +43,8 @@ func LoadZone() (bool, error) {
4443
}
4544

4645
if err := zp.Err(); err != nil {
47-
if err != nil {
48-
logger("ERROR", err.Error())
49-
GiveHead(2)
50-
log.Fatal(err)
51-
}
46+
logger("ERROR", err.Error())
47+
return false, err
5248
}
5349

5450
Printy("Monitoring "+strconv.Itoa(zoneCounter)+" items in zone", 1)
@@ -57,6 +53,11 @@ func LoadZone() (bool, error) {
5753
}
5854

5955
func inZone(needle string, qType uint16) (map[int]dns.RR, bool) {
56+
// if last character of needle isn't a period, add it
57+
if needle[len(needle)-1] != '.' {
58+
needle += "."
59+
}
60+
6061
if val, ok := zoneMap[strings.ToLower(needle)]; ok {
6162
// this (sub)domain is present in the zone file
6263
// confirm whether one or many match the qType
@@ -102,6 +103,11 @@ func addZone(fqdn string, ttl int, qType string, value string) error {
102103
}
103104

104105
func remZone(fqdn string) {
106+
// if last character of fqdn isn't a period, add it
107+
if fqdn[len(fqdn)-1] != '.' {
108+
fqdn += "."
109+
}
110+
105111
// this is pretty dodgy.
106112
// we're hoping that the last zone added to the map is the one we want to delete
107113
lastVal := len(zoneMap[fqdn]) - 1

libknary/zones_test.go

+81
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package libknary
33
import (
44
"os"
55
"testing"
6+
7+
"github.com/miekg/dns"
68
)
79

810
func TestLoadZone_WhenZoneFileExists_ReturnsTrueAndNoError(t *testing.T) {
@@ -22,6 +24,24 @@ func TestLoadZone_WhenZoneFileExists_ReturnsTrueAndNoError(t *testing.T) {
2224
}
2325
}
2426

27+
func TestLoadZone_WhenZoneFileInvalid_ReturnsError(t *testing.T) {
28+
os.Setenv("ZONE_FILE", ".zone_test.txt")
29+
// No trailing period
30+
if err := os.WriteFile(".zone_test.txt", []byte("example.com IN A 192.0.2.1"), 0644); err != nil {
31+
t.Fatal(err)
32+
}
33+
defer os.Remove(".zone_test.txt")
34+
35+
result, err := LoadZone()
36+
37+
if err == nil {
38+
t.Errorf("Expected an error")
39+
}
40+
if result == true {
41+
t.Error("Expected result to be false")
42+
}
43+
}
44+
2545
func TestLoadZone_WhenZoneFileDoesNotExist_ReturnsFalseAndError(t *testing.T) {
2646
os.Setenv("ZONE_FILE", "nonexistent.txt")
2747

@@ -50,3 +70,64 @@ func TestAddZone_WhenInvalidInput_ReturnsError(t *testing.T) {
5070
t.Error("Expected an error")
5171
}
5272
}
73+
74+
func TestInZone_WhenZoneExists_ReturnsNoError(t *testing.T) {
75+
fqdn := "example.com"
76+
addZone(fqdn, 3600, "A", "192.0.2.1")
77+
78+
rr, foundInZone := inZone(fqdn, dns.TypeA)
79+
80+
if rr == nil {
81+
t.Error("Expected RR not found")
82+
}
83+
84+
if foundInZone != true {
85+
t.Error("Expected zone not found")
86+
}
87+
}
88+
89+
func TestInZone_WhenZoneDoesNotExist_ReturnsNoError(t *testing.T) {
90+
rr, foundInZone := inZone("not-exists.com", dns.TypeA)
91+
92+
if rr != nil {
93+
t.Error("Unexpected RR found")
94+
}
95+
96+
if foundInZone != false {
97+
t.Error("Unexpected zone found")
98+
}
99+
}
100+
101+
func TestRemZone_WhenZoneExists_DeletesZoneAndReturnsNoError(t *testing.T) {
102+
fqdn := "another-example.com"
103+
err := addZone(fqdn, 3600, "A", "192.0.2.1")
104+
105+
if err != nil {
106+
t.Errorf("Unexpected error: %v", err)
107+
}
108+
109+
remZone(fqdn)
110+
111+
// Check if zone is deleted
112+
_, foundInZone := inZone(fqdn, dns.TypeA)
113+
if foundInZone == true {
114+
t.Error("Expected zone not deleted")
115+
}
116+
}
117+
118+
func TestRemZone_WhenZoneDoesNotExist_DoesNotDeleteZoneAndReturnsNoError(t *testing.T) {
119+
fqdn := "another-example.com"
120+
err := addZone(fqdn, 3600, "A", "192.0.2.2")
121+
122+
if err != nil {
123+
t.Errorf("Unexpected error: %v", err)
124+
}
125+
126+
remZone("not-exists.com")
127+
128+
// Check if zone is not deleted
129+
_, foundInZone := inZone(fqdn, dns.TypeA)
130+
if foundInZone != true {
131+
t.Error("Unexpected zone deleted")
132+
}
133+
}

main.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
)
1616

1717
const (
18-
VERSION = "3.4.8"
18+
VERSION = "3.4.9"
1919
GITHUB = "https://github.com/sudosammy/knary"
2020
GITHUBVERSION = "https://raw.githubusercontent.com/sudosammy/knary/master/VERSION"
2121
)
@@ -100,7 +100,14 @@ func main() {
100100
// load lists, zone file & submit usage
101101
libknary.LoadAllowlist()
102102
libknary.LoadBlacklist()
103-
libknary.LoadZone()
103+
104+
_, err = libknary.LoadZone()
105+
if err != nil {
106+
libknary.Printy("Error in zone file entries", 2)
107+
libknary.GiveHead(2)
108+
log.Fatal(err)
109+
}
110+
104111
go libknary.UsageStats(VERSION)
105112

106113
if os.Getenv("HTTP") == "true" && os.Getenv("LETS_ENCRYPT") == "" && (os.Getenv("TLS_CRT") == "" || os.Getenv("TLS_KEY") == "") {

0 commit comments

Comments
 (0)