diff --git a/dist/oculus_darwin_amd64 b/dist/oculus_darwin_amd64 index 05b99fc..b4b4b6e 100755 Binary files a/dist/oculus_darwin_amd64 and b/dist/oculus_darwin_amd64 differ diff --git a/dist/oculus_darwin_arm64 b/dist/oculus_darwin_arm64 index a81ff46..db7003c 100755 Binary files a/dist/oculus_darwin_arm64 and b/dist/oculus_darwin_arm64 differ diff --git a/dist/oculus_linux_amd64 b/dist/oculus_linux_amd64 index 676b508..7cf5d0b 100755 Binary files a/dist/oculus_linux_amd64 and b/dist/oculus_linux_amd64 differ diff --git a/dist/oculus_linux_amd64_static b/dist/oculus_linux_amd64_static index 44f1d31..43b2519 100755 Binary files a/dist/oculus_linux_amd64_static and b/dist/oculus_linux_amd64_static differ diff --git a/dist/oculus_linux_arm64 b/dist/oculus_linux_arm64 index b3dd706..18cd7e8 100755 Binary files a/dist/oculus_linux_arm64 and b/dist/oculus_linux_arm64 differ diff --git a/dist/oculus_linux_arm64_static b/dist/oculus_linux_arm64_static index 747b712..b9ea708 100755 Binary files a/dist/oculus_linux_arm64_static and b/dist/oculus_linux_arm64_static differ diff --git a/dist/oculus_windows_amd64 b/dist/oculus_windows_amd64 index d670018..d6cf973 100755 Binary files a/dist/oculus_windows_amd64 and b/dist/oculus_windows_amd64 differ diff --git a/main.go b/main.go index 738977e..b9ef6f9 100644 --- a/main.go +++ b/main.go @@ -1,11 +1,13 @@ package main import ( + "crypto/md5" "fmt" "log" "os" "os/exec" "strings" + "sync" "time" ) @@ -16,7 +18,20 @@ type ContainerInfo struct { Ignores []string } +var notifiedChanges = struct { + sync.RWMutex + changes map[string]string +}{changes: make(map[string]string)} + func main() { + // Check if GLITCHTIP_DSN environment variable is set + glitchtipDSN := os.Getenv("GLITCHTIP_DSN") + if glitchtipDSN == "" { + log.Fatal("GLITCHTIP_DSN environment variable is not set") + } + + log.Println("Starting Oculus...") + for { containers, err := getContainers() if err != nil { @@ -26,6 +41,7 @@ func main() { } for _, container := range containers { + log.Printf("Monitoring container: %s (%s) every %s", container.Name, container.ID, container.Interval) go monitorContainer(container) } @@ -35,6 +51,7 @@ func main() { } func getContainers() ([]ContainerInfo, error) { + log.Println("Fetching container list...") output, err := exec.Command("docker", "ps", "--format", "{{.ID}} {{.Label \"oculus.enable\"}} {{.Label \"oculus.interval\"}} {{.Label \"oculus.cname\"}} {{.Label \"oculus.ignores\"}}").Output() if err != nil { return nil, err @@ -81,11 +98,13 @@ func getContainers() ([]ContainerInfo, error) { }) } + log.Printf("Found %d containers to monitor.", len(containers)) return containers, nil } func monitorContainer(container ContainerInfo) { for { + log.Printf("Checking diffs for container: %s (%s)", container.Name, container.ID) checkDiff(container) time.Sleep(container.Interval) } @@ -106,20 +125,39 @@ func checkDiff(container ContainerInfo) { } if diffOutput != "" { - // Write diff output to a file - filename := fmt.Sprintf("%s.diff", container.Name) - err = writeToFile(filename, diffOutput) - if err != nil { - log.Printf("Error writing diff to file for container %s: %v", container.ID, err) - } + diffHash := fmt.Sprintf("%x", md5.Sum([]byte(diffOutput))) - // Send notification using go-glitch - cmd = exec.Command("go-glitch") - cmd.Stdin = strings.NewReader(diffOutput) - err = cmd.Run() - if err != nil { - log.Printf("Error sending notification for container %s: %v", container.ID, err) + notifiedChanges.RLock() + lastNotifiedHash, notified := notifiedChanges.changes[container.ID] + notifiedChanges.RUnlock() + + if !notified || lastNotifiedHash != diffHash { + log.Printf("Writing diff output for container: %s (%s)", container.Name, container.ID) + // Write diff output to a file + filename := fmt.Sprintf("%s.diff", container.Name) + err = writeToFile(filename, diffOutput) + if err != nil { + log.Printf("Error writing diff to file for container %s: %v", container.ID, err) + } + + // Send notification using go-glitch + log.Printf("Sending notification for container: %s (%s)", container.Name, container.ID) + cmd = exec.Command("go-glitch") + cmd.Stdin = strings.NewReader(diffOutput) + output, err = cmd.CombinedOutput() + if err != nil { + log.Printf("Error sending notification for container %s: %v", container.ID, err) + log.Printf("go-glitch output: %s", output) + } else { + notifiedChanges.Lock() + notifiedChanges.changes[container.ID] = diffHash + notifiedChanges.Unlock() + } + } else { + log.Printf("No new changes detected for container: %s (%s)", container.Name, container.ID) } + } else { + log.Printf("No significant changes detected for container: %s (%s)", container.Name, container.ID) } } diff --git a/my_friendly_container.diff b/my_friendly_container.diff new file mode 100644 index 0000000..138b9b3 --- /dev/null +++ b/my_friendly_container.diff @@ -0,0 +1,3 @@ +A /newfile2.txt +A /newfile3.txt +A /newfile.txt