made log package
sophuwu sophie@sophuwu.com
Sun, 27 Jul 2025 20:36:04 +0200
7 files changed,
79 insertions(+),
69 deletions(-)
M
CFG/CFG.go
→
CFG/CFG.go
@@ -3,9 +3,8 @@
import ( "context" "errors" - "fmt" "git.sophuwu.com/gophuwu/flags" - "git.sophuwu.com/manhttpd/neterr" + "git.sophuwu.com/manhttpd/logs" "golang.org/x/sys/unix" "net/http" "os"@@ -41,20 +40,20 @@ }
func checkCmds() { var err error + errfmt := "dependency `%s` not found" Mandoc, err = which("mandoc") - fmt.Println(Mandoc, err) if err != nil || len(Mandoc) == 0 { - neterr.Fatal("dependency `mandoc` not found in $PATH, is it installed?\n") + logs.Fatalf(errfmt, "mandoc") } ManCmd, err = which("man") - if err != nil { - neterr.Fatal("dependency `man` not found in $PATH, is it installed?\n") + if err != nil || len(ManCmd) == 0 { + logs.Fatalf(errfmt, "man") } DbCmd, err = which("apropos") if err != nil || len(DbCmd) == 0 { DbCmd, err = which("whatis") if err != nil || len(DbCmd) == 0 { - neterr.Fatal("dependency `apropos` or `whatis` not found in $PATH, is it installed?\n") + logs.Fatalf(errfmt, "apropos") } } }@@ -88,9 +87,7 @@ func ParseConfig() {
checkCmds() s, err := flags.GetStringFlag("conf") - if err != nil { - neterr.Fatal("Failed to get configuration file flag:", err) - } + logs.CheckFatal("getting conf flag", err) if s != "" { ConfFile = s }@@ -98,7 +95,7 @@
err = parse() if err != nil { if !errors.Is(err, NoConfError) { - neterr.Fatal("Failed to parse configuration file:", err) + logs.Fatal("parsing conf file", err) } getEnvs() }@@ -134,20 +131,20 @@ sigchan := make(chan os.Signal)
go func() { signal.Notify(sigchan, unix.SIGINT, unix.SIGTERM, unix.SIGQUIT, unix.SIGKILL, unix.SIGSTOP) <-sigchan - fmt.Println("Stopping server...") + logs.Log("Stopping server...") err = server.Shutdown(context.Background()) if err != nil { - fmt.Println("Error stopping server: %v", err) + logs.Log("Error stopping server: %v", err) } }() - fmt.Println("Starting server on", server.Addr) + logs.Log("Starting server on", server.Addr) if UseTLS && TLSCertFile != "" && TLSKeyFile != "" { err = server.ListenAndServeTLS(TLSCertFile, TLSKeyFile) } else { err = server.ListenAndServe() } if err != nil && !errors.Is(err, http.ErrServerClosed) { - fmt.Println("Error starting server:", err) + logs.Log("Error starting server:", err) } - fmt.Println("Server stopped.") + logs.Log("Server stopped.") }
M
CFG/etc.conf.go
→
CFG/etc.conf.go
@@ -3,6 +3,7 @@
import ( "errors" "fmt" + "git.sophuwu.com/manhttpd/logs" "os" "strings" )@@ -78,7 +79,7 @@ var fn func(j string) error
var ok bool errFmt := "invalid %s in " + ConfFile + " at line %d: %s" ErrPrint := func(e, s string) { - fmt.Fprintf(os.Stderr, errFmt, e, i+1, s) + logs.Logf(errFmt, e, i+1, s) } for i, line = range strings.Split(string(b), "\n") { if len(line) == 0 {
M
embeds/embeds.go
→
embeds/embeds.go
@@ -5,6 +5,7 @@ "embed"
_ "embed" "fmt" "git.sophuwu.com/manhttpd/CFG" + "git.sophuwu.com/manhttpd/logs" "git.sophuwu.com/manhttpd/neterr" "html/template" "io/fs"@@ -65,9 +66,6 @@ sfs.Content, _ = static.ReadFile("static/" + f.Name())
sfs.Length = fmt.Sprint(len(sfs.Content)) files[ext] = sfs } - if len(files) != 3 { - neterr.Fatal("Failed to load static files, expected 3 types (css, js, ico), got", len(files)) - } } var t *template.Template@@ -83,9 +81,7 @@ func OpenAndParse() {
openStatic() var e error t, e = template.New("index.html").Parse(index) - if e != nil { - neterr.Fatal("Failed to parse index template:", e) - } + logs.CheckFatal("unable to parse embedded html", e) LoginPage = strings.ReplaceAll(LoginPage, "{{ HostName }}", func() string { if CFG.Hostname != "" { return "@" + CFG.Hostname
A
logs/logs.go
@@ -0,0 +1,34 @@
+package logs + +import ( + "fmt" + "os" +) + +func Log(a ...any) { + fmt.Println(a...) +} + +func Logf(format string, a ...any) { + fmt.Printf(format, a...) +} + +func Error(a ...any) { + fmt.Println("Error: ", fmt.Sprint(a...)) +} + +func Fatalf(format string, a ...any) { + fmt.Println("Fatal Error: ", fmt.Sprintf(format, a...)) + os.Exit(1) +} + +func Fatal(msg string, err error) { + fmt.Println("Fatal Error:", msg, ": ", err) + os.Exit(1) +} + +func CheckFatal(msg string, err error) { + if err != nil { + Fatal(msg, err) + } +}
M
main.go
→
main.go
@@ -7,6 +7,7 @@ "git.sophuwu.com/authuwu/userpass"
"git.sophuwu.com/gophuwu/flags" "git.sophuwu.com/manhttpd/CFG" "git.sophuwu.com/manhttpd/embeds" + "git.sophuwu.com/manhttpd/logs" "git.sophuwu.com/manhttpd/manpage" "git.sophuwu.com/manhttpd/neterr" "git.sophuwu.com/manhttpd/tldr"@@ -21,17 +22,16 @@ )
func init() { err := flags.NewFlag("conf", "c", "configuration file to use", "/etc/manhttpd/manhttpd.conf") - neterr.ChkFtl("creating conf flag:", err) + logs.CheckFatal("creating conf flag", err) err = flags.NewFlag("passwd", "p", "open the program in password edit mode", false) - neterr.ChkFtl("creating passwd flag:", err) + logs.CheckFatal("creating passwd flag", err) err = flags.NewFlag("user", "u", "choose a username to set/change/delete password for", "") - neterr.ChkFtl("creating user flag:", err) + logs.CheckFatal("creating user flag", err) err = flags.ParseArgs() - neterr.ChkFtl("parsing flags:", err) + logs.CheckFatal("parsing flags", err) CFG.ParseConfig() embeds.OpenAndParse() - err = tldr.Open() - neterr.ChkFtl("opening tldr pages:", err) + tldr.Open() } func setPasswd() {@@ -79,18 +79,25 @@ }
func main() { b, err := flags.GetBoolFlag("passwd") - neterr.ChkFtl("getting passwd flag:", err) + logs.CheckFatal("getting passwd flag", err) if b { err = authuwu.OpenDB(CFG.PasswdFile) - neterr.ChkFtl("opening password database:", err) + if err != nil { + if err.Error() == "timeout" { + logs.Error("The database is currently opened by another process.") + return + } + logs.Fatal("opening password database", err) + } setPasswd() authuwu.CloseDB() return } if CFG.RequireAuth { err = authuwu.OpenDB(CFG.PasswdFile) - neterr.ChkFtl("error opening password database:", err) + logs.CheckFatal("opening password database", err) PageHandler = authuwu.NewAuthuwuHandler(PageHandler, time.Hour*24*3, embeds.LoginPage) + defer authuwu.CloseDB() } CFG.ListenAndServe(Handler) }
M
neterr/neterr.go
→
neterr/neterr.go
@@ -2,27 +2,7 @@ package neterr
import ( "fmt" - "os" ) - -func ChkFtl(str string, e error) { - if e == nil { - return - } - Fatal(str, e) -} - -func Fatal(v ...any) { - fmt.Fprintln(os.Stderr, "manhttpd exited due to an error it could not recover from.") - fmt.Fprintf(os.Stderr, "Error: %s\n", func() string { - s := "" - for _, i := range v { - s += fmt.Sprintf("%v ", i) - } - return s - }()) - os.Exit(1) -} var ( Err400 = HTCode(400, "Bad Request",
M
tldr/tldr.go
→
tldr/tldr.go
@@ -5,6 +5,7 @@ "errors"
"fmt" "git.sophuwu.com/manhttpd/CFG" "git.sophuwu.com/manhttpd/embeds" + "git.sophuwu.com/manhttpd/logs" "git.sophuwu.com/manhttpd/neterr" "net/http" "os"@@ -66,48 +67,43 @@ upcmd := filepath.Join(CFG.TldrDir, "update.sh")
_ = os.Remove(upcmd) err := os.WriteFile(upcmd, []byte(sh), 0755) if err != nil { - return err + return fmt.Errorf("failed to write update script: %w", err) } cmd := exec.Command(upcmd) cmd.Env = os.Environ() cmd.Dir = CFG.TldrDir - var b []byte - b, err = cmd.CombinedOutput() - fmt.Println("update tldr pages:", string(b)) + _, err = cmd.CombinedOutput() if err != nil { - return err + return fmt.Errorf("failed to run update script: %w", err) } return nil } -func Open() error { +func Open() { if !CFG.TldrPages { - return nil + return } PageDir = filepath.Join(CFG.TldrDir, "pages") update := false st, err := os.Stat(PageDir) if err != nil && os.IsNotExist(err) { - if err = os.MkdirAll(PageDir, 0755); err != nil { - return err - } + err = os.MkdirAll(PageDir, 0755) + logs.CheckFatal("unable to create tldr pages directory", err) update = true } else if time.Now().After(st.ModTime().AddDate(0, 0, 14)) { update = true } if update { - if err = updateTldrPages(); err != nil { - return fmt.Errorf("failed to update tldr pages: %w", err) - } + logs.Log("Updating tldr pages...") + logs.CheckFatal("unable to update tldr pages", err) + logs.Log("Tldr pages updated successfully.") } TldrPagesMap = make(map[string]string) var de []os.DirEntry de, err = os.ReadDir(PageDir) - if err != nil { - return err - } + logs.CheckFatal("unable to read tldr pages directory", err) var name string for _, d := range de { if d.IsDir() {@@ -116,7 +112,6 @@ }
name = strings.TrimSuffix(d.Name(), ".md") TldrPagesMap[name] = filepath.Join(PageDir, d.Name()) } - return nil } type TldrPage struct {