<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Cradicle Explorer</title>
    <link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
    <style>
      .form-control-dark::placeholder {
          color: #aaa;
          opacity: 1;
      }
    </style>
    <link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
    <link rel="icon" type="image/png" href="/favicon.png">


                <link href="/css/dashboard.css" rel="stylesheet">
                </head>
                <body>
                <header class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
                  <a class="navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6" href="/">Cradicle Explorer</a>
                  <button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                  </button>
                  <form method="get" action="/cgi-bin/main" style="width:100%;"><input class="form-control form-control-dark w-100 rounded-0 border-0" type="text" name="q" placeholder="Search repos" aria-label="Search"></form>
                  <div class="navbar-nav flex-row">
                    <div class="nav-item text-nowrap">
                      <a class="nav-link px-3 active" href="/cgi-bin/repo?id=z34N4czZqp5MXJYwLYk71GdxCDoeW">go-uptime-alert</a>
                    </div>
                  </div>
                </header>
                <div class="container-fluid">
                  <div class="row">
                    <nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-dark sidebar collapse">
                      <div class="position-sticky pt-3 sidebar-sticky">
                        <ul class="nav flex-column">
                          <li class="nav-item">
                            <a class="nav-link active" href="/cgi-bin/repo?id=z34N4czZqp5MXJYwLYk71GdxCDoeW">
                              <i class="align-text-bottom fa-solid fa-info"></i>
                              Info
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z34N4czZqp5MXJYwLYk71GdxCDoeW&issue=list">
                              <i class="align-text-bottom fa-solid fa-layer-group"></i>
                              Issues
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z34N4czZqp5MXJYwLYk71GdxCDoeW&patch=list">
                              <i class="align-text-bottom fa-solid fa-vest-patches"></i>
                              Patches
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z34N4czZqp5MXJYwLYk71GdxCDoeW&wallet=list">
                              <i class="align-text-bottom fa-solid fa-wallet"></i>
                              Wallets
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z34N4czZqp5MXJYwLYk71GdxCDoeW&source=.">
                              <i class="align-text-bottom fa-solid fa-code"></i>
                              Source
                            </a>
                          </li>
                        <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted text-uppercase">
                          <span></span>
                        </h6>
                        <ul class="nav flex-column mb-2">
                        
                        </ul>
                      </div>
                    </nav>
                <main class="col-md-9 ms-sm-auto col-lg-10">
                  <div class="container px-1 py-3">
        

    <div class="list-group">
    <div class="list-group-item">
    <div style="font-size:1.3rem;">go-uptime-alert</div>
    <div class="repo-item">Program that checks if a URL returns an HTTP 200 status</div>
    <div>rad:z34N4czZqp5MXJYwLYk71GdxCDoeW</div>
    </div>
    <div class="list-group-item">
    <div>Visibility</div>
    <div class="repo-item">public</div>
    </div>
    <div class="list-group-item">
    <div>Delegates</div><div class="repo-item">did:key:z6MkfVu4xWZfARXYGEGx3kUim5yEMMczbdxrpfvZwnfeT95t</div>
    </div>
    <div class="list-group-item">
    <div>Default branch</div>
    <div><span class="repo-item">main &#8594 04e4331c9961e5e7aed020bdd385813330b084a9</span> (Wed Oct 25 14:57:05 2023)</div>
    </div>
    <div class="list-group-item">
    <div>Threshold</div>
    <div class="repo-item">1</div>
    </div>
    </div>
    
        <div class="list-group mt-3">
        <div class="list-group-item">
        <div class="mb-2" style="font-weight:bold;"><i class="fa-solid fa-book"></i> README.md</div>
        <pre style="margin:0; font-size:0.85rem; overflow-x:auto; color:#fafafa;"># go-uptime-alert

This program checks to see if each URL in a given set of URLs responds with a 200 OK HTTP status, and if they do it send a ping to a healthchecks.io API. I run this as a cronjob or systemd timer every 15 minutes, and I have the grace time and period of the Healthchecks check set to 15 minutes.

## Installation

Requires Go &gt;= 1.20

``` shell
go install git.sr.ht/~hyperreal/go-uptime-alert@latest
```

## Usage

It requires a JSON configuration file located at `~/.config/go-uptime-alert.json`. The configuration file is of the following format:

``` json
{
    &quot;service_urls_uuids&quot;: [
        { &quot;site_url&quot;: &quot;https://hyperreal.coffee&quot;, &quot;hc_ping_url&quot;: &quot;&lt;Healthchecks.io API ping URL&gt;&quot; },
        { &quot;site_url&quot;: &quot;https://fedi.hyperreal.coffee&quot;, &quot;hc_ping_url&quot;: &quot;&lt;Healthchecks.io API ping URL&gt;&quot; }
    ]
}
```

### systemd

`~/.config/systemd/user/go-uptime-alert.service`
``` ini
[Unit]
Description=go-uptime-alert service

[Service]
Type=oneshot
ExecStart=/home/user/go/bin/go-uptime-alert
```

`~/.config/systemd/user/go-uptime-alert.timer`

``` ini
[Unit]
Description=go-uptime-alert timer

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target
```

Enable linger for the user and enable the timer:

``` shell
sudo loginctl enable-linger user
systemctl --user enable --now go-uptime-alert.timer
```

### cron/periodic

Place the following at `/etc/periodic/15min/go-uptime-alert`:

``` shell
#!/bin/sh

LOGFILE=&quot;/var/log/go-uptime-alert.log&quot;

sudo -u user /home/user/go/bin/go-uptime-alert &gt;&gt; &quot;${LOGFILE}&quot; 2&gt;&amp;1
```

## TODO

- Send output to a static HTML file and format appropriately for web server.
- Send output to a .md file for use in Hugo or other static site generators.

## Or just use Bash and curl

``` shell
#!/usr/bin/env bash

# associative array to store mappings between site URLS and ping URLs.
declare -A sites_hc_urls

sites_hc_urls[&quot;https://hyperreal.coffee&quot;]=&quot;https://healthchecks.io/ping/blahblah&quot;
sites_hc_urls[&quot;https://anonoverflow.hyperreal.coffee&quot;]=&quot;https://healthchecks.io/ping/blahblahblah&quot;
...

for key in &quot;${!sites_hc_urls[@]}&quot;; do
    if curl -sSL -q &quot;$key&quot; &gt;/dev/null 2&gt;&amp;1; then
        if curl -m 10 --retry 5 &quot;${sites_hc_urls[$key]}&quot; &gt;/dev/null 2&gt;&amp;1; then
            echo &quot;$key: OK&quot;
        else
            echo &quot;Error sending ping to ${sites_hc_urls[$key]}&quot;
        fi
    else
        echo &quot;$key: DOWN&quot;
    fi
done
```
</pre>
        </div>
        </div>

</div>
</main>
</div>
</div>


</body>
</html>

