Skip to content

Commit dc4664a

Browse files
committed
Add all observer variants
1 parent 9999a2b commit dc4664a

File tree

14 files changed

+404
-0
lines changed

14 files changed

+404
-0
lines changed

observer-barebones/config.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
status=500
2+
tick=10s
3+
url=https://ieftimov.com
4+
server=cloudflare
5+
content_type=text/html; charset=utf-8
6+
user_agent=

observer-barebones/go.mod

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module github.com/fteem/go-playground/observer
2+
3+
go 1.14
4+
5+
require (
6+
github.com/0xAX/notificator v0.0.0-20191016112426-3962a5ea8da1 // indirect
7+
github.com/namsral/flag v1.7.4-pre
8+
)

observer-barebones/go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
github.com/0xAX/notificator v0.0.0-20191016112426-3962a5ea8da1 h1:j9HaafapDbPbGRDku6e/HRs6KBMcKHiWcm1/9Sbxnl4=
2+
github.com/0xAX/notificator v0.0.0-20191016112426-3962a5ea8da1/go.mod h1:NtXa9WwQsukMHZpjNakTTz0LArxvGYdPA9CjIcUSZ6s=
3+
github.com/namsral/flag v1.7.4-pre h1:b2ScHhoCUkbsq0d2C15Mv+VU8bl8hAXV8arnWiOHNZs=
4+
github.com/namsral/flag v1.7.4-pre/go.mod h1:OXldTctbM6SWH1K899kPZcf65KxJiD7MsceFUpB5yDo=

observer-barebones/main.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"log"
8+
"net/http"
9+
"os"
10+
"time"
11+
12+
"github.com/namsral/flag"
13+
)
14+
15+
const defaultTick = 60 * time.Second
16+
17+
type config struct {
18+
contentType string
19+
server string
20+
statusCode int
21+
tick time.Duration
22+
url string
23+
userAgent string
24+
}
25+
26+
func (c *config) init(args []string) error {
27+
flags := flag.NewFlagSet(args[0], flag.ExitOnError)
28+
flags.String(flag.DefaultConfigFlagname, "", "Path to config file")
29+
30+
var (
31+
statusCode = flags.Int("status", 200, "Response HTTP status code")
32+
tick = flags.Duration("tick", defaultTick, "Ticking interval")
33+
server = flags.String("server", "", "Server HTTP header value")
34+
contentType = flags.String("content_type", "", "Content-Type HTTP header value")
35+
userAgent = flags.String("user_agent", "", "User-Agent HTTP header value")
36+
url = flags.String("url", "", "Request URL")
37+
)
38+
39+
if err := flags.Parse(args[1:]); err != nil {
40+
return err
41+
}
42+
43+
c.statusCode = *statusCode
44+
c.tick = *tick
45+
c.server = *server
46+
c.contentType = *contentType
47+
c.userAgent = *userAgent
48+
c.url = *url
49+
50+
return nil
51+
}
52+
53+
func main() {
54+
ctx := context.Background()
55+
ctx, cancel := context.WithCancel(ctx)
56+
57+
c := &config{}
58+
59+
defer func() {
60+
cancel()
61+
}()
62+
63+
if err := run(ctx, c, os.Stdout); err != nil {
64+
fmt.Fprintf(os.Stderr, "%s\n", err)
65+
os.Exit(1)
66+
}
67+
}
68+
69+
func run(ctx context.Context, c *config, out io.Writer) error {
70+
c.init(os.Args)
71+
log.SetOutput(out)
72+
73+
for {
74+
select {
75+
case <-ctx.Done():
76+
return nil
77+
case <-time.Tick(c.tick):
78+
resp, err := http.Get(c.url)
79+
if err != nil {
80+
return err
81+
}
82+
83+
if resp.StatusCode != c.statusCode {
84+
log.Printf("Status code mismatch, got: %d\n", resp.StatusCode)
85+
}
86+
87+
if s := resp.Header.Get("server"); s != c.server {
88+
log.Printf("Server header mismatch, got: %s\n", s)
89+
}
90+
91+
if ct := resp.Header.Get("content-type"); ct != c.contentType {
92+
log.Printf("Content-Type header mismatch, got: %s\n", ct)
93+
}
94+
95+
if ua := resp.Header.Get("user-agent"); ua != c.userAgent {
96+
log.Printf("User-Agent header mismatch, got: %s\n", ua)
97+
}
98+
}
99+
}
100+
}

observer-barebones/observer

6.68 MB
Binary file not shown.

observer-signals/config.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
status=500
2+
tick=10s
3+
url=https://ieftimov.com
4+
server=cloudflare
5+
content_type=text/html; charset=utf-8
6+
user_agent=

