ugit/cmd/ugitd/main.go

86 lines
1.8 KiB
Go

package main
import (
"errors"
"flag"
"fmt"
"os"
"os/signal"
"go.jolheiser.com/ugit/internal/http"
"go.jolheiser.com/ugit/internal/ssh"
"github.com/charmbracelet/log"
"github.com/go-chi/chi/v5/middleware"
"github.com/go-git/go-git/v5/utils/trace"
)
func main() {
args, err := parseArgs(os.Args[1:])
if err != nil {
if errors.Is(err, flag.ErrHelp) {
return
}
panic(err)
}
if args.Debug {
trace.SetTarget(trace.Packet)
log.SetLevel(log.DebugLevel)
} else {
middleware.DefaultLogger = http.NoopLogger
ssh.DefaultLogger = ssh.NoopLogger
}
if err := os.MkdirAll(args.RepoDir, os.ModePerm); err != nil {
panic(err)
}
sshSettings := ssh.Settings{
AuthorizedKeys: args.SSH.AuthorizedKeys,
CloneURL: args.SSH.CloneURL,
Port: args.SSH.Port,
HostKey: args.SSH.HostKey,
RepoDir: args.RepoDir,
}
sshSrv, err := ssh.New(sshSettings)
if err != nil {
panic(err)
}
go func() {
fmt.Printf("SSH listening on ssh://localhost:%d\n", sshSettings.Port)
if err := sshSrv.ListenAndServe(); err != nil {
panic(err)
}
}()
httpSettings := http.Settings{
Title: args.Meta.Title,
Description: args.Meta.Description,
CloneURL: args.HTTP.CloneURL,
Port: args.HTTP.Port,
RepoDir: args.RepoDir,
Profile: http.Profile{
Username: args.Profile.Username,
Email: args.Profile.Email,
},
}
for _, link := range args.Profile.Links {
httpSettings.Profile.Links = append(httpSettings.Profile.Links, http.Link{
Name: link.Name,
URL: link.URL,
})
}
httpSrv := http.New(httpSettings)
go func() {
fmt.Printf("HTTP listening on http://localhost:%d\n", httpSettings.Port)
if err := httpSrv.ListenAndServe(); err != nil {
panic(err)
}
}()
ch := make(chan os.Signal, 1)
signal.Notify(ch, os.Kill, os.Interrupt)
<-ch
}