diff --git a/cmd/publish.go b/cmd/publish.go index aaec35e9..c15761ab 100644 --- a/cmd/publish.go +++ b/cmd/publish.go @@ -69,6 +69,7 @@ Examples: ntfy pub --icon="http://some.tld/icon.png" 'Icon!' # Send notification with custom icon ntfy pub --attach="http://some.tld/file.zip" files # Send ZIP archive from URL as attachment ntfy pub --file=flower.jpg flowers 'Nice!' # Send image.jpg as attachment + echo 'message' | ntfy publish mytopic # Send message from stdin ntfy pub -u phil:mypass secret Psst # Publish with username/password ntfy pub --wait-pid 1234 mytopic # Wait for process 1234 to exit before publishing ntfy pub --wait-cmd mytopic rsync -av ./ /tmp/a # Run command and publish after it completes @@ -254,6 +255,15 @@ func parseTopicMessageCommand(c *cli.Context) (topic string, message string, com if c.String("message") != "" { message = c.String("message") } + if message == "" && isStdinRedirected() { + var data []byte + data, err = io.ReadAll(io.LimitReader(c.App.Reader, 1024*1024)) + if err != nil { + log.Debug("Failed to read from stdin: %s", err.Error()) + return + } + message = strings.TrimSpace(string(data)) + } return } @@ -312,3 +322,12 @@ func runAndWaitForCommand(command []string) (message string, err error) { log.Debug("Command succeeded after %s: %s", runtime, prettyCmd) return fmt.Sprintf("Command succeeded after %s: %s", runtime, prettyCmd), nil } + +func isStdinRedirected() bool { + stat, err := os.Stdin.Stat() + if err != nil { + log.Debug("Failed to stat stdin: %s", err.Error()) + return false + } + return (stat.Mode() & os.ModeCharDevice) == 0 +}