Merge pull request #23 from kha7iq/add-support-for-pushbullet

feat(service): add support for pushbullet
pull/26/head v0.1.6
Khaliq 4 years ago committed by GitHub
commit efdbe12cd5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -40,9 +40,6 @@ archives:
format_overrides: format_overrides:
- goos: windows - goos: windows
format: zip format: zip
files:
- README.md
- LICENSE.md
brews: brews:
- tap: - tap:

@ -24,14 +24,13 @@
</p> </p>
<p align="center"> <p align="center">
<a href="#about">About</a>
<a href="https://kha7iq.github.io/pingme">Documentation</a> <a href="https://kha7iq.github.io/pingme">Documentation</a>
<a href="#supported-services">Supported Services</a> <a href="#supported-services">Supported Services</a>
<a href="#install">Install</a> <a href="#install">Install</a>
<a href="#github-action">Github Action</a> <a href="#github-action">Github Action</a>
<a href="#configuration">Configuration</a> <a href="#configuration">Configuration</a>
<a href="#contributing">Contributing</a> <a href="#contributing">Contributing</a>
<a href="#show-your-support">Show Your Support</a> <a href="#show-your-support">Show Your Support</a>
</p> </p>
--- ---
@ -45,7 +44,7 @@ And i can ship it everywhere with ease.
Hence, the birth of PingMe. Hence, the birth of PingMe.
Everything is configurable via environment variables, and you can simply export the logs or messages to a variable which will be sent Everything is configurable via environment variables, and you can simply export the logs or messages to a variable which will be sent
as message. And most of all this serves as a swiss army knife sort of tool which supports multiple platforms. as message, and most of all this serves as a swiss army knife sort of tool which supports multiple platforms.
@ -53,20 +52,28 @@ as message. And most of all this serves as a swiss army knife sort of tool which
- *Discord* - *Discord*
- *Email* - *Email*
- *Microsoft Teams* - *Microsoft Teams*
- *Mattermost*
- *Pushover*
- *Pushbullet*
- *RocketChat* - *RocketChat*
- *Slack* - *Slack*
- *Telegram* - *Telegram*
- *Pushover*
- *Mattermost*
## Install ## Install
### Linux & MacOs ### MacOS & Linux Homebrew
```bash ```bash
brew install kha7iq/tap/pingme brew install kha7iq/tap/pingme
``` ```
## Linux Binary
```bash
wget -q https://github.com/kha7iq/pingme/releases/download/v0.1.6/pingme_Linux_x86_64.tar.gz
tar -xf pingme_Linux_x86_64.tar.gz
chmod +x pingme
sudo mv pingme /usr/local/bin/pingme
```
### Go Get ### Go Get
```bash ```bash
go get -u github.com/kha7iq/pingme go get -u github.com/kha7iq/pingme
@ -91,7 +98,7 @@ Docker Registry
```bash ```bash
docker pull khaliq/pingme:latest docker pull khaliq/pingme:latest
``` ```
Gighub Registry Github Registry
```bash ```bash
docker pull ghcr.io/kha7iq/pingme:latest docker pull ghcr.io/kha7iq/pingme:latest
``` ```
@ -132,6 +139,7 @@ COMMANDS:
pushover Send message to pushover pushover Send message to pushover
email Send an email email Send an email
mattermost Send message to mattermost mattermost Send message to mattermost
pushbullet Send message to pushbullet
help, h Shows a list of commands or help for one command help, h Shows a list of commands or help for one command
GLOBAL OPTIONS: GLOBAL OPTIONS:

@ -146,7 +146,6 @@ You can specify multiple channels by separating the value with ','.`,
// toJson takes strings and convert them to json byte array // toJson takes strings and convert them to json byte array
func toJson(channel string, msg string) ([]byte, error) { func toJson(channel string, msg string) ([]byte, error) {
m := make(map[string]string, 2) m := make(map[string]string, 2)
m["channel_id"] = channel m["channel_id"] = channel
m["message"] = msg m["message"] = msg

@ -0,0 +1,137 @@
package cmd
import (
"context"
"fmt"
"log"
"strings"
"github.com/nikoksr/notify"
"github.com/nikoksr/notify/service/pushbullet"
"github.com/urfave/cli/v2"
)
// pushBullet struct holds data parsed via flags for pushbullet service.
type pushBullet struct {
Token string
Message string
Title string
Device string
PhoneNumber string
SMS bool
}
// SendToPushBullet parse values from *cli.context and return *cli.Command.
// Values include pushbullet token, Device, phone number, Message and Title.
// If multiple devices are provided they the string is split with "," separator and
// each device is added to receiver.
func SendToPushBullet() *cli.Command {
var pushBulletOpts pushBullet
return &cli.Command{
Name: "pushbullet",
Usage: "Send message to pushbullet",
Description: `Pushbullet uses API token to authenticate & send messages to defined devices.
Multiple device nicknames or numbers can be used separated by comma.`,
UsageText: "pingme pushbullet --token '123' --device 'Web123, myAndroid' --msg 'some message'\n" +
"pingme pushbullet --token '123' --sms true --device 'Web123' --msg 'some message' --number '00123456789'",
Flags: []cli.Flag{
&cli.StringFlag{
Destination: &pushBulletOpts.Token,
Name: "token",
Aliases: []string{"t"},
Required: true,
Usage: "Token of pushbullet api used for sending message.",
EnvVars: []string{"PUSHBULLET_TOKEN"},
},
&cli.StringFlag{
Destination: &pushBulletOpts.Device,
Name: "device",
Aliases: []string{"d"},
Required: true,
Usage: "Device's nickname of pushbullet.",
EnvVars: []string{"PUSHBULLET_DEVICE"},
},
&cli.StringFlag{
Destination: &pushBulletOpts.PhoneNumber,
Name: "number",
Aliases: []string{"n"},
Usage: "Target phone number",
EnvVars: []string{"PUSHBULLET_NUMBER"},
},
&cli.StringFlag{
Destination: &pushBulletOpts.Message,
Name: "msg",
Aliases: []string{"m"},
Usage: "Message content.",
EnvVars: []string{"PUSHBULLET_MESSAGE"},
},
&cli.StringFlag{
Destination: &pushBulletOpts.Title,
Name: "title",
Value: TimeValue,
Usage: "Title of the message.",
EnvVars: []string{"PUSHBULLET_TITLE"},
},
&cli.BoolFlag{
Destination: &pushBulletOpts.SMS,
Name: "sms",
Value: false,
Usage: "To send sms message set the value to 'true'",
EnvVars: []string{"PUSHBULLET_SMS"},
},
},
Action: func(ctx *cli.Context) error {
notifier := notify.New()
switch pushBulletOpts.SMS {
case true:
pushBulletSmsSvc, err := pushbullet.NewSMS(pushBulletOpts.Token, pushBulletOpts.Device)
if err != nil {
return err
}
devices := strings.Split(pushBulletOpts.PhoneNumber, ",")
for _, v := range devices {
if len(v) <= 0 {
return fmt.Errorf(EmptyChannel)
}
pushBulletSmsSvc.AddReceivers(v)
notifier.UseServices(pushBulletSmsSvc)
if err := notifier.Send(
context.Background(),
pushBulletOpts.Title,
pushBulletOpts.Message,
); err != nil {
return err
}
}
default:
pushBulletSvc := pushbullet.New(pushBulletOpts.Token)
devices := strings.Split(pushBulletOpts.Device, ",")
for _, v := range devices {
if len(v) <= 0 {
return fmt.Errorf(EmptyChannel)
}
pushBulletSvc.AddReceivers(v)
}
notifier.UseServices(pushBulletSvc)
if err := notifier.Send(
context.Background(),
pushBulletOpts.Title,
pushBulletOpts.Message,
); err != nil {
return err
}
}
log.Println("Successfully sent!")
return nil
},
}
}

@ -33,24 +33,25 @@
## About ## About
**PingMe** is a personal project to satisfy my needs of having alerts, most major platforms have integration to send alerts **PingMe** is a personal project to satisfy my needs of having alerts, most major platforms have integration to send alerts
but its not always useful, either you are stuck with one particular platform, or you have to do alot of integrations. I needed a small app but it's not always useful, either you are stuck with one particular platform, or you have to do alot of integrations. I needed a small app
which i can just call from my backup scripts, cron jobs, CI/CD pipelines or from anywhere to send a message with particular information. which i can just call from my backup scripts, cron jobs, CI/CD pipelines or from anywhere to send a message with particular information.
And i can ship it everywhere with ease. And i can ship it everywhere with ease.
Hence, the birth of PingMe. Hence, the birth of PingMe.
Everything is configurable via environment variables, and you can simply export the logs or messages to a variable which will be sent Everything is configurable via environment variables, and you can simply export the logs or messages to a variable which will be sent
as message. And most of all this serves as a swiss army knife sort of tool which supports multiple platforms. as message, and most of all this serves as a swiss army knife sort of tool which supports multiple platforms.
## Supported services ## Supported services
- *Discord* - *Discord*
- *Email* - *Email*
- *Microsoft Teams* - *Microsoft Teams*
- *Mattermost*
- *Pushover*
- *Pushbullet*
- *RocketChat* - *RocketChat*
- *Slack* - *Slack*
- *Telegram* - *Telegram*
- *Pushover*
- *Mattermost*

@ -1,9 +1,17 @@
## Linux & MacOs ## MacOS & Linux Homebrew
```bash ```bash
brew install kha7iq/tap/pingme brew install kha7iq/tap/pingme
``` ```
## Linux Binary
```bash
wget -q https://github.com/kha7iq/pingme/releases/download/v0.1.6/pingme_Linux_x86_64.tar.gz
tar -xf pingme_Linux_x86_64.tar.gz
chmod +x pingme
sudo mv
```
## Go Get ## Go Get
```bash ```bash
go get -u github.com/kha7iq/pingme go get -u github.com/kha7iq/pingme
@ -29,7 +37,7 @@ Checkout [release](https://github.com/kha7iq/pingme/releases) page for available
```bash ```bash
docker pull khaliq/pingme:latest docker pull khaliq/pingme:latest
``` ```
- Github Registry - GitHub Registry
```bash ```bash
docker pull ghcr.io/kha7iq/pingme:latest docker pull ghcr.io/kha7iq/pingme:latest
``` ```
@ -39,7 +47,7 @@ docker run ghcr.io/kha7iq/pingme:latest
``` ```
## Github Action ## GitHub Action
A github action is also available now for this app, you can find it on [Github Market Place](https://github.com/marketplace/actions/pingme-action) or from this [repository](https://github.com/kha7iq/pingme-action) on github. A github action is also available now for this app, you can find it on [Github Market Place](https://github.com/marketplace/actions/pingme-action) or from this [repository](https://github.com/kha7iq/pingme-action) on github.
Usage examples for workflow are available in the repo. Usage examples for workflow are available in the repo.

@ -19,7 +19,7 @@ Multiple channel ids can be used separated by comma ','.
pingme telegram --token "0125:AAFHvnYf_ABC" --msg "This is a new message ✈" --channel="-1001001001,-1002002001" pingme telegram --token "0125:AAFHvnYf_ABC" --msg "This is a new message ✈" --channel="-1001001001,-1002002001"
``` ```
- Github Action - GitHub Action
```yaml ```yaml
on: [push] on: [push]
@ -37,8 +37,8 @@ jobs:
env: env:
TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }} TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
TELEGRAM_CHANNELS: ${{ secrets.TELEGRAM_CHANNELS }} TELEGRAM_CHANNELS: ${{ secrets.TELEGRAM_CHANNELS }}
TELEGRAM_TITLE: 'Refrence: ${{ github.ref }}' TELEGRAM_TITLE: 'Reference: ${{ github.ref }}'
TELEGRAM_MESSAGE: 'Event is triggerd by ${{ github.event_name }}' TELEGRAM_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
with: with:
# Chose the messaging platform. # Chose the messaging platform.
@ -88,8 +88,8 @@ jobs:
ROCKETCHAT_SERVER_URL: ${{ secrets.ROCKETCHAT_SERVER_URL }} ROCKETCHAT_SERVER_URL: ${{ secrets.ROCKETCHAT_SERVER_URL }}
ROCKETCHAT_CHANNELS: ${{ secrets.ROCKETCHAT_CHANNELS }} ROCKETCHAT_CHANNELS: ${{ secrets.ROCKETCHAT_CHANNELS }}
ROCKETCHAT_URL_SCHEME: "https" ROCKETCHAT_URL_SCHEME: "https"
ROCKETCHAT_TITLE: 'Refrence: ${{ github.ref }}' ROCKETCHAT_TITLE: 'Reference: ${{ github.ref }}'
ROCKETCHAT_MESSAGE: 'Event is triggerd by ${{ github.event_name }}' ROCKETCHAT_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
with: with:
# Chose the messaging platform. # Chose the messaging platform.
# slack / telegram / rocketchat / teams / pushover / discord / email / mattermost # slack / telegram / rocketchat / teams / pushover / discord / email / mattermost
@ -114,7 +114,7 @@ jobs:
pingme pushover --token '123' --user '12345567' --title 'some title' --msg 'some message' pingme pushover --token '123' --user '12345567' --title 'some title' --msg 'some message'
``` ```
- Github Action - GitHub Action
```yaml ```yaml
on: [push] on: [push]
@ -132,8 +132,8 @@ jobs:
env: env:
PUSHOVER_TOKEN: ${{ secrets.PUSHOVER_TOKEN }} PUSHOVER_TOKEN: ${{ secrets.PUSHOVER_TOKEN }}
PUSHOVER_USER: ${{ secrets.PUSHOVER_USER }} PUSHOVER_USER: ${{ secrets.PUSHOVER_USER }}
PUSHOVER_TITLE: 'Refrence: ${{ github.ref }}' PUSHOVER_TITLE: 'Reference: ${{ github.ref }}'
PUSHOVER_MESSAGE: 'Event is triggerd by ${{ github.event_name }}' PUSHOVER_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
with: with:
# Chose the messaging platform. # Chose the messaging platform.
@ -161,7 +161,7 @@ You can specify multiple channels by separating the value with ','.
pingme mattermost --token '123' --channel '12345,567' --url 'localhost' --scheme 'http' --msg 'some message' pingme mattermost --token '123' --channel '12345,567' --url 'localhost' --scheme 'http' --msg 'some message'
``` ```
- Github Action - GitHub Action
```yaml ```yaml
on: on:
@ -179,11 +179,11 @@ jobs:
uses: kha7iq/pingme-action@v1 uses: kha7iq/pingme-action@v1
env: env:
MATTERMOST_TOKEN: ${{ secrets.MATTERMOST_TOKEN }} MATTERMOST_TOKEN: ${{ secrets.MATTERMOST_TOKEN }}
ROCKETCHAT_SERVER_URL: ${{ secrets.ROCKETCHAT_SERVER_URL }} MATTERMOST_SERVER_URL: ${{ secrets.MATTERMOST_SERVER_URL }}
MATTERMOST_CHANNELS: ${{ secrets.MATTERMOST_CHANNELS }} MATTERMOST_CHANNELS: ${{ secrets.MATTERMOST_CHANNELS }}
MATTERMOST_CHANNELS: ${{ secrets.MATTERMOST_CHANNELS }} MATTERMOST_CHANNELS: ${{ secrets.MATTERMOST_CHANNELS }}
MATTERMOST_TITLE: 'Refrence: ${{ github.ref }}' MATTERMOST_TITLE: 'Reference: ${{ github.ref }}'
MATTERMOST_MESSAGE: 'Event is triggerd by ${{ github.event_name }}' MATTERMOST_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
with: with:
# Chose the messaging platform. # Chose the messaging platform.
# slack / telegram / rocketchat / teams / pushover / discord / email / mattermost # slack / telegram / rocketchat / teams / pushover / discord / email / mattermost
@ -227,10 +227,10 @@ jobs:
- name: Ping me On - name: Ping me On
uses: kha7iq/pingme-action@v1 uses: kha7iq/pingme-action@v1
env: env:
PUSHOVER_TOKEN: ${{ secrets.SLACK_TOKEN }} SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }}
SLACK_CHANNELS: ${{ secrets.SLACK_CHANNELS }} SLACK_CHANNELS: ${{ secrets.SLACK_CHANNELS }}
SLACK_MSG_TITLE: 'Refrence: ${{ github.ref }}' SLACK_MSG_TITLE: 'Reference: ${{ github.ref }}'
SLACK_MESSAGE: 'Event is triggerd by ${{ github.event_name }}' SLACK_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
with: with:
# Chose the messaging platform. # Chose the messaging platform.
# slack / telegram / rocketchat / teams / pushover / discord / email # slack / telegram / rocketchat / teams / pushover / discord / email
@ -254,7 +254,7 @@ Multiple channel ids can be used separated by comma ','.
pingme discord --token '123' --channel '1234567890' --msg 'some message' pingme discord --token '123' --channel '1234567890' --msg 'some message'
``` ```
- Github Action - GitHub Action
```yaml ```yaml
on: on:
@ -273,8 +273,8 @@ jobs:
env: env:
DISCORD_CHANNELS: ${{ secrets.DISCORD_CHANNELS }} DISCORD_CHANNELS: ${{ secrets.DISCORD_CHANNELS }}
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
DISCORD_TITLE: 'Refrence: ${{ github.ref }}' DISCORD_TITLE: 'Reference: ${{ github.ref }}'
DISCORD_MESSAGE: 'Event is triggerd by ${{ github.event_name }}' DISCORD_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
with: with:
# Chose the messaging platform. # Chose the messaging platform.
# slack / telegram / rocketchat / teams / pushover / discord / email / mattermost # slack / telegram / rocketchat / teams / pushover / discord / email / mattermost
@ -298,7 +298,7 @@ you can add permissions for multiple channels to single webhook.
pingme teams --webhook 'https://example.webhook.office.com/xx' --msg 'some message' pingme teams --webhook 'https://example.webhook.office.com/xx' --msg 'some message'
``` ```
- Github Action - GitHub Action
```yaml ```yaml
on: [push] on: [push]
@ -315,9 +315,8 @@ jobs:
uses: kha7iq/pingme-action@v1 uses: kha7iq/pingme-action@v1
env: env:
TEAMS_WEBHOOK: ${{ secrets.TEAMS_WEBHOOK }} TEAMS_WEBHOOK: ${{ secrets.TEAMS_WEBHOOK }}
TELEGRAM_CHANNELS: ${{ secrets.TELEGRAM_CHANNELS }} TEAMS_MSG_TITLE: 'Reference: ${{ github.ref }}'
TEAMS_MSG_TITLE: 'Refrence: ${{ github.ref }}' TEAMS_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
TEAMS_MESSAGE: 'Event is triggerd by ${{ github.event_name }}'
with: with:
# Chose the messaging platform. # Chose the messaging platform.
@ -332,6 +331,56 @@ jobs:
| TEAMS_MESSAGE | "" | | TEAMS_MESSAGE | "" |
| TEAMS_MSG_TITLE | "" | | TEAMS_MSG_TITLE | "" |
## Pushbullet
- SMS
```bash
pingme pushbullet --sms true --token "abcdefg" -d "adnroid" --msg "some message" --number "00123456789"
```
- Push notification
```bash
pingme pushbullet --token "abcdefg" -d "adnroid" --msg "some message"
```
- GitHub Action
```yaml
on: [push]
jobs:
pingme-job:
runs-on: ubuntu-latest
name: PingMe
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Ping me On
uses: kha7iq/pingme-action@v1
env:
PUSHBULLET_TOKEN: ${{ secrets.PUSHBULLET_TOKEN }}
PUSHBULLET_DEVICE: ${{ secrets.PUSHBULLET_DEVICE }}
PUSHBULLET_TITLE: 'Reference: ${{ github.ref }}'
PUSHBULLET_MESSAGE: 'Event is triggered by ${{ github.event_name }}'
with:
# Chose the messaging platform.
# slack / telegram / rocketchat / teams / pushover / discord / email
service: pushbullet
```
- **Variables**
| Variables | Default Value |
| -------------------------- | :----------------: |
| PUSHBULLET_TOKEN | "" |
| PUSHBULLET_DEVICE | "" |
| PUSHBULLET_NUMBER | "" |
| PUSHBULLET_MESSAGE | "" |
| PUSHBULLET_SMS | "false" |
| PUSHBULLET_TITLE | "" |
## Email ## Email
Email uses username & password to authenticate for sending emails. Email uses username & password to authenticate for sending emails.

@ -32,6 +32,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma
github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cschomburg/go-pushbullet v0.0.0-20171206132031-67759df45fbb h1:7X9nrm+LNWdxzQOiCjy0G51rNUxbH35IDHCjAMvogyM=
github.com/cschomburg/go-pushbullet v0.0.0-20171206132031-67759df45fbb/go.mod h1:RfQ9wji3fjcSEsQ+uFCtIh3+BXgcZum8Kt3JxvzYzlk= github.com/cschomburg/go-pushbullet v0.0.0-20171206132031-67759df45fbb/go.mod h1:RfQ9wji3fjcSEsQ+uFCtIh3+BXgcZum8Kt3JxvzYzlk=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=

@ -21,7 +21,7 @@ func main() {
app.Description = `PingMe is a CLI tool which provides the ability to send messages or alerts to multiple app.Description = `PingMe is a CLI tool which provides the ability to send messages or alerts to multiple
messaging platforms and also email, everything is configurable via environment messaging platforms and also email, everything is configurable via environment
variables and command line switches.Currently supported platforms include Slack, Telegram, variables and command line switches.Currently supported platforms include Slack, Telegram,
RocketChat, Discord, Pushover, Mattermost, Microsoft Teams and email address.` RocketChat, Discord, Pushover, Mattermost, Pushbullet, Microsoft Teams and email address.`
// app.Commands contains the subcommands as functions which return []*cli.Command. // app.Commands contains the subcommands as functions which return []*cli.Command.
app.Commands = []*cli.Command{ app.Commands = []*cli.Command{
cmd.SendToTelegram(), cmd.SendToTelegram(),
@ -32,6 +32,7 @@ RocketChat, Discord, Pushover, Mattermost, Microsoft Teams and email address.`
cmd.SendToPushOver(), cmd.SendToPushOver(),
cmd.SendToEmail(), cmd.SendToEmail(),
cmd.SendToMattermost(), cmd.SendToMattermost(),
cmd.SendToPushBullet(),
} }
err := app.Run(os.Args) err := app.Run(os.Args)

Loading…
Cancel
Save