xmpp-certwatch
created pr with
xmpp-certwatch/add-logging.1
added xmpp-certwatch/add-logging.2
1: 92fa143 ! 1: cfa444f Add lots of logs
commented
https://tangled.org/mrry.band/xmpp-certwatch add-logging
cmds
checkout latest patchset:
ssh pr.pico.sh pull xmpp-certwatch:add-logging | git am -3checkout specific patchset revision:
ssh pr.pico.sh pull xmpp-certwatch:add-logging [rev] | git am -3add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh xmpp-certwatch:add-loggingadd comment to patch request:
ssh pr.pico.sh comment xmpp-certwatch:add-logging "lgtm!"
Patchset
xmpp-certwatch/add-logging.1
Add lots of logs
Eric Roberts
2026-10-26T13:41:20ZSomething is going wrong and it's getting stuck, but we don't know why. Add logs to see where we can get things stuck.
Semantic diff summary
1 added,
9 modified,
0 signature changed,
0 removed
across 3 analyzed files
+34
-6
cmd/cron/main.go
#
| ... | ... | @@ -57,15 +59,20 @@ func publish(node string, title string) { | |
| 57 | 59 | atomEntry(entryId, title), | |
| 58 | 60 | ) | |
| 59 | 61 | if err != nil { | |
| 60 | - | log.Printf("Error publishing to %s", node, err) | |
| 62 | + | log.Printf("Error publishing to %s: %s", node, err) | |
| 63 | + | } else { | |
| 64 | + | log.Printf("Published notification: node=%s", node) | |
| 61 | 65 | } | |
| 62 | 66 | } | |
| 63 | 67 | ||
| 64 | 68 | func main() { | |
| 69 | + | ||
| 70 | + | log.Print("Cron started") | |
| 65 | 71 | opt, err := redis.ParseURL(os.Getenv("REDIS_URL")) | |
| 66 | 72 | if err != nil { | |
| 67 | 73 | log.Panic(err) | |
| 68 | 74 | } | |
| 75 | + | log.Print("Connecting XMPP session") | |
| 69 | 76 | xmppSession, err = DialXMPP( | |
| 70 | 77 | context.Background(), | |
| 71 | 78 | jid.MustParse(os.Args[1]), |
| ... | ... | @@ -76,37 +83,58 @@ func main() { | |
| 76 | 83 | if err != nil { | |
| 77 | 84 | log.Panic(err) | |
| 78 | 85 | } | |
| 79 | - | go func () { | |
| 86 | + | log.Print("XMPP session connected") | |
| 87 | + | go func() { | |
| 88 | + | log.Print("Serving XMPP session") | |
| 80 | 89 | err := xmppSession.Serve(nil) | |
| 81 | 90 | log.Printf("XMPP session error: %s\n", err) | |
| 82 | 91 | os.Exit(1) | |
| 83 | 92 | }() | |
| 84 | 93 | pubsubService = jid.MustParse(os.Args[3]) | |
| 85 | 94 | rclient := redis.NewClient(opt) | |
| 95 | + | log.Print("Loading hosts from Redis") | |
| 86 | 96 | hosts := rclient.HGetAll(context.Background(), "mitm_monitor_hosts").Val() | |
| 97 | + | log.Printf("Loaded %d hosts from Redis", len(hosts)) | |
| 98 | + | checked := 0 | |
| 87 | 99 | for host, errCount := range hosts { | |
| 100 | + | ||
| 101 | + | log.Printf("Checking host: host=%s progress=%d/%d", host, checked+1, len(hosts)) | |
| 88 | 102 | result := CheckOne(host) | |
| 103 | + | log.Printf("Host check returned: host=%s", host) | |
| 89 | 104 | if result.Err != nil { | |
| 90 | 105 | log.Printf("Error checking %s: %s\n", host, result.Err) | |
| 91 | - | errCount, _ := rclient.HIncrBy(context.Background(), "mitm_monitor_hosts", host, 1).Result() | |
| 106 | + | errCount := updateErrorCount(rclient, host, 1) | |
| 92 | 107 | if errCount > 1 { | |
| 93 | 108 | publish(host, fmt.Sprintf("Error checking %s: %s", host, result.Err)) | |
| 94 | 109 | } | |
| 95 | 110 | } else if !result.Dnssec { | |
| 96 | 111 | log.Printf("No DNSSEC for %s\n", host) | |
| 97 | - | rclient.HIncrBy(context.Background(), "mitm_monitor_hosts", host, 2) | |
| 112 | + | updateErrorCount(rclient, host, 2) | |
| 98 | 113 | publish(host, fmt.Sprintf("DNSSEC failed for %s", host)) | |
| 99 | 114 | } else if !result.Daneok { | |
| 100 | 115 | log.Printf("DANE failed for %s\n", host) | |
| 101 | - | rclient.HIncrBy(context.Background(), "mitm_monitor_hosts", host, 2) | |
| 116 | + | updateErrorCount(rclient, host, 2) | |
| 102 | 117 | publish(host, fmt.Sprintf("Certificate check failed for %s: possible MITM or you changed your public key", host)) | |
| 103 | 118 | } else { | |
| 104 | 119 | log.Printf("Success for %s\n", host) | |
| 105 | - | rclient.HSet(context.Background(), "mitm_monitor_hosts", host, 0) | |
| 120 | + | log.Printf("Resetting Redis error count: host=%s", host) | |
| 121 | + | err := rclient.HSet(context.Background(), "mitm_monitor_hosts", host, 0).Err() | |
| 122 | + | log.Printf("Redis error count reset returned: host=%s error=%v", host, err) | |
| 106 | 123 | errCountI, _ := strconv.Atoi(errCount) | |
| 107 | 124 | if errCountI > 1 { | |
| 108 | 125 | publish(host, fmt.Sprintf("Certificate checks passed for %s", host)) | |
| 109 | 126 | } | |
| 110 | 127 | } | |
| 128 | + | checked++ | |
| 129 | + | log.Printf("Finished host: host=%s progress=%d/%d", host, checked, len(hosts)) | |
| 111 | 130 | } | |
| 131 | + | log.Printf("Cron completed: hosts=%d", checked) | |
| 132 | + | } | |
| 133 | + | ||
| 134 | + | func updateErrorCount(client *redis.Client, host string, increment int64) int64 { | |
| 135 | + | ||
| 136 | + | log.Printf("Updating Redis error count: host=%s increment=%d", host, increment) | |
| 137 | + | count, err := client.HIncrBy(context.Background(), "mitm_monitor_hosts", host, increment).Result() | |
| 138 | + | log.Printf("Redis error count update returned: host=%s count=%d error=%v", host, count, err) | |
| 139 | + | return count | |
| 112 | 140 | } |
+17
-2
common/common.go
#
| ... | ... | @@ -73,6 +74,7 @@ func oneTarget(resolver *dane.Resolver, service string, selector string, target | |
| 73 | 74 | alpn = "xmpp-server" | |
| 74 | 75 | } | |
| 75 | 76 | ||
| 77 | + | log.Printf("Resolving target addresses: service=%s selector=%s target=%s port=%d", service, selector, target, port) | |
| 76 | 78 | iplist, err := GetAddresses(resolver, target) | |
| 77 | 79 | if err != nil { | |
| 78 | 80 | return TargetResult{}, err |
| ... | ... | @@ -83,8 +85,11 @@ func oneTarget(resolver *dane.Resolver, service string, selector string, target | |
| 83 | 85 | } | |
| 84 | 86 | ||
| 85 | 87 | daneok := true | |
| 88 | + | log.Printf("Looking up TLSA: service=%s target=%s port=%d", service, target, port) | |
| 89 | + | ||
| 86 | 90 | tlsa, err := dane.GetTLSA(resolver, target, int(port)) | |
| 87 | 91 | ||
| 92 | + | log.Printf("TLSA lookup returned: target=%s port=%d error=%v", target, port, err) | |
| 88 | 93 | if err != nil { | |
| 89 | 94 | return TargetResult{}, err | |
| 90 | 95 | } |
| ... | ... | @@ -92,19 +97,25 @@ func oneTarget(resolver *dane.Resolver, service string, selector string, target | |
| 92 | 97 | infos := map[string]dane.TLSAinfo{} | |
| 93 | 98 | for _, ip := range iplist.IPs { | |
| 94 | 99 | // Ignore ygg targets for now | |
| 95 | - | if strings.HasPrefix(fmt.Sprintf("%s", ip), "200:") { continue } | |
| 100 | + | if strings.HasPrefix(fmt.Sprintf("%s", ip), "200:") { | |
| 101 | + | log.Printf("Skipping Yggdrasil address: service=%s target=%s ip=%s port=%d", service, target, ip, port) | |
| 102 | + | continue | |
| 103 | + | } | |
| 96 | 104 | config := getDaneConfig(service, appname, alpn, service, ip, port) | |
| 97 | 105 | config.SetTLSA(tlsa) | |
| 98 | 106 | ||
| 107 | + | log.Printf("Connecting target: service=%s selector=%s target=%s ip=%s port=%d starttls=%t", service, selector, target, ip, port, appname != "") | |
| 99 | 108 | if appname == "" { | |
| 100 | 109 | conn, err = dane.DialTLS(config) | |
| 101 | 110 | if err == nil { | |
| 111 | + | log.Printf("Starting TLS handshake: target=%s ip=%s port=%d", target, ip, port) | |
| 102 | 112 | err = conn.Handshake() | |
| 103 | 113 | } | |
| 104 | 114 | } else { | |
| 105 | 115 | conn, err = dane.DialStartTLS(config) | |
| 106 | 116 | } | |
| 107 | 117 | ||
| 118 | + | log.Printf("Target connection returned: target=%s ip=%s port=%d error=%v", target, ip, port, err) | |
| 108 | 119 | if err != nil { | |
| 109 | 120 | return TargetResult{}, err | |
| 110 | 121 | } |
| ... | ... | @@ -142,7 +153,9 @@ func oneTarget(resolver *dane.Resolver, service string, selector string, target | |
| 142 | 153 | ||
| 143 | 154 | infos[fmt.Sprintf("%s:%d", ip, port)] = oneTlsa | |
| 144 | 155 | ||
| 145 | - | conn.Close() | |
| 156 | + | log.Printf("Closing target connection: target=%s ip=%s port=%d", target, ip, port) | |
| 157 | + | closeErr := conn.Close() | |
| 158 | + | log.Printf("Target connection close returned: target=%s ip=%s port=%d error=%v", target, ip, port, closeErr) | |
| 146 | 159 | ||
| 147 | 160 | if config.DiagError != nil && config.DiagError.Error() != "DANE TLS authentication failed" { | |
| 148 | 161 | return TargetResult{}, config.DiagError |
| ... | ... | @@ -168,6 +181,7 @@ type CheckResult struct { | |
| 168 | 181 | ||
| 169 | 182 | func CheckOne(hostname string) CheckResult { | |
| 170 | 183 | finalResult := CheckResult{hostname, true, true, true, false, map[string]dane.TLSAinfo{}, nil} | |
| 184 | + | log.Printf("Initializing resolver: host=%s", hostname) | |
| 171 | 185 | resolver, err := dane.GetResolver("") | |
| 172 | 186 | if err != nil { | |
| 173 | 187 | finalResult.Err = err |
+7
-0
common/dns.go
#
| ... | ... | @@ -54,7 +55,10 @@ func sendQueryUDP(query *dane.Query, resolver *dane.Resolver) (*dns.Msg, error) | |
| 54 | 55 | retries := resolver.Retries | |
| 55 | 56 | for retries > 0 { | |
| 56 | 57 | for _, server := range resolver.Servers { | |
| 58 | + | ||
| 59 | + | log.Printf("DNS query started: transport=udp name=%s type=%s server=%s attempt=%d", query.Name, dns.TypeToString[query.Type], server.Address(), resolver.Retries-retries+1) | |
| 57 | 60 | response, _, err = c.Exchange(m, server.Address()) | |
| 61 | + | log.Printf("DNS query returned: transport=udp name=%s type=%s server=%s error=%v", query.Name, dns.TypeToString[query.Type], server.Address(), err) | |
| 58 | 62 | if err == nil { | |
| 59 | 63 | return response, err | |
| 60 | 64 | } |
| ... | ... | @@ -81,7 +85,10 @@ func sendQueryTCP(query *dane.Query, resolver *dane.Resolver) (*dns.Msg, error) | |
| 81 | 85 | c.Timeout = resolver.Timeout | |
| 82 | 86 | ||
| 83 | 87 | for _, server := range resolver.Servers { | |
| 88 | + | ||
| 89 | + | log.Printf("DNS query started: transport=tcp name=%s type=%s server=%s", query.Name, dns.TypeToString[query.Type], server.Address()) | |
| 84 | 90 | response, _, err = c.Exchange(m, server.Address()) | |
| 91 | + | log.Printf("DNS query returned: transport=tcp name=%s type=%s server=%s error=%v", query.Name, dns.TypeToString[query.Type], server.Address(), err) | |
| 85 | 92 | if err == nil { | |
| 86 | 93 | return response, err | |
| 87 | 94 | } |