Skip to content

Commit

Permalink
Added SocketBee, to send data via UDP (and in the future TCP) sockets
Browse files Browse the repository at this point in the history
  • Loading branch information
muesli committed Mar 3, 2019
1 parent 91e1d89 commit 012b586
Show file tree
Hide file tree
Showing 3 changed files with 205 additions and 0 deletions.
96 changes: 96 additions & 0 deletions bees/socketbee/socketbee.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* Copyright (C) 2019 Christian Muehlhaeuser
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* Christian Muehlhaeuser <[email protected]>
*/

// Package socketbee is a Bee that lets you transmit data via UDP sockets.
package socketbee

import (
"log"
"net"
"strconv"

"github.com/muesli/beehive/bees"
)

// SocketBee is a Bee that lets you transmit data via UDP sockets.
type SocketBee struct {
bees.Bee

eventChan chan bees.Event
}

// Run executes the Bee's event loop.
func (mod *SocketBee) Run(cin chan bees.Event) {
mod.eventChan = cin

select {
case <-mod.SigChan:
return
}
}

// Action triggers the action passed to it.
func (mod *SocketBee) Action(action bees.Action) []bees.Placeholder {
outs := []bees.Placeholder{}

var data string
var addr string
var port int

action.Options.Bind("address", &addr)
action.Options.Bind("port", &port)
action.Options.Bind("data", &data)

switch action.Name {
case "send":
// log.Println("Sending", data, "to", addr, port)

sa, err := net.ResolveUDPAddr("udp", addr+":"+strconv.Itoa(port))
if err != nil {
log.Panicln(err)
}

la, err := net.ResolveUDPAddr("udp", "0:0")
if err != nil {
log.Panicln(err)
}

conn, err := net.DialUDP("udp", la, sa)
if err != nil {
log.Panicln(err)
}

defer conn.Close()
_, err = conn.Write([]byte(data))
if err != nil {
log.Panicln(err)
}

default:
panic("Unknown action triggered in " + mod.Name() + ": " + action.Name)
}

return outs
}

// ReloadOptions parses the config options and initializes the Bee.
func (mod *SocketBee) ReloadOptions(options bees.BeeOptions) {
mod.SetOptions(options)
}
108 changes: 108 additions & 0 deletions bees/socketbee/socketbeefactory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
/*
* Copyright (C) 2019 Christian Muehlhaeuser
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* Christian Muehlhaeuser <[email protected]>
*/

package socketbee

import (
"github.com/muesli/beehive/bees"
)

// SocketBeeFactory is a factory for SocketBees.
type SocketBeeFactory struct {
bees.BeeFactory
}

// New returns a new Bee instance configured with the supplied options.
func (factory *SocketBeeFactory) New(name, description string, options bees.BeeOptions) bees.BeeInterface {
bee := SocketBee{
Bee: bees.NewBee(name, factory.ID(), description, options),
}
bee.ReloadOptions(options)

return &bee
}

// ID returns the ID of this Bee.
func (factory *SocketBeeFactory) ID() string {
return "socketbee"
}

// Name returns the name of this Bee.
func (factory *SocketBeeFactory) Name() string {
return "UDP Client"
}

// Description returns the description of this Bee.
func (factory *SocketBeeFactory) Description() string {
return "Lets you transmit data via UDP sockets"
}

// Image returns the filename of an image for this Bee.
func (factory *SocketBeeFactory) Image() string {
return "socketbee.png"
}

// LogoColor returns the preferred logo background color (used by the admin interface).
func (factory *SocketBeeFactory) LogoColor() string {
return "#223f5e"
}

// Events describes the available events provided by this Bee.
func (factory *SocketBeeFactory) Events() []bees.EventDescriptor {
events := []bees.EventDescriptor{}
return events
}

// Actions describes the available actions provided by this Bee.
func (factory *SocketBeeFactory) Actions() []bees.ActionDescriptor {
actions := []bees.ActionDescriptor{
{
Namespace: factory.Name(),
Name: "send",
Description: "Sends data via a UDP socket",
Options: []bees.PlaceholderDescriptor{
{
Name: "address",
Description: "Address to connect to",
Type: "address",
Mandatory: true,
},
{
Name: "port",
Description: "Port to connect to",
Type: "int",
Mandatory: true,
},
{
Name: "data",
Description: "Data to send",
Type: "string",
Mandatory: true,
},
},
},
}
return actions
}

func init() {
f := SocketBeeFactory{}
bees.RegisterFactory(&f)
}
1 change: 1 addition & 0 deletions hives.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import (
_ "github.com/muesli/beehive/bees/serialbee"
_ "github.com/muesli/beehive/bees/simplepushbee"
_ "github.com/muesli/beehive/bees/slackbee"
_ "github.com/muesli/beehive/bees/socketbee"
_ "github.com/muesli/beehive/bees/spaceapibee"
_ "github.com/muesli/beehive/bees/telegrambee"
_ "github.com/muesli/beehive/bees/timebee"
Expand Down

0 comments on commit 012b586

Please sign in to comment.