First step
This commit is contained in:
parent
d1600c38c8
commit
36f5dde838
32
curl.go
Normal file
32
curl.go
Normal file
@ -0,0 +1,32 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func curl(socket, method, path string) (io.ReadCloser, error) {
|
||||
socketDial := func(proto, addr string) (conn net.Conn, err error) {
|
||||
return net.Dial("unix", socket)
|
||||
}
|
||||
|
||||
tr := &http.Transport{
|
||||
Dial: socketDial,
|
||||
}
|
||||
client := &http.Client{
|
||||
Transport: tr,
|
||||
}
|
||||
|
||||
req, err := http.NewRequest(method, path, nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Error creating request: %w\n", err)
|
||||
}
|
||||
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Error performing request: %w\n", err)
|
||||
}
|
||||
return resp.Body, nil
|
||||
}
|
38
index.html
Normal file
38
index.html
Normal file
@ -0,0 +1,38 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Meetup Go</title>
|
||||
<link href="/style.css" type="text/css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Meetup Go !</h1>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>CONTAINER ID</th>
|
||||
<th>IMAGE</th>
|
||||
<th>COMMAND</th>
|
||||
<th>CREATED</th>
|
||||
<th>STATUS</th>
|
||||
<th>PORTS</th>
|
||||
<th>NAMES</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="containers">
|
||||
</tbody>
|
||||
</table>
|
||||
<script>
|
||||
fetch('/containers').then(
|
||||
(res) => res.json()
|
||||
).then(
|
||||
(containers) => {
|
||||
document.getElementById('containers').innerHTML = '';
|
||||
for (const container of containers) {
|
||||
let div = document.createElement('tr');
|
||||
div.innerHTML = `<td>${container.Id.substring(0, 8)}</td><td>${container.Image}</td><td>${container.Command}</td><td>${container.Created}</td><td>${container.Status}</td><td>${container.Ports.map((port) => port.PrivatePort + '/' + port.Type).join(" ")}</td><td>${container.Names.join(" ")}</td>`;
|
||||
document.getElementById('containers').appendChild(div);
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
22
main.go
Normal file
22
main.go
Normal file
@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func main() {
|
||||
http.HandleFunc("GET /containers", func(w http.ResponseWriter, r *http.Request) {
|
||||
rd, err := curl("/var/run/docker.sock", "GET", "http://d/v1.43/containers/json?all=true")
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
} else {
|
||||
io.Copy(w, rd)
|
||||
}
|
||||
})
|
||||
|
||||
http.Handle("GET /", http.FileServer(http.Dir(".")))
|
||||
|
||||
log.Fatal(http.ListenAndServe(":8080", nil))
|
||||
}
|
31
style.css
Normal file
31
style.css
Normal file
@ -0,0 +1,31 @@
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
gap: .5rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
border-bottom: 5px double forestgreen;
|
||||
flex-grow: 1;
|
||||
text-align: center;
|
||||
padding-bottom: .66rem;
|
||||
}
|
||||
|
||||
table {
|
||||
border-spacing:0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
td, th {
|
||||
padding: .5rem 0;
|
||||
text-align: center;
|
||||
}
|
||||
tbody > tr {
|
||||
border-top: 1px solid #222;
|
||||
}
|
||||
tbody > tr:nth-child(odd) {
|
||||
background: #bbb;
|
||||
}
|
||||
tbody > tr:nth-child(even) {
|
||||
background: #ddd;
|
||||
}
|
Loading…
Reference in New Issue
Block a user