Compare commits

..

5 Commits
v0.1 ... main

Author SHA1 Message Date
Wojciech Kwolek 9028fb513f remove test data
continuous-integration/drone/push Build is passing Details
2021-10-18 17:00:01 +02:00
Wojciech Kwolek c5bd1c5707 allow customizing the addresses on the site
continuous-integration/drone/push Build is passing Details
2021-10-18 16:59:31 +02:00
Wojciech Kwolek f84b0a16e1 add docker image
continuous-integration/drone/push Build is passing Details
2021-10-18 16:46:35 +02:00
Wojciech Kwolek 1e1bc3594c get config from .env, persist ssh host key
continuous-integration/drone/push Build is passing Details
2021-10-18 16:20:00 +02:00
Wojciech Kwolek e3a1e9573e rename domain
continuous-integration/drone/push Build is passing Details
2021-10-10 23:41:26 +02:00
8 changed files with 66 additions and 18 deletions

5
.env.sample Normal file
View File

@ -0,0 +1,5 @@
SSH_KEY=./id_ed25519
SSH_ADDR=:2222
HTTP_ADDR=:8080
SITE_NAME=localhost:8080
SSH_REMOTE_ADDR=localhost:2222

2
.gitignore vendored
View File

@ -1 +1,3 @@
dist/
.env
id_*

11
Dockerfile Normal file
View File

@ -0,0 +1,11 @@
FROM golang:1-alpine as builder
ADD . /src
RUN cd /src && go build -o /messagessh
FROM alpine:latest
COPY --from=builder /messagessh /bin/messagessh
RUN apk --no-cache add openssh
ADD ./entrypoint.sh /entrypoint.sh
EXPOSE 2222
EXPOSE 8080
ENTRYPOINT "/entrypoint.sh"

19
entrypoint.sh Executable file
View File

@ -0,0 +1,19 @@
#!/bin/sh
[[ ! -d /data ]] && mkdir /data
[[ -z $SSH_KEY ]] && SSH_KEY=/data/id_25519
[[ ! -f $SSH_KEY ]] && ssh-keygen -t ed25519 -f "$SSH_KEY" -q -N ""
[[ -z $SSH_ADDR ]] && SSH_ADDR=:2222
[[ -z $HTTP_ADDR ]] && HTTP_ADDR=:8080
[[ -z $SSH_REMOTE_ADDR ]] && {
if [[ ! -z $SITE_NAME ]]; then
SSH_REMOTE_ADDR=$SITE_NAME
else
SSH_REMOTE_ADDR=localhost:2222
fi
}
[[ -z $SITE_NAME ]] && SITE_NAME=localhost:8080
export SSH_KEY SSH_ADDR HTTP_ADDR SSH_REMOTE_ADDR SITE_NAME
echo "Listening on $SSH_ADDR (ssh), $HTTP_ADDR (http)"
messagessh

3
go.mod
View File

@ -1,4 +1,4 @@
module git.kwolek.io/wojciech/messages.sh
module git.kwolek.io/wojciech/msg.kwolek.io
go 1.17
@ -11,6 +11,7 @@ require (
require (
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
github.com/davecgh/go-spew v1.1.0 // indirect
github.com/joho/godotenv v1.4.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 // indirect
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect

2
go.sum
View File

@ -4,6 +4,8 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gliderlabs/ssh v0.3.3 h1:mBQ8NiOgDkINJrZtoizkC3nDNYgSaWtxyem6S2XHBtA=
github.com/gliderlabs/ssh v0.3.3/go.mod h1:ZSS+CUoKHDrqVakTfTWUlKSr9MtMFkC4UvtQKD7O914=
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=

16
main.go
View File

@ -5,10 +5,13 @@ import (
"fmt"
"io"
"log"
"os"
"strings"
"time"
"github.com/gliderlabs/ssh"
"github.com/joho/godotenv"
terminal "golang.org/x/term"
)
@ -60,6 +63,13 @@ func CheckString(s string) bool {
}
func main() {
godotenv.Load()
sshKey := ssh.HostKeyFile(os.Getenv("SSH_KEY"))
sshAddr := os.Getenv("SSH_ADDR")
httpAddr := os.Getenv("HTTP_ADDR")
siteName := os.Getenv("SITE_NAME")
sshRemoteAddr := os.Getenv("SSH_REMOTE_ADDR")
m := NewMessageList(10)
pkAuth := ssh.PublicKeyAuth(func(ctx ssh.Context, key ssh.PublicKey) bool {
return true
@ -162,7 +172,9 @@ func main() {
web := Web{
Messages: m,
SiteName: siteName,
SSHAddr: sshRemoteAddr,
}
go web.ListenAndServe(":8080")
log.Fatal(ssh.ListenAndServe(":2222", nil, pkAuth))
go web.ListenAndServe(httpAddr)
log.Fatal(ssh.ListenAndServe(sshAddr, nil, pkAuth, sshKey))
}

26
web.go
View File

@ -7,11 +7,13 @@ import (
type Web struct {
Messages *MessageList
SiteName string
SSHAddr string
}
var siteTemplate string = `
<!DOCTYPE html>
<title>messages.sh</title>
<title>{{ .Name }}</title>
<meta charset="utf-8">
<style>
@import url('https://fonts.googleapis.com/css2?family=Ubuntu+Mono&display=swap');
@ -103,12 +105,12 @@ h1 {
padding-bottom: 1em;
}
</style>
<h1>messages.sh</h1>
<h1>{{ .Name }}</h1>
<p class="info">Hello! To add your own message, run:</p>
<pre class="info"><code>ssh messages.sh</code></pre>
<pre class="info"><code>ssh {{ .Addr }}</code></pre>
<h2>Latest messages</h2>
<p>
{{range .}}
{{range .Msgs}}
<div class="message">
<div class="meta"><div class="ts">{{ .Timestamp.Format "2006-01-02 15:04:05 MST" }}</div> <div class="username">{{ .Username }} ({{ .PKShort }})</div></div> <div class="content">{{ .Content }}</div><br>
</div>
@ -117,19 +119,13 @@ h1 {
`
func (w *Web) ListenAndServe(addr string) {
w.Messages.Add(Message{
Content: "2137 papiez",
Username: "weeeoefka",
PKShort: "23daa6f",
})
w.Messages.Add(Message{
Content: "2137 papiez lorem ipsum dolan sit amet saldkjaksjdf sdkjf slkdj flskjdf lkjsdlkfj ",
Username: "weeeoe",
PKShort: "23daa6f",
})
tmpl := template.Must(template.New("tmpl").Parse(siteTemplate))
http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {
tmpl.Execute(rw, w.Messages.Reverse())
tmpl.Execute(rw, map[string]interface{}{
"Msgs": w.Messages.Reverse(),
"Name": w.SiteName,
"Addr": w.SSHAddr,
})
})
http.ListenAndServe(addr, nil)
}