observer-signals/go.mod

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module github.com/fteem/go-playground/observer
2+
3+
go 1.14
4+
5+
require (
6+
github.com/0xAX/notificator v0.0.0-20191016112426-3962a5ea8da1 // indirect
7+
github.com/namsral/flag v1.7.4-pre
8+
)

observer-signals/go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
github.com/0xAX/notificator v0.0.0-20191016112426-3962a5ea8da1 h1:j9HaafapDbPbGRDku6e/HRs6KBMcKHiWcm1/9Sbxnl4=
2+
github.com/0xAX/notificator v0.0.0-20191016112426-3962a5ea8da1/go.mod h1:NtXa9WwQsukMHZpjNakTTz0LArxvGYdPA9CjIcUSZ6s=
3+
github.com/namsral/flag v1.7.4-pre h1:b2ScHhoCUkbsq0d2C15Mv+VU8bl8hAXV8arnWiOHNZs=
4+
github.com/namsral/flag v1.7.4-pre/go.mod h1:OXldTctbM6SWH1K899kPZcf65KxJiD7MsceFUpB5yDo=

observer-signals/main.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"log"
8+
"net/http"
9+
"os"
10+
"os/signal"
11+
"syscall"
12+
"time"
13+
14+
"github.com/namsral/flag"
15+
)
16+
17+
const defaultTick = 60 * time.Second
18+
19+
type config struct {
20+
contentType string
21+
server string
22+
statusCode int
23+
tick time.Duration
24+
url string
25+
userAgent string
26+
}
27+
28+
func (c *config) init(args []string) error {
29+
flags := flag.NewFlagSet(args[0], flag.ExitOnError)
30+
flags.String(flag.DefaultConfigFlagname, "", "Path to config file")
31+
32+
var (
33+
statusCode = flags.Int("status", 200, "Response HTTP status code")
34+
tick = flags.Duration("tick", defaultTick, "Ticking interval")
35+
server = flags.String("server", "", "Server HTTP header value")
36+
contentType = flags.String("content_type", "", "Content-Type HTTP header value")
37+
userAgent = flags.String("user_agent", "", "User-Agent HTTP header value")
38+
url = flags.String("url", "", "Request URL")
39+
)
40+
41+
if err := flags.Parse(args[1:]); err != nil {
42+
return err
43+
}
44+
45+
c.statusCode = *statusCode
46+
c.tick = *tick
47+
c.server = *server
48+
c.contentType = *contentType
49+
c.userAgent = *userAgent
50+
c.url = *url
51+
52+
return nil
53+
}
54+
55+
func main() {
56+
ctx := context.Background()
57+
ctx, cancel := context.WithCancel(ctx)
58+
59+
signalChan := make(chan os.Signal, 1)
60+
signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
61+
62+
c := &config{}
63+
64+
defer func() {
65+
signal.Stop(signalChan)
66+
cancel()
67+
}()
68+
69+
go func() {
70+
for {
71+
select {
72+
case s := <-signalChan:
73+
switch s {
74+
case syscall.SIGINT, syscall.SIGTERM:
75+
log.Printf("Got SIGINT/SIGTERM, exiting.")
76+
cancel()
77+
os.Exit(1)
78+
case syscall.SIGHUP:
79+
log.Printf("Got SIGHUP, reloading.")
80+
c.init(os.Args)
81+
}
82+
case <-ctx.Done():
83+
log.Printf("Done.")
84+
os.Exit(1)
85+
}
86+
}
87+
}()
88+
89+
if err := run(ctx, c, os.Stdout); err != nil {
90+
fmt.Fprintf(os.Stderr, "%s\n", err)
91+
os.Exit(1)
92+
}
93+
}
94+
95+
func run(ctx context.Context, c *config, stdout io.Writer) error {
96+
c.init(os.Args)
97+
log.SetOutput(os.Stdout)
98+
99+
for {
100+
select {
101+
case <-ctx.Done():
102+
return nil
103+
case <-time.Tick(c.tick):
104+
resp, err := http.Get(c.url)
105+
if err != nil {
106+
return err
107+
}
108+
109+
if resp.StatusCode != c.statusCode {
110+
log.Printf("Status code mismatch, got: %d\n", resp.StatusCode)
111+
}
112+
113+
if s := resp.Header.Get("server"); s != c.server {
114+
log.Printf("Server header mismatch, got: %s\n", s)
115+
}
116+
117+
if ct := resp.Header.Get("content-type"); ct != c.contentType {
118+
log.Printf("Content-Type header mismatch, got: %s\n", ct)
119+
}
120+
121+
if ua := resp.Header.Get("user-agent"); ua != c.userAgent {
122+
log.Printf("User-Agent header mismatch, got: %s\n", ua)
123+
}
124+
}
125+
}
126+
}

observer-signals/observer

6.7 MB
Binary file not shown.

0 commit comments

Comments
 (0)