diff --git a/.gitignore b/.gitignore
index 079f556..8d65f16 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@
*.dll
*.so
*.dylib
+bin/
# Test binary, built with `go test -c`
*.test
diff --git a/config/config.go b/config/config.go
new file mode 100644
index 0000000..ed7d686
--- /dev/null
+++ b/config/config.go
@@ -0,0 +1,8 @@
+package config
+
+var (
+ ServerAddr = ":8080"
+ AppName = "PastePass"
+ DBPath = "pastes.boltdb"
+ ResetDB = false
+)
diff --git a/db/db.go b/db/db.go
index 2867d94..53a8540 100644
--- a/db/db.go
+++ b/db/db.go
@@ -3,7 +3,7 @@ package db
import (
"errors"
"fmt"
- "log"
+ "log/slog"
"time"
"encoding/json"
@@ -26,15 +26,6 @@ type DB struct {
boltDB *bolt.DB
}
-func NewDB(name string) (*DB, error) {
- boltDB, err := bolt.Open(name, 0600, &bolt.Options{Timeout: 1 * time.Second})
- if err != nil {
- return nil, err
- }
-
- return &DB{boltDB: boltDB}, nil
-}
-
func (d *DB) Close() error {
return d.boltDB.Close()
}
@@ -106,7 +97,7 @@ func (d *DB) Get(id string) (*Paste, error) {
func (d *DB) Decrypt(id string, key string) (string, error) {
// delete paste if expired
- if _, err := d.Get(id); err == ErrPasteExpired {
+ if _, err := d.Get(id); errors.Is(err, ErrPasteExpired) {
return "", d.Delete(id)
}
@@ -186,7 +177,7 @@ func (d *DB) DeleteExpired() error {
for _, id := range expiredPastes {
if err := d.Delete(id); err != nil {
- log.Println(fmt.Errorf("error deleting expired paste %s: %v", id, err))
+ slog.Error("error_deleting_expired_paste", "id", id, "error", err)
}
}
@@ -199,7 +190,7 @@ func (d *DB) DeleteExpiredPeriodically(interval time.Duration) {
for range ticker.C {
if err := d.DeleteExpired(); err != nil {
- log.Println(fmt.Errorf("error deleting expired pastes: %v", err))
+ slog.Error("error_starting_expired_paste_job", "error", err)
}
}
}
diff --git a/db/utils.go b/db/utils.go
new file mode 100644
index 0000000..0aa8dfa
--- /dev/null
+++ b/db/utils.go
@@ -0,0 +1,36 @@
+package db
+
+import (
+ "github.com/boltdb/bolt"
+ "log/slog"
+ "os"
+ "time"
+)
+
+func NewDB(path string, reset bool) (*DB, error) {
+ if reset {
+ removeDB(path)
+ }
+
+ boltDB, err := bolt.Open(path, 0600, &bolt.Options{Timeout: 1 * time.Second})
+ if err != nil {
+ return nil, err
+ }
+
+ return &DB{boltDB: boltDB}, nil
+}
+
+func removeDB(path string) {
+ slog.Info("resetting_db", "path", path)
+ if _, err := os.Stat(path); err != nil && os.IsNotExist(err) {
+ slog.Error("db_does_not_exist", "path", path, "error", err)
+ return
+ }
+
+ if err := os.Remove(path); err != nil {
+ slog.Error("error_removing_db", "path", path, "error", err)
+ return
+ }
+
+ slog.Info("db_removed", "path", path)
+}
diff --git a/main.go b/main.go
index 9e0352d..fc459b0 100644
--- a/main.go
+++ b/main.go
@@ -1,7 +1,10 @@
package main
import (
+ "flag"
+ "github.com/v1k45/pastepass/config"
"log"
+ "log/slog"
"net/http"
"time"
@@ -10,14 +13,22 @@ import (
)
func main() {
+ flag.StringVar(&config.ServerAddr, "server-addr", config.ServerAddr, "The server address to listen on")
+ flag.StringVar(&config.AppName, "app-name", config.AppName, "The name of the application (e.g. ACME PastePass)")
+ flag.StringVar(&config.DBPath, "db-path", config.DBPath, "The path to the database file")
+ flag.BoolVar(&config.ResetDB, "reset-db", config.ResetDB, "Reset the database on startup")
+ flag.Parse()
+
// Open the database
- boltdb, err := db.NewDB("pastes.boltdb")
+ boltdb, err := db.NewDB(config.DBPath, config.ResetDB)
if err != nil {
log.Fatalf("failed to open database: %v", err)
}
go boltdb.DeleteExpiredPeriodically(time.Minute * 5)
+ slog.Info("starting_server", "server_addr", config.ServerAddr, "app_name", config.AppName, "db_name", config.DBPath)
+
// Start the web server
handler := web.NewHandler(boltdb)
- http.ListenAndServe(":8080", handler.Router())
+ http.ListenAndServe(config.ServerAddr, handler.Router())
}
diff --git a/views/base.templ b/views/base.templ
index c9ef498..9446a8f 100644
--- a/views/base.templ
+++ b/views/base.templ
@@ -1,5 +1,7 @@
package views
+import "github.com/v1k45/pastepass/config"
+
templ base() {
@@ -8,14 +10,14 @@ templ base() {
-
Paste
+ { config.AppName } - secure, one-time paste bin.
@@ -25,7 +27,7 @@ templ base() {