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