diff --git a/src/main.go b/src/main.go index fa55a33..0561a64 100644 --- a/src/main.go +++ b/src/main.go @@ -1,12 +1,18 @@ package main import ( + _ "embed" "flag" "log" "math/rand" + "os" + "text/template" "time" ) +//go:embed beretta.json +var defconfig string + type RepoUpdate struct { repo Repo Tag string @@ -22,7 +28,7 @@ func notifierThread(c chan RepoUpdate, n Notifier) { } func repoThread(c chan RepoUpdate, repo Repo, avgInterval int, db Db) { - log.Println("Checking", repo.IdTuple()) + log.Println("Checking: ", repo.IdTuple()) tag, err := repo.GetLatestTag() isNewVersion, err_2 := db.CheckAndStore(repo.IdTuple(), tag.Name) @@ -33,6 +39,7 @@ func repoThread(c chan RepoUpdate, repo Repo, avgInterval int, db Db) { } else if isNewVersion { c <- RepoUpdate{repo, tag.Name} } + log.Println("Checking done: ", repo.IdTuple()) sleepTime := time.Duration(rand.Intn(avgInterval)) * time.Second time.Sleep(sleepTime) @@ -41,25 +48,54 @@ func repoThread(c chan RepoUpdate, repo Repo, avgInterval int, db Db) { } func main() { - - conf := flag.String("config", "./beretta.json", "The path to the config file") + conf_path := flag.String("config", "beretta.json", "The path to the config file") + db_path := flag.String("db", "cache.db", "The path to the cache database") flag.Parse() - log.Printf("Using config path: %s", *conf) + tmpl, err := template.New("config").Parse(defconfig) + if err != nil { + panic(err) + } + + randtk, err := randToken(8) + if err != nil { + panic(err) + } + + data := map[string]any{ + "TopicToken": randtk, + } + + if _, err := os.Stat(*conf_path); os.IsNotExist(err) { + log.Printf("Writing new config file: %s", *conf_path) + file, err := os.Create(*conf_path) + if err != nil { + panic(err) + } + err = tmpl.Execute(file, data) + if err != nil { + log.Fatalf("Error writing config file: %s", err) + return + } + } + + log.Printf("Using config path: %s", *conf_path) + log.Printf("Using db path: %s", *db_path) // Load configuration - config, err := loadConfig(*conf) + config, err := loadConfig(*conf_path) if err != nil { log.Fatalf("Failed to load configuration: %v", err) } // Create database - db, err := NewSQLiteDb("tags.db") + db, err := NewSQLiteDb(*db_path) if err != nil { log.Fatalf("Failed to create database: %v", err) } notifier := NtfyNotifier{Topic: config.NtfyTopic} + log.Printf("Sending notifications to: %s", notifier.Url()) c := make(chan RepoUpdate) diff --git a/src/random_token.go b/src/random_token.go new file mode 100644 index 0000000..a8d2b96 --- /dev/null +++ b/src/random_token.go @@ -0,0 +1,14 @@ +package main + +import ( + "crypto/rand" + "encoding/hex" +) + +func randToken(n int) (string, error) { + bytes := make([]byte, n) + if _, err := rand.Read(bytes); err != nil { + return "", err + } + return hex.EncodeToString(bytes), nil +} diff --git a/src/types.go b/src/types.go index 59074f2..e66f97f 100644 --- a/src/types.go +++ b/src/types.go @@ -39,6 +39,7 @@ func loadConfig(file string) (Config, error) { type Notifier interface { Notify(repo Repo, tag string) bool + Url() string } type NtfyNotifier struct { @@ -46,10 +47,10 @@ type NtfyNotifier struct { } func (n NtfyNotifier) Notify(repo Repo, tag string) bool { - ntfyURL := fmt.Sprintf("https://ntfy.sh/%s", n.Topic) + // ntfyURL := fmt.Sprintf("https://ntfy.sh/%s", n.Topic) message := fmt.Sprintf("New release for %s/%s: %s", repo.Owner(), repo.Name(), tag) - _, err := http.Post(ntfyURL, "text/plain", bytes.NewBuffer([]byte(message))) + _, err := http.Post(n.Url(), "text/plain", bytes.NewBuffer([]byte(message))) if err != nil { log.Printf("Failed to send notification: %v", err) return false @@ -57,3 +58,7 @@ func (n NtfyNotifier) Notify(repo Repo, tag string) bool { log.Printf("Notification sent: %s", message) return true } + +func (n NtfyNotifier) Url() string { + return fmt.Sprintf("https://ntfy.sh/%s", n.Topic) +}