feat: refactor configuration + html page template data

This commit is contained in:
wpetit 2023-09-24 09:33:20 -06:00
parent c2f8be504e
commit bf14a70efe
10 changed files with 59 additions and 43 deletions

View File

@ -57,6 +57,7 @@ nfpms:
packager: deb packager: deb
- src: misc/packaging/systemd/rebound.env - src: misc/packaging/systemd/rebound.env
dst: /etc/rebound/environ dst: /etc/rebound/environ
type: config|noreplace
packager: deb packager: deb
# RPM # RPM
@ -64,6 +65,7 @@ nfpms:
dst: /usr/lib/systemd/system/rebound.service dst: /usr/lib/systemd/system/rebound.service
packager: rpm packager: rpm
- src: misc/packaging/systemd/rebound.env - src: misc/packaging/systemd/rebound.env
type: config|noreplace
dst: /etc/rebound/environ dst: /etc/rebound/environ
packager: rpm packager: rpm
@ -74,6 +76,7 @@ nfpms:
mode: 0755 mode: 0755
packager: apk packager: apk
- src: misc/packaging/openrc/rebound.conf - src: misc/packaging/openrc/rebound.conf
type: config|noreplace
dst: /etc/conf.d/rebound dst: /etc/conf.d/rebound
file_info: file_info:
mode: 0755 mode: 0755
@ -84,14 +87,6 @@ nfpms:
type: dir type: dir
file_info: file_info:
mode: 0700 mode: 0700
- dst: /etc/rebound/custom
type: dir
file_info:
mode: 0700
- dst: /usr/share/rebound
type: dir
file_info:
mode: 0700
- dst: /var/log/rebound - dst: /var/log/rebound
type: dir type: dir
file_info: file_info:

View File

@ -1,7 +1,6 @@
package main package main
import ( import (
"flag"
"log" "log"
"os" "os"
"os/signal" "os/signal"
@ -19,30 +18,17 @@ func main() {
log.Fatalf("[ERROR] %+v", errors.WithStack(err)) log.Fatalf("[ERROR] %+v", errors.WithStack(err))
} }
// Global Options
address := flag.String("address", opts.Address, "server listening address")
// SSH Options
sockDir := flag.String("ssh-sock-dir", opts.SSH.SockDir, "ssh sock directory")
publicPort := flag.Uint("ssh-public-port", opts.SSH.PublicPort, "ssh public port")
publicHost := flag.String("ssh-public-host", opts.SSH.PublicHost, "ssh public host")
hostKey := flag.String("ssh-host-key", opts.SSH.HostKey, "ssh host key")
// HTTP Options
customDir := flag.String("http-custom-dir", opts.HTTP.CustomDir, "http custom templates/assets directory")
flag.Parse()
server := rebound.NewServer( server := rebound.NewServer(
rebound.WithAddress(*address), rebound.WithAddress(opts.Address),
rebound.WithSSHOption( rebound.WithSSHOption(
ssh.WithSockDir(*sockDir), ssh.WithSockDir(opts.SSH.SockDir),
ssh.WithPublicHost(*publicHost), ssh.WithPublicHost(opts.SSH.PublicHost),
ssh.WithPublicPort(*publicPort), ssh.WithPublicPort(opts.SSH.PublicPort),
ssh.WithHostKey(*hostKey), ssh.WithHostKey(opts.SSH.HostKey),
), ),
rebound.WitHTTPOption( rebound.WitHTTPOption(
http.WithCustomDir(*customDir), http.WithCustomDir(opts.HTTP.CustomDir),
http.WithTemplateData(opts.HTTP.TemplateData),
), ),
) )

View File

@ -1,10 +1,19 @@
package http package http
import "log" import (
"log"
)
type Options struct { type Options struct {
Logger func(message string, args ...any) Logger func(message string, args ...any)
CustomDir string `env:"CUSTOM_DIR"` CustomDir string `env:"CUSTOM_DIR"`
TemplateData *TemplateData `envPrefix:"TEMPLATE_DATA_"`
}
type TemplateData struct {
Title string `env:"TITLE"`
SSHPublicHost string `env:"SSH_PUBLIC_HOST"`
SSHPublicPort int `env:"SSH_PUBLIC_PORT"`
} }
type OptionFunc func(*Options) type OptionFunc func(*Options)
@ -13,6 +22,11 @@ func DefaultOptions() *Options {
return &Options{ return &Options{
Logger: log.Printf, Logger: log.Printf,
CustomDir: "", CustomDir: "",
TemplateData: &TemplateData{
Title: "Rebound",
SSHPublicHost: "127.0.0.1",
SSHPublicPort: 2222,
},
} }
} }
@ -27,3 +41,9 @@ func WithCustomDir(customDir string) func(*Options) {
opts.CustomDir = customDir opts.CustomDir = customDir
} }
} }
func WithTemplateData(templateData *TemplateData) func(*Options) {
return func(opts *Options) {
opts.TemplateData = templateData
}
}

View File

@ -30,13 +30,7 @@ type Server struct {
} }
func (s *Server) serveHomepage(w http.ResponseWriter, r *http.Request) { func (s *Server) serveHomepage(w http.ResponseWriter, r *http.Request) {
data := struct { s.renderTemplate(w, "index", s.opts.TemplateData)
Title string
}{
Title: "Rebound",
}
s.renderTemplate(w, "index", data)
} }
func (s *Server) Serve(l net.Listener) error { func (s *Server) Serve(l net.Listener) error {

View File

@ -2,7 +2,7 @@
<footer class="footer"> <footer class="footer">
<div class="container"> <div class="container">
<div class="content has-text-centered"> <div class="content has-text-centered">
Ce service est propulsé par Rebound, un logiciel libre diffusé sous licence <a href="#">AGPL-3.0</a>. Ce service est propulsé par <a href="https://forge.cadoles.com/wpetit/rebound" title="Rebound repository">Rebound</a>, un logiciel libre diffusé sous licence <a href="https://www.gnu.org/licenses/agpl-3.0.en.html#license-text">AGPL-3.0</a>.
</div> </div>
</div> </div>
</footer> </footer>

View File

@ -17,7 +17,7 @@
<p>Rebound est un serveur SSH permettant de créer des tunnels TCP/IP éphémères et privés entre 2 machines positionnées <p>Rebound est un serveur SSH permettant de créer des tunnels TCP/IP éphémères et privés entre 2 machines positionnées
derrière un <abbr title="Network Address Traversal">NAT</abbr>.</p> derrière un <abbr title="Network Address Traversal">NAT</abbr>.</p>
<p>Pour l'utiliser <strong>un simple client SSH suffit !</strong></p> <p>Pour l'utiliser <strong>un simple client SSH suffit !</strong></p>
<pre class="has-background-dark has-text-white-ter is-family-monospace">ssh -R 0:127.0.0.1:<span class="has-text-info">&lt;port&gt;</span> rebound@rebound.cadol.es</pre> <pre class="has-background-dark has-text-white-ter is-family-monospace">ssh -R 0:127.0.0.1:<span class="has-text-info">&lt;port&gt;</span> rebound@{{ .SSHPublicHost }} -p {{ .SSHPublicPort }}</pre>
<p class="is-italic"><span class="has-text-info">&lt;port&gt;</span> est à remplacer par le port du service <p class="is-italic"><span class="has-text-info">&lt;port&gt;</span> est à remplacer par le port du service
s'exécutant sur votre machine en local.</span> s'exécutant sur votre machine en local.</span>
<p>Une fois connecté, suivez les instructions. 😉</p> <p>Une fois connecté, suivez les instructions. 😉</p>

View File

@ -3,4 +3,7 @@ export REBOUND_HTTP_CUSTOM_DIR=/etc/rebound/custom
export REBOUND_SSH_PUBLIC_HOST=rebound export REBOUND_SSH_PUBLIC_HOST=rebound
export REBOUND_SSH_PUBLIC_PORT=2222 export REBOUND_SSH_PUBLIC_PORT=2222
export REBOUND_SSH_SOCK_DIR=/var/lib/rebound/socks export REBOUND_SSH_SOCK_DIR=/var/lib/rebound/socks
export REBOUND_SSH_HOST_KEY=/etc/rebound/host.key export REBOUND_SSH_HOST_KEY=/etc/rebound/host.key
export REBOUND_HTTP_TEMPLATE_DATA_TITLE=Rebound
export REBOUND_HTTP_TEMPLATE_DATA_SSH_PUBLIC_HOST=127.0.0.1
export REBOUND_HTTP_TEMPLATE_DATA_SSH_PUBLIC_PORT=8080

View File

@ -3,4 +3,7 @@ REBOUND_HTTP_CUSTOM_DIR=/var/lib/rebound/custom
REBOUND_SSH_PUBLIC_HOST=rebound REBOUND_SSH_PUBLIC_HOST=rebound
REBOUND_SSH_PUBLIC_PORT=8080 REBOUND_SSH_PUBLIC_PORT=8080
REBOUND_SSH_SOCK_DIR=/var/lib/rebound/socks REBOUND_SSH_SOCK_DIR=/var/lib/rebound/socks
REBOUND_SSH_HOST_KEY=/var/lib/rebound/host.key REBOUND_SSH_HOST_KEY=/var/lib/rebound/host.key
REBOUND_HTTP_TEMPLATE_DATA_TITLE=Rebound
REBOUND_HTTP_TEMPLATE_DATA_SSH_PUBLIC_HOST=127.0.0.1
REBOUND_HTTP_TEMPLATE_DATA_SSH_PUBLIC_PORT=8080

View File

@ -47,6 +47,7 @@ func (s *Server) Start() error {
server := http.NewServer( server := http.NewServer(
http.WithCustomDir(s.opts.HTTP.CustomDir), http.WithCustomDir(s.opts.HTTP.CustomDir),
http.WithTemplateData(s.opts.HTTP.TemplateData),
http.WithLogger(s.opts.HTTP.Logger), http.WithLogger(s.opts.HTTP.Logger),
) )

View File

@ -80,6 +80,11 @@ func (s *Server) handleRequest(ctx ssh.Context, srv *ssh.Server, req *gossh.Requ
addr := s.getSocketPath(sessionID) addr := s.getSocketPath(sessionID)
if err := s.ensureFileDir(addr); err != nil {
s.log("[ERROR] %+v", errors.WithStack(err))
return false, []byte("internal server error")
}
ln, err := net.Listen("unix", addr) ln, err := net.Listen("unix", addr)
if err != nil { if err != nil {
s.log("[ERROR] %+v", errors.WithStack(err)) s.log("[ERROR] %+v", errors.WithStack(err))
@ -200,6 +205,15 @@ func (s *Server) getSocketPath(sessionID SessionID) string {
return filepath.Join(s.opts.SockDir, fmt.Sprintf("%s.sock", sessionID)) return filepath.Join(s.opts.SockDir, fmt.Sprintf("%s.sock", sessionID))
} }
func (s *Server) ensureFileDir(file string) error {
dir := filepath.Dir(file)
if err := os.MkdirAll(dir, os.FileMode(0750)); err != nil {
return errors.WithStack(err)
}
return nil
}
func generateToken(length int) (string, error) { func generateToken(length int) (string, error) {
chars := []rune( chars := []rune(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +