Merge branch 'master' of ../mysqlunifi into merge-them-all
This commit is contained in:
commit
1480ac947f
|
|
@ -0,0 +1,3 @@
|
|||
/mysqlunifi
|
||||
/*.so
|
||||
/go.sum
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
language: go
|
||||
go:
|
||||
- 1.15.x
|
||||
before_install:
|
||||
# download super-linter: golangci-lint
|
||||
- curl -sL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin latest
|
||||
script:
|
||||
- golangci-lint run --enable-all -D gochecknoinits,exhaustivestruct,nlreturn,forbidigo,goerr113
|
||||
- go test ./...
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
MIT LICENSE.
|
||||
Copyright (c) 2018-2020 David Newhall II
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
# MYSQL Output Plugin Example
|
||||
|
||||
This plugin is not finished and did not get finished for the release of poller v2.
|
||||
Sorry about that. I'll try to get it working soon! 2/4/20
|
||||
|
||||
The code here, and the dynamic plugin provided shows an example of how you can
|
||||
write your own output for unifi-poller. This plugin records some very basic
|
||||
data about clients on a unifi network into a mysql database.
|
||||
|
||||
You could write outputs that do... anything. An example: They could compare current
|
||||
connected clients to a previous list (in a db, or stored in memory), and send a
|
||||
notification if it changes. The possibilities are endless.
|
||||
|
||||
You must compile your plugin using the unifi-poller source for the version you're
|
||||
using. In other words, to build a plugin for version 2.0.1, do this:
|
||||
```
|
||||
mkdir -p $GOPATH/src/github.com/unifi-poller
|
||||
cd $GOPATH/src/github.com/unifi-poller
|
||||
|
||||
git clone git@github.com:unifi-poller/unifi-poller.git
|
||||
cd unifi-poller
|
||||
|
||||
git checkout v2.0.1
|
||||
|
||||
cp -r <your plugin> plugins/
|
||||
GOOS=linux make plugins
|
||||
```
|
||||
The plugin you copy in *must* have a `main.go` file for `make plugins` to build it.
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package main
|
||||
|
||||
/* Everything in this file runs after the config is unmarshalled and we've
|
||||
verified the configuration for the poller. */
|
||||
|
||||
func (p *plugin) runCollector() error {
|
||||
p.Logf("mysql plugin is not finished")
|
||||
return nil
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
module github.com/unifi-poller/mysqlunifi
|
||||
|
||||
go 1.15
|
||||
|
||||
require (
|
||||
github.com/unifi-poller/poller v0.0.0-20210315075554-47d92433b172
|
||||
golift.io/cnfg v0.0.7
|
||||
)
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/unifi-poller/poller"
|
||||
"golift.io/cnfg"
|
||||
)
|
||||
|
||||
// Only capital (exported) members are unmarshaled when passed into poller.NewOutput().
|
||||
type plugin struct {
|
||||
*Config `json:"mysql" toml:"mysql" xml:"mysql" yaml:"mysql"`
|
||||
poller.Collect
|
||||
}
|
||||
|
||||
// Config represents the data that is unmarshalled from the up.conf config file for this plugins.
|
||||
// See up.conf.example.mysql for sample input data.
|
||||
type Config struct {
|
||||
Disable bool `json:"disable" toml:"disable" xml:"disable" yaml:"disable"`
|
||||
Interval cnfg.Duration `json:"interval" toml:"interval" xml:"interval" yaml:"interval"`
|
||||
Host string `json:"host" toml:"host" xml:"host" yaml:"host"`
|
||||
User string `json:"user" toml:"user" xml:"user" yaml:"user"`
|
||||
Pass string `json:"pass" toml:"pass" xml:"pass" yaml:"pass"`
|
||||
DB string `json:"db" toml:"db" xml:"db" yaml:"db"`
|
||||
Devices []Device `json:"devices" toml:"devices" xml:"device" yaml:"devices"`
|
||||
Clients *Clients `json:"clients" toml:"clients" xml:"clients" yaml:"clients"`
|
||||
}
|
||||
|
||||
// Device represents the configuration to save a devices' data.
|
||||
// Type is one of uap, usw, ugw, udm.
|
||||
// Table represents the mysql table name we save these fields to.
|
||||
// Fields is a map of api response data key -> mysql column.
|
||||
type Device struct {
|
||||
Type string `json:"type" toml:"type" xml:"type" yaml:"type"`
|
||||
Table string `json:"table" toml:"table" xml:"table" yaml:"table"`
|
||||
Fields map[string]string `json:"fields" toml:"fields" xml:"field" yaml:"fields"`
|
||||
}
|
||||
|
||||
// Clients represents the configuration to save clients' data.
|
||||
// Table represents the mysql table name we save these fields to.
|
||||
// Fields is a map of api response data key -> mysql column.
|
||||
type Clients struct {
|
||||
Table string `json:"table" toml:"table" xml:"table" yaml:"table"`
|
||||
Fields map[string]string `json:"fields" toml:"fields" xml:"field" yaml:"fields"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
u := &plugin{Config: &Config{}}
|
||||
|
||||
poller.NewOutput(&poller.Output{
|
||||
Name: "mysql",
|
||||
Config: u, // pass in the struct *above* your config (so it can see the struct tags).
|
||||
Method: u.Run,
|
||||
})
|
||||
}
|
||||
|
||||
// Run gets called by poller core code. Return when the plugin stops working or has an error.
|
||||
// In other words, don't run your code in a go routine, it already is.
|
||||
func (p *plugin) Run(c poller.Collect) error {
|
||||
if p.Collect = c; c == nil || p.Config == nil || p.Disable {
|
||||
return nil // no config or disabled, bail out.
|
||||
}
|
||||
|
||||
if err := p.validateConfig(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return p.runCollector()
|
||||
}
|
||||
|
||||
// validateConfig checks input sanity.
|
||||
func (p *plugin) validateConfig() error {
|
||||
if p.Interval.Duration == 0 {
|
||||
return fmt.Errorf("must provide a polling interval")
|
||||
}
|
||||
|
||||
if p.Clients == nil && len(p.Devices) == 0 {
|
||||
return fmt.Errorf("must configure client or device collection; both empty")
|
||||
}
|
||||
|
||||
for _, d := range p.Devices {
|
||||
if len(d.Fields) == 0 {
|
||||
return fmt.Errorf("no fields defined for device type %s, table %s", d.Type, d.Table)
|
||||
}
|
||||
}
|
||||
|
||||
if p.Clients != nil && p.Clients.Fields == nil {
|
||||
return fmt.Errorf("no fields defined for clients; if you don't want to store client data, remove it from the config")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// main() is required, but it shouldn't do much as it's not used in plugin mode.
|
||||
func main() {
|
||||
fmt.Println("this is a unifi-poller plugin; not an application")
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
[poller]
|
||||
debug = true
|
||||
plugins = ["/path/to/mysql.so"]
|
||||
|
||||
[mysql]
|
||||
interval = "30s"
|
||||
host = "127.0.0.1:3306"
|
||||
user = "unifipoller"
|
||||
pass = "unifipoller"
|
||||
db = "unifipoller"
|
||||
|
||||
[mysql.clients]
|
||||
table = "client_records"
|
||||
[mysql.clients.fields]
|
||||
tx_bytes = "tx-bytes"
|
||||
rx_bytes = "rx-bytes"
|
||||
|
||||
[[mysql.devices]]
|
||||
type = "uap"
|
||||
table = "uap_records"
|
||||
[mysql.devices.fields]
|
||||
tx_bytes = "tx-bytes"
|
||||
rx_bytes = "rx-bytes"
|
||||
|
||||
[[mysql.devices]]
|
||||
type = "ugw"
|
||||
table = "usg_records"
|
||||
[mysql.devices.fields]
|
||||
wan_bytes = "wan_bytes"
|
||||
|
||||
[unifi.defaults]
|
||||
url = "https://127.0.0.1:8443"
|
||||
user = "unifipoller"
|
||||
pass = "4BB9345C-2341-48D7-99F5-E01B583FF77F"
|
||||
Loading…
Reference in New Issue