Move errors, shift API to server-gated

This commit is contained in:
Ian Gulliver
2024-11-22 13:49:31 -08:00
parent d7169a295a
commit 7fcf63bcfa
2 changed files with 32 additions and 24 deletions

19
main.go
View File

@@ -23,11 +23,13 @@ type PDPayload struct {
} }
type PHandler struct { type PHandler struct {
routingKey string
next http.Handler next http.Handler
} }
func NewPHandler(next http.Handler) *PHandler { func NewPHandler(routingKey string, next http.Handler) *PHandler {
return &PHandler{ return &PHandler{
routingKey: routingKey,
next: next, next: next,
} }
} }
@@ -39,6 +41,8 @@ func (ph *PHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return return
} }
log.Printf("%s %s", r.RemoteAddr, r.Form.Encode())
msg := r.Form.Get("msg") msg := r.Form.Get("msg")
if msg == "" { if msg == "" {
ph.next.ServeHTTP(w, r) ph.next.ServeHTTP(w, r)
@@ -47,11 +51,11 @@ func (ph *PHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
err = json.NewEncoder(buf).Encode(PDAlert{ err = json.NewEncoder(buf).Encode(PDAlert{
RoutingKey: "63e451a6e5f84309d08d439bfe5efab5", RoutingKey: ph.routingKey,
EventAction: "trigger", EventAction: "trigger",
Payload: PDPayload{ Payload: PDPayload{
Summary: msg, Summary: msg,
Source: "urlparam", Source: r.RemoteAddr,
Severity: "critical", Severity: "critical",
}, },
}) })
@@ -87,7 +91,12 @@ func (ph *PHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
func main() { func main() {
http.Handle("/", NewPHandler(http.FileServer(http.Dir("./static")))) routingKey := os.Getenv("PD_ROUTING_KEY")
if routingKey == "" {
log.Fatalf("please set PD_ROUTING_KEY")
}
http.Handle("/", NewPHandler(routingKey, http.FileServer(http.Dir("./static"))))
port := os.Getenv("PORT") port := os.Getenv("PORT")
if port == "" { if port == "" {
@@ -98,6 +107,6 @@ func main() {
log.Printf("listening on %s", bind) log.Printf("listening on %s", bind)
if err := http.ListenAndServe(bind, nil); err != nil { if err := http.ListenAndServe(bind, nil); err != nil {
panic(err) log.Fatalf("listen: %s", err)
} }
} }

View File

@@ -14,7 +14,7 @@ body {
} }
</style> </style>
<title>Page Ian</title> <title>Page Ian</title>
<link rel="icon" href="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCAxMDIuMzQ0IDkzLjMxMDUiPgogPGc+CiAgPHJlY3QgaGVpZ2h0PSI5My4zMTA1IiBvcGFjaXR5PSIwIiB3aWR0aD0iMTAyLjM0NCIgeD0iMCIgeT0iMCIvPgogIDxwYXRoIGQ9Ik0xMy4zMzAxIDkyLjc3MzRMODkuMDEzNyA5Mi43NzM0Qzk3LjMxNDUgOTIuNzczNCAxMDIuMzQ0IDg3LjAxMTcgMTAyLjM0NCA3OS41NDFDMTAyLjM0NCA3Ny4yNDYxIDEwMS42NiA3NC44NTM1IDEwMC40MzkgNzIuNzA1MUw2Mi41NDg4IDYuNjg5NDVDNjAuMDA5OCAyLjI0NjA5IDU1LjY2NDEgMCA1MS4xNzE5IDBDNDYuNjc5NyAwIDQyLjI4NTIgMi4yNDYwOSAzOS43OTQ5IDYuNjg5NDVMMS45MDQzIDcyLjcwNTFDMC41ODU5MzggNzQuOTAyMyAwIDc3LjI0NjEgMCA3OS41NDFDMCA4Ny4wMTE3IDUuMDI5MyA5Mi43NzM0IDEzLjMzMDEgOTIuNzczNFoiIGZpbGw9IiNmZjQ1M2EiLz4KICA8cGF0aCBkPSJNNTEuMjIwNyA2MC4xNTYyQzQ4LjY4MTYgNjAuMTU2MiA0Ny4yNjU2IDU4LjY5MTQgNDcuMjE2OCA1Ni4xMDM1TDQ2LjU4MiAyOS41NDFDNDYuNTMzMiAyNi45NTMxIDQ4LjQzNzUgMjUuMDk3NyA1MS4xNzE5IDI1LjA5NzdDNTMuODA4NiAyNS4wOTc3IDU1Ljg1OTQgMjcuMDAyIDU1LjgxMDUgMjkuNTg5OEw1NS4wNzgxIDU2LjEwMzVDNTUuMDI5MyA1OC43NDAyIDUzLjYxMzMgNjAuMTU2MiA1MS4yMjA3IDYwLjE1NjJaTTUxLjIyMDcgNzYuNTEzN0M0OC4yOTEgNzYuNTEzNyA0NS43NTIgNzQuMTY5OSA0NS43NTIgNzEuMjg5MUM0NS43NTIgNjguMzU5NCA0OC4yNDIyIDY2LjAxNTYgNTEuMjIwNyA2Ni4wMTU2QzU0LjE1MDQgNjYuMDE1NiA1Ni42NDA2IDY4LjMxMDUgNTYuNjQwNiA3MS4yODkxQzU2LjY0MDYgNzQuMjE4OCA1NC4xMDE2IDc2LjUxMzcgNTEuMjIwNyA3Ni41MTM3WiIgZmlsbD0iYmxhY2siLz4KIDwvZz4KPC9zdmc+Cg==" /> <link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCAxMDIuMzQ0IDkzLjMxMDUiPgogPGc+CiAgPHJlY3QgaGVpZ2h0PSI5My4zMTA1IiBvcGFjaXR5PSIwIiB3aWR0aD0iMTAyLjM0NCIgeD0iMCIgeT0iMCIvPgogIDxwYXRoIGQ9Ik0xMy4zMzAxIDkyLjc3MzRMODkuMDEzNyA5Mi43NzM0Qzk3LjMxNDUgOTIuNzczNCAxMDIuMzQ0IDg3LjAxMTcgMTAyLjM0NCA3OS41NDFDMTAyLjM0NCA3Ny4yNDYxIDEwMS42NiA3NC44NTM1IDEwMC40MzkgNzIuNzA1MUw2Mi41NDg4IDYuNjg5NDVDNjAuMDA5OCAyLjI0NjA5IDU1LjY2NDEgMCA1MS4xNzE5IDBDNDYuNjc5NyAwIDQyLjI4NTIgMi4yNDYwOSAzOS43OTQ5IDYuNjg5NDVMMS45MDQzIDcyLjcwNTFDMC41ODU5MzggNzQuOTAyMyAwIDc3LjI0NjEgMCA3OS41NDFDMCA4Ny4wMTE3IDUuMDI5MyA5Mi43NzM0IDEzLjMzMDEgOTIuNzczNFoiIGZpbGw9IiNmZjQ1M2EiLz4KICA8cGF0aCBkPSJNNTEuMjIwNyA2MC4xNTYyQzQ4LjY4MTYgNjAuMTU2MiA0Ny4yNjU2IDU4LjY5MTQgNDcuMjE2OCA1Ni4xMDM1TDQ2LjU4MiAyOS41NDFDNDYuNTMzMiAyNi45NTMxIDQ4LjQzNzUgMjUuMDk3NyA1MS4xNzE5IDI1LjA5NzdDNTMuODA4NiAyNS4wOTc3IDU1Ljg1OTQgMjcuMDAyIDU1LjgxMDUgMjkuNTg5OEw1NS4wNzgxIDU2LjEwMzVDNTUuMDI5MyA1OC43NDAyIDUzLjYxMzMgNjAuMTU2MiA1MS4yMjA3IDYwLjE1NjJaTTUxLjIyMDcgNzYuNTEzN0M0OC4yOTEgNzYuNTEzNyA0NS43NTIgNzQuMTY5OSA0NS43NTIgNzEuMjg5MUM0NS43NTIgNjguMzU5NCA0OC4yNDIyIDY2LjAxNTYgNTEuMjIwNyA2Ni4wMTU2QzU0LjE1MDQgNjYuMDE1NiA1Ni42NDA2IDY4LjMxMDUgNTYuNjQwNiA3MS4yODkxQzU2LjY0MDYgNzQuMjE4OCA1NC4xMDE2IDc2LjUxMzcgNTEuMjIwNyA3Ni41MTM3WiIgZmlsbD0iYmxhY2siLz4KIDwvZz4KPC9zdmc+Cg==" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.18.0/cdn/themes/dark.css" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.18.0/cdn/themes/dark.css" />
<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.18.0/cdn/shoelace-autoloader.js"></script> <script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.18.0/cdn/shoelace-autoloader.js"></script>
@@ -42,24 +42,23 @@ async function pageIan() {
clearAlerts(); clearAlerts();
const params = new URLSearchParams({
msg: msg,
});
const resp = await fetch( const resp = await fetch(
'https://events.pagerduty.com/v2/enqueue', '.',
{ {
method: 'POST', method: 'POST',
body: JSON.stringify({ headers: {
payload: { 'Content-Type': 'application/x-www-form-urlencoded',
severity: 'critical',
source: 'jsapp',
summary: msg,
}, },
routing_key: '63e451a6e5f84309d08d439bfe5efab5', body: params.toString(),
event_action: 'trigger',
}),
}, },
) )
if (!resp.ok) { if (!resp.ok) {
error('Failed to send page', (await resp.json()).message); error('Failed to send page', await resp.text());
return; return;
} }
@@ -69,6 +68,13 @@ async function pageIan() {
</head> </head>
<body> <body>
<div style="width: min(500px, 100vw)"> <div style="width: min(500px, 100vw)">
<sl-textarea id="message" placeholder="Message" oninput="clearAlerts()"></sl-textarea>
<br />
<br />
<div style="text-align: center">
<sl-button type="submit" variant="primary" onclick="pageIan()">Page Ian</sl-button>
</div>
<br />
<sl-alert id="err" variant="danger"> <sl-alert id="err" variant="danger">
<sl-icon slot="icon" name="exclamation-octagon"></sl-icon> <sl-icon slot="icon" name="exclamation-octagon"></sl-icon>
<strong id="err1"></strong><br /> <strong id="err1"></strong><br />
@@ -78,13 +84,6 @@ async function pageIan() {
<sl-icon slot="icon" name="check2-circle"></sl-icon> <sl-icon slot="icon" name="check2-circle"></sl-icon>
<strong>Page sent</strong> <strong>Page sent</strong>
</sl-alert> </sl-alert>
<br />
<sl-textarea id="message" placeholder="Message" oninput="clearAlerts()"></sl-textarea>
<br />
<br />
<div style="text-align: center">
<sl-button type="submit" variant="primary" onclick="pageIan()">Page Ian</sl-button>
</div>
</div> </div>
</body> </body>
</html> </html>