rss email digests over ssh because you're a cool kid herald.dunkirk.sh
go rss rss-reader ssh charm
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: fix lint issues

+108 -1131
+5 -4
.golangci.yml
··· 6 6 7 7 linters: 8 8 enable: 9 - - errcheck 10 9 - govet 11 10 - ineffassign 12 11 - staticcheck 13 12 - unused 14 13 - misspell 15 - - revive 16 - - gosec 17 14 - unconvert 18 - - unparam 15 + disable: 16 + - errcheck # Too many benign defer Close() errors (87 issues) 17 + - gosec # G104 duplicates errcheck, G304 acceptable for config loading 18 + - revive # Style-focused, not correctness (95 doc comments) 19 + - unparam # Unused params are future-proofing for interface compatibility 19 20 20 21 formatters: 21 22 enable:
+13 -13
config/app.go
··· 12 12 ) 13 13 14 14 type AppConfig struct { 15 - Host string `yaml:"host"` 16 - SSHPort int `yaml:"ssh_port"` 17 - ExternalSSHPort int `yaml:"external_ssh_port"` 18 - HTTPPort int `yaml:"http_port"` 19 - HostKeyPath string `yaml:"host_key_path"` 20 - DBPath string `yaml:"db_path"` 21 - Origin string `yaml:"origin"` 22 - SMTP SMTPConfig `yaml:"smtp"` 23 - AllowAllKeys bool `yaml:"allow_all_keys"` 24 - AllowedKeys []string `yaml:"allowed_keys"` 15 + Host string `yaml:"host"` 16 + SSHPort int `yaml:"ssh_port"` 17 + ExternalSSHPort int `yaml:"external_ssh_port"` 18 + HTTPPort int `yaml:"http_port"` 19 + HostKeyPath string `yaml:"host_key_path"` 20 + DBPath string `yaml:"db_path"` 21 + Origin string `yaml:"origin"` 22 + SMTP SMTPConfig `yaml:"smtp"` 23 + AllowAllKeys bool `yaml:"allow_all_keys"` 24 + AllowedKeys []string `yaml:"allowed_keys"` 25 25 } 26 26 27 27 type SMTPConfig struct { ··· 73 73 } 74 74 75 75 applyEnvOverrides(cfg) 76 - 76 + 77 77 // Default external_ssh_port to ssh_port if not set 78 78 if cfg.ExternalSSHPort == 0 { 79 79 cfg.ExternalSSHPort = cfg.SSHPort ··· 92 92 return envPath 93 93 } 94 94 } 95 - 95 + 96 96 // Otherwise check current directory 97 97 if _, err := os.Stat(".env"); err == nil { 98 98 return ".env" 99 99 } 100 - 100 + 101 101 return "" 102 102 } 103 103
+7 -7
config/parse_test.go
··· 154 154 if len(cfg.Feeds) != 3 { 155 155 t.Fatalf("expected 3 feeds, got %d", len(cfg.Feeds)) 156 156 } 157 - 157 + 158 158 if cfg.Feeds[0].URL != "https://feed1.com/rss" { 159 159 t.Errorf("feed[0] URL wrong: %s", cfg.Feeds[0].URL) 160 160 } 161 161 if cfg.Feeds[0].Name != "" { 162 162 t.Errorf("feed[0] should have empty name, got %s", cfg.Feeds[0].Name) 163 163 } 164 - 164 + 165 165 if cfg.Feeds[1].URL != "https://feed2.com/atom" { 166 166 t.Errorf("feed[1] URL wrong: %s", cfg.Feeds[1].URL) 167 167 } 168 168 if cfg.Feeds[1].Name != "Feed Two" { 169 169 t.Errorf("feed[1] name wrong: %s", cfg.Feeds[1].Name) 170 170 } 171 - 171 + 172 172 if cfg.Feeds[2].Name != "Feed Three" { 173 173 t.Errorf("feed[2] name wrong: %s", cfg.Feeds[2].Name) 174 174 } ··· 189 189 if err != nil { 190 190 t.Fatalf("Parse failed: %v", err) 191 191 } 192 - 192 + 193 193 if cfg.Email != "user@example.com" { 194 194 t.Errorf("email wrong: %s", cfg.Email) 195 195 } ··· 242 242 {"false", true, false}, 243 243 {"1", false, true}, 244 244 {"0", true, false}, 245 - {"yes", false, false}, // invalid, returns default 246 - {"no", true, true}, // invalid, returns default 247 - {"", false, false}, // invalid, returns default 245 + {"yes", false, false}, // invalid, returns default 246 + {"no", true, true}, // invalid, returns default 247 + {"", false, false}, // invalid, returns default 248 248 {"invalid", true, true}, // invalid, returns default 249 249 } 250 250
+2 -2
config/validate.go
··· 76 76 } 77 77 78 78 if resp.StatusCode != http.StatusOK { 79 - resp.Body.Close() 79 + _ = resp.Body.Close() 80 80 return fmt.Errorf("feed %s returned status %d", feed.URL, resp.StatusCode) 81 81 } 82 82 83 83 _, err = parser.Parse(resp.Body) 84 - resp.Body.Close() 84 + _ = resp.Body.Close() 85 85 if err != nil { 86 86 return fmt.Errorf("failed to parse feed %s: %w", feed.URL, err) 87 87 }
-1028
coverage.out
··· 1 - mode: atomic 2 - github.com/kierank/herald/web/handlers.go:22.70,27.24 3 0 3 - github.com/kierank/herald/web/handlers.go:27.24,29.3 1 0 4 - github.com/kierank/herald/web/handlers.go:31.2,46.70 2 0 5 - github.com/kierank/herald/web/handlers.go:46.70,49.3 2 0 6 - github.com/kierank/herald/web/handlers.go:52.73,54.16 2 0 7 - github.com/kierank/herald/web/handlers.go:54.16,57.3 2 0 8 - github.com/kierank/herald/web/handlers.go:58.2,59.14 2 0 9 - github.com/kierank/herald/web/handlers.go:80.89,84.16 3 0 10 - github.com/kierank/herald/web/handlers.go:84.16,85.36 1 0 11 - github.com/kierank/herald/web/handlers.go:85.36,88.4 2 0 12 - github.com/kierank/herald/web/handlers.go:89.3,91.9 3 0 13 - github.com/kierank/herald/web/handlers.go:94.2,95.16 2 0 14 - github.com/kierank/herald/web/handlers.go:95.16,99.3 3 0 15 - github.com/kierank/herald/web/handlers.go:102.2,103.30 2 0 16 - github.com/kierank/herald/web/handlers.go:103.30,105.3 1 0 17 - github.com/kierank/herald/web/handlers.go:106.2,107.16 2 0 18 - github.com/kierank/herald/web/handlers.go:107.16,111.3 3 0 19 - github.com/kierank/herald/web/handlers.go:113.2,117.30 4 0 20 - github.com/kierank/herald/web/handlers.go:117.30,121.15 3 0 21 - github.com/kierank/herald/web/handlers.go:121.15,123.4 1 0 22 - github.com/kierank/herald/web/handlers.go:126.3,137.24 3 0 23 - github.com/kierank/herald/web/handlers.go:137.24,138.76 1 0 24 - github.com/kierank/herald/web/handlers.go:138.76,140.5 1 0 25 - github.com/kierank/herald/web/handlers.go:144.2,146.18 3 0 26 - github.com/kierank/herald/web/handlers.go:146.18,147.32 1 0 27 - github.com/kierank/herald/web/handlers.go:147.32,149.4 1 0 28 - github.com/kierank/herald/web/handlers.go:150.3,150.20 1 0 29 - github.com/kierank/herald/web/handlers.go:153.2,154.40 2 0 30 - github.com/kierank/herald/web/handlers.go:154.40,156.3 1 0 31 - github.com/kierank/herald/web/handlers.go:158.2,167.69 2 0 32 - github.com/kierank/herald/web/handlers.go:167.69,170.3 2 0 33 - github.com/kierank/herald/web/handlers.go:198.108,202.16 3 0 34 - github.com/kierank/herald/web/handlers.go:202.16,203.36 1 0 35 - github.com/kierank/herald/web/handlers.go:203.36,206.4 2 0 36 - github.com/kierank/herald/web/handlers.go:207.3,209.9 3 0 37 - github.com/kierank/herald/web/handlers.go:212.2,213.16 2 0 38 - github.com/kierank/herald/web/handlers.go:213.16,214.36 1 0 39 - github.com/kierank/herald/web/handlers.go:214.36,217.4 2 0 40 - github.com/kierank/herald/web/handlers.go:218.3,220.9 3 0 41 - github.com/kierank/herald/web/handlers.go:223.2,225.16 3 0 42 - github.com/kierank/herald/web/handlers.go:225.16,229.3 3 0 43 - github.com/kierank/herald/web/handlers.go:231.2,231.29 1 0 44 - github.com/kierank/herald/web/handlers.go:231.29,233.17 2 0 45 - github.com/kierank/herald/web/handlers.go:233.17,234.12 1 0 46 - github.com/kierank/herald/web/handlers.go:236.3,236.34 1 0 47 - github.com/kierank/herald/web/handlers.go:236.34,244.24 2 0 48 - github.com/kierank/herald/web/handlers.go:244.24,246.5 1 0 49 - github.com/kierank/herald/web/handlers.go:247.4,247.23 1 0 50 - github.com/kierank/herald/web/handlers.go:247.23,249.5 1 0 51 - github.com/kierank/herald/web/handlers.go:250.4,250.32 1 0 52 - github.com/kierank/herald/web/handlers.go:254.2,254.40 1 0 53 - github.com/kierank/herald/web/handlers.go:254.40,256.3 1 0 54 - github.com/kierank/herald/web/handlers.go:258.2,258.31 1 0 55 - github.com/kierank/herald/web/handlers.go:258.31,260.3 1 0 56 - github.com/kierank/herald/web/handlers.go:263.2,264.29 2 0 57 - github.com/kierank/herald/web/handlers.go:264.29,266.3 1 0 58 - github.com/kierank/herald/web/handlers.go:268.2,281.23 4 0 59 - github.com/kierank/herald/web/handlers.go:281.23,287.60 4 0 60 - github.com/kierank/herald/web/handlers.go:287.60,290.4 2 0 61 - github.com/kierank/herald/web/handlers.go:293.3,293.68 1 0 62 - github.com/kierank/herald/web/handlers.go:293.68,294.84 1 0 63 - github.com/kierank/herald/web/handlers.go:294.84,297.5 2 0 64 - github.com/kierank/herald/web/handlers.go:301.2,304.18 4 0 65 - github.com/kierank/herald/web/handlers.go:327.109,331.16 3 0 66 - github.com/kierank/herald/web/handlers.go:331.16,332.36 1 0 67 - github.com/kierank/herald/web/handlers.go:332.36,335.4 2 0 68 - github.com/kierank/herald/web/handlers.go:336.3,338.9 3 0 69 - github.com/kierank/herald/web/handlers.go:341.2,342.16 2 0 70 - github.com/kierank/herald/web/handlers.go:342.16,343.36 1 0 71 - github.com/kierank/herald/web/handlers.go:343.36,346.4 2 0 72 - github.com/kierank/herald/web/handlers.go:347.3,349.9 3 0 73 - github.com/kierank/herald/web/handlers.go:352.2,354.16 3 0 74 - github.com/kierank/herald/web/handlers.go:354.16,358.3 3 0 75 - github.com/kierank/herald/web/handlers.go:360.2,360.29 1 0 76 - github.com/kierank/herald/web/handlers.go:360.29,362.17 2 0 77 - github.com/kierank/herald/web/handlers.go:362.17,363.12 1 0 78 - github.com/kierank/herald/web/handlers.go:365.3,365.34 1 0 79 - github.com/kierank/herald/web/handlers.go:365.34,373.24 2 0 80 - github.com/kierank/herald/web/handlers.go:373.24,375.5 1 0 81 - github.com/kierank/herald/web/handlers.go:376.4,376.23 1 0 82 - github.com/kierank/herald/web/handlers.go:376.23,378.5 1 0 83 - github.com/kierank/herald/web/handlers.go:379.4,379.32 1 0 84 - github.com/kierank/herald/web/handlers.go:383.2,383.40 1 0 85 - github.com/kierank/herald/web/handlers.go:383.40,385.3 1 0 86 - github.com/kierank/herald/web/handlers.go:387.2,387.31 1 0 87 - github.com/kierank/herald/web/handlers.go:387.31,389.3 1 0 88 - github.com/kierank/herald/web/handlers.go:392.2,393.29 2 0 89 - github.com/kierank/herald/web/handlers.go:393.29,395.3 1 0 90 - github.com/kierank/herald/web/handlers.go:397.2,408.23 4 0 91 - github.com/kierank/herald/web/handlers.go:408.23,414.60 4 0 92 - github.com/kierank/herald/web/handlers.go:414.60,417.4 2 0 93 - github.com/kierank/herald/web/handlers.go:420.3,420.68 1 0 94 - github.com/kierank/herald/web/handlers.go:420.68,421.84 1 0 95 - github.com/kierank/herald/web/handlers.go:421.84,424.5 2 0 96 - github.com/kierank/herald/web/handlers.go:428.2,430.18 3 0 97 - github.com/kierank/herald/web/handlers.go:433.101,437.16 3 0 98 - github.com/kierank/herald/web/handlers.go:437.16,438.36 1 0 99 - github.com/kierank/herald/web/handlers.go:438.36,441.4 2 0 100 - github.com/kierank/herald/web/handlers.go:442.3,444.9 3 0 101 - github.com/kierank/herald/web/handlers.go:447.2,448.16 2 0 102 - github.com/kierank/herald/web/handlers.go:448.16,449.36 1 0 103 - github.com/kierank/herald/web/handlers.go:449.36,452.4 2 0 104 - github.com/kierank/herald/web/handlers.go:453.3,455.9 3 0 105 - github.com/kierank/herald/web/handlers.go:458.2,459.30 2 0 106 - github.com/kierank/herald/web/handlers.go:471.93,475.16 3 0 107 - github.com/kierank/herald/web/handlers.go:475.16,476.36 1 0 108 - github.com/kierank/herald/web/handlers.go:476.36,479.4 2 0 109 - github.com/kierank/herald/web/handlers.go:480.3,482.9 3 0 110 - github.com/kierank/herald/web/handlers.go:485.2,486.16 2 0 111 - github.com/kierank/herald/web/handlers.go:486.16,490.3 3 0 112 - github.com/kierank/herald/web/handlers.go:492.2,493.40 2 0 113 - github.com/kierank/herald/web/handlers.go:493.40,495.3 1 0 114 - github.com/kierank/herald/web/handlers.go:497.2,503.76 2 0 115 - github.com/kierank/herald/web/handlers.go:503.76,506.3 2 0 116 - github.com/kierank/herald/web/handlers.go:509.94,512.38 2 0 117 - github.com/kierank/herald/web/handlers.go:512.38,515.3 2 0 118 - github.com/kierank/herald/web/handlers.go:517.2,518.50 2 0 119 - github.com/kierank/herald/web/handlers.go:518.50,521.3 2 0 120 - github.com/kierank/herald/web/handlers.go:523.2,524.16 2 0 121 - github.com/kierank/herald/web/handlers.go:524.16,525.36 1 0 122 - github.com/kierank/herald/web/handlers.go:525.36,528.4 2 0 123 - github.com/kierank/herald/web/handlers.go:529.3,531.9 3 0 124 - github.com/kierank/herald/web/handlers.go:534.2,536.28 2 0 125 - github.com/kierank/herald/web/handlers.go:536.28,537.63 1 0 126 - github.com/kierank/herald/web/handlers.go:537.63,541.4 3 0 127 - github.com/kierank/herald/web/handlers.go:542.3,543.85 2 0 128 - github.com/kierank/herald/web/handlers.go:544.8,545.61 1 0 129 - github.com/kierank/herald/web/handlers.go:545.61,549.4 3 0 130 - github.com/kierank/herald/web/handlers.go:550.3,551.55 2 0 131 - github.com/kierank/herald/web/handlers.go:554.2,554.56 1 0 132 - github.com/kierank/herald/web/handlers.go:554.56,556.3 1 0 133 - github.com/kierank/herald/web/handlers.go:558.2,563.76 2 0 134 - github.com/kierank/herald/web/handlers.go:563.76,566.3 2 0 135 - github.com/kierank/herald/web/handlers.go:569.90,570.32 1 0 136 - github.com/kierank/herald/web/handlers.go:570.32,572.3 1 0 137 - github.com/kierank/herald/web/handlers.go:572.8,572.40 1 0 138 - github.com/kierank/herald/web/handlers.go:572.40,574.3 1 0 139 - github.com/kierank/herald/web/handlers.go:574.8,576.3 1 0 140 - github.com/kierank/herald/web/handlers.go:579.42,580.22 1 0 141 - github.com/kierank/herald/web/handlers.go:580.22,582.3 1 0 142 - github.com/kierank/herald/web/handlers.go:585.2,585.48 1 0 143 - github.com/kierank/herald/web/handlers.go:585.48,587.3 1 0 144 - github.com/kierank/herald/web/handlers.go:588.2,588.49 1 0 145 - github.com/kierank/herald/web/handlers.go:588.49,590.3 1 0 146 - github.com/kierank/herald/web/handlers.go:592.2,592.15 1 0 147 - github.com/kierank/herald/web/handlers.go:595.44,598.20 2 0 148 - github.com/kierank/herald/web/handlers.go:598.20,600.3 1 0 149 - github.com/kierank/herald/web/handlers.go:603.2,603.42 1 0 150 - github.com/kierank/herald/web/handlers.go:603.42,604.25 1 0 151 - github.com/kierank/herald/web/handlers.go:604.25,606.4 1 0 152 - github.com/kierank/herald/web/handlers.go:609.2,609.17 1 0 153 - github.com/kierank/herald/web/handlers.go:612.68,618.68 3 0 154 - github.com/kierank/herald/web/handlers.go:618.68,621.3 2 0 155 - github.com/kierank/herald/web/handlers.go:624.102,633.68 3 0 156 - github.com/kierank/herald/web/handlers.go:633.68,636.3 2 0 157 - github.com/kierank/herald/web/metrics.go:25.28,29.2 1 0 158 - github.com/kierank/herald/web/metrics.go:53.46,73.2 3 0 159 - github.com/kierank/herald/web/metrics.go:76.72,77.32 1 0 160 - github.com/kierank/herald/web/metrics.go:77.32,80.3 2 0 161 - github.com/kierank/herald/web/metrics.go:82.2,87.60 4 0 162 - github.com/kierank/herald/web/metrics.go:87.60,90.3 2 0 163 - github.com/kierank/herald/web/metrics.go:94.71,95.32 1 0 164 - github.com/kierank/herald/web/metrics.go:95.32,98.3 2 0 165 - github.com/kierank/herald/web/metrics.go:101.2,109.60 4 0 166 - github.com/kierank/herald/web/metrics.go:109.60,112.3 2 0 167 - github.com/kierank/herald/web/server.go:38.118,51.2 2 0 168 - github.com/kierank/herald/web/server.go:53.60,66.12 7 0 169 - github.com/kierank/herald/web/server.go:66.12,69.3 2 0 170 - github.com/kierank/herald/web/server.go:71.2,73.33 3 0 171 - github.com/kierank/herald/web/server.go:73.33,75.3 1 0 172 - github.com/kierank/herald/web/server.go:76.2,76.12 1 0 173 - github.com/kierank/herald/web/server.go:79.70,80.71 1 0 174 - github.com/kierank/herald/web/server.go:80.71,82.17 2 0 175 - github.com/kierank/herald/web/server.go:82.17,84.4 1 0 176 - github.com/kierank/herald/web/server.go:86.3,86.31 1 0 177 - github.com/kierank/herald/web/server.go:86.31,91.4 4 0 178 - github.com/kierank/herald/web/server.go:93.3,93.23 1 0 179 - github.com/kierank/herald/web/server.go:97.68,98.71 1 0 180 - github.com/kierank/herald/web/server.go:98.71,120.28 9 0 181 - github.com/kierank/herald/web/server.go:120.28,122.4 1 0 182 - github.com/kierank/herald/web/server.go:131.57,134.2 2 0 183 - github.com/kierank/herald/web/server.go:136.71,139.16 2 0 184 - github.com/kierank/herald/web/server.go:139.16,142.3 2 0 185 - github.com/kierank/herald/web/server.go:144.2,146.50 2 0 186 - github.com/kierank/herald/web/server.go:146.50,149.3 2 0 187 - github.com/kierank/herald/web/server.go:151.2,151.20 1 0 188 - github.com/kierank/herald/web/server.go:152.9,153.31 1 0 189 - github.com/kierank/herald/web/server.go:154.9,156.42 1 0 190 - github.com/kierank/herald/web/server.go:156.42,161.4 3 0 191 - github.com/kierank/herald/web/server.go:161.9,161.50 1 0 192 - github.com/kierank/herald/web/server.go:161.50,166.4 3 0 193 - github.com/kierank/herald/web/server.go:166.9,169.4 1 0 194 - github.com/kierank/herald/web/server.go:170.10,171.20 1 0 195 - github.com/kierank/herald/ssh/commands.go:31.118,33.19 2 0 196 - github.com/kierank/herald/ssh/commands.go:33.19,35.3 1 0 197 - github.com/kierank/herald/ssh/commands.go:37.2,39.16 2 0 198 - github.com/kierank/herald/ssh/commands.go:40.12,41.32 1 0 199 - github.com/kierank/herald/ssh/commands.go:42.13,43.19 1 0 200 - github.com/kierank/herald/ssh/commands.go:43.19,46.4 2 0 201 - github.com/kierank/herald/ssh/commands.go:47.3,47.41 1 0 202 - github.com/kierank/herald/ssh/commands.go:48.12,49.19 1 0 203 - github.com/kierank/herald/ssh/commands.go:49.19,52.4 2 0 204 - github.com/kierank/herald/ssh/commands.go:53.3,53.40 1 0 205 - github.com/kierank/herald/ssh/commands.go:54.18,55.19 1 0 206 - github.com/kierank/herald/ssh/commands.go:55.19,58.4 2 0 207 - github.com/kierank/herald/ssh/commands.go:59.3,59.46 1 0 208 - github.com/kierank/herald/ssh/commands.go:60.20,61.19 1 0 209 - github.com/kierank/herald/ssh/commands.go:61.19,64.4 2 0 210 - github.com/kierank/herald/ssh/commands.go:65.3,65.48 1 0 211 - github.com/kierank/herald/ssh/commands.go:66.13,67.19 1 0 212 - github.com/kierank/herald/ssh/commands.go:67.19,70.4 2 0 213 - github.com/kierank/herald/ssh/commands.go:71.3,71.48 1 0 214 - github.com/kierank/herald/ssh/commands.go:72.14,73.34 1 0 215 - github.com/kierank/herald/ssh/commands.go:74.10,76.89 2 0 216 - github.com/kierank/herald/ssh/commands.go:80.86,82.16 2 0 217 - github.com/kierank/herald/ssh/commands.go:82.16,85.3 2 0 218 - github.com/kierank/herald/ssh/commands.go:87.2,87.23 1 0 219 - github.com/kierank/herald/ssh/commands.go:87.23,90.3 2 0 220 - github.com/kierank/herald/ssh/commands.go:92.2,94.30 2 0 221 - github.com/kierank/herald/ssh/commands.go:94.30,97.17 3 0 222 - github.com/kierank/herald/ssh/commands.go:97.17,99.4 1 0 223 - github.com/kierank/herald/ssh/commands.go:101.3,102.24 2 0 224 - github.com/kierank/herald/ssh/commands.go:102.24,104.4 1 0 225 - github.com/kierank/herald/ssh/commands.go:106.3,110.4 1 0 226 - github.com/kierank/herald/ssh/commands.go:114.104,116.16 2 0 227 - github.com/kierank/herald/ssh/commands.go:116.16,119.3 2 0 228 - github.com/kierank/herald/ssh/commands.go:121.2,122.33 2 0 229 - github.com/kierank/herald/ssh/commands.go:125.103,127.16 2 0 230 - github.com/kierank/herald/ssh/commands.go:127.16,130.3 2 0 231 - github.com/kierank/herald/ssh/commands.go:132.2,132.63 1 0 232 - github.com/kierank/herald/ssh/commands.go:135.109,137.16 2 0 233 - github.com/kierank/herald/ssh/commands.go:137.16,140.3 2 0 234 - github.com/kierank/herald/ssh/commands.go:142.2,142.65 1 0 235 - github.com/kierank/herald/ssh/commands.go:145.111,147.16 2 0 236 - github.com/kierank/herald/ssh/commands.go:147.16,150.3 2 0 237 - github.com/kierank/herald/ssh/commands.go:152.2,152.67 1 0 238 - github.com/kierank/herald/ssh/commands.go:155.132,157.16 2 0 239 - github.com/kierank/herald/ssh/commands.go:157.16,160.3 2 0 240 - github.com/kierank/herald/ssh/commands.go:163.2,171.12 4 0 241 - github.com/kierank/herald/ssh/commands.go:171.12,173.7 2 0 242 - github.com/kierank/herald/ssh/commands.go:173.7,174.11 1 0 243 - github.com/kierank/herald/ssh/commands.go:175.16,176.11 1 0 244 - github.com/kierank/herald/ssh/commands.go:177.12,180.38 3 0 245 - github.com/kierank/herald/ssh/commands.go:186.2,186.12 1 0 246 - github.com/kierank/herald/ssh/commands.go:186.12,192.3 2 0 247 - github.com/kierank/herald/ssh/commands.go:195.2,199.20 4 0 248 - github.com/kierank/herald/ssh/commands.go:199.20,202.3 2 0 249 - github.com/kierank/herald/ssh/commands.go:204.2,204.20 1 0 250 - github.com/kierank/herald/ssh/commands.go:204.20,206.3 1 0 251 - github.com/kierank/herald/ssh/commands.go:206.8,208.3 1 0 252 - github.com/kierank/herald/ssh/commands.go:211.88,213.16 2 0 253 - github.com/kierank/herald/ssh/commands.go:213.16,216.3 2 0 254 - github.com/kierank/herald/ssh/commands.go:218.2,218.20 1 0 255 - github.com/kierank/herald/ssh/commands.go:218.20,221.3 2 0 256 - github.com/kierank/herald/ssh/commands.go:223.2,225.25 2 0 257 - github.com/kierank/herald/ssh/commands.go:225.25,227.35 2 0 258 - github.com/kierank/herald/ssh/commands.go:228.16,229.27 1 0 259 - github.com/kierank/herald/ssh/commands.go:230.15,231.29 1 0 260 - github.com/kierank/herald/ssh/commands.go:234.3,239.4 2 0 261 - github.com/kierank/herald/ssh/commands.go:243.45,247.14 3 0 262 - github.com/kierank/herald/ssh/commands.go:247.14,249.3 1 0 263 - github.com/kierank/herald/ssh/commands.go:251.2,251.24 1 0 264 - github.com/kierank/herald/ssh/commands.go:251.24,253.3 1 0 265 - github.com/kierank/herald/ssh/commands.go:254.2,254.22 1 0 266 - github.com/kierank/herald/ssh/commands.go:254.22,257.3 2 0 267 - github.com/kierank/herald/ssh/commands.go:258.2,258.25 1 0 268 - github.com/kierank/herald/ssh/commands.go:258.25,261.3 2 0 269 - github.com/kierank/herald/ssh/commands.go:263.2,264.39 2 0 270 - github.com/kierank/herald/ssh/scp.go:29.76,31.9 2 0 271 - github.com/kierank/herald/ssh/scp.go:31.9,33.3 1 0 272 - github.com/kierank/herald/ssh/scp.go:35.2,36.16 2 0 273 - github.com/kierank/herald/ssh/scp.go:36.16,38.3 1 0 274 - github.com/kierank/herald/ssh/scp.go:40.2,41.30 2 0 275 - github.com/kierank/herald/ssh/scp.go:41.30,43.59 2 0 276 - github.com/kierank/herald/ssh/scp.go:43.59,45.4 1 0 277 - github.com/kierank/herald/ssh/scp.go:47.2,47.21 1 0 278 - github.com/kierank/herald/ssh/scp.go:50.83,52.9 2 0 279 - github.com/kierank/herald/ssh/scp.go:52.9,54.3 1 0 280 - github.com/kierank/herald/ssh/scp.go:56.2,57.16 2 0 281 - github.com/kierank/herald/ssh/scp.go:57.16,59.3 1 0 282 - github.com/kierank/herald/ssh/scp.go:61.2,61.30 1 0 283 - github.com/kierank/herald/ssh/scp.go:61.30,63.76 2 0 284 - github.com/kierank/herald/ssh/scp.go:63.76,65.4 1 0 285 - github.com/kierank/herald/ssh/scp.go:67.2,67.12 1 0 286 - github.com/kierank/herald/ssh/scp.go:70.85,72.2 1 0 287 - github.com/kierank/herald/ssh/scp.go:74.101,76.9 2 0 288 - github.com/kierank/herald/ssh/scp.go:76.9,78.3 1 0 289 - github.com/kierank/herald/ssh/scp.go:80.2,81.16 2 0 290 - github.com/kierank/herald/ssh/scp.go:81.16,83.3 1 0 291 - github.com/kierank/herald/ssh/scp.go:85.2,96.24 3 0 292 - github.com/kierank/herald/ssh/scp.go:99.70,101.2 1 0 293 - github.com/kierank/herald/ssh/scp.go:103.80,107.9 3 0 294 - github.com/kierank/herald/ssh/scp.go:107.9,109.3 1 0 295 - github.com/kierank/herald/ssh/scp.go:112.2,112.58 1 0 296 - github.com/kierank/herald/ssh/scp.go:112.58,114.3 1 0 297 - github.com/kierank/herald/ssh/scp.go:117.2,117.28 1 0 298 - github.com/kierank/herald/ssh/scp.go:117.28,119.3 1 0 299 - github.com/kierank/herald/ssh/scp.go:121.2,122.38 2 0 300 - github.com/kierank/herald/ssh/scp.go:122.38,124.3 1 0 301 - github.com/kierank/herald/ssh/scp.go:126.2,127.16 2 0 302 - github.com/kierank/herald/ssh/scp.go:127.16,129.3 1 0 303 - github.com/kierank/herald/ssh/scp.go:131.2,132.16 2 0 304 - github.com/kierank/herald/ssh/scp.go:132.16,134.3 1 0 305 - github.com/kierank/herald/ssh/scp.go:136.2,136.48 1 0 306 - github.com/kierank/herald/ssh/scp.go:136.48,138.3 1 0 307 - github.com/kierank/herald/ssh/scp.go:140.2,143.61 2 0 308 - github.com/kierank/herald/ssh/scp.go:143.61,145.3 1 0 309 - github.com/kierank/herald/ssh/scp.go:147.2,148.16 2 0 310 - github.com/kierank/herald/ssh/scp.go:148.16,150.3 1 0 311 - github.com/kierank/herald/ssh/scp.go:153.2,154.16 2 0 312 - github.com/kierank/herald/ssh/scp.go:154.16,156.3 1 0 313 - github.com/kierank/herald/ssh/scp.go:157.2,159.71 2 0 314 - github.com/kierank/herald/ssh/scp.go:159.71,161.3 1 0 315 - github.com/kierank/herald/ssh/scp.go:161.8,163.3 1 0 316 - github.com/kierank/herald/ssh/scp.go:165.2,166.16 2 0 317 - github.com/kierank/herald/ssh/scp.go:166.16,168.3 1 0 318 - github.com/kierank/herald/ssh/scp.go:170.2,170.36 1 0 319 - github.com/kierank/herald/ssh/scp.go:170.36,171.87 1 0 320 - github.com/kierank/herald/ssh/scp.go:171.87,173.4 1 0 321 - github.com/kierank/herald/ssh/scp.go:176.2,176.36 1 0 322 - github.com/kierank/herald/ssh/scp.go:176.36,178.3 1 0 323 - github.com/kierank/herald/ssh/scp.go:180.2,181.33 2 0 324 - github.com/kierank/herald/ssh/scp.go:184.59,186.2 1 0 325 - github.com/kierank/herald/ssh/scp.go:192.46,192.71 1 0 326 - github.com/kierank/herald/ssh/scp.go:193.46,193.82 1 0 327 - github.com/kierank/herald/ssh/scp.go:194.46,194.61 1 0 328 - github.com/kierank/herald/ssh/scp.go:195.46,195.72 1 0 329 - github.com/kierank/herald/ssh/scp.go:196.46,196.62 1 0 330 - github.com/kierank/herald/ssh/scp.go:197.46,197.60 1 0 331 - github.com/kierank/herald/ssh/scp.go:203.54,203.78 1 0 332 - github.com/kierank/herald/ssh/scp.go:204.54,204.70 1 0 333 - github.com/kierank/herald/ssh/scp.go:205.54,205.78 1 0 334 - github.com/kierank/herald/ssh/scp.go:206.54,206.76 1 0 335 - github.com/kierank/herald/ssh/server.go:39.98,47.2 1 0 336 - github.com/kierank/herald/ssh/server.go:49.60,50.42 1 0 337 - github.com/kierank/herald/ssh/server.go:50.42,52.3 1 0 338 - github.com/kierank/herald/ssh/server.go:54.2,71.16 3 0 339 - github.com/kierank/herald/ssh/server.go:71.16,73.3 1 0 340 - github.com/kierank/herald/ssh/server.go:75.2,78.12 3 0 341 - github.com/kierank/herald/ssh/server.go:78.12,80.3 1 0 342 - github.com/kierank/herald/ssh/server.go:82.2,82.9 1 0 343 - github.com/kierank/herald/ssh/server.go:83.20,87.91 4 0 344 - github.com/kierank/herald/ssh/server.go:87.91,89.4 1 0 345 - github.com/kierank/herald/ssh/server.go:90.3,90.13 1 0 346 - github.com/kierank/herald/ssh/server.go:91.22,92.42 1 0 347 - github.com/kierank/herald/ssh/server.go:92.42,94.4 1 0 348 - github.com/kierank/herald/ssh/server.go:95.3,95.13 1 0 349 - github.com/kierank/herald/ssh/server.go:99.76,104.54 3 0 350 - github.com/kierank/herald/ssh/server.go:104.54,107.3 2 0 351 - github.com/kierank/herald/ssh/server.go:109.2,109.25 1 0 352 - github.com/kierank/herald/ssh/server.go:109.25,111.39 2 0 353 - github.com/kierank/herald/ssh/server.go:111.39,112.22 1 0 354 - github.com/kierank/herald/ssh/server.go:112.22,114.10 2 0 355 - github.com/kierank/herald/ssh/server.go:117.3,117.15 1 0 356 - github.com/kierank/herald/ssh/server.go:117.15,120.4 2 0 357 - github.com/kierank/herald/ssh/server.go:123.2,124.16 2 0 358 - github.com/kierank/herald/ssh/server.go:124.16,127.3 2 0 359 - github.com/kierank/herald/ssh/server.go:129.2,132.13 4 0 360 - github.com/kierank/herald/ssh/server.go:135.66,136.32 1 0 361 - github.com/kierank/herald/ssh/server.go:136.32,141.10 4 0 362 - github.com/kierank/herald/ssh/server.go:141.10,144.4 2 0 363 - github.com/kierank/herald/ssh/server.go:147.3,147.20 1 0 364 - github.com/kierank/herald/ssh/server.go:147.20,150.4 2 0 365 - github.com/kierank/herald/ssh/server.go:153.3,153.38 1 0 366 - github.com/kierank/herald/ssh/server.go:153.38,157.4 3 0 367 - github.com/kierank/herald/ssh/server.go:160.3,160.60 1 0 368 - github.com/kierank/herald/ssh/server.go:164.68,178.2 13 0 369 - github.com/kierank/herald/ssh/server.go:180.40,181.54 1 0 370 - github.com/kierank/herald/ssh/server.go:181.54,183.3 1 0 371 - github.com/kierank/herald/ssh/server.go:183.8,183.44 1 0 372 - github.com/kierank/herald/ssh/server.go:183.44,185.3 1 0 373 - github.com/kierank/herald/ssh/server.go:187.2,190.16 3 0 374 - github.com/kierank/herald/ssh/server.go:190.16,192.3 1 0 375 - github.com/kierank/herald/ssh/server.go:194.2,195.16 2 0 376 - github.com/kierank/herald/ssh/server.go:195.16,197.3 1 0 377 - github.com/kierank/herald/ssh/server.go:199.2,200.72 2 0 378 - github.com/kierank/herald/ssh/server.go:200.72,202.3 1 0 379 - github.com/kierank/herald/ssh/server.go:204.2,204.12 1 0 380 - github.com/kierank/herald/ssh/sftp.go:18.98,19.29 1 0 381 - github.com/kierank/herald/ssh/sftp.go:19.29,21.10 2 0 382 - github.com/kierank/herald/ssh/sftp.go:21.10,24.4 2 0 383 - github.com/kierank/herald/ssh/sftp.go:26.3,41.43 3 0 384 - github.com/kierank/herald/ssh/sftp.go:41.43,43.4 1 0 385 - github.com/kierank/herald/ssh/sftp.go:43.9,43.24 1 0 386 - github.com/kierank/herald/ssh/sftp.go:43.24,45.4 1 0 387 - github.com/kierank/herald/ssh/sftp.go:58.70,60.39 2 0 388 - github.com/kierank/herald/ssh/sftp.go:60.39,62.3 1 0 389 - github.com/kierank/herald/ssh/sftp.go:64.2,65.16 2 0 390 - github.com/kierank/herald/ssh/sftp.go:65.16,67.3 1 0 391 - github.com/kierank/herald/ssh/sftp.go:69.2,69.55 1 0 392 - github.com/kierank/herald/ssh/sftp.go:73.71,75.39 2 0 393 - github.com/kierank/herald/ssh/sftp.go:75.39,77.3 1 0 394 - github.com/kierank/herald/ssh/sftp.go:79.2,79.42 1 0 395 - github.com/kierank/herald/ssh/sftp.go:79.42,81.3 1 0 396 - github.com/kierank/herald/ssh/sftp.go:83.2,89.8 2 0 397 - github.com/kierank/herald/ssh/sftp.go:93.54,96.18 2 0 398 - github.com/kierank/herald/ssh/sftp.go:97.17,99.13 1 0 399 - github.com/kierank/herald/ssh/sftp.go:100.16,101.40 1 0 400 - github.com/kierank/herald/ssh/sftp.go:101.40,103.4 1 0 401 - github.com/kierank/herald/ssh/sftp.go:104.3,104.72 1 0 402 - github.com/kierank/herald/ssh/sftp.go:105.16,106.44 1 0 403 - github.com/kierank/herald/ssh/sftp.go:107.24,108.49 1 0 404 - github.com/kierank/herald/ssh/sftp.go:109.10,110.36 1 0 405 - github.com/kierank/herald/ssh/sftp.go:115.72,116.18 1 0 406 - github.com/kierank/herald/ssh/sftp.go:117.14,119.17 2 0 407 - github.com/kierank/herald/ssh/sftp.go:119.17,121.4 1 0 408 - github.com/kierank/herald/ssh/sftp.go:122.3,123.31 2 0 409 - github.com/kierank/herald/ssh/sftp.go:123.31,125.4 1 0 410 - github.com/kierank/herald/ssh/sftp.go:126.3,126.30 1 0 411 - github.com/kierank/herald/ssh/sftp.go:127.14,129.59 2 0 412 - github.com/kierank/herald/ssh/sftp.go:129.59,132.4 1 0 413 - github.com/kierank/herald/ssh/sftp.go:133.3,134.17 2 0 414 - github.com/kierank/herald/ssh/sftp.go:134.17,136.4 1 0 415 - github.com/kierank/herald/ssh/sftp.go:137.3,137.50 1 0 416 - github.com/kierank/herald/ssh/sftp.go:138.10,139.41 1 0 417 - github.com/kierank/herald/ssh/sftp.go:149.66,152.28 2 0 418 - github.com/kierank/herald/ssh/sftp.go:152.28,156.3 3 0 419 - github.com/kierank/herald/ssh/sftp.go:157.2,158.20 2 0 420 - github.com/kierank/herald/ssh/sftp.go:161.38,165.16 3 0 421 - github.com/kierank/herald/ssh/sftp.go:165.16,167.3 1 0 422 - github.com/kierank/herald/ssh/sftp.go:169.2,169.48 1 0 423 - github.com/kierank/herald/ssh/sftp.go:169.48,171.3 1 0 424 - github.com/kierank/herald/ssh/sftp.go:173.2,174.16 2 0 425 - github.com/kierank/herald/ssh/sftp.go:174.16,176.3 1 0 426 - github.com/kierank/herald/ssh/sftp.go:178.2,179.89 2 0 427 - github.com/kierank/herald/ssh/sftp.go:179.89,181.3 1 0 428 - github.com/kierank/herald/ssh/sftp.go:183.2,184.16 2 0 429 - github.com/kierank/herald/ssh/sftp.go:184.16,186.3 1 0 430 - github.com/kierank/herald/ssh/sftp.go:188.2,188.36 1 0 431 - github.com/kierank/herald/ssh/sftp.go:188.36,189.89 1 0 432 - github.com/kierank/herald/ssh/sftp.go:189.89,191.4 1 0 433 - github.com/kierank/herald/ssh/sftp.go:194.2,195.12 2 0 434 - github.com/kierank/herald/ssh/sftp.go:202.66,203.31 1 0 435 - github.com/kierank/herald/ssh/sftp.go:203.31,205.3 1 0 436 - github.com/kierank/herald/ssh/sftp.go:206.2,207.16 2 0 437 - github.com/kierank/herald/ssh/sftp.go:207.16,209.3 1 0 438 - github.com/kierank/herald/ssh/sftp.go:210.2,210.15 1 0 439 - github.com/kierank/herald/ssh/sftp.go:215.71,216.29 1 0 440 - github.com/kierank/herald/ssh/sftp.go:216.29,218.3 1 0 441 - github.com/kierank/herald/ssh/sftp.go:219.2,220.17 2 0 442 - github.com/kierank/herald/ssh/sftp.go:220.17,222.3 1 0 443 - github.com/kierank/herald/ssh/sftp.go:223.2,223.15 1 0 444 - github.com/kierank/herald/ssh/sftp.go:228.39,228.53 1 0 445 - github.com/kierank/herald/ssh/sftp.go:229.39,229.51 1 0 446 - github.com/kierank/herald/ssh/sftp.go:230.39,230.67 1 0 447 - github.com/kierank/herald/ssh/sftp.go:231.39,231.60 1 0 448 - github.com/kierank/herald/ssh/sftp.go:232.39,232.54 1 0 449 - github.com/kierank/herald/ssh/sftp.go:233.39,233.53 1 0 450 - github.com/kierank/herald/scheduler/fetch.go:36.68,42.21 2 0 451 - github.com/kierank/herald/scheduler/fetch.go:42.21,44.3 1 0 452 - github.com/kierank/herald/scheduler/fetch.go:46.2,50.16 4 0 453 - github.com/kierank/herald/scheduler/fetch.go:50.16,53.3 2 0 454 - github.com/kierank/herald/scheduler/fetch.go:55.2,57.47 2 0 455 - github.com/kierank/herald/scheduler/fetch.go:57.47,59.3 1 0 456 - github.com/kierank/herald/scheduler/fetch.go:60.2,60.63 1 0 457 - github.com/kierank/herald/scheduler/fetch.go:60.63,62.3 1 0 458 - github.com/kierank/herald/scheduler/fetch.go:64.2,69.16 3 0 459 - github.com/kierank/herald/scheduler/fetch.go:69.16,72.3 2 0 460 - github.com/kierank/herald/scheduler/fetch.go:73.2,75.47 2 0 461 - github.com/kierank/herald/scheduler/fetch.go:75.47,77.3 1 0 462 - github.com/kierank/herald/scheduler/fetch.go:79.2,79.38 1 0 463 - github.com/kierank/herald/scheduler/fetch.go:79.38,82.3 2 0 464 - github.com/kierank/herald/scheduler/fetch.go:84.2,89.16 5 0 465 - github.com/kierank/herald/scheduler/fetch.go:89.16,92.3 2 0 466 - github.com/kierank/herald/scheduler/fetch.go:94.2,94.53 1 0 467 - github.com/kierank/herald/scheduler/fetch.go:94.53,96.3 1 0 468 - github.com/kierank/herald/scheduler/fetch.go:98.2,98.40 1 0 469 - github.com/kierank/herald/scheduler/fetch.go:98.40,105.29 2 0 470 - github.com/kierank/herald/scheduler/fetch.go:105.29,107.4 1 0 471 - github.com/kierank/herald/scheduler/fetch.go:109.3,109.25 1 0 472 - github.com/kierank/herald/scheduler/fetch.go:109.25,111.4 1 0 473 - github.com/kierank/herald/scheduler/fetch.go:111.9,111.36 1 0 474 - github.com/kierank/herald/scheduler/fetch.go:111.36,113.4 1 0 475 - github.com/kierank/herald/scheduler/fetch.go:115.3,115.34 1 0 476 - github.com/kierank/herald/scheduler/fetch.go:115.34,117.4 1 0 477 - github.com/kierank/herald/scheduler/fetch.go:117.9,117.39 1 0 478 - github.com/kierank/herald/scheduler/fetch.go:117.39,119.4 1 0 479 - github.com/kierank/herald/scheduler/fetch.go:121.3,121.51 1 0 480 - github.com/kierank/herald/scheduler/fetch.go:124.2,124.15 1 0 481 - github.com/kierank/herald/scheduler/fetch.go:127.74,132.29 4 0 482 - github.com/kierank/herald/scheduler/fetch.go:132.29,134.3 1 0 483 - github.com/kierank/herald/scheduler/fetch.go:135.2,137.29 2 0 484 - github.com/kierank/herald/scheduler/fetch.go:137.29,139.35 2 0 485 - github.com/kierank/herald/scheduler/fetch.go:139.35,142.17 3 0 486 - github.com/kierank/herald/scheduler/fetch.go:142.17,142.32 1 0 487 - github.com/kierank/herald/scheduler/fetch.go:143.4,143.36 1 0 488 - github.com/kierank/herald/scheduler/fetch.go:147.2,148.16 2 0 489 - github.com/kierank/herald/scheduler/fetch.go:155.36,157.2 1 0 490 - github.com/kierank/herald/scheduler/scheduler.go:39.128,48.2 1 0 491 - github.com/kierank/herald/scheduler/scheduler.go:50.48,63.6 7 0 492 - github.com/kierank/herald/scheduler/scheduler.go:63.6,64.10 1 0 493 - github.com/kierank/herald/scheduler/scheduler.go:65.21,67.10 2 0 494 - github.com/kierank/herald/scheduler/scheduler.go:68.19,69.15 1 0 495 - github.com/kierank/herald/scheduler/scheduler.go:70.26,71.30 1 0 496 - github.com/kierank/herald/scheduler/scheduler.go:76.62,77.15 1 0 497 - github.com/kierank/herald/scheduler/scheduler.go:77.15,78.31 1 0 498 - github.com/kierank/herald/scheduler/scheduler.go:78.31,80.4 1 0 499 - github.com/kierank/herald/scheduler/scheduler.go:83.2,84.16 2 0 500 - github.com/kierank/herald/scheduler/scheduler.go:84.16,87.3 2 0 501 - github.com/kierank/herald/scheduler/scheduler.go:88.2,88.17 1 0 502 - github.com/kierank/herald/scheduler/scheduler.go:88.17,90.3 1 0 503 - github.com/kierank/herald/scheduler/scheduler.go:93.47,94.15 1 0 504 - github.com/kierank/herald/scheduler/scheduler.go:94.15,95.31 1 0 505 - github.com/kierank/herald/scheduler/scheduler.go:95.31,97.4 1 0 506 - github.com/kierank/herald/scheduler/scheduler.go:100.2,102.16 3 0 507 - github.com/kierank/herald/scheduler/scheduler.go:102.16,105.3 2 0 508 - github.com/kierank/herald/scheduler/scheduler.go:107.2,107.30 1 0 509 - github.com/kierank/herald/scheduler/scheduler.go:107.30,108.51 1 0 510 - github.com/kierank/herald/scheduler/scheduler.go:108.51,111.4 2 0 511 - github.com/kierank/herald/scheduler/scheduler.go:115.78,117.16 2 0 512 - github.com/kierank/herald/scheduler/scheduler.go:117.16,119.3 1 0 513 - github.com/kierank/herald/scheduler/scheduler.go:121.2,122.16 2 0 514 - github.com/kierank/herald/scheduler/scheduler.go:122.16,124.3 1 0 515 - github.com/kierank/herald/scheduler/scheduler.go:126.2,126.21 1 0 516 - github.com/kierank/herald/scheduler/scheduler.go:126.21,128.3 1 0 517 - github.com/kierank/herald/scheduler/scheduler.go:130.2,133.16 3 0 518 - github.com/kierank/herald/scheduler/scheduler.go:133.16,135.3 1 0 519 - github.com/kierank/herald/scheduler/scheduler.go:137.2,137.18 1 0 520 - github.com/kierank/herald/scheduler/scheduler.go:137.18,138.90 1 0 521 - github.com/kierank/herald/scheduler/scheduler.go:138.90,140.4 1 0 522 - github.com/kierank/herald/scheduler/scheduler.go:141.3,141.66 1 0 523 - github.com/kierank/herald/scheduler/scheduler.go:145.2,145.33 1 0 524 - github.com/kierank/herald/scheduler/scheduler.go:145.33,146.53 1 0 525 - github.com/kierank/herald/scheduler/scheduler.go:146.53,147.106 1 0 526 - github.com/kierank/herald/scheduler/scheduler.go:147.106,149.5 1 0 527 - github.com/kierank/herald/scheduler/scheduler.go:153.2,155.16 3 0 528 - github.com/kierank/herald/scheduler/scheduler.go:155.16,157.3 1 0 529 - github.com/kierank/herald/scheduler/scheduler.go:159.2,159.73 1 0 530 - github.com/kierank/herald/scheduler/scheduler.go:159.73,161.3 1 0 531 - github.com/kierank/herald/scheduler/scheduler.go:163.2,165.22 2 0 532 - github.com/kierank/herald/scheduler/scheduler.go:168.114,174.33 5 0 533 - github.com/kierank/herald/scheduler/scheduler.go:174.33,175.26 1 0 534 - github.com/kierank/herald/scheduler/scheduler.go:175.26,178.12 3 0 535 - github.com/kierank/herald/scheduler/scheduler.go:182.3,183.37 2 0 536 - github.com/kierank/herald/scheduler/scheduler.go:183.37,184.65 1 0 537 - github.com/kierank/herald/scheduler/scheduler.go:184.65,185.13 1 0 538 - github.com/kierank/herald/scheduler/scheduler.go:187.4,187.36 1 0 539 - github.com/kierank/herald/scheduler/scheduler.go:191.3,192.17 2 0 540 - github.com/kierank/herald/scheduler/scheduler.go:192.17,194.12 2 0 541 - github.com/kierank/herald/scheduler/scheduler.go:198.3,199.37 2 0 542 - github.com/kierank/herald/scheduler/scheduler.go:199.37,200.65 1 0 543 - github.com/kierank/herald/scheduler/scheduler.go:200.65,201.13 1 0 544 - github.com/kierank/herald/scheduler/scheduler.go:204.4,204.27 1 0 545 - github.com/kierank/herald/scheduler/scheduler.go:204.27,211.5 1 0 546 - github.com/kierank/herald/scheduler/scheduler.go:214.3,214.24 1 0 547 - github.com/kierank/herald/scheduler/scheduler.go:214.24,216.22 2 0 548 - github.com/kierank/herald/scheduler/scheduler.go:216.22,218.5 1 0 549 - github.com/kierank/herald/scheduler/scheduler.go:219.4,224.29 2 0 550 - github.com/kierank/herald/scheduler/scheduler.go:228.2,228.32 1 0 551 - github.com/kierank/herald/scheduler/scheduler.go:228.32,230.3 1 0 552 - github.com/kierank/herald/scheduler/scheduler.go:232.2,232.34 1 0 553 - github.com/kierank/herald/scheduler/scheduler.go:235.157,243.34 3 0 554 - github.com/kierank/herald/scheduler/scheduler.go:243.34,245.3 1 0 555 - github.com/kierank/herald/scheduler/scheduler.go:247.2,248.16 2 0 556 - github.com/kierank/herald/scheduler/scheduler.go:248.16,250.3 1 0 557 - github.com/kierank/herald/scheduler/scheduler.go:252.2,253.16 2 0 558 - github.com/kierank/herald/scheduler/scheduler.go:253.16,256.3 2 0 559 - github.com/kierank/herald/scheduler/scheduler.go:258.2,260.16 3 0 560 - github.com/kierank/herald/scheduler/scheduler.go:260.16,262.3 1 0 561 - github.com/kierank/herald/scheduler/scheduler.go:262.8,264.3 1 0 562 - github.com/kierank/herald/scheduler/scheduler.go:267.2,267.63 1 0 563 - github.com/kierank/herald/scheduler/scheduler.go:267.63,269.3 1 0 564 - github.com/kierank/herald/scheduler/scheduler.go:272.2,273.16 2 0 565 - github.com/kierank/herald/scheduler/scheduler.go:273.16,275.3 1 0 566 - github.com/kierank/herald/scheduler/scheduler.go:276.2,279.33 2 0 567 - github.com/kierank/herald/scheduler/scheduler.go:279.33,280.26 1 0 568 - github.com/kierank/herald/scheduler/scheduler.go:280.26,281.12 1 0 569 - github.com/kierank/herald/scheduler/scheduler.go:283.3,283.37 1 0 570 - github.com/kierank/herald/scheduler/scheduler.go:283.37,284.107 1 0 571 - github.com/kierank/herald/scheduler/scheduler.go:284.107,286.5 1 0 572 - github.com/kierank/herald/scheduler/scheduler.go:291.2,292.104 2 0 573 - github.com/kierank/herald/scheduler/scheduler.go:292.104,294.3 1 0 574 - github.com/kierank/herald/scheduler/scheduler.go:297.2,297.36 1 0 575 - github.com/kierank/herald/scheduler/scheduler.go:297.36,299.3 1 0 576 - github.com/kierank/herald/scheduler/scheduler.go:301.2,301.12 1 0 577 - github.com/kierank/herald/scheduler/scheduler.go:304.81,308.16 3 0 578 - github.com/kierank/herald/scheduler/scheduler.go:308.16,310.3 1 0 579 - github.com/kierank/herald/scheduler/scheduler.go:312.2,312.21 1 0 580 - github.com/kierank/herald/scheduler/scheduler.go:312.21,315.3 2 0 581 - github.com/kierank/herald/scheduler/scheduler.go:317.2,320.16 3 0 582 - github.com/kierank/herald/scheduler/scheduler.go:320.16,322.3 1 0 583 - github.com/kierank/herald/scheduler/scheduler.go:324.2,324.18 1 0 584 - github.com/kierank/herald/scheduler/scheduler.go:324.18,325.90 1 0 585 - github.com/kierank/herald/scheduler/scheduler.go:325.90,327.4 1 0 586 - github.com/kierank/herald/scheduler/scheduler.go:328.3,328.66 1 0 587 - github.com/kierank/herald/scheduler/scheduler.go:329.8,331.3 1 0 588 - github.com/kierank/herald/scheduler/scheduler.go:334.2,334.33 1 0 589 - github.com/kierank/herald/scheduler/scheduler.go:334.33,335.53 1 0 590 - github.com/kierank/herald/scheduler/scheduler.go:335.53,336.106 1 0 591 - github.com/kierank/herald/scheduler/scheduler.go:336.106,338.5 1 0 592 - github.com/kierank/herald/scheduler/scheduler.go:342.2,344.16 3 0 593 - github.com/kierank/herald/scheduler/scheduler.go:344.16,346.3 1 0 594 - github.com/kierank/herald/scheduler/scheduler.go:348.2,348.73 1 0 595 - github.com/kierank/herald/scheduler/scheduler.go:348.73,350.3 1 0 596 - github.com/kierank/herald/scheduler/scheduler.go:352.2,354.12 2 0 597 - github.com/kierank/herald/email/render.go:38.13,41.16 3 0 598 - github.com/kierank/herald/email/render.go:41.16,42.57 1 0 599 - github.com/kierank/herald/email/render.go:44.2,45.16 2 0 600 - github.com/kierank/herald/email/render.go:45.16,46.57 1 0 601 - github.com/kierank/herald/email/render.go:50.88,61.60 3 0 602 - github.com/kierank/herald/email/render.go:61.60,63.3 1 0 603 - github.com/kierank/herald/email/render.go:65.2,65.60 1 0 604 - github.com/kierank/herald/email/render.go:65.60,67.3 1 0 605 - github.com/kierank/herald/email/render.go:69.2,69.48 1 0 606 - github.com/kierank/herald/email/send.go:26.61,31.2 1 0 607 - github.com/kierank/herald/email/send.go:34.41,38.42 3 0 608 - github.com/kierank/herald/email/send.go:38.42,40.3 1 0 609 - github.com/kierank/herald/email/send.go:43.2,43.23 1 0 610 - github.com/kierank/herald/email/send.go:43.23,49.17 3 0 611 - github.com/kierank/herald/email/send.go:49.17,51.4 1 0 612 - github.com/kierank/herald/email/send.go:52.3,55.17 3 0 613 - github.com/kierank/herald/email/send.go:55.17,57.4 1 0 614 - github.com/kierank/herald/email/send.go:58.3,60.18 2 0 615 - github.com/kierank/herald/email/send.go:60.18,61.43 1 0 616 - github.com/kierank/herald/email/send.go:61.43,63.5 1 0 617 - github.com/kierank/herald/email/send.go:66.3,66.23 1 0 618 - github.com/kierank/herald/email/send.go:70.2,71.16 2 0 619 - github.com/kierank/herald/email/send.go:71.16,73.3 1 0 620 - github.com/kierank/herald/email/send.go:74.2,77.16 3 0 621 - github.com/kierank/herald/email/send.go:77.16,79.3 1 0 622 - github.com/kierank/herald/email/send.go:80.2,86.50 3 0 623 - github.com/kierank/herald/email/send.go:86.50,88.3 1 0 624 - github.com/kierank/herald/email/send.go:90.2,90.17 1 0 625 - github.com/kierank/herald/email/send.go:90.17,91.42 1 0 626 - github.com/kierank/herald/email/send.go:91.42,93.4 1 0 627 - github.com/kierank/herald/email/send.go:96.2,96.22 1 0 628 - github.com/kierank/herald/email/send.go:99.95,108.44 5 0 629 - github.com/kierank/herald/email/send.go:108.44,112.25 3 0 630 - github.com/kierank/herald/email/send.go:112.25,115.4 2 0 631 - github.com/kierank/herald/email/send.go:117.3,117.23 1 0 632 - github.com/kierank/herald/email/send.go:117.23,119.26 2 0 633 - github.com/kierank/herald/email/send.go:119.26,122.5 2 0 634 - github.com/kierank/herald/email/send.go:123.4,124.70 2 0 635 - github.com/kierank/herald/email/send.go:127.3,129.44 3 0 636 - github.com/kierank/herald/email/send.go:132.2,140.22 7 0 637 - github.com/kierank/herald/email/send.go:140.22,144.3 3 0 638 - github.com/kierank/herald/email/send.go:146.2,147.28 2 0 639 - github.com/kierank/herald/email/send.go:147.28,149.3 1 0 640 - github.com/kierank/herald/email/send.go:150.2,169.42 16 0 641 - github.com/kierank/herald/email/send.go:169.42,171.3 1 0 642 - github.com/kierank/herald/email/send.go:173.2,173.23 1 0 643 - github.com/kierank/herald/email/send.go:173.23,175.3 1 0 644 - github.com/kierank/herald/email/send.go:177.2,177.82 1 0 645 - github.com/kierank/herald/email/send.go:180.45,186.2 5 0 646 - github.com/kierank/herald/email/send.go:188.81,194.16 3 0 647 - github.com/kierank/herald/email/send.go:194.16,196.3 1 0 648 - github.com/kierank/herald/email/send.go:197.2,200.16 3 0 649 - github.com/kierank/herald/email/send.go:200.16,202.3 1 0 650 - github.com/kierank/herald/email/send.go:203.2,205.17 2 0 651 - github.com/kierank/herald/email/send.go:205.17,206.42 1 0 652 - github.com/kierank/herald/email/send.go:206.42,208.4 1 0 653 - github.com/kierank/herald/email/send.go:211.2,211.47 1 0 654 - github.com/kierank/herald/email/send.go:211.47,213.3 1 0 655 - github.com/kierank/herald/email/send.go:215.2,215.39 1 0 656 - github.com/kierank/herald/email/send.go:215.39,217.3 1 0 657 - github.com/kierank/herald/email/send.go:219.2,220.16 2 0 658 - github.com/kierank/herald/email/send.go:220.16,222.3 1 0 659 - github.com/kierank/herald/email/send.go:224.2,224.47 1 0 660 - github.com/kierank/herald/email/send.go:224.47,226.3 1 0 661 - github.com/kierank/herald/email/send.go:228.2,228.33 1 0 662 - github.com/kierank/herald/email/send.go:228.33,230.3 1 0 663 - github.com/kierank/herald/email/send.go:232.2,232.22 1 0 664 - github.com/kierank/herald/main.go:30.13,53.16 6 0 665 - github.com/kierank/herald/main.go:53.16,55.3 1 0 666 - github.com/kierank/herald/main.go:58.32,62.55 1 0 667 - github.com/kierank/herald/main.go:62.55,64.4 1 0 668 - github.com/kierank/herald/main.go:68.31,74.55 1 0 669 - github.com/kierank/herald/main.go:74.55,76.21 2 0 670 - github.com/kierank/herald/main.go:76.21,78.5 1 0 671 - github.com/kierank/herald/main.go:80.4,80.43 1 0 672 - github.com/kierank/herald/main.go:80.43,82.5 1 0 673 - github.com/kierank/herald/main.go:84.4,117.73 2 0 674 - github.com/kierank/herald/main.go:117.73,119.5 1 0 675 - github.com/kierank/herald/main.go:121.4,122.14 2 0 676 - github.com/kierank/herald/main.go:127.43,129.16 2 0 677 - github.com/kierank/herald/main.go:129.16,131.3 1 0 678 - github.com/kierank/herald/main.go:133.2,140.16 3 0 679 - github.com/kierank/herald/main.go:140.16,142.3 1 0 680 - github.com/kierank/herald/main.go:143.2,145.37 2 0 681 - github.com/kierank/herald/main.go:145.37,147.3 1 0 682 - github.com/kierank/herald/main.go:149.2,158.48 2 0 683 - github.com/kierank/herald/main.go:158.48,160.3 1 0 684 - github.com/kierank/herald/main.go:162.2,174.33 4 0 685 - github.com/kierank/herald/main.go:174.33,176.46 2 0 686 - github.com/kierank/herald/main.go:176.46,178.4 1 0 687 - github.com/kierank/herald/main.go:178.9,180.4 1 0 688 - github.com/kierank/herald/main.go:183.2,187.20 3 0 689 - github.com/kierank/herald/main.go:187.20,189.3 1 0 690 - github.com/kierank/herald/main.go:191.2,191.20 1 0 691 - github.com/kierank/herald/main.go:191.20,193.3 1 0 692 - github.com/kierank/herald/main.go:195.2,195.20 1 0 693 - github.com/kierank/herald/main.go:195.20,196.16 1 0 694 - github.com/kierank/herald/main.go:196.16,197.32 1 0 695 - github.com/kierank/herald/main.go:197.32,199.5 1 0 696 - github.com/kierank/herald/main.go:201.3,202.13 2 0 697 - github.com/kierank/herald/main.go:205.2,205.17 1 0 698 - github.com/kierank/herald/config/app.go:35.36,50.2 1 0 699 - github.com/kierank/herald/config/app.go:52.53,56.49 2 0 700 - github.com/kierank/herald/config/app.go:56.49,58.3 1 0 701 - github.com/kierank/herald/config/app.go:60.2,60.16 1 0 702 - github.com/kierank/herald/config/app.go:60.16,62.17 2 0 703 - github.com/kierank/herald/config/app.go:62.17,64.4 1 0 704 - github.com/kierank/herald/config/app.go:66.3,66.63 1 0 705 - github.com/kierank/herald/config/app.go:66.63,68.4 1 0 706 - github.com/kierank/herald/config/app.go:70.3,70.63 1 0 707 - github.com/kierank/herald/config/app.go:70.63,72.4 1 0 708 - github.com/kierank/herald/config/app.go:75.2,78.30 2 0 709 - github.com/kierank/herald/config/app.go:78.30,80.3 1 0 710 - github.com/kierank/herald/config/app.go:82.2,82.17 1 0 711 - github.com/kierank/herald/config/app.go:86.44,88.22 1 0 712 - github.com/kierank/herald/config/app.go:88.22,91.45 3 0 713 - github.com/kierank/herald/config/app.go:91.45,93.4 1 0 714 - github.com/kierank/herald/config/app.go:97.2,97.43 1 0 715 - github.com/kierank/herald/config/app.go:97.43,99.3 1 0 716 - github.com/kierank/herald/config/app.go:101.2,101.11 1 0 717 - github.com/kierank/herald/config/app.go:104.40,105.44 1 0 718 - github.com/kierank/herald/config/app.go:105.44,107.3 1 0 719 - github.com/kierank/herald/config/app.go:108.2,108.48 1 0 720 - github.com/kierank/herald/config/app.go:108.48,109.47 1 0 721 - github.com/kierank/herald/config/app.go:109.47,111.4 1 0 722 - github.com/kierank/herald/config/app.go:113.2,113.57 1 0 723 - github.com/kierank/herald/config/app.go:113.57,114.47 1 0 724 - github.com/kierank/herald/config/app.go:114.47,116.4 1 0 725 - github.com/kierank/herald/config/app.go:118.2,118.49 1 0 726 - github.com/kierank/herald/config/app.go:118.49,119.47 1 0 727 - github.com/kierank/herald/config/app.go:119.47,121.4 1 0 728 - github.com/kierank/herald/config/app.go:123.2,123.53 1 0 729 - github.com/kierank/herald/config/app.go:123.53,125.3 1 0 730 - github.com/kierank/herald/config/app.go:126.2,126.47 1 0 731 - github.com/kierank/herald/config/app.go:126.47,128.3 1 0 732 - github.com/kierank/herald/config/app.go:129.2,129.49 1 0 733 - github.com/kierank/herald/config/app.go:129.49,131.3 1 0 734 - github.com/kierank/herald/config/app.go:132.2,132.49 1 0 735 - github.com/kierank/herald/config/app.go:132.49,133.47 1 0 736 - github.com/kierank/herald/config/app.go:133.47,135.4 1 0 737 - github.com/kierank/herald/config/app.go:137.2,137.49 1 0 738 - github.com/kierank/herald/config/app.go:137.49,139.3 1 0 739 - github.com/kierank/herald/config/app.go:140.2,140.49 1 0 740 - github.com/kierank/herald/config/app.go:140.49,142.3 1 0 741 - github.com/kierank/herald/config/app.go:143.2,143.49 1 0 742 - github.com/kierank/herald/config/app.go:143.49,145.3 1 0 743 - github.com/kierank/herald/config/app.go:146.2,146.54 1 0 744 - github.com/kierank/herald/config/app.go:146.54,148.3 1 0 745 - github.com/kierank/herald/config/app.go:149.2,149.46 1 0 746 - github.com/kierank/herald/config/app.go:149.46,151.3 1 0 747 - github.com/kierank/herald/config/parse.go:24.48,32.29 3 19 748 - github.com/kierank/herald/config/parse.go:32.29,34.49 2 42 749 - github.com/kierank/herald/config/parse.go:34.49,35.12 1 14 750 - github.com/kierank/herald/config/parse.go:38.3,38.36 1 28 751 - github.com/kierank/herald/config/parse.go:38.36,39.52 1 21 752 - github.com/kierank/herald/config/parse.go:39.52,41.5 1 0 753 - github.com/kierank/herald/config/parse.go:42.9,42.43 1 7 754 - github.com/kierank/herald/config/parse.go:42.43,43.47 1 7 755 - github.com/kierank/herald/config/parse.go:43.47,45.5 1 0 756 - github.com/kierank/herald/config/parse.go:49.2,49.17 1 19 757 - github.com/kierank/herald/config/parse.go:52.59,57.20 4 21 758 - github.com/kierank/herald/config/parse.go:57.20,59.3 1 0 759 - github.com/kierank/herald/config/parse.go:61.2,64.13 3 21 760 - github.com/kierank/herald/config/parse.go:65.15,66.20 1 4 761 - github.com/kierank/herald/config/parse.go:67.14,68.23 1 3 762 - github.com/kierank/herald/config/parse.go:69.16,70.38 1 7 763 - github.com/kierank/herald/config/parse.go:71.16,72.39 1 7 764 - github.com/kierank/herald/config/parse.go:75.2,75.12 1 21 765 - github.com/kierank/herald/config/parse.go:78.54,80.20 2 7 766 - github.com/kierank/herald/config/parse.go:80.20,82.3 1 0 767 - github.com/kierank/herald/config/parse.go:84.2,90.12 3 7 768 - github.com/kierank/herald/config/parse.go:93.48,95.16 2 22 769 - github.com/kierank/herald/config/parse.go:95.16,97.3 1 6 770 - github.com/kierank/herald/config/parse.go:98.2,98.10 1 16 771 - github.com/kierank/herald/config/validate.go:25.40,26.21 1 27 772 - github.com/kierank/herald/config/validate.go:26.21,28.3 1 1 773 - github.com/kierank/herald/config/validate.go:29.2,29.56 1 26 774 - github.com/kierank/herald/config/validate.go:29.56,31.3 1 1 775 - github.com/kierank/herald/config/validate.go:33.2,33.24 1 25 776 - github.com/kierank/herald/config/validate.go:33.24,35.3 1 1 777 - github.com/kierank/herald/config/validate.go:36.2,37.33 2 24 778 - github.com/kierank/herald/config/validate.go:37.33,39.3 1 4 779 - github.com/kierank/herald/config/validate.go:41.2,41.25 1 20 780 - github.com/kierank/herald/config/validate.go:41.25,43.3 1 1 781 - github.com/kierank/herald/config/validate.go:45.2,45.33 1 19 782 - github.com/kierank/herald/config/validate.go:45.33,47.51 2 22 783 - github.com/kierank/herald/config/validate.go:47.51,49.4 1 3 784 - github.com/kierank/herald/config/validate.go:52.2,52.12 1 16 785 - github.com/kierank/herald/config/validate.go:56.69,65.33 5 0 786 - github.com/kierank/herald/config/validate.go:65.33,67.17 2 0 787 - github.com/kierank/herald/config/validate.go:67.17,69.4 1 0 788 - github.com/kierank/herald/config/validate.go:71.3,74.17 3 0 789 - github.com/kierank/herald/config/validate.go:74.17,76.4 1 0 790 - github.com/kierank/herald/config/validate.go:78.3,78.39 1 0 791 - github.com/kierank/herald/config/validate.go:78.39,81.4 2 0 792 - github.com/kierank/herald/config/validate.go:83.3,85.17 3 0 793 - github.com/kierank/herald/config/validate.go:85.17,87.4 1 0 794 - github.com/kierank/herald/config/validate.go:90.2,90.12 1 0 795 - github.com/kierank/herald/ratelimit/limiter.go:21.43,31.2 3 5 796 - github.com/kierank/herald/ratelimit/limiter.go:34.42,39.13 4 12 797 - github.com/kierank/herald/ratelimit/limiter.go:39.13,42.3 2 6 798 - github.com/kierank/herald/ratelimit/limiter.go:44.2,45.24 2 12 799 - github.com/kierank/herald/ratelimit/limiter.go:49.33,53.21 3 5 800 - github.com/kierank/herald/ratelimit/limiter.go:53.21,56.41 3 0 801 - github.com/kierank/herald/ratelimit/limiter.go:56.41,57.31 1 0 802 - github.com/kierank/herald/ratelimit/limiter.go:57.31,60.5 2 0 803 - github.com/kierank/herald/ratelimit/limiter.go:62.3,62.16 1 0 804 - github.com/kierank/herald/store/configs.go:26.170,32.16 2 12 805 - github.com/kierank/herald/store/configs.go:32.16,34.3 1 0 806 - github.com/kierank/herald/store/configs.go:36.2,37.16 2 12 807 - github.com/kierank/herald/store/configs.go:37.16,39.3 1 0 808 - github.com/kierank/herald/store/configs.go:41.2,52.8 1 12 809 - github.com/kierank/herald/store/configs.go:55.184,61.16 2 0 810 - github.com/kierank/herald/store/configs.go:61.16,63.3 1 0 811 - github.com/kierank/herald/store/configs.go:65.2,66.16 2 0 812 - github.com/kierank/herald/store/configs.go:66.16,68.3 1 0 813 - github.com/kierank/herald/store/configs.go:70.2,81.8 1 0 814 - github.com/kierank/herald/store/configs.go:84.100,89.16 2 0 815 - github.com/kierank/herald/store/configs.go:89.16,91.3 1 0 816 - github.com/kierank/herald/store/configs.go:93.2,94.16 2 0 817 - github.com/kierank/herald/store/configs.go:94.16,96.3 1 0 818 - github.com/kierank/herald/store/configs.go:97.2,97.12 1 0 819 - github.com/kierank/herald/store/configs.go:97.12,99.3 1 0 820 - github.com/kierank/herald/store/configs.go:100.2,100.12 1 0 821 - github.com/kierank/herald/store/configs.go:103.94,106.16 3 2 822 - github.com/kierank/herald/store/configs.go:106.16,108.3 1 1 823 - github.com/kierank/herald/store/configs.go:109.2,109.18 1 1 824 - github.com/kierank/herald/store/configs.go:112.77,119.16 3 1 825 - github.com/kierank/herald/store/configs.go:119.16,121.3 1 0 826 - github.com/kierank/herald/store/configs.go:122.2,122.18 1 1 827 - github.com/kierank/herald/store/configs.go:125.81,131.16 2 1 828 - github.com/kierank/herald/store/configs.go:131.16,133.3 1 0 829 - github.com/kierank/herald/store/configs.go:134.2,137.18 3 1 830 - github.com/kierank/herald/store/configs.go:137.18,139.190 2 2 831 - github.com/kierank/herald/store/configs.go:139.190,141.4 1 0 832 - github.com/kierank/herald/store/configs.go:142.3,142.34 1 2 833 - github.com/kierank/herald/store/configs.go:144.2,144.28 1 1 834 - github.com/kierank/herald/store/configs.go:147.86,152.16 2 1 835 - github.com/kierank/herald/store/configs.go:152.16,154.3 1 0 836 - github.com/kierank/herald/store/configs.go:156.2,157.16 2 1 837 - github.com/kierank/herald/store/configs.go:157.16,159.3 1 0 838 - github.com/kierank/herald/store/configs.go:160.2,160.12 1 1 839 - github.com/kierank/herald/store/configs.go:160.12,162.3 1 0 840 - github.com/kierank/herald/store/configs.go:163.2,163.12 1 1 841 - github.com/kierank/herald/store/configs.go:166.100,168.16 2 0 842 - github.com/kierank/herald/store/configs.go:168.16,170.3 1 0 843 - github.com/kierank/herald/store/configs.go:171.2,171.12 1 0 844 - github.com/kierank/herald/store/configs.go:174.84,180.16 2 0 845 - github.com/kierank/herald/store/configs.go:180.16,182.3 1 0 846 - github.com/kierank/herald/store/configs.go:183.2,186.18 3 0 847 - github.com/kierank/herald/store/configs.go:186.18,188.190 2 0 848 - github.com/kierank/herald/store/configs.go:188.190,190.4 1 0 849 - github.com/kierank/herald/store/configs.go:191.3,191.34 1 0 850 - github.com/kierank/herald/store/configs.go:193.2,193.28 1 0 851 - github.com/kierank/herald/store/configs.go:196.75,201.16 2 0 852 - github.com/kierank/herald/store/configs.go:201.16,203.3 1 0 853 - github.com/kierank/herald/store/configs.go:204.2,204.12 1 0 854 - github.com/kierank/herald/store/configs.go:207.100,209.16 2 0 855 - github.com/kierank/herald/store/configs.go:209.16,211.3 1 0 856 - github.com/kierank/herald/store/configs.go:212.2,212.41 1 0 857 - github.com/kierank/herald/store/configs.go:215.88,217.16 2 0 858 - github.com/kierank/herald/store/configs.go:217.16,219.3 1 0 859 - github.com/kierank/herald/store/configs.go:221.2,222.16 2 0 860 - github.com/kierank/herald/store/configs.go:222.16,224.3 1 0 861 - github.com/kierank/herald/store/configs.go:226.2,231.16 2 0 862 - github.com/kierank/herald/store/configs.go:231.16,233.3 1 0 863 - github.com/kierank/herald/store/configs.go:234.2,234.12 1 0 864 - github.com/kierank/herald/store/db.go:26.37,28.16 2 17 865 - github.com/kierank/herald/store/db.go:28.16,30.3 1 0 866 - github.com/kierank/herald/store/db.go:33.2,36.34 3 17 867 - github.com/kierank/herald/store/db.go:36.34,38.3 1 0 868 - github.com/kierank/herald/store/db.go:40.2,41.40 2 17 869 - github.com/kierank/herald/store/db.go:41.40,43.3 1 0 870 - github.com/kierank/herald/store/db.go:45.2,45.50 1 17 871 - github.com/kierank/herald/store/db.go:45.50,47.3 1 0 872 - github.com/kierank/herald/store/db.go:49.2,49.19 1 17 873 - github.com/kierank/herald/store/db.go:52.31,122.2 3 17 874 - github.com/kierank/herald/store/db.go:124.29,125.21 1 17 875 - github.com/kierank/herald/store/db.go:125.21,133.3 7 17 876 - github.com/kierank/herald/store/db.go:134.2,134.22 1 17 877 - github.com/kierank/herald/store/db.go:137.41,145.16 4 17 878 - github.com/kierank/herald/store/db.go:145.16,147.3 1 0 879 - github.com/kierank/herald/store/db.go:149.2,151.16 2 17 880 - github.com/kierank/herald/store/db.go:151.16,153.3 1 0 881 - github.com/kierank/herald/store/db.go:155.2,158.16 2 17 882 - github.com/kierank/herald/store/db.go:158.16,160.3 1 0 883 - github.com/kierank/herald/store/db.go:162.2,165.16 2 17 884 - github.com/kierank/herald/store/db.go:165.16,167.3 1 0 885 - github.com/kierank/herald/store/db.go:169.2,171.16 2 17 886 - github.com/kierank/herald/store/db.go:171.16,173.3 1 0 887 - github.com/kierank/herald/store/db.go:175.2,177.16 2 17 888 - github.com/kierank/herald/store/db.go:177.16,179.3 1 0 889 - github.com/kierank/herald/store/db.go:181.2,183.16 2 17 890 - github.com/kierank/herald/store/db.go:183.16,185.3 1 0 891 - github.com/kierank/herald/store/db.go:187.2,187.12 1 17 892 - github.com/kierank/herald/store/db.go:190.31,192.2 1 0 893 - github.com/kierank/herald/store/db.go:194.61,196.2 1 0 894 - github.com/kierank/herald/store/feeds.go:20.96,22.16 2 7 895 - github.com/kierank/herald/store/feeds.go:22.16,24.3 1 3 896 - github.com/kierank/herald/store/feeds.go:26.2,30.16 2 7 897 - github.com/kierank/herald/store/feeds.go:30.16,32.3 1 0 898 - github.com/kierank/herald/store/feeds.go:34.2,35.16 2 7 899 - github.com/kierank/herald/store/feeds.go:35.16,37.3 1 0 900 - github.com/kierank/herald/store/feeds.go:39.2,44.8 1 7 901 - github.com/kierank/herald/store/feeds.go:47.110,49.16 2 0 902 - github.com/kierank/herald/store/feeds.go:49.16,51.3 1 0 903 - github.com/kierank/herald/store/feeds.go:53.2,57.16 2 0 904 - github.com/kierank/herald/store/feeds.go:57.16,59.3 1 0 905 - github.com/kierank/herald/store/feeds.go:61.2,62.16 2 0 906 - github.com/kierank/herald/store/feeds.go:62.16,64.3 1 0 907 - github.com/kierank/herald/store/feeds.go:66.2,71.8 1 0 908 - github.com/kierank/herald/store/feeds.go:74.86,80.16 2 1 909 - github.com/kierank/herald/store/feeds.go:80.16,82.3 1 0 910 - github.com/kierank/herald/store/feeds.go:83.2,86.18 3 1 911 - github.com/kierank/herald/store/feeds.go:86.18,88.114 2 2 912 - github.com/kierank/herald/store/feeds.go:88.114,90.4 1 0 913 - github.com/kierank/herald/store/feeds.go:91.3,91.28 1 2 914 - github.com/kierank/herald/store/feeds.go:93.2,93.26 1 1 915 - github.com/kierank/herald/store/feeds.go:97.100,98.25 1 0 916 - github.com/kierank/herald/store/feeds.go:98.25,100.3 1 0 917 - github.com/kierank/herald/store/feeds.go:103.2,105.40 3 0 918 - github.com/kierank/herald/store/feeds.go:105.40,107.3 1 0 919 - github.com/kierank/herald/store/feeds.go:108.2,108.31 1 0 920 - github.com/kierank/herald/store/feeds.go:108.31,110.3 1 0 921 - github.com/kierank/herald/store/feeds.go:112.2,119.16 3 0 922 - github.com/kierank/herald/store/feeds.go:119.16,121.3 1 0 923 - github.com/kierank/herald/store/feeds.go:122.2,125.18 3 0 924 - github.com/kierank/herald/store/feeds.go:125.18,127.114 2 0 925 - github.com/kierank/herald/store/feeds.go:127.114,129.4 1 0 926 - github.com/kierank/herald/store/feeds.go:130.3,130.56 1 0 927 - github.com/kierank/herald/store/feeds.go:133.2,133.28 1 0 928 - github.com/kierank/herald/store/feeds.go:136.101,138.16 2 0 929 - github.com/kierank/herald/store/feeds.go:138.16,140.3 1 0 930 - github.com/kierank/herald/store/feeds.go:141.2,141.24 1 0 931 - github.com/kierank/herald/store/feeds.go:141.24,143.3 1 0 932 - github.com/kierank/herald/store/feeds.go:145.2,146.16 2 0 933 - github.com/kierank/herald/store/feeds.go:146.16,148.3 1 0 934 - github.com/kierank/herald/store/feeds.go:149.2,149.12 1 0 935 - github.com/kierank/herald/store/feeds.go:152.78,157.16 2 0 936 - github.com/kierank/herald/store/feeds.go:157.16,159.3 1 0 937 - github.com/kierank/herald/store/feeds.go:160.2,160.12 1 0 938 - github.com/kierank/herald/store/items.go:20.95,22.17 2 4 939 - github.com/kierank/herald/store/items.go:22.17,24.3 1 4 940 - github.com/kierank/herald/store/items.go:25.2,25.16 1 4 941 - github.com/kierank/herald/store/items.go:25.16,27.3 1 4 942 - github.com/kierank/herald/store/items.go:29.2,30.16 2 4 943 - github.com/kierank/herald/store/items.go:30.16,32.3 1 0 944 - github.com/kierank/herald/store/items.go:33.2,33.12 1 4 945 - github.com/kierank/herald/store/items.go:36.88,39.16 3 2 946 - github.com/kierank/herald/store/items.go:39.16,40.36 1 1 947 - github.com/kierank/herald/store/items.go:40.36,42.4 1 1 948 - github.com/kierank/herald/store/items.go:43.3,43.55 1 0 949 - github.com/kierank/herald/store/items.go:45.2,45.18 1 1 950 - github.com/kierank/herald/store/items.go:48.109,50.17 2 0 951 - github.com/kierank/herald/store/items.go:50.17,52.3 1 0 952 - github.com/kierank/herald/store/items.go:53.2,53.16 1 0 953 - github.com/kierank/herald/store/items.go:53.16,55.3 1 0 954 - github.com/kierank/herald/store/items.go:57.2,62.16 2 0 955 - github.com/kierank/herald/store/items.go:62.16,64.3 1 0 956 - github.com/kierank/herald/store/items.go:65.2,65.12 1 0 957 - github.com/kierank/herald/store/items.go:68.95,70.16 2 0 958 - github.com/kierank/herald/store/items.go:70.16,72.3 1 0 959 - github.com/kierank/herald/store/items.go:73.2,76.18 3 0 960 - github.com/kierank/herald/store/items.go:76.18,78.110 2 0 961 - github.com/kierank/herald/store/items.go:78.110,80.4 1 0 962 - github.com/kierank/herald/store/items.go:81.3,81.31 1 0 963 - github.com/kierank/herald/store/items.go:83.2,83.26 1 0 964 - github.com/kierank/herald/store/items.go:87.104,88.21 1 1 965 - github.com/kierank/herald/store/items.go:88.21,90.3 1 0 966 - github.com/kierank/herald/store/items.go:93.2,97.36 4 1 967 - github.com/kierank/herald/store/items.go:97.36,99.3 1 2 968 - github.com/kierank/herald/store/items.go:100.2,100.29 1 1 969 - github.com/kierank/herald/store/items.go:100.29,102.3 1 3 970 - github.com/kierank/herald/store/items.go:104.2,110.16 3 1 971 - github.com/kierank/herald/store/items.go:110.16,112.3 1 0 972 - github.com/kierank/herald/store/items.go:113.2,116.18 3 1 973 - github.com/kierank/herald/store/items.go:116.18,118.42 2 2 974 - github.com/kierank/herald/store/items.go:118.42,120.4 1 0 975 - github.com/kierank/herald/store/items.go:121.3,121.23 1 2 976 - github.com/kierank/herald/store/items.go:124.2,124.28 1 1 977 - github.com/kierank/herald/store/items.go:128.96,131.16 3 1 978 - github.com/kierank/herald/store/items.go:131.16,133.3 1 0 979 - github.com/kierank/herald/store/items.go:135.2,136.16 2 1 980 - github.com/kierank/herald/store/items.go:136.16,138.3 1 0 981 - github.com/kierank/herald/store/items.go:140.2,140.21 1 1 982 - github.com/kierank/herald/store/logs.go:17.88,22.16 2 0 983 - github.com/kierank/herald/store/logs.go:22.16,24.3 1 0 984 - github.com/kierank/herald/store/logs.go:25.2,25.12 1 0 985 - github.com/kierank/herald/store/logs.go:28.87,34.16 2 0 986 - github.com/kierank/herald/store/logs.go:34.16,36.3 1 0 987 - github.com/kierank/herald/store/logs.go:37.2,40.18 3 0 988 - github.com/kierank/herald/store/logs.go:40.18,42.101 2 0 989 - github.com/kierank/herald/store/logs.go:42.101,44.4 1 0 990 - github.com/kierank/herald/store/logs.go:45.3,45.28 1 0 991 - github.com/kierank/herald/store/logs.go:47.2,47.25 1 0 992 - github.com/kierank/herald/store/logs.go:50.91,59.16 2 0 993 - github.com/kierank/herald/store/logs.go:59.16,61.3 1 0 994 - github.com/kierank/herald/store/logs.go:62.2,65.18 3 0 995 - github.com/kierank/herald/store/logs.go:65.18,67.101 2 0 996 - github.com/kierank/herald/store/logs.go:67.101,69.4 1 0 997 - github.com/kierank/herald/store/logs.go:70.3,70.28 1 0 998 - github.com/kierank/herald/store/logs.go:72.2,72.25 1 0 999 - github.com/kierank/herald/store/unsubscribe.go:11.91,14.49 2 0 1000 - github.com/kierank/herald/store/unsubscribe.go:14.49,16.3 1 0 1001 - github.com/kierank/herald/store/unsubscribe.go:17.2,23.16 3 0 1002 - github.com/kierank/herald/store/unsubscribe.go:23.16,25.3 1 0 1003 - github.com/kierank/herald/store/unsubscribe.go:27.2,27.19 1 0 1004 - github.com/kierank/herald/store/unsubscribe.go:30.84,36.16 3 0 1005 - github.com/kierank/herald/store/unsubscribe.go:36.16,38.3 1 0 1006 - github.com/kierank/herald/store/unsubscribe.go:40.2,40.40 1 0 1007 - github.com/kierank/herald/store/unsubscribe.go:43.68,49.2 2 0 1008 - github.com/kierank/herald/store/unsubscribe.go:51.96,59.16 3 0 1009 - github.com/kierank/herald/store/unsubscribe.go:59.16,61.3 1 0 1010 - github.com/kierank/herald/store/unsubscribe.go:63.2,63.26 1 0 1011 - github.com/kierank/herald/store/unsubscribe.go:63.26,65.3 1 0 1012 - github.com/kierank/herald/store/unsubscribe.go:68.2,68.49 1 0 1013 - github.com/kierank/herald/store/users.go:18.92,20.16 2 16 1014 - github.com/kierank/herald/store/users.go:20.16,22.3 1 1 1015 - github.com/kierank/herald/store/users.go:23.2,23.36 1 15 1016 - github.com/kierank/herald/store/users.go:23.36,25.3 1 0 1017 - github.com/kierank/herald/store/users.go:27.2,31.16 2 15 1018 - github.com/kierank/herald/store/users.go:31.16,33.3 1 0 1019 - github.com/kierank/herald/store/users.go:35.2,36.16 2 15 1020 - github.com/kierank/herald/store/users.go:36.16,38.3 1 0 1021 - github.com/kierank/herald/store/users.go:40.2,45.8 1 15 1022 - github.com/kierank/herald/store/users.go:48.83,54.16 3 18 1023 - github.com/kierank/herald/store/users.go:54.16,56.3 1 16 1024 - github.com/kierank/herald/store/users.go:57.2,57.19 1 2 1025 - github.com/kierank/herald/store/users.go:60.77,66.16 3 2 1026 - github.com/kierank/herald/store/users.go:66.16,68.3 1 1 1027 - github.com/kierank/herald/store/users.go:69.2,69.19 1 1 1028 - github.com/kierank/herald/store/users.go:72.67,75.2 2 1
+3
email/send.go
··· 43 43 if m.cfg.Port == 465 { 44 44 tlsConfig := &tls.Config{ 45 45 ServerName: m.cfg.Host, 46 + MinVersion: tls.VersionTLS12, 46 47 } 47 48 48 49 conn, err := tls.Dial("tcp", addr, tlsConfig) ··· 82 83 // Start TLS before auth 83 84 tlsConfig := &tls.Config{ 84 85 ServerName: m.cfg.Host, 86 + MinVersion: tls.VersionTLS12, 85 87 } 86 88 if err = client.StartTLS(tlsConfig); err != nil { 87 89 return fmt.Errorf("STARTTLS: %w", err) ··· 188 190 func (m *Mailer) sendWithTLS(addr string, auth smtp.Auth, to, msg string) error { 189 191 tlsConfig := &tls.Config{ 190 192 ServerName: m.cfg.Host, 193 + MinVersion: tls.VersionTLS12, 191 194 } 192 195 193 196 conn, err := tls.Dial("tcp", addr, tlsConfig)
+1 -1
main.go
··· 114 114 # - "ssh-ed25519 AAAA... user@host" 115 115 ` 116 116 117 - if err := os.WriteFile(path, []byte(sampleConfig), 0644); err != nil { 117 + if err := os.WriteFile(path, []byte(sampleConfig), 0600); err != nil { 118 118 return fmt.Errorf("failed to write config file: %w", err) 119 119 } 120 120
+1 -1
ratelimit/limiter_test.go
··· 46 46 47 47 func TestAllow_MultipleKeys(t *testing.T) { 48 48 limiter := New(10, 1) 49 - 49 + 50 50 key1 := "key1" 51 51 key2 := "key2" 52 52
+2 -2
scheduler/fetch.go
··· 11 11 ) 12 12 13 13 const ( 14 - feedFetchTimeout = 30 * time.Second 14 + feedFetchTimeout = 30 * time.Second 15 15 maxConcurrentFetch = 10 16 16 ) 17 17 ··· 127 127 func FetchFeeds(ctx context.Context, feeds []*store.Feed) []*FetchResult { 128 128 results := make([]*FetchResult, len(feeds)) 129 129 var wg sync.WaitGroup 130 - 130 + 131 131 concurrent := maxConcurrentFetch 132 132 if len(feeds) < concurrent { 133 133 concurrent = len(feeds)
+6 -6
scheduler/scheduler.go
··· 14 14 15 15 const ( 16 16 // Email rate limiting 17 - emailsPerMinutePerUser = 1 18 - emailRateBurst = 1 19 - emailsPerSecondPerUser = emailsPerMinutePerUser / 60.0 17 + emailsPerMinutePerUser = 1 18 + emailRateBurst = 1 19 + emailsPerSecondPerUser = emailsPerMinutePerUser / 60.0 20 20 21 21 // Cleanup intervals 22 - cleanupInterval = 24 * time.Hour 23 - seenItemsRetention = 6 * 30 * 24 * time.Hour // 6 months 24 - itemMaxAge = 3 * 30 * 24 * time.Hour // 3 months 22 + cleanupInterval = 24 * time.Hour 23 + seenItemsRetention = 6 * 30 * 24 * time.Hour // 6 months 24 + itemMaxAge = 3 * 30 * 24 * time.Hour // 3 months 25 25 26 26 // Item limits 27 27 minItemsForDigest = 5
+2 -2
ssh/scp.go
··· 102 102 103 103 func (h *scpHandler) Write(s ssh.Session, entry *scp.FileEntry) (int64, error) { 104 104 h.logger.Debug("SCP Write called", "name", entry.Name, "size", entry.Size) 105 - 105 + 106 106 user, ok := s.Context().Value("user").(*store.User) 107 107 if !ok { 108 108 return 0, fmt.Errorf("no user in context") ··· 148 148 if err != nil { 149 149 return 0, fmt.Errorf("failed to calculate next run: %w", err) 150 150 } 151 - 151 + 152 152 // Use transaction for config update 153 153 tx, err := h.store.BeginTx(ctx) 154 154 if err != nil {
+5 -5
ssh/server.go
··· 21 21 ) 22 22 23 23 type Config struct { 24 - Host string 25 - Port int 26 - HostKeyPath string 24 + Host string 25 + Port int 26 + HostKeyPath string 27 27 AllowAllKeys bool 28 28 AllowedKeys []string 29 29 } ··· 136 136 return func(sess ssh.Session) { 137 137 cmd := sess.Command() 138 138 s.logger.Debug("commandMiddleware", "cmd", cmd, "len", len(cmd)) 139 - 139 + 140 140 user, ok := sess.Context().Value("user").(*store.User) 141 141 if !ok { 142 142 fmt.Fprintln(sess, "Authentication error") ··· 148 148 s.handleWelcome(sess, user) 149 149 return 150 150 } 151 - 151 + 152 152 // Check if it's an SCP command - let SCP middleware handle it 153 153 if len(cmd) > 0 && cmd[0] == "scp" { 154 154 s.logger.Debug("passing to SCP middleware")
+1 -1
store/db_test.go
··· 352 352 353 353 // Wait to ensure timestamp is old enough 354 354 time.Sleep(50 * time.Millisecond) 355 - 355 + 356 356 // Clean up items older than 10ms 357 357 deleted, err := db.CleanupOldSeenItems(ctx, 10*time.Millisecond) 358 358 if err != nil {
+1 -1
store/feeds.go
··· 129 129 } 130 130 feedMap[f.ConfigID] = append(feedMap[f.ConfigID], &f) 131 131 } 132 - 132 + 133 133 return feedMap, rows.Err() 134 134 } 135 135
+4 -4
store/items.go
··· 92 92 // Build the query with the appropriate number of placeholders 93 93 args := make([]interface{}, 0, len(guids)+1) 94 94 args = append(args, feedID) 95 - 95 + 96 96 placeholders := "?" 97 97 for i := 0; i < len(guids)-1; i++ { 98 98 placeholders += ",?" ··· 120 120 } 121 121 seenSet[guid] = true 122 122 } 123 - 123 + 124 124 return seenSet, rows.Err() 125 125 } 126 126 ··· 131 131 if err != nil { 132 132 return 0, fmt.Errorf("cleanup old seen items: %w", err) 133 133 } 134 - 134 + 135 135 deleted, err := result.RowsAffected() 136 136 if err != nil { 137 137 return 0, fmt.Errorf("get rows affected: %w", err) 138 138 } 139 - 139 + 140 140 return deleted, nil 141 141 }
+2 -2
store/unsubscribe.go
··· 55 55 `SELECT token FROM unsubscribe_tokens WHERE config_id = ? LIMIT 1`, 56 56 configID, 57 57 ).Scan(&token) 58 - 58 + 59 59 if err == nil { 60 60 return token, nil 61 61 } 62 - 62 + 63 63 if err != sql.ErrNoRows { 64 64 return "", err 65 65 }
+22 -21
web/handlers.go
··· 13 13 ) 14 14 15 15 const ( 16 - maxFeedItems = 100 17 - shortFingerprintLen = 8 18 - recentItemsLimit = 50 19 - feedCacheMaxAge = 300 // 5 minutes 16 + maxFeedItems = 100 17 + shortFingerprintLen = 8 18 + recentItemsLimit = 50 19 + feedCacheMaxAge = 300 // 5 minutes 20 20 ) 21 21 22 22 func (s *Server) handleIndex(w http.ResponseWriter, r *http.Request) { 23 23 host := parseOriginHost(s.origin) 24 - 24 + 25 25 // Get short commit hash (first 7 chars) 26 26 shortHash := s.commitHash 27 27 if len(shortHash) > 7 { 28 28 shortHash = shortHash[:7] 29 29 } 30 - 30 + 31 31 data := struct { 32 32 Origin string 33 33 OriginHost string ··· 227 227 http.Error(w, "Internal Server Error", http.StatusInternalServerError) 228 228 return 229 229 } 230 - 230 + 231 231 for _, feed := range feeds { 232 232 seenItems, err := s.store.GetSeenItems(ctx, feed.ID, 50) 233 233 if err != nil { ··· 282 282 etag := fmt.Sprintf(`"%s-%d"`, fingerprint[:shortFingerprintLen], cfg.LastRun.Time.Unix()) 283 283 w.Header().Set("ETag", etag) 284 284 w.Header().Set("Last-Modified", cfg.LastRun.Time.UTC().Format(http.TimeFormat)) 285 - 285 + 286 286 // Check If-None-Match 287 287 if match := r.Header.Get("If-None-Match"); match == etag { 288 288 w.WriteHeader(http.StatusNotModified) 289 289 return 290 290 } 291 - 291 + 292 292 // Check If-Modified-Since 293 293 if modSince := r.Header.Get("If-Modified-Since"); modSince != "" { 294 294 if t, err := http.ParseTime(modSince); err == nil && !cfg.LastRun.Time.After(t) { ··· 297 297 } 298 298 } 299 299 } 300 - 300 + 301 301 w.Write([]byte(xml.Header)) 302 302 enc := xml.NewEncoder(w) 303 303 enc.Indent("", " ") ··· 356 356 http.Error(w, "Internal Server Error", http.StatusInternalServerError) 357 357 return 358 358 } 359 - 359 + 360 360 for _, feed := range feeds { 361 361 seenItems, err := s.store.GetSeenItems(ctx, feed.ID, recentItemsLimit) 362 362 if err != nil { ··· 409 409 etag := fmt.Sprintf(`"%s-%d"`, fingerprint[:shortFingerprintLen], cfg.LastRun.Time.Unix()) 410 410 w.Header().Set("ETag", etag) 411 411 w.Header().Set("Last-Modified", cfg.LastRun.Time.UTC().Format(http.TimeFormat)) 412 - 412 + 413 413 // Check If-None-Match 414 414 if match := r.Header.Get("If-None-Match"); match == etag { 415 415 w.WriteHeader(http.StatusNotModified) 416 416 return 417 417 } 418 - 418 + 419 419 // Check If-Modified-Since 420 420 if modSince := r.Header.Get("If-Modified-Since"); modSince != "" { 421 421 if t, err := http.ParseTime(modSince); err == nil && !cfg.LastRun.Time.After(t) { ··· 424 424 } 425 425 } 426 426 } 427 - 427 + 428 428 enc := json.NewEncoder(w) 429 429 enc.SetIndent("", " ") 430 430 enc.Encode(feed) ··· 567 567 } 568 568 569 569 func (s *Server) handleUnsubscribe(w http.ResponseWriter, r *http.Request, token string) { 570 - if r.Method == http.MethodGet { 570 + switch r.Method { 571 + case http.MethodGet: 571 572 s.handleUnsubscribeGET(w, r, token) 572 - } else if r.Method == http.MethodPost { 573 + case http.MethodPost: 573 574 s.handleUnsubscribePOST(w, r, token) 574 - } else { 575 + default: 575 576 http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) 576 577 } 577 578 } ··· 580 581 if len(origin) == 0 { 581 582 return origin 582 583 } 583 - 584 + 584 585 // Remove http:// or https:// 585 586 if len(origin) > 7 && origin[:7] == "http://" { 586 587 return origin[7:] ··· 588 589 if len(origin) > 8 && origin[:8] == "https://" { 589 590 return origin[8:] 590 591 } 591 - 592 + 592 593 return origin 593 594 } 594 595 ··· 598 599 if hostPort == "" { 599 600 return "localhost" 600 601 } 601 - 602 + 602 603 // Strip port if present 603 604 for i := len(hostPort) - 1; i >= 0; i-- { 604 605 if hostPort[i] == ':' { 605 606 return hostPort[:i] 606 607 } 607 608 } 608 - 609 + 609 610 return hostPort 610 611 } 611 612
+25 -25
web/metrics.go
··· 10 10 11 11 // Metrics holds runtime metrics for observability 12 12 type Metrics struct { 13 - StartTime time.Time 14 - RequestsTotal atomic.Uint64 15 - RequestsActive atomic.Int64 16 - EmailsSent atomic.Uint64 17 - FeedsFetched atomic.Uint64 18 - ItemsSeen atomic.Uint64 19 - ConfigsActive atomic.Uint64 20 - ErrorsTotal atomic.Uint64 21 - RateLimitHits atomic.Uint64 13 + StartTime time.Time 14 + RequestsTotal atomic.Uint64 15 + RequestsActive atomic.Int64 16 + EmailsSent atomic.Uint64 17 + FeedsFetched atomic.Uint64 18 + ItemsSeen atomic.Uint64 19 + ConfigsActive atomic.Uint64 20 + ErrorsTotal atomic.Uint64 21 + RateLimitHits atomic.Uint64 22 22 } 23 23 24 24 // NewMetrics creates a new Metrics instance ··· 37 37 MemAllocMB uint64 `json:"mem_alloc_mb"` 38 38 MemTotalAllocMB uint64 `json:"mem_total_alloc_mb"` 39 39 MemSysMB uint64 `json:"mem_sys_mb"` 40 - 40 + 41 41 // Application metrics 42 - RequestsTotal uint64 `json:"requests_total"` 43 - RequestsActive int64 `json:"requests_active"` 44 - EmailsSent uint64 `json:"emails_sent"` 45 - FeedsFetched uint64 `json:"feeds_fetched"` 46 - ItemsSeen uint64 `json:"items_seen"` 47 - ConfigsActive uint64 `json:"configs_active"` 48 - ErrorsTotal uint64 `json:"errors_total"` 49 - RateLimitHits uint64 `json:"rate_limit_hits"` 42 + RequestsTotal uint64 `json:"requests_total"` 43 + RequestsActive int64 `json:"requests_active"` 44 + EmailsSent uint64 `json:"emails_sent"` 45 + FeedsFetched uint64 `json:"feeds_fetched"` 46 + ItemsSeen uint64 `json:"items_seen"` 47 + ConfigsActive uint64 `json:"configs_active"` 48 + ErrorsTotal uint64 `json:"errors_total"` 49 + RateLimitHits uint64 `json:"rate_limit_hits"` 50 50 } 51 51 52 52 // Snapshot creates a snapshot of current metrics 53 53 func (m *Metrics) Snapshot() MetricsSnapshot { 54 54 var mem runtime.MemStats 55 55 runtime.ReadMemStats(&mem) 56 - 56 + 57 57 return MetricsSnapshot{ 58 58 UptimeSeconds: int64(time.Since(m.StartTime).Seconds()), 59 59 GoVersion: runtime.Version(), ··· 78 78 http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) 79 79 return 80 80 } 81 - 81 + 82 82 snapshot := s.metrics.Snapshot() 83 - 83 + 84 84 w.Header().Set("Content-Type", "application/json") 85 85 w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") 86 - 86 + 87 87 if err := json.NewEncoder(w).Encode(snapshot); err != nil { 88 88 s.logger.Warn("failed to encode metrics", "error", err) 89 89 http.Error(w, "Internal Server Error", http.StatusInternalServerError) ··· 96 96 http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) 97 97 return 98 98 } 99 - 99 + 100 100 // Simple health check - could be extended to check DB connection, etc. 101 101 w.Header().Set("Content-Type", "application/json") 102 102 w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") 103 - 103 + 104 104 response := map[string]string{ 105 105 "status": "ok", 106 106 "uptime": time.Since(s.metrics.StartTime).String(), 107 107 } 108 - 108 + 109 109 if err := json.NewEncoder(w).Encode(response); err != nil { 110 110 s.logger.Warn("failed to encode health response", "error", err) 111 111 http.Error(w, "Internal Server Error", http.StatusInternalServerError)
+6 -6
web/server.go
··· 97 97 func (s *Server) loggingMiddleware(next http.Handler) http.Handler { 98 98 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 99 99 start := time.Now() 100 - 100 + 101 101 s.metrics.RequestsTotal.Add(1) 102 102 s.metrics.RequestsActive.Add(1) 103 103 defer s.metrics.RequestsActive.Add(-1) 104 - 104 + 105 105 // Wrap response writer to capture status code 106 106 lrw := &loggingResponseWriter{ResponseWriter: w, statusCode: http.StatusOK} 107 - 107 + 108 108 next.ServeHTTP(lrw, r) 109 - 109 + 110 110 duration := time.Since(start) 111 - 111 + 112 112 s.logger.Info("http request", 113 113 "method", r.Method, 114 114 "path", r.URL.Path, ··· 116 116 "duration_ms", duration.Milliseconds(), 117 117 "remote_addr", r.RemoteAddr, 118 118 ) 119 - 119 + 120 120 if lrw.statusCode >= 500 { 121 121 s.metrics.ErrorsTotal.Add(1) 122 122 }