]> Sergey Matveev's repositories - mmc.git/blobdiff - cmd/mmc/main.go
External netrc module
[mmc.git] / cmd / mmc / main.go
index 159674709388922f2030b490877657ed2e744991..76f92c5d5b8ae5351715bc46d240f9dc2bb23f9c 100644 (file)
@@ -38,11 +38,10 @@ import (
 
        "github.com/davecgh/go-spew/spew"
        "github.com/mattermost/mattermost-server/v6/model"
+       "go.cypherpunks.ru/netrc"
        "go.stargrave.org/mmc"
 )
 
-const CmdFile = "/FILE "
-
 var (
        Newwin   = flag.String("newwin", "cmd/newwin", "Path to newwin command")
        DebugFd  *os.File
@@ -51,13 +50,22 @@ var (
 
 func rewriteIfChanged(fn string, data string) {
        if their, err := os.ReadFile(fn); err != nil ||
-               bytes.Compare([]byte(data), their) != 0 {
+               !bytes.Equal([]byte(data), their) {
                if err = os.WriteFile(fn, []byte(data), 0o666); err != nil {
                        log.Fatalln(err)
                }
        }
 }
 
+func mkFifo(pth string) {
+       if _, err := os.Stat(pth); err == nil {
+               return
+       }
+       if err := syscall.Mkfifo(pth, 0666); err != nil {
+               log.Fatalln(err)
+       }
+}
+
 func main() {
        entrypoint := flag.String("entrypoint", mmc.GetEntrypoint(), "Entrypoint")
        notifyCmd := flag.String("notify", "cmd/notify", "Path to notification handler")
@@ -68,11 +76,8 @@ func main() {
        UmaskCur = syscall.Umask(0)
        syscall.Umask(UmaskCur)
 
-       os.Remove("debug")
-       err := syscall.Mkfifo("debug", 0666)
-       if err != nil {
-               log.Fatalln(err)
-       }
+       mkFifo("debug")
+       var err error
        DebugFd, err = os.OpenFile(
                "debug", os.O_WRONLY|os.O_APPEND, os.FileMode(0666),
        )
@@ -81,7 +86,7 @@ func main() {
        }
        defer DebugFd.Close()
 
-       login, password := mmc.FindInNetrc(*entrypoint)
+       login, password := netrc.Find(*entrypoint)
        if login == "" || password == "" {
                log.Fatalln("no credentials found for:", *entrypoint)
        }
@@ -150,10 +155,7 @@ func main() {
                }
 
                usersPth := path.Join(pth, "users")
-               os.Remove(usersPth)
-               if err := syscall.Mkfifo(usersPth, 0666); err != nil {
-                       log.Fatalln(err)
-               }
+               mkFifo(usersPth)
                go func(ch *model.Channel) {
                        for {
                                time.Sleep(mmc.SleepTime)
@@ -189,10 +191,7 @@ func main() {
                }(ch)
 
                pth = path.Join(pth, "in")
-               os.Remove(pth)
-               if err := syscall.Mkfifo(pth, 0666); err != nil {
-                       log.Fatalln(err)
-               }
+               mkFifo(pth)
                go func(ch *model.Channel) {
                        for {
                                fd, err := os.OpenFile(pth, os.O_RDONLY, os.FileMode(0666))
@@ -253,10 +252,7 @@ func main() {
                }
 
                statusPth := path.Join(pth, "status")
-               os.Remove(statusPth)
-               if err := syscall.Mkfifo(statusPth, 0666); err != nil {
-                       log.Fatalln(err)
-               }
+               mkFifo(statusPth)
                go func(u *model.User) {
                        for {
                                time.Sleep(mmc.SleepTime)
@@ -285,10 +281,7 @@ func main() {
                }(u)
 
                pth = path.Join(pth, "in")
-               os.Remove(pth)
-               if err := syscall.Mkfifo(pth, 0666); err != nil {
-                       log.Fatalln(err)
-               }
+               mkFifo(pth)
                go func(u *model.User) {
                        var dc *model.Channel
                        for {
@@ -327,10 +320,7 @@ func main() {
        var UserStatusM sync.RWMutex
        go func() {
                pth := path.Join("users", "status")
-               os.Remove(pth)
-               if err := syscall.Mkfifo(pth, 0666); err != nil {
-                       log.Fatalln(err)
-               }
+               mkFifo(pth)
                for {
                        time.Sleep(mmc.SleepTime)
                        fd, err := os.OpenFile(pth, os.O_WRONLY|os.O_APPEND, os.FileMode(0666))
@@ -338,15 +328,20 @@ func main() {
                                log.Println("OpenFile:", pth, err)
                                continue
                        }
-                       statuses := make(map[string][]string)
+                       agg := make(map[string][]string)
                        UserStatusM.RLock()
                        for name, status := range UserStatus {
-                               statuses[status] = append(statuses[status], name)
+                               agg[status] = append(agg[status], name)
                        }
                        UserStatusM.RUnlock()
-                       for status := range statuses {
-                               sort.Strings(statuses[status])
-                               fmt.Fprintln(fd, status+":", strings.Join(statuses[status], " "))
+                       statuses := make([]string, 0, len(agg))
+                       for status := range agg {
+                               sort.Strings(agg[status])
+                               statuses = append(statuses, status)
+                       }
+                       sort.Strings(statuses)
+                       for _, status := range statuses {
+                               fmt.Fprintln(fd, status+":", strings.Join(agg[status], " "))
                        }
                        fd.Close()
                }
@@ -368,15 +363,9 @@ func main() {
        go func() {
                os.MkdirAll("file", 0777)
                pthGet := path.Join("file", "get")
-               os.Remove(pthGet)
-               if err := syscall.Mkfifo(pthGet, 0666); err != nil {
-                       log.Fatalln(err)
-               }
+               mkFifo(pthGet)
                pthOut := path.Join("file", "out")
-               os.Remove(pthOut)
-               if err := syscall.Mkfifo(pthOut, 0666); err != nil {
-                       log.Fatalln(err)
-               }
+               mkFifo(pthOut)
                for {
                        time.Sleep(mmc.SleepTime)
                        fd, err := os.OpenFile(pthGet, os.O_RDONLY, os.FileMode(0666))
@@ -520,7 +509,7 @@ func main() {
                                                userId = strings.TrimSuffix(userId, "__"+me.Id)
                                                user := Users[userId]
                                                if user == nil {
-                                                       log.Println("unknown user:", post)
+                                                       log.Println("unknown user:", userId)
                                                        continue
                                                }
                                                recipient = path.Join("users", user.Username)