-
Notifications
You must be signed in to change notification settings - Fork 2
/
probe.go
78 lines (67 loc) · 1.69 KB
/
probe.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package scheme
import (
"context"
"errors"
api "github.com/macrat/ayd/lib-ayd"
)
var (
ErrInvalidURL = errors.New("invalid URL")
ErrMissingScheme = errors.New("missing scheme in URL")
ErrUnsupportedScheme = errors.New("unsupported scheme")
ErrMissingHost = errors.New("missing target host")
)
// Prober is the interface to check the target is dead or alive.
type Prober interface {
// Target returns the target URL.
// This URL should not change during lifetime of the instance.
Target() *api.URL
// Probe checks the target is dead or alive, and report result(s) to the Reporter.
Probe(context.Context, Reporter)
}
func NewProberFromURL(u *api.URL) (Prober, error) {
scheme, _, _ := SplitScheme(u.Scheme)
switch scheme {
case "http", "https":
return NewHTTPScheme(u)
case "ftp", "ftps":
return NewFTPScheme(u)
case "ping", "ping4", "ping6":
return NewPingProbe(u)
case "tcp", "tcp4", "tcp6":
return NewTCPProbe(u)
case "dns", "dns4", "dns6":
return NewDNSProbe(u)
case "file":
return NewFileScheme(u)
case "exec":
return NewExecScheme(u)
case "source":
return NewSourceProbe(u)
case "dummy":
return NewDummyScheme(u)
default:
return NewPluginProbe(u)
}
}
func NewProber(rawURL string) (Prober, error) {
u, err := api.ParseURL(rawURL)
if err != nil {
return nil, ErrInvalidURL
}
if u.Scheme == "" {
return nil, ErrMissingScheme
}
return NewProberFromURL(u)
}
func timeoutOr(ctx context.Context, r api.Record) api.Record {
switch ctx.Err() {
case context.Canceled:
r.Status = api.StatusAborted
r.Message = "probe aborted"
case context.DeadlineExceeded:
r.Status = api.StatusFailure
r.Message = "probe timed out"
default:
}
return r
}