summaryrefslogtreecommitdiff
path: root/att script/4(v6 DDoS)/code/辅助权威服务器/plugin/prometheus/handler.go
diff options
context:
space:
mode:
Diffstat (limited to 'att script/4(v6 DDoS)/code/辅助权威服务器/plugin/prometheus/handler.go')
-rw-r--r--att script/4(v6 DDoS)/code/辅助权威服务器/plugin/prometheus/handler.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/att script/4(v6 DDoS)/code/辅助权威服务器/plugin/prometheus/handler.go b/att script/4(v6 DDoS)/code/辅助权威服务器/plugin/prometheus/handler.go
new file mode 100644
index 0000000..47fa172
--- /dev/null
+++ b/att script/4(v6 DDoS)/code/辅助权威服务器/plugin/prometheus/handler.go
@@ -0,0 +1,56 @@
+package prometheus
+
+import (
+ "context"
+ "ohmydns2/plugin"
+ "ohmydns2/plugin/pkg/rcode"
+ "ohmydns2/plugin/pkg/request"
+ "ohmydns2/plugin/prometheus/vars"
+ "path/filepath"
+
+ "github.com/miekg/dns"
+)
+
+// ServeDNS implements the Handler interface.
+func (m *Metrics) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
+ state := request.Request{W: w, Req: r}
+
+ qname := state.QName()
+ zone := plugin.Zones(m.ZoneNames()).Matches(qname)
+ if zone == "" {
+ zone = "."
+ }
+
+ // Record response to get status code and size of the reply.
+ rw := NewRecorder(w)
+ status, err := plugin.NextOrFailure(m.Name(), m.Next, ctx, rw, r)
+
+ rc := rw.Rcode
+ if !plugin.ClientWrite(status) {
+ // when no response was written, fallback to status returned from next plugin as this status
+ // is actually used as rcode of DNS response
+ // see https://github.com/coredns/coredns/blob/master/core/dnsserver/server.go#L318
+ rc = status
+ }
+ plugin := m.authoritativePlugin(rw.Caller)
+ vars.Report(WithServer(ctx), state, zone, WithView(ctx), rcode.ToString(rc), plugin, rw.Len, rw.Start)
+
+ return status, err
+}
+
+// Name implements the Handler interface.
+func (m *Metrics) Name() string { return "prometheus" }
+
+// authoritativePlugin returns which of made the write, if none is found the empty string is returned.
+func (m *Metrics) authoritativePlugin(caller [3]string) string {
+ // a b and c contain the full path of the caller, the plugin name 2nd last elements
+ // .../coredns/plugin/whoami/whoami.go --> whoami
+ // this is likely FS specific, so use filepath.
+ for _, c := range caller {
+ plug := filepath.Base(filepath.Dir(c))
+ if _, ok := m.plugins[plug]; ok {
+ return plug
+ }
+ }
+ return ""
+}