ing
This commit is contained in:
parent
5a9359c3af
commit
6fb6bc66d8
185
auth/auth.go
185
auth/auth.go
|
@ -2,27 +2,24 @@ package auth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/base64"
|
"errors"
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
|
||||||
"path"
|
"path"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
lfcc "git.loafle.net/commons_go/config"
|
lfcc "git.loafle.net/commons_go/config"
|
||||||
"git.loafle.net/commons_go/logging"
|
"git.loafle.net/commons_go/logging"
|
||||||
|
"git.loafle.net/overflow/overflow_probes/central/api/module"
|
||||||
|
|
||||||
"git.loafle.net/overflow/overflow_probes/central/client"
|
"git.loafle.net/overflow/overflow_probes/central/client"
|
||||||
"git.loafle.net/overflow/overflow_probes/commons"
|
"git.loafle.net/overflow/overflow_probes/commons"
|
||||||
"git.loafle.net/overflow/overflow_probes/config"
|
"git.loafle.net/overflow/overflow_probes/config"
|
||||||
|
opuu "git.loafle.net/overflow/overflow_probes/util/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
noAuthConfigFileName = "noauth.json"
|
noAuthEntryPoint = "/auth"
|
||||||
noAuthHeaderNoAuthID = "overFlow-NoAuth-ID"
|
|
||||||
noAuthHeaderNoAuthRegist = "overFlow-NoAuth-Regist"
|
|
||||||
noAuthHeaderSetNoAuthID = "overFlow-Set-NoAuth-ID"
|
|
||||||
probeConfigFileName = "probe.json"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type AuthHandler interface {
|
type AuthHandler interface {
|
||||||
|
@ -30,100 +27,127 @@ type AuthHandler interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type authHandlers struct {
|
type authHandlers struct {
|
||||||
|
c client.Client
|
||||||
|
entryURL string
|
||||||
configDir string
|
configDir string
|
||||||
|
|
||||||
noAuthConfigPath string
|
noAuthConfigPath string
|
||||||
noAuthConfig config.NoAuthProbeConfig
|
noAuthConfig config.NoAuthProbeConfig
|
||||||
entryURL string
|
|
||||||
c client.Client
|
|
||||||
probeConfigPath string
|
probeConfigPath string
|
||||||
probeConfig config.ProbeConfig
|
probeConfig config.ProbeConfig
|
||||||
|
|
||||||
|
shutdownChan chan bool
|
||||||
|
acceptedChan chan bool
|
||||||
|
deniedChan chan error
|
||||||
}
|
}
|
||||||
|
|
||||||
type NoAuthProbe struct {
|
func New(configDir string) (AuthHandler, error) {
|
||||||
APIKey string `json:"apiKey"`
|
var err error
|
||||||
Description string `json:"description"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type NoAuthDescription struct {
|
|
||||||
Host Host `json:"host"`
|
|
||||||
Network Network `json:"network"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(configDir string) AuthHandler {
|
|
||||||
h := &authHandlers{
|
h := &authHandlers{
|
||||||
configDir: configDir,
|
configDir: configDir,
|
||||||
|
shutdownChan: make(chan bool),
|
||||||
|
acceptedChan: make(chan bool),
|
||||||
|
deniedChan: make(chan error),
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
if h.entryURL, err = opuu.Join(config.Config.Central.URL, noAuthEntryPoint); nil != err {
|
||||||
var centralURL *url.URL
|
return nil, err
|
||||||
var noAuthEntryPoint string
|
|
||||||
var ok bool
|
|
||||||
if centralURL, err = url.Parse(config.Config.Central.URL); nil != err {
|
|
||||||
logging.Logger.Error(fmt.Sprintf("Auth: Central URL[%s] is not valid error[%v]", config.Config.Central.URL, err))
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if noAuthEntryPoint, ok = config.Config.Central.EntryPoints["noauth"]; !ok {
|
h.noAuthConfigPath = path.Join(configDir, config.NoAuthProbeConfigFileName)
|
||||||
logging.Logger.Error("Auth: NoAuth entry point of Central is not exist")
|
h.probeConfigPath = path.Join(configDir, config.ProbeConfigFileName)
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
centralURL.Path = path.Join(centralURL.Path, noAuthEntryPoint)
|
|
||||||
h.entryURL = centralURL.String()
|
|
||||||
|
|
||||||
h.noAuthConfigPath = path.Join(configDir, noAuthConfigFileName)
|
|
||||||
h.probeConfigPath = path.Join(configDir, probeConfigFileName)
|
|
||||||
|
|
||||||
conf := lfcc.New()
|
conf := lfcc.New()
|
||||||
if lfcc.Exists(h.noAuthConfigPath) {
|
if lfcc.Exists(h.noAuthConfigPath) {
|
||||||
if err = conf.Load(&h.noAuthConfig, h.noAuthConfigPath); nil != err {
|
if err = conf.Load(&h.noAuthConfig, h.noAuthConfigPath); nil != err {
|
||||||
logging.Logger.Error(fmt.Sprintf("Auth: Loading of NoAuth config file[%s] failed error[%v]", h.noAuthConfigPath, err))
|
return nil, fmt.Errorf("Auth: Loading of NoAuth config file[%s] failed error[%v]", h.noAuthConfigPath, err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if err = lfcc.Save(h.noAuthConfig, h.noAuthConfigPath, true); nil != err {
|
if err = lfcc.Save(h.noAuthConfig, h.noAuthConfigPath, true); nil != err {
|
||||||
logging.Logger.Error(fmt.Sprintf("Auth: Saving of NoAuth config file[%s] failed error[%v]", h.noAuthConfigPath, err))
|
return nil, fmt.Errorf("Auth: Saving of NoAuth config file[%s] failed error[%v]", h.noAuthConfigPath, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return h
|
return h, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *authHandlers) Listen() error {
|
func (h *authHandlers) Serve() error {
|
||||||
var err error
|
if nil != h.noAuthConfig.DenyDate {
|
||||||
isRegist := true
|
return fmt.Errorf("Cannot start because this probe have been denied from overFlow[%s]", h.noAuthConfig.DenyDate.String())
|
||||||
|
}
|
||||||
|
|
||||||
h.c = client.New()
|
h.c = client.New()
|
||||||
h.c.OnNotify("NoAuthProbeService.accept", h.onNoAuthProbeAccept)
|
h.c.OnNotify(module.NoAuthProbeService_AcceptNoAuthProbe, h.onNoAuthProbeAccept)
|
||||||
h.c.OnNotify("NoAuthProbeService.deny", h.onNoAuthProbeDeny)
|
h.c.OnNotify(module.NoAuthProbeService_DenyNoauthProbe, h.onNoAuthProbeDeny)
|
||||||
|
|
||||||
header := http.Header{}
|
var err error
|
||||||
|
if nil != h.noAuthConfig.TempKey && "" != *h.noAuthConfig.TempKey {
|
||||||
if "" != h.noAuthConfig.TempKey {
|
err = h.serveConnect(*h.noAuthConfig.TempKey)
|
||||||
isRegist = false
|
|
||||||
header[noAuthHeaderNoAuthID] = []string{h.noAuthConfig.TempKey}
|
|
||||||
} else {
|
} else {
|
||||||
var enc string
|
err = h.serveRegistration()
|
||||||
if enc, err = h.getRegistHeader(); nil != err {
|
}
|
||||||
|
if nil != err {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
header[noAuthHeaderNoAuthRegist] = []string{enc}
|
|
||||||
|
ListenLoop:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-h.shutdownChan:
|
||||||
|
return errors.New("Shutting down")
|
||||||
|
case <-h.acceptedChan:
|
||||||
|
break ListenLoop
|
||||||
|
case err := <-h.deniedChan:
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *authHandlers) Shutdown(ctx context.Context) error {
|
||||||
|
h.shutdownChan <- true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *authHandlers) serveRegistration() error {
|
||||||
|
var err error
|
||||||
|
header := http.Header{}
|
||||||
|
|
||||||
|
var enc string
|
||||||
|
if enc, err = getRegistHeader(); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
header[module.NoAuthProbeHeader_NoAuthRegist] = []string{enc}
|
||||||
|
|
||||||
var res *http.Response
|
var res *http.Response
|
||||||
if res, err = h.c.Dial(h.entryURL, header, 4096, 4096); nil != err {
|
if res, err = h.c.Dial(h.entryURL, header, 4096, 4096); nil != err {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if isRegist {
|
tempKey := res.Header.Get(module.NoAuthProbeHeader_SetNoAuthID)
|
||||||
h.noAuthConfig.TempKey = res.Header.Get(noAuthHeaderSetNoAuthID)
|
h.noAuthConfig.TempKey = &tempKey
|
||||||
if err = lfcc.Save(h.noAuthConfig, h.noAuthConfigPath, true); nil != err {
|
if err = lfcc.Save(h.noAuthConfig, h.noAuthConfigPath, true); nil != err {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
for {
|
func (h *authHandlers) serveConnect(noAuthTempKey string) error {
|
||||||
|
var err error
|
||||||
|
header := http.Header{}
|
||||||
|
header[module.NoAuthProbeHeader_NoAuthID] = []string{noAuthTempKey}
|
||||||
|
|
||||||
|
var res *http.Response
|
||||||
|
if res, err = h.c.Dial(h.entryURL, header, 4096, 4096); nil != err {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logging.Logger.Debug(fmt.Sprintf("Auth: Connect HTTP Status[%s]", res.Status))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,59 +162,20 @@ func (h *authHandlers) onNoAuthProbeAccept(method string, params interface{}) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
h.probeConfig.ID = probeID
|
h.probeConfig.ID = &probeID
|
||||||
if err = lfcc.Save(h.probeConfig, h.probeConfigPath, true); nil != err {
|
if err = lfcc.Save(h.probeConfig, h.probeConfigPath, true); nil != err {
|
||||||
logging.Logger.Error(fmt.Sprintf("Auth: Saving of Probe config file[%s] failed error[%v]", h.probeConfigPath, err))
|
logging.Logger.Error(fmt.Sprintf("Auth: Saving of Probe config file[%s] failed error[%v]", h.probeConfigPath, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h.acceptedChan <- true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *authHandlers) onNoAuthProbeDeny(method string, params interface{}) {
|
func (h *authHandlers) onNoAuthProbeDeny(method string, params interface{}) {
|
||||||
h.noAuthConfig.DenyDate = time.Now()
|
n := time.Now()
|
||||||
|
h.noAuthConfig.DenyDate = &n
|
||||||
if err := lfcc.Save(h.noAuthConfig, h.noAuthConfigPath, true); nil != err {
|
if err := lfcc.Save(h.noAuthConfig, h.noAuthConfigPath, true); nil != err {
|
||||||
logging.Logger.Error(fmt.Sprintf("Auth: Saving of NoAuth config file[%s] failed error[%v]", h.noAuthConfigPath, err))
|
logging.Logger.Error(fmt.Sprintf("Auth: Saving of NoAuth config file[%s] failed error[%v]", h.noAuthConfigPath, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
h.deniedChan <- fmt.Errorf("This probe have been denied from overFlow")
|
||||||
|
|
||||||
func (h *authHandlers) getRegistHeader() (string, error) {
|
|
||||||
var err error
|
|
||||||
nap := NoAuthProbe{
|
|
||||||
APIKey: config.Config.Domain.APIKey,
|
|
||||||
}
|
|
||||||
nad := NoAuthDescription{}
|
|
||||||
|
|
||||||
if err = getHost(&nad.Host); nil != err {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = getNetwork(&nad.Network); nil != err {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
var buf []byte
|
|
||||||
if buf, err = json.Marshal(nad); nil != err {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
nap.Description = string(buf)
|
|
||||||
|
|
||||||
if buf, err = json.Marshal(nap); nil != err {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
logging.Logger.Debug(fmt.Sprintf("%s", string(buf)))
|
|
||||||
|
|
||||||
enc := base64.StdEncoding.EncodeToString(buf)
|
|
||||||
|
|
||||||
return enc, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *authHandlers) listen() {
|
|
||||||
// 1. regist
|
|
||||||
// 2. wait for accept auth
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *authHandlers) Shutdown(ctx context.Context) error {
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
30
auth/host.go
30
auth/host.go
|
@ -1,30 +0,0 @@
|
||||||
package auth
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/shirou/gopsutil/host"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Host struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
OS string `json:"os"`
|
|
||||||
Platform string `json:"paltform"`
|
|
||||||
PlatformFamily string `json:"platformFamily"`
|
|
||||||
PlatformVersion string `json:"platformVersion"`
|
|
||||||
KernelVersion string `json:"kernelVersion"`
|
|
||||||
HostID string `json:"hostID"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func getHost(h *Host) error {
|
|
||||||
if i, err := host.Info(); nil == err {
|
|
||||||
h.Name = i.Hostname
|
|
||||||
h.OS = i.OS
|
|
||||||
h.Platform = i.Platform
|
|
||||||
h.PlatformFamily = i.PlatformFamily
|
|
||||||
h.KernelVersion = i.KernelVersion
|
|
||||||
h.HostID = i.HostID
|
|
||||||
} else {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,64 +0,0 @@
|
||||||
package auth
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"errors"
|
|
||||||
"net"
|
|
||||||
|
|
||||||
"git.loafle.net/commons_go/util/net/gateway"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Network struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Address string `json:"address"`
|
|
||||||
Gateway string `json:"gateway"`
|
|
||||||
MacAddress string `json:"macAddress"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func getNetwork(n *Network) error {
|
|
||||||
var ip net.IP
|
|
||||||
var iface string
|
|
||||||
var err error
|
|
||||||
if ip, iface, err = gateway.DiscoverGateway(); nil != err {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
interfaces, err := net.Interfaces()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
idx := -1
|
|
||||||
|
|
||||||
for _idx, i := range interfaces {
|
|
||||||
if i.Name == iface {
|
|
||||||
idx = _idx
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if -1 == idx {
|
|
||||||
return errors.New("Interface of gateway is not exist")
|
|
||||||
}
|
|
||||||
|
|
||||||
i := interfaces[idx]
|
|
||||||
|
|
||||||
n.Name = i.Name
|
|
||||||
n.MacAddress = i.HardwareAddr.String()
|
|
||||||
n.Gateway = ip.String()
|
|
||||||
|
|
||||||
if addrs, err := i.Addrs(); nil == err {
|
|
||||||
var buffer bytes.Buffer
|
|
||||||
for _idx, a := range addrs {
|
|
||||||
if 0 < _idx {
|
|
||||||
buffer.WriteString("|")
|
|
||||||
}
|
|
||||||
buffer.WriteString(a.String())
|
|
||||||
}
|
|
||||||
n.Address = buffer.String()
|
|
||||||
} else {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
116
auth/registration.go
Normal file
116
auth/registration.go
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
package auth
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"net"
|
||||||
|
|
||||||
|
"git.loafle.net/commons_go/util/net/gateway"
|
||||||
|
"git.loafle.net/overflow/overflow_probes/central/api/module"
|
||||||
|
"git.loafle.net/overflow/overflow_probes/config"
|
||||||
|
"github.com/shirou/gopsutil/host"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getRegistHeader() (string, error) {
|
||||||
|
var err error
|
||||||
|
nap := module.NoAuthProbe{
|
||||||
|
APIKey: config.Config.Domain.APIKey,
|
||||||
|
}
|
||||||
|
var nad *module.NoAuthProbeDescription
|
||||||
|
if nad, err = getDescription(); nil != err {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
var buf []byte
|
||||||
|
if buf, err = json.Marshal(nad); nil != err {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
nap.Description = string(buf)
|
||||||
|
|
||||||
|
if buf, err = json.Marshal(nap); nil != err {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
enc := base64.StdEncoding.EncodeToString(buf)
|
||||||
|
|
||||||
|
return enc, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDescription() (*module.NoAuthProbeDescription, error) {
|
||||||
|
nad := &module.NoAuthProbeDescription{}
|
||||||
|
|
||||||
|
if err := getHost(&nad.Host); nil != err {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := getNetwork(&nad.Network); nil != err {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nad, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getHost(h *module.NoAuthProbeDescriptionHost) error {
|
||||||
|
if i, err := host.Info(); nil == err {
|
||||||
|
h.Name = i.Hostname
|
||||||
|
h.OS = i.OS
|
||||||
|
h.Platform = i.Platform
|
||||||
|
h.PlatformFamily = i.PlatformFamily
|
||||||
|
h.KernelVersion = i.KernelVersion
|
||||||
|
h.HostID = i.HostID
|
||||||
|
} else {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getNetwork(n *module.NoAuthProbeDescriptionNetwork) error {
|
||||||
|
var ip net.IP
|
||||||
|
var iface string
|
||||||
|
var err error
|
||||||
|
if ip, iface, err = gateway.DiscoverGateway(); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
interfaces, err := net.Interfaces()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
idx := -1
|
||||||
|
|
||||||
|
for _idx, i := range interfaces {
|
||||||
|
if i.Name == iface {
|
||||||
|
idx = _idx
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if -1 == idx {
|
||||||
|
return errors.New("Interface of gateway is not exist")
|
||||||
|
}
|
||||||
|
|
||||||
|
i := interfaces[idx]
|
||||||
|
|
||||||
|
n.Name = i.Name
|
||||||
|
n.MacAddress = i.HardwareAddr.String()
|
||||||
|
n.Gateway = ip.String()
|
||||||
|
|
||||||
|
if addrs, err := i.Addrs(); nil == err {
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
for _idx, a := range addrs {
|
||||||
|
if 0 < _idx {
|
||||||
|
buffer.WriteString("|")
|
||||||
|
}
|
||||||
|
buffer.WriteString(a.String())
|
||||||
|
}
|
||||||
|
n.Address = buffer.String()
|
||||||
|
} else {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
45
central/api/module/noauthprobe.go
Normal file
45
central/api/module/noauthprobe.go
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
package module
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
const (
|
||||||
|
NoAuthProbeHeader_NoAuthID = "overFlow-NoAuth-ID"
|
||||||
|
NoAuthProbeHeader_NoAuthRegist = "overFlow-NoAuth-Regist"
|
||||||
|
NoAuthProbeHeader_SetNoAuthID = "overFlow-Set-NoAuth-ID"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NoAuthProbe struct {
|
||||||
|
ID uint64 `json:"id"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
TempProbeKey string `json:"tempProbeKey"`
|
||||||
|
CreateDate time.Time `json:"createDate"`
|
||||||
|
APIKey string `json:"apiKey"`
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
NoAuthProbeService_Regist = "NoAuthProbeService.regist"
|
||||||
|
NoAuthProbeService_AcceptNoAuthProbe = "NoAuthProbeService.acceptNoAuthProbe"
|
||||||
|
NoAuthProbeService_DenyNoauthProbe = "NoAuthProbeService.denyNoauthProbe"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NoAuthProbeDescription struct {
|
||||||
|
Host NoAuthProbeDescriptionHost `json:"host"`
|
||||||
|
Network NoAuthProbeDescriptionNetwork `json:"network"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type NoAuthProbeDescriptionHost struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
OS string `json:"os"`
|
||||||
|
Platform string `json:"paltform"`
|
||||||
|
PlatformFamily string `json:"platformFamily"`
|
||||||
|
PlatformVersion string `json:"platformVersion"`
|
||||||
|
KernelVersion string `json:"kernelVersion"`
|
||||||
|
HostID string `json:"hostID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type NoAuthProbeDescriptionNetwork struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Address string `json:"address"`
|
||||||
|
Gateway string `json:"gateway"`
|
||||||
|
MacAddress string `json:"macAddress"`
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ const (
|
||||||
|
|
||||||
type (
|
type (
|
||||||
OnNotifyFunc func(method string, params interface{})
|
OnNotifyFunc func(method string, params interface{})
|
||||||
|
OnCloseFunc func(code int, text string)
|
||||||
)
|
)
|
||||||
|
|
||||||
type ServerError string
|
type ServerError string
|
||||||
|
@ -54,6 +55,7 @@ type Client interface {
|
||||||
Call(method string, args interface{}, result interface{}) error
|
Call(method string, args interface{}, result interface{}) error
|
||||||
Notify(method string, args interface{}) error
|
Notify(method string, args interface{}) error
|
||||||
OnNotify(method string, cb OnNotifyFunc)
|
OnNotify(method string, cb OnNotifyFunc)
|
||||||
|
OnClose(cb OnCloseFunc)
|
||||||
Shutdown(ctx context.Context) error
|
Shutdown(ctx context.Context) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,6 +70,7 @@ type client struct {
|
||||||
closing bool // user has called Close
|
closing bool // user has called Close
|
||||||
shutdown bool // server has told us to stop
|
shutdown bool // server has told us to stop
|
||||||
onNotifyHandlers map[string][]OnNotifyFunc
|
onNotifyHandlers map[string][]OnNotifyFunc
|
||||||
|
onCloseHandlers []OnCloseFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
func New() Client {
|
func New() Client {
|
||||||
|
@ -75,6 +78,7 @@ func New() Client {
|
||||||
requestID: 0,
|
requestID: 0,
|
||||||
pending: make(map[uint64]*Call),
|
pending: make(map[uint64]*Call),
|
||||||
onNotifyHandlers: make(map[string][]OnNotifyFunc),
|
onNotifyHandlers: make(map[string][]OnNotifyFunc),
|
||||||
|
onCloseHandlers: make([]OnCloseFunc, 1),
|
||||||
}
|
}
|
||||||
|
|
||||||
return c
|
return c
|
||||||
|
@ -93,6 +97,8 @@ func (c *client) Dial(url string, header http.Header, readBufSize int, writeBufS
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.conn.SetCloseHandler(c.connCloseHandler)
|
||||||
|
|
||||||
go c.input()
|
go c.input()
|
||||||
|
|
||||||
return res, nil
|
return res, nil
|
||||||
|
@ -128,6 +134,10 @@ func (c *client) OnNotify(method string, cb OnNotifyFunc) {
|
||||||
hs = append(hs, cb)
|
hs = append(hs, cb)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *client) OnClose(cb OnCloseFunc) {
|
||||||
|
c.onCloseHandlers = append(c.onCloseHandlers, cb)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *client) Shutdown(ctx context.Context) error {
|
func (c *client) Shutdown(ctx context.Context) error {
|
||||||
c.mutex.Lock()
|
c.mutex.Lock()
|
||||||
if c.closing {
|
if c.closing {
|
||||||
|
@ -292,3 +302,11 @@ func (c *client) onNotification(noti protocol.Notification) error {
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *client) connCloseHandler(code int, text string) error {
|
||||||
|
for _, h := range c.onCloseHandlers {
|
||||||
|
h(code, text)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,6 @@ package commons
|
||||||
import "context"
|
import "context"
|
||||||
|
|
||||||
type Handler interface {
|
type Handler interface {
|
||||||
Listen() error
|
Serve() error
|
||||||
Shutdown(ctx context.Context) error
|
Shutdown(ctx context.Context) error
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,6 @@
|
||||||
"apikey": "52abd6fd57e511e7ac52080027658d13"
|
"apikey": "52abd6fd57e511e7ac52080027658d13"
|
||||||
},
|
},
|
||||||
"central": {
|
"central": {
|
||||||
"url": "ws://127.0.0.1:19190",
|
"url": "ws://127.0.0.1:19190"
|
||||||
"entryPoints": {
|
|
||||||
"noauth": "/auth",
|
|
||||||
"probe": "/probe"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,5 +1,9 @@
|
||||||
package config
|
package config
|
||||||
|
|
||||||
|
const (
|
||||||
|
ConfigFileName = "config.json"
|
||||||
|
)
|
||||||
|
|
||||||
var Config AllConfig
|
var Config AllConfig
|
||||||
|
|
||||||
type AllConfig struct {
|
type AllConfig struct {
|
||||||
|
|
|
@ -2,7 +2,11 @@ package config
|
||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
|
const (
|
||||||
|
NoAuthProbeConfigFileName = "noauthprobe.json"
|
||||||
|
)
|
||||||
|
|
||||||
type NoAuthProbeConfig struct {
|
type NoAuthProbeConfig struct {
|
||||||
TempKey string `json:"tempKey" yaml:"tempKey" toml:"tempKey"`
|
TempKey *string `json:"tempKey,omitempty" yaml:"tempKey" toml:"tempKey"`
|
||||||
DenyDate time.Time `json:"denyDate" yaml:"denyDate" toml:"denyDate"`
|
DenyDate *time.Time `json:"denyDate,omitempty" yaml:"denyDate" toml:"denyDate"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
package config
|
package config
|
||||||
|
|
||||||
|
const (
|
||||||
|
ProbeConfigFileName = "probe.json"
|
||||||
|
)
|
||||||
|
|
||||||
type ProbeConfig struct {
|
type ProbeConfig struct {
|
||||||
ID string `json:"id" yaml:"id" toml:"id"`
|
ID *string `json:"id,omitempty" yaml:"id" toml:"id"`
|
||||||
}
|
}
|
||||||
|
|
9
main.go
9
main.go
|
@ -150,16 +150,19 @@ func main() {
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
handler = auth.New(confDir)
|
if handler, err = auth.New(confDir); nil != err {
|
||||||
|
logging.Logger.Error(fmt.Sprintf("Auth: error: %v", err))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
if err := handler.Listen(); err != nil {
|
if err := handler.Serve(); err != nil {
|
||||||
logging.Logger.Error(fmt.Sprintf("Probe: Authenticator error: %v", err))
|
logging.Logger.Error(fmt.Sprintf("Probe: Authenticator error: %v", err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
handler = probe.New(confDir)
|
handler = probe.New(confDir)
|
||||||
if err := handler.Listen(); err != nil {
|
if err := handler.Serve(); err != nil {
|
||||||
logging.Logger.Error(fmt.Sprintf("Probe: error: %v", err))
|
logging.Logger.Error(fmt.Sprintf("Probe: error: %v", err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
{"tempID":""}
|
|
1
noauthprobe.json
Normal file
1
noauthprobe.json
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"tempKey":"3ca894e0-373a-47d9-a1dd-e4fbd4e214a7"}
|
|
@ -22,7 +22,7 @@ type probe struct {
|
||||||
configDir string
|
configDir string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *probe) Listen() error {
|
func (p *probe) Serve() error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
20
util/url/url.go
Normal file
20
util/url/url.go
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
"path"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Join is concat URL string and path
|
||||||
|
// ex) http://127.0.0.1/ and /entry
|
||||||
|
func Join(u string, p string) (string, error) {
|
||||||
|
var err error
|
||||||
|
var rURL *url.URL
|
||||||
|
|
||||||
|
if rURL, err = url.Parse(u); nil != err {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
rURL.Path = path.Join(rURL.Path, p)
|
||||||
|
return rURL.String(), nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user