Skip to content

Commit

Permalink
filesystem notification bee
Browse files Browse the repository at this point in the history
A bee that reacts to filesystem events and forwards them to other
bees interested.
  • Loading branch information
rubiojr committed May 13, 2017
1 parent d37697a commit 159de5b
Show file tree
Hide file tree
Showing 5 changed files with 208 additions and 0 deletions.
Binary file added assets/bees/fsnotifybee.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions bees/fsnotifybee/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# FSNotify bee

Monitors filesystem paths and sends events when files are created, removed or modified.

## Configuration

* path: Path to monitor (file or directory).

## Events

**fsevent**

* type: the event type received (CREATE, REMOVE, RENAME, CHMOD).
* path: filesystem path that triggered the event.

## Credits

File manager logo: https://openclipart.org/detail/35329/tango-system-file-manager
82 changes: 82 additions & 0 deletions bees/fsnotifybee/fsnotifybee.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* Copyright (C) 2017 Sergio Rubio
*
* 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:
* Sergio Rubio <[email protected]>
*/

package fsnotifybee

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

type FSNotifyBee struct {
bees.Bee
}

func (mod *FSNotifyBee) Run(eventChan chan bees.Event) {
watcher, err := fsnotify.NewWatcher()
if err != nil {
mod.LogFatal("error: could not create the fswatcher: %v", err)
}
defer watcher.Close()

path := mod.Options().Value("path").(string)
mod.Logf("monitoring %s\n", path)

err = watcher.Add(path)
if err != nil {
mod.LogErrorf("error: watching %s failed: %v", path, err)
return
}
for {
select {
case <-mod.SigChan:
return
case event := <-watcher.Events:
if event.Op != fsnotify.Write && event.Op != 0 {
sendEvent(mod.Name(), event.Op.String(), event.Name, eventChan)
}
case <-watcher.Errors:
}
}
}

func (mod *FSNotifyBee) ReloadOptions(options bees.BeeOptions) {
mod.SetOptions(options)
}

func sendEvent(bee, etype, path string, eventChan chan bees.Event) {
event := bees.Event{
Bee: bee,
Name: "event",
Options: []bees.Placeholder{
{
Name: "type",
Type: "string",
Value: etype,
},
{
Name: "path",
Type: "string",
Value: path,
},
},
}
eventChan <- event
}
107 changes: 107 additions & 0 deletions bees/fsnotifybee/fsnotifybeefactory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* Copyright (C) 2017 Sergio Rubio
*
* 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:
* Sergio Rubio <[email protected]>
*/

package fsnotifybee

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

// FSNotifyBeeFactory is a factory for FSNotifyBees.
type FSNotifyBeeFactory struct {
bees.BeeFactory
}

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

return &bee
}

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

// Name returns the name of this Bee.
func (factory *FSNotifyBeeFactory) Name() string {
return "FSNotify"
}

// Description returns the description of this Bee.
func (factory *FSNotifyBeeFactory) Description() string {
return "Monitor filesystem paths"
}

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

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

// Options returns the options available to configure this Bee.
func (factory *FSNotifyBeeFactory) Options() []bees.BeeOptionDescriptor {
opts := []bees.BeeOptionDescriptor{
{
Name: "path",
Description: "Filesystem path to monitor",
Type: "string",
Mandatory: true,
},
}
return opts
}

// Events describes the available events provided by this Bee.
func (factory *FSNotifyBeeFactory) Events() []bees.EventDescriptor {
events := []bees.EventDescriptor{
{
Namespace: factory.Name(),
Name: "fsevent",
Description: "Filesystem event",
Options: []bees.PlaceholderDescriptor{
{
Name: "type", // CREATE, CHMOD, RENAME, REMOVE
Description: "The event type received",
Type: "string",
},
{
Name: "path",
Description: "Canonical path to the file or directory",
Type: "string",
},
},
},
}
return events
}

func init() {
f := FSNotifyBeeFactory{}
bees.RegisterFactory(&f)
}
1 change: 1 addition & 0 deletions hives.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
_ "github.com/muesli/beehive/bees/emailbee"
_ "github.com/muesli/beehive/bees/execbee"
_ "github.com/muesli/beehive/bees/facebookbee"
_ "github.com/muesli/beehive/bees/fsnotifybee"
_ "github.com/muesli/beehive/bees/githubbee"
_ "github.com/muesli/beehive/bees/gitterbee"
_ "github.com/muesli/beehive/bees/htmlextractbee"
Expand Down

0 comments on commit 159de5b

Please sign in to comment.