MM-11029 Adding plugin logging functionality. (#9034)
* Capturing stdout, stderr of plugins in logs. * Cleanup go-plugin debug logs. * Adding logging to plugin API * Generating mocks. * godoc convention
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
3848cb7e79
Коммит
83a3ac089c
@@ -7,18 +7,21 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/mattermost/mattermost-server/mlog"
|
||||||
"github.com/mattermost/mattermost-server/model"
|
"github.com/mattermost/mattermost-server/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
type PluginAPI struct {
|
type PluginAPI struct {
|
||||||
id string
|
id string
|
||||||
app *App
|
app *App
|
||||||
|
logger *mlog.SugarLogger
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPluginAPI(a *App, manifest *model.Manifest) *PluginAPI {
|
func NewPluginAPI(a *App, manifest *model.Manifest) *PluginAPI {
|
||||||
return &PluginAPI{
|
return &PluginAPI{
|
||||||
id: manifest.Id,
|
id: manifest.Id,
|
||||||
app: a,
|
app: a,
|
||||||
|
logger: a.Log.With(mlog.String("plugin_id", manifest.Id)).Sugar(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,3 +188,16 @@ func (api *PluginAPI) PublishWebSocketEvent(event string, payload map[string]int
|
|||||||
Broadcast: broadcast,
|
Broadcast: broadcast,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (api *PluginAPI) LogDebug(msg string, keyValuePairs ...interface{}) {
|
||||||
|
api.logger.Debug(msg, keyValuePairs...)
|
||||||
|
}
|
||||||
|
func (api *PluginAPI) LogInfo(msg string, keyValuePairs ...interface{}) {
|
||||||
|
api.logger.Info(msg, keyValuePairs...)
|
||||||
|
}
|
||||||
|
func (api *PluginAPI) LogError(msg string, keyValuePairs ...interface{}) {
|
||||||
|
api.logger.Error(msg, keyValuePairs...)
|
||||||
|
}
|
||||||
|
func (api *PluginAPI) LogWarn(msg string, keyValuePairs ...interface{}) {
|
||||||
|
api.logger.Warn(msg, keyValuePairs...)
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ import (
|
|||||||
var globalLogger *Logger
|
var globalLogger *Logger
|
||||||
|
|
||||||
func InitGlobalLogger(logger *Logger) {
|
func InitGlobalLogger(logger *Logger) {
|
||||||
globalLogger = logger
|
glob := *logger
|
||||||
|
glob.zap = glob.zap.WithOptions(zap.AddCallerSkip(1))
|
||||||
|
globalLogger = &glob
|
||||||
Debug = globalLogger.Debug
|
Debug = globalLogger.Debug
|
||||||
Info = globalLogger.Info
|
Info = globalLogger.Info
|
||||||
Warn = globalLogger.Warn
|
Warn = globalLogger.Warn
|
||||||
@@ -20,7 +22,7 @@ func InitGlobalLogger(logger *Logger) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RedirectStdLog(logger *Logger) {
|
func RedirectStdLog(logger *Logger) {
|
||||||
zap.RedirectStdLogAt(logger.zap.With(zap.String("source", "stdlog")), zapcore.ErrorLevel)
|
zap.RedirectStdLogAt(logger.zap.With(zap.String("source", "stdlog")).WithOptions(zap.AddCallerSkip(-2)), zapcore.ErrorLevel)
|
||||||
}
|
}
|
||||||
|
|
||||||
type LogFunc func(string, ...Field)
|
type LogFunc func(string, ...Field)
|
||||||
|
|||||||
27
mlog/log.go
27
mlog/log.go
@@ -4,6 +4,7 @@
|
|||||||
package mlog
|
package mlog
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
@@ -101,7 +102,7 @@ func NewLogger(config *LoggerConfiguration) *Logger {
|
|||||||
combinedCore := zapcore.NewTee(cores...)
|
combinedCore := zapcore.NewTee(cores...)
|
||||||
|
|
||||||
logger.zap = zap.New(combinedCore,
|
logger.zap = zap.New(combinedCore,
|
||||||
zap.AddCallerSkip(2),
|
zap.AddCallerSkip(1),
|
||||||
zap.AddCaller(),
|
zap.AddCaller(),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -127,6 +128,30 @@ func (l *Logger) StdLog(fields ...Field) *log.Logger {
|
|||||||
return zap.NewStdLog(l.With(fields...).zap.WithOptions(getStdLogOption()))
|
return zap.NewStdLog(l.With(fields...).zap.WithOptions(getStdLogOption()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StdLogWriter returns a writer that can be hooked up to the output of a golang standard logger
|
||||||
|
// anything written will be interpreted as log entries accordingly
|
||||||
|
func (l *Logger) StdLogWriter() io.Writer {
|
||||||
|
newLogger := *l
|
||||||
|
newLogger.zap = newLogger.zap.WithOptions(zap.AddCallerSkip(4), getStdLogOption())
|
||||||
|
f := newLogger.Info
|
||||||
|
return &loggerWriter{f}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Logger) WithCallerSkip(skip int) *Logger {
|
||||||
|
newlogger := *l
|
||||||
|
newlogger.zap = newlogger.zap.WithOptions(zap.AddCallerSkip(skip))
|
||||||
|
return &newlogger
|
||||||
|
}
|
||||||
|
|
||||||
|
// Made for the plugin interface, wraps mlog in a simpler interface
|
||||||
|
// at the cost of performance
|
||||||
|
func (l *Logger) Sugar() *SugarLogger {
|
||||||
|
return &SugarLogger{
|
||||||
|
wrappedLogger: l,
|
||||||
|
zapSugar: l.zap.Sugar(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (l *Logger) Debug(message string, fields ...Field) {
|
func (l *Logger) Debug(message string, fields ...Field) {
|
||||||
l.zap.Debug(message, fields...)
|
l.zap.Debug(message, fields...)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
package mlog
|
package mlog
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
@@ -72,3 +73,15 @@ func getStdLogOption() zap.Option {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type loggerWriter struct {
|
||||||
|
logFunc func(msg string, fields ...Field)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *loggerWriter) Write(p []byte) (int, error) {
|
||||||
|
trimmed := string(bytes.TrimSpace(p))
|
||||||
|
for _, line := range strings.Split(trimmed, "\n") {
|
||||||
|
l.logFunc(string(line))
|
||||||
|
}
|
||||||
|
return len(p), nil
|
||||||
|
}
|
||||||
|
|||||||
28
mlog/sugar.go
Обычный файл
28
mlog/sugar.go
Обычный файл
@@ -0,0 +1,28 @@
|
|||||||
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||||
|
// See LICENSE.txt for license information.
|
||||||
|
|
||||||
|
package mlog
|
||||||
|
|
||||||
|
import "go.uber.org/zap"
|
||||||
|
|
||||||
|
// Made for the plugin interface, use the regular logger for other uses
|
||||||
|
type SugarLogger struct {
|
||||||
|
wrappedLogger *Logger
|
||||||
|
zapSugar *zap.SugaredLogger
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SugarLogger) Debug(msg string, keyValuePairs ...interface{}) {
|
||||||
|
l.zapSugar.Debugw(msg, keyValuePairs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SugarLogger) Info(msg string, keyValuePairs ...interface{}) {
|
||||||
|
l.zapSugar.Infow(msg, keyValuePairs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SugarLogger) Error(msg string, keyValuePairs ...interface{}) {
|
||||||
|
l.zapSugar.Errorw(msg, keyValuePairs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SugarLogger) Warn(msg string, keyValuePairs ...interface{}) {
|
||||||
|
l.zapSugar.Warnw(msg, keyValuePairs...)
|
||||||
|
}
|
||||||
@@ -119,6 +119,30 @@ type API interface {
|
|||||||
// payload is the data sent with the event. Interface values must be primitive Go types or mattermost-server/model types
|
// payload is the data sent with the event. Interface values must be primitive Go types or mattermost-server/model types
|
||||||
// broadcast determines to which users to send the event
|
// broadcast determines to which users to send the event
|
||||||
PublishWebSocketEvent(event string, payload map[string]interface{}, broadcast *model.WebsocketBroadcast)
|
PublishWebSocketEvent(event string, payload map[string]interface{}, broadcast *model.WebsocketBroadcast)
|
||||||
|
|
||||||
|
// LogDebug writes a log message to the Mattermost server log file.
|
||||||
|
// Appropriate context such as the plugin name will already be added as fields so plugins
|
||||||
|
// do not need to add that info.
|
||||||
|
// keyValuePairs should be primitive go types or other values that can be encoded by encoding/gob
|
||||||
|
LogDebug(msg string, keyValuePairs ...interface{})
|
||||||
|
|
||||||
|
// LogInfo writes a log message to the Mattermost server log file.
|
||||||
|
// Appropriate context such as the plugin name will already be added as fields so plugins
|
||||||
|
// do not need to add that info.
|
||||||
|
// keyValuePairs should be primitive go types or other values that can be encoded by encoding/gob
|
||||||
|
LogInfo(msg string, keyValuePairs ...interface{})
|
||||||
|
|
||||||
|
// LogError writes a log message to the Mattermost server log file.
|
||||||
|
// Appropriate context such as the plugin name will already be added as fields so plugins
|
||||||
|
// do not need to add that info.
|
||||||
|
// keyValuePairs should be primitive go types or other values that can be encoded by encoding/gob
|
||||||
|
LogError(msg string, keyValuePairs ...interface{})
|
||||||
|
|
||||||
|
// LogWarn writes a log message to the Mattermost server log file.
|
||||||
|
// Appropriate context such as the plugin name will already be added as fields so plugins
|
||||||
|
// do not need to add that info.
|
||||||
|
// keyValuePairs should be primitive go types or other values that can be encoded by encoding/gob
|
||||||
|
LogWarn(msg string, keyValuePairs ...interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
var Handshake = plugin.HandshakeConfig{
|
var Handshake = plugin.HandshakeConfig{
|
||||||
|
|||||||
@@ -9,9 +9,12 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/gob"
|
"encoding/gob"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/rpc"
|
"net/rpc"
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"github.com/hashicorp/go-plugin"
|
"github.com/hashicorp/go-plugin"
|
||||||
@@ -33,7 +36,6 @@ type HooksRPCServer struct {
|
|||||||
impl interface{}
|
impl interface{}
|
||||||
muxBroker *plugin.MuxBroker
|
muxBroker *plugin.MuxBroker
|
||||||
apiRPCClient *APIRPCClient
|
apiRPCClient *APIRPCClient
|
||||||
log *mlog.Logger
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements hashicorp/go-plugin/plugin.Plugin interface to connect the hooks of a plugin
|
// Implements hashicorp/go-plugin/plugin.Plugin interface to connect the hooks of a plugin
|
||||||
@@ -156,24 +158,11 @@ func (g *HooksRPCClient) OnActivate() error {
|
|||||||
func (s *HooksRPCServer) OnActivate(args *OnActivateArgs, returns *OnActivateReturns) error {
|
func (s *HooksRPCServer) OnActivate(args *OnActivateArgs, returns *OnActivateReturns) error {
|
||||||
connection, err := s.muxBroker.Dial(args.APIMuxId)
|
connection, err := s.muxBroker.Dial(args.APIMuxId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err // Where does this go?
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Settings for this should come from the parent process, for now just set it up
|
|
||||||
// though stdout.
|
|
||||||
logger := mlog.NewLogger(&mlog.LoggerConfiguration{
|
|
||||||
EnableConsole: true,
|
|
||||||
ConsoleJson: true,
|
|
||||||
ConsoleLevel: mlog.LevelDebug,
|
|
||||||
EnableFile: false,
|
|
||||||
})
|
|
||||||
logger = logger.With(mlog.Bool("plugin_subprocess", true))
|
|
||||||
|
|
||||||
s.log = logger
|
|
||||||
|
|
||||||
s.apiRPCClient = &APIRPCClient{
|
s.apiRPCClient = &APIRPCClient{
|
||||||
client: rpc.NewClient(connection),
|
client: rpc.NewClient(connection),
|
||||||
log: logger,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if mmplugin, ok := s.impl.(interface {
|
if mmplugin, ok := s.impl.(interface {
|
||||||
@@ -185,6 +174,10 @@ func (s *HooksRPCServer) OnActivate(args *OnActivateArgs, returns *OnActivateRet
|
|||||||
mmplugin.OnConfigurationChange()
|
mmplugin.OnConfigurationChange()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Capture output of standard logger because go-plugin
|
||||||
|
// redirects it.
|
||||||
|
log.SetOutput(os.Stderr)
|
||||||
|
|
||||||
if hook, ok := s.impl.(interface {
|
if hook, ok := s.impl.(interface {
|
||||||
OnActivate() error
|
OnActivate() error
|
||||||
}); ok {
|
}); ok {
|
||||||
@@ -293,7 +286,7 @@ func (g *HooksRPCClient) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
Request: forwardedRequest,
|
Request: forwardedRequest,
|
||||||
RequestBodyStream: requestBodyStreamId,
|
RequestBodyStream: requestBodyStreamId,
|
||||||
}, nil); err != nil {
|
}, nil); err != nil {
|
||||||
mlog.Error("Plugin failed to ServeHTTP, RPC call failed", mlog.Err(err))
|
g.log.Error("Plugin failed to ServeHTTP, RPC call failed", mlog.Err(err))
|
||||||
http.Error(w, "500 internal server error", http.StatusInternalServerError)
|
http.Error(w, "500 internal server error", http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@@ -302,7 +295,7 @@ func (g *HooksRPCClient) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
func (s *HooksRPCServer) ServeHTTP(args *ServeHTTPArgs, returns *struct{}) error {
|
func (s *HooksRPCServer) ServeHTTP(args *ServeHTTPArgs, returns *struct{}) error {
|
||||||
connection, err := s.muxBroker.Dial(args.ResponseWriterStream)
|
connection, err := s.muxBroker.Dial(args.ResponseWriterStream)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.log.Debug("Can't connect to remote response writer stream", mlog.Err(err))
|
fmt.Fprintf(os.Stderr, "[ERROR] Can't connect to remote response writer stream, error: %v", err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
w := ConnectHTTPResponseWriter(connection)
|
w := ConnectHTTPResponseWriter(connection)
|
||||||
@@ -312,7 +305,7 @@ func (s *HooksRPCServer) ServeHTTP(args *ServeHTTPArgs, returns *struct{}) error
|
|||||||
if args.RequestBodyStream != 0 {
|
if args.RequestBodyStream != 0 {
|
||||||
connection, err := s.muxBroker.Dial(args.RequestBodyStream)
|
connection, err := s.muxBroker.Dial(args.RequestBodyStream)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.log.Debug("Can't connect to remote response writer stream", mlog.Err(err))
|
fmt.Fprintf(os.Stderr, "[ERROR] Can't connect to remote request body stream, error: %v", err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
r.Body = ConnectIOReader(connection)
|
r.Body = ConnectIOReader(connection)
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
package plugin
|
package plugin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/mattermost/mattermost-server/mlog"
|
"github.com/mattermost/mattermost-server/mlog"
|
||||||
"github.com/mattermost/mattermost-server/model"
|
"github.com/mattermost/mattermost-server/model"
|
||||||
)
|
)
|
||||||
@@ -38,6 +40,8 @@ func (s *HooksRPCServer) OnDeactivate(args *OnDeactivateArgs, returns *OnDeactiv
|
|||||||
OnDeactivate() error
|
OnDeactivate() error
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.OnDeactivate()
|
returns.A = hook.OnDeactivate()
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("Hook OnDeactivate called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -69,6 +73,8 @@ func (s *HooksRPCServer) OnConfigurationChange(args *OnConfigurationChangeArgs,
|
|||||||
OnConfigurationChange() error
|
OnConfigurationChange() error
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.OnConfigurationChange()
|
returns.A = hook.OnConfigurationChange()
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("Hook OnConfigurationChange called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -102,6 +108,8 @@ func (s *HooksRPCServer) ExecuteCommand(args *ExecuteCommandArgs, returns *Execu
|
|||||||
ExecuteCommand(args *model.CommandArgs) (*model.CommandResponse, *model.AppError)
|
ExecuteCommand(args *model.CommandArgs) (*model.CommandResponse, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.ExecuteCommand(args.A)
|
returns.A, returns.B = hook.ExecuteCommand(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("Hook ExecuteCommand called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -135,6 +143,8 @@ func (s *HooksRPCServer) MessageWillBePosted(args *MessageWillBePostedArgs, retu
|
|||||||
MessageWillBePosted(post *model.Post) (*model.Post, string)
|
MessageWillBePosted(post *model.Post) (*model.Post, string)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.MessageWillBePosted(args.A)
|
returns.A, returns.B = hook.MessageWillBePosted(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("Hook MessageWillBePosted called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -169,6 +179,8 @@ func (s *HooksRPCServer) MessageWillBeUpdated(args *MessageWillBeUpdatedArgs, re
|
|||||||
MessageWillBeUpdated(newPost, oldPost *model.Post) (*model.Post, string)
|
MessageWillBeUpdated(newPost, oldPost *model.Post) (*model.Post, string)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.MessageWillBeUpdated(args.A, args.B)
|
returns.A, returns.B = hook.MessageWillBeUpdated(args.A, args.B)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("Hook MessageWillBeUpdated called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -200,6 +212,8 @@ func (s *HooksRPCServer) MessageHasBeenPosted(args *MessageHasBeenPostedArgs, re
|
|||||||
MessageHasBeenPosted(post *model.Post)
|
MessageHasBeenPosted(post *model.Post)
|
||||||
}); ok {
|
}); ok {
|
||||||
hook.MessageHasBeenPosted(args.A)
|
hook.MessageHasBeenPosted(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("Hook MessageHasBeenPosted called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -232,6 +246,8 @@ func (s *HooksRPCServer) MessageHasBeenUpdated(args *MessageHasBeenUpdatedArgs,
|
|||||||
MessageHasBeenUpdated(newPost, oldPost *model.Post)
|
MessageHasBeenUpdated(newPost, oldPost *model.Post)
|
||||||
}); ok {
|
}); ok {
|
||||||
hook.MessageHasBeenUpdated(args.A, args.B)
|
hook.MessageHasBeenUpdated(args.A, args.B)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("Hook MessageHasBeenUpdated called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -258,6 +274,8 @@ func (s *APIRPCServer) RegisterCommand(args *RegisterCommandArgs, returns *Regis
|
|||||||
RegisterCommand(command *model.Command) error
|
RegisterCommand(command *model.Command) error
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.RegisterCommand(args.A)
|
returns.A = hook.RegisterCommand(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API RegisterCommand called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -285,6 +303,8 @@ func (s *APIRPCServer) UnregisterCommand(args *UnregisterCommandArgs, returns *U
|
|||||||
UnregisterCommand(teamId, trigger string) error
|
UnregisterCommand(teamId, trigger string) error
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.UnregisterCommand(args.A, args.B)
|
returns.A = hook.UnregisterCommand(args.A, args.B)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API UnregisterCommand called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -312,6 +332,8 @@ func (s *APIRPCServer) CreateUser(args *CreateUserArgs, returns *CreateUserRetur
|
|||||||
CreateUser(user *model.User) (*model.User, *model.AppError)
|
CreateUser(user *model.User) (*model.User, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.CreateUser(args.A)
|
returns.A, returns.B = hook.CreateUser(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API CreateUser called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -338,6 +360,8 @@ func (s *APIRPCServer) DeleteUser(args *DeleteUserArgs, returns *DeleteUserRetur
|
|||||||
DeleteUser(userId string) *model.AppError
|
DeleteUser(userId string) *model.AppError
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.DeleteUser(args.A)
|
returns.A = hook.DeleteUser(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API DeleteUser called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -365,6 +389,8 @@ func (s *APIRPCServer) GetUser(args *GetUserArgs, returns *GetUserReturns) error
|
|||||||
GetUser(userId string) (*model.User, *model.AppError)
|
GetUser(userId string) (*model.User, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetUser(args.A)
|
returns.A, returns.B = hook.GetUser(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetUser called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -392,6 +418,8 @@ func (s *APIRPCServer) GetUserByEmail(args *GetUserByEmailArgs, returns *GetUser
|
|||||||
GetUserByEmail(email string) (*model.User, *model.AppError)
|
GetUserByEmail(email string) (*model.User, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetUserByEmail(args.A)
|
returns.A, returns.B = hook.GetUserByEmail(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetUserByEmail called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -419,6 +447,8 @@ func (s *APIRPCServer) GetUserByUsername(args *GetUserByUsernameArgs, returns *G
|
|||||||
GetUserByUsername(name string) (*model.User, *model.AppError)
|
GetUserByUsername(name string) (*model.User, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetUserByUsername(args.A)
|
returns.A, returns.B = hook.GetUserByUsername(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetUserByUsername called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -446,6 +476,8 @@ func (s *APIRPCServer) UpdateUser(args *UpdateUserArgs, returns *UpdateUserRetur
|
|||||||
UpdateUser(user *model.User) (*model.User, *model.AppError)
|
UpdateUser(user *model.User) (*model.User, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.UpdateUser(args.A)
|
returns.A, returns.B = hook.UpdateUser(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API UpdateUser called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -473,6 +505,8 @@ func (s *APIRPCServer) CreateTeam(args *CreateTeamArgs, returns *CreateTeamRetur
|
|||||||
CreateTeam(team *model.Team) (*model.Team, *model.AppError)
|
CreateTeam(team *model.Team) (*model.Team, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.CreateTeam(args.A)
|
returns.A, returns.B = hook.CreateTeam(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API CreateTeam called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -499,6 +533,8 @@ func (s *APIRPCServer) DeleteTeam(args *DeleteTeamArgs, returns *DeleteTeamRetur
|
|||||||
DeleteTeam(teamId string) *model.AppError
|
DeleteTeam(teamId string) *model.AppError
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.DeleteTeam(args.A)
|
returns.A = hook.DeleteTeam(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API DeleteTeam called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -526,6 +562,8 @@ func (s *APIRPCServer) GetTeam(args *GetTeamArgs, returns *GetTeamReturns) error
|
|||||||
GetTeam(teamId string) (*model.Team, *model.AppError)
|
GetTeam(teamId string) (*model.Team, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetTeam(args.A)
|
returns.A, returns.B = hook.GetTeam(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetTeam called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -553,6 +591,8 @@ func (s *APIRPCServer) GetTeamByName(args *GetTeamByNameArgs, returns *GetTeamBy
|
|||||||
GetTeamByName(name string) (*model.Team, *model.AppError)
|
GetTeamByName(name string) (*model.Team, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetTeamByName(args.A)
|
returns.A, returns.B = hook.GetTeamByName(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetTeamByName called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -580,6 +620,8 @@ func (s *APIRPCServer) UpdateTeam(args *UpdateTeamArgs, returns *UpdateTeamRetur
|
|||||||
UpdateTeam(team *model.Team) (*model.Team, *model.AppError)
|
UpdateTeam(team *model.Team) (*model.Team, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.UpdateTeam(args.A)
|
returns.A, returns.B = hook.UpdateTeam(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API UpdateTeam called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -607,6 +649,8 @@ func (s *APIRPCServer) CreateChannel(args *CreateChannelArgs, returns *CreateCha
|
|||||||
CreateChannel(channel *model.Channel) (*model.Channel, *model.AppError)
|
CreateChannel(channel *model.Channel) (*model.Channel, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.CreateChannel(args.A)
|
returns.A, returns.B = hook.CreateChannel(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API CreateChannel called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -633,6 +677,8 @@ func (s *APIRPCServer) DeleteChannel(args *DeleteChannelArgs, returns *DeleteCha
|
|||||||
DeleteChannel(channelId string) *model.AppError
|
DeleteChannel(channelId string) *model.AppError
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.DeleteChannel(args.A)
|
returns.A = hook.DeleteChannel(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API DeleteChannel called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -660,6 +706,8 @@ func (s *APIRPCServer) GetChannel(args *GetChannelArgs, returns *GetChannelRetur
|
|||||||
GetChannel(channelId string) (*model.Channel, *model.AppError)
|
GetChannel(channelId string) (*model.Channel, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetChannel(args.A)
|
returns.A, returns.B = hook.GetChannel(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetChannel called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -688,6 +736,8 @@ func (s *APIRPCServer) GetChannelByName(args *GetChannelByNameArgs, returns *Get
|
|||||||
GetChannelByName(name, teamId string) (*model.Channel, *model.AppError)
|
GetChannelByName(name, teamId string) (*model.Channel, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetChannelByName(args.A, args.B)
|
returns.A, returns.B = hook.GetChannelByName(args.A, args.B)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetChannelByName called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -716,6 +766,8 @@ func (s *APIRPCServer) GetDirectChannel(args *GetDirectChannelArgs, returns *Get
|
|||||||
GetDirectChannel(userId1, userId2 string) (*model.Channel, *model.AppError)
|
GetDirectChannel(userId1, userId2 string) (*model.Channel, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetDirectChannel(args.A, args.B)
|
returns.A, returns.B = hook.GetDirectChannel(args.A, args.B)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetDirectChannel called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -743,6 +795,8 @@ func (s *APIRPCServer) GetGroupChannel(args *GetGroupChannelArgs, returns *GetGr
|
|||||||
GetGroupChannel(userIds []string) (*model.Channel, *model.AppError)
|
GetGroupChannel(userIds []string) (*model.Channel, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetGroupChannel(args.A)
|
returns.A, returns.B = hook.GetGroupChannel(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetGroupChannel called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -770,6 +824,8 @@ func (s *APIRPCServer) UpdateChannel(args *UpdateChannelArgs, returns *UpdateCha
|
|||||||
UpdateChannel(channel *model.Channel) (*model.Channel, *model.AppError)
|
UpdateChannel(channel *model.Channel) (*model.Channel, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.UpdateChannel(args.A)
|
returns.A, returns.B = hook.UpdateChannel(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API UpdateChannel called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -798,6 +854,8 @@ func (s *APIRPCServer) AddChannelMember(args *AddChannelMemberArgs, returns *Add
|
|||||||
AddChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError)
|
AddChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.AddChannelMember(args.A, args.B)
|
returns.A, returns.B = hook.AddChannelMember(args.A, args.B)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API AddChannelMember called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -826,6 +884,8 @@ func (s *APIRPCServer) GetChannelMember(args *GetChannelMemberArgs, returns *Get
|
|||||||
GetChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError)
|
GetChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetChannelMember(args.A, args.B)
|
returns.A, returns.B = hook.GetChannelMember(args.A, args.B)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetChannelMember called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -855,6 +915,8 @@ func (s *APIRPCServer) UpdateChannelMemberRoles(args *UpdateChannelMemberRolesAr
|
|||||||
UpdateChannelMemberRoles(channelId, userId, newRoles string) (*model.ChannelMember, *model.AppError)
|
UpdateChannelMemberRoles(channelId, userId, newRoles string) (*model.ChannelMember, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.UpdateChannelMemberRoles(args.A, args.B, args.C)
|
returns.A, returns.B = hook.UpdateChannelMemberRoles(args.A, args.B, args.C)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API UpdateChannelMemberRoles called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -884,6 +946,8 @@ func (s *APIRPCServer) UpdateChannelMemberNotifications(args *UpdateChannelMembe
|
|||||||
UpdateChannelMemberNotifications(channelId, userId string, notifications map[string]string) (*model.ChannelMember, *model.AppError)
|
UpdateChannelMemberNotifications(channelId, userId string, notifications map[string]string) (*model.ChannelMember, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.UpdateChannelMemberNotifications(args.A, args.B, args.C)
|
returns.A, returns.B = hook.UpdateChannelMemberNotifications(args.A, args.B, args.C)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API UpdateChannelMemberNotifications called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -911,6 +975,8 @@ func (s *APIRPCServer) DeleteChannelMember(args *DeleteChannelMemberArgs, return
|
|||||||
DeleteChannelMember(channelId, userId string) *model.AppError
|
DeleteChannelMember(channelId, userId string) *model.AppError
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.DeleteChannelMember(args.A, args.B)
|
returns.A = hook.DeleteChannelMember(args.A, args.B)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API DeleteChannelMember called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -938,6 +1004,8 @@ func (s *APIRPCServer) CreatePost(args *CreatePostArgs, returns *CreatePostRetur
|
|||||||
CreatePost(post *model.Post) (*model.Post, *model.AppError)
|
CreatePost(post *model.Post) (*model.Post, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.CreatePost(args.A)
|
returns.A, returns.B = hook.CreatePost(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API CreatePost called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -964,6 +1032,8 @@ func (s *APIRPCServer) DeletePost(args *DeletePostArgs, returns *DeletePostRetur
|
|||||||
DeletePost(postId string) *model.AppError
|
DeletePost(postId string) *model.AppError
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.DeletePost(args.A)
|
returns.A = hook.DeletePost(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API DeletePost called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -991,6 +1061,8 @@ func (s *APIRPCServer) GetPost(args *GetPostArgs, returns *GetPostReturns) error
|
|||||||
GetPost(postId string) (*model.Post, *model.AppError)
|
GetPost(postId string) (*model.Post, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.GetPost(args.A)
|
returns.A, returns.B = hook.GetPost(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API GetPost called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -1018,6 +1090,8 @@ func (s *APIRPCServer) UpdatePost(args *UpdatePostArgs, returns *UpdatePostRetur
|
|||||||
UpdatePost(post *model.Post) (*model.Post, *model.AppError)
|
UpdatePost(post *model.Post) (*model.Post, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.UpdatePost(args.A)
|
returns.A, returns.B = hook.UpdatePost(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API UpdatePost called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -1045,6 +1119,8 @@ func (s *APIRPCServer) KVSet(args *KVSetArgs, returns *KVSetReturns) error {
|
|||||||
KVSet(key string, value []byte) *model.AppError
|
KVSet(key string, value []byte) *model.AppError
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.KVSet(args.A, args.B)
|
returns.A = hook.KVSet(args.A, args.B)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API KVSet called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -1072,6 +1148,8 @@ func (s *APIRPCServer) KVGet(args *KVGetArgs, returns *KVGetReturns) error {
|
|||||||
KVGet(key string) ([]byte, *model.AppError)
|
KVGet(key string) ([]byte, *model.AppError)
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A, returns.B = hook.KVGet(args.A)
|
returns.A, returns.B = hook.KVGet(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API KVGet called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -1098,6 +1176,8 @@ func (s *APIRPCServer) KVDelete(args *KVDeleteArgs, returns *KVDeleteReturns) er
|
|||||||
KVDelete(key string) *model.AppError
|
KVDelete(key string) *model.AppError
|
||||||
}); ok {
|
}); ok {
|
||||||
returns.A = hook.KVDelete(args.A)
|
returns.A = hook.KVDelete(args.A)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API KVDelete called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -1125,6 +1205,120 @@ func (s *APIRPCServer) PublishWebSocketEvent(args *PublishWebSocketEventArgs, re
|
|||||||
PublishWebSocketEvent(event string, payload map[string]interface{}, broadcast *model.WebsocketBroadcast)
|
PublishWebSocketEvent(event string, payload map[string]interface{}, broadcast *model.WebsocketBroadcast)
|
||||||
}); ok {
|
}); ok {
|
||||||
hook.PublishWebSocketEvent(args.A, args.B, args.C)
|
hook.PublishWebSocketEvent(args.A, args.B, args.C)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API PublishWebSocketEvent called but not implemented.")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type LogDebugArgs struct {
|
||||||
|
A string
|
||||||
|
B []interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type LogDebugReturns struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *APIRPCClient) LogDebug(msg string, keyValuePairs ...interface{}) {
|
||||||
|
_args := &LogDebugArgs{msg, keyValuePairs}
|
||||||
|
_returns := &LogDebugReturns{}
|
||||||
|
if err := g.client.Call("Plugin.LogDebug", _args, _returns); err != nil {
|
||||||
|
g.log.Error("RPC call to LogDebug API failed.", mlog.Err(err))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *APIRPCServer) LogDebug(args *LogDebugArgs, returns *LogDebugReturns) error {
|
||||||
|
if hook, ok := s.impl.(interface {
|
||||||
|
LogDebug(msg string, keyValuePairs ...interface{})
|
||||||
|
}); ok {
|
||||||
|
hook.LogDebug(args.A, args.B...)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API LogDebug called but not implemented.")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type LogInfoArgs struct {
|
||||||
|
A string
|
||||||
|
B []interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type LogInfoReturns struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *APIRPCClient) LogInfo(msg string, keyValuePairs ...interface{}) {
|
||||||
|
_args := &LogInfoArgs{msg, keyValuePairs}
|
||||||
|
_returns := &LogInfoReturns{}
|
||||||
|
if err := g.client.Call("Plugin.LogInfo", _args, _returns); err != nil {
|
||||||
|
g.log.Error("RPC call to LogInfo API failed.", mlog.Err(err))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *APIRPCServer) LogInfo(args *LogInfoArgs, returns *LogInfoReturns) error {
|
||||||
|
if hook, ok := s.impl.(interface {
|
||||||
|
LogInfo(msg string, keyValuePairs ...interface{})
|
||||||
|
}); ok {
|
||||||
|
hook.LogInfo(args.A, args.B...)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API LogInfo called but not implemented.")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type LogErrorArgs struct {
|
||||||
|
A string
|
||||||
|
B []interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type LogErrorReturns struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *APIRPCClient) LogError(msg string, keyValuePairs ...interface{}) {
|
||||||
|
_args := &LogErrorArgs{msg, keyValuePairs}
|
||||||
|
_returns := &LogErrorReturns{}
|
||||||
|
if err := g.client.Call("Plugin.LogError", _args, _returns); err != nil {
|
||||||
|
g.log.Error("RPC call to LogError API failed.", mlog.Err(err))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *APIRPCServer) LogError(args *LogErrorArgs, returns *LogErrorReturns) error {
|
||||||
|
if hook, ok := s.impl.(interface {
|
||||||
|
LogError(msg string, keyValuePairs ...interface{})
|
||||||
|
}); ok {
|
||||||
|
hook.LogError(args.A, args.B...)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API LogError called but not implemented.")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type LogWarnArgs struct {
|
||||||
|
A string
|
||||||
|
B []interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type LogWarnReturns struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *APIRPCClient) LogWarn(msg string, keyValuePairs ...interface{}) {
|
||||||
|
_args := &LogWarnArgs{msg, keyValuePairs}
|
||||||
|
_returns := &LogWarnReturns{}
|
||||||
|
if err := g.client.Call("Plugin.LogWarn", _args, _returns); err != nil {
|
||||||
|
g.log.Error("RPC call to LogWarn API failed.", mlog.Err(err))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *APIRPCServer) LogWarn(args *LogWarnArgs, returns *LogWarnReturns) error {
|
||||||
|
if hook, ok := s.impl.(interface {
|
||||||
|
LogWarn(msg string, keyValuePairs ...interface{})
|
||||||
|
}); ok {
|
||||||
|
hook.LogWarn(args.A, args.B...)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API LogWarn called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ package plugin
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/go-hclog"
|
"github.com/hashicorp/go-hclog"
|
||||||
"github.com/mattermost/mattermost-server/mlog"
|
"github.com/mattermost/mattermost-server/mlog"
|
||||||
@@ -17,23 +18,48 @@ type HclogAdapter struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (h *HclogAdapter) Trace(msg string, args ...interface{}) {
|
func (h *HclogAdapter) Trace(msg string, args ...interface{}) {
|
||||||
h.wrappedLogger.Debug(msg, mlog.String(h.extrasKey, fmt.Sprintln(args...)))
|
extras := strings.TrimSpace(fmt.Sprint(args...))
|
||||||
|
if extras != "" {
|
||||||
|
h.wrappedLogger.Debug(msg, mlog.String(h.extrasKey, extras))
|
||||||
|
} else {
|
||||||
|
h.wrappedLogger.Debug(msg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HclogAdapter) Debug(msg string, args ...interface{}) {
|
func (h *HclogAdapter) Debug(msg string, args ...interface{}) {
|
||||||
h.wrappedLogger.Debug(msg, mlog.String(h.extrasKey, fmt.Sprintln(args...)))
|
extras := strings.TrimSpace(fmt.Sprint(args...))
|
||||||
|
if extras != "" {
|
||||||
|
h.wrappedLogger.Debug(msg, mlog.String(h.extrasKey, extras))
|
||||||
|
} else {
|
||||||
|
h.wrappedLogger.Debug(msg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HclogAdapter) Info(msg string, args ...interface{}) {
|
func (h *HclogAdapter) Info(msg string, args ...interface{}) {
|
||||||
h.wrappedLogger.Info(msg, mlog.String(h.extrasKey, fmt.Sprintln(args...)))
|
extras := strings.TrimSpace(fmt.Sprint(args...))
|
||||||
|
if extras != "" {
|
||||||
|
h.wrappedLogger.Info(msg, mlog.String(h.extrasKey, extras))
|
||||||
|
} else {
|
||||||
|
h.wrappedLogger.Info(msg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HclogAdapter) Warn(msg string, args ...interface{}) {
|
func (h *HclogAdapter) Warn(msg string, args ...interface{}) {
|
||||||
h.wrappedLogger.Warn(msg, mlog.String(h.extrasKey, fmt.Sprintln(args...)))
|
extras := strings.TrimSpace(fmt.Sprint(args...))
|
||||||
|
if extras != "" {
|
||||||
|
h.wrappedLogger.Warn(msg, mlog.String(h.extrasKey, extras))
|
||||||
|
} else {
|
||||||
|
h.wrappedLogger.Warn(msg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HclogAdapter) Error(msg string, args ...interface{}) {
|
func (h *HclogAdapter) Error(msg string, args ...interface{}) {
|
||||||
h.wrappedLogger.Error(msg, mlog.String(h.extrasKey, fmt.Sprintln(args...)))
|
extras := strings.TrimSpace(fmt.Sprint(args...))
|
||||||
|
if extras != "" {
|
||||||
|
h.wrappedLogger.Error(msg, mlog.String(h.extrasKey, extras))
|
||||||
|
} else {
|
||||||
|
h.wrappedLogger.Error(msg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HclogAdapter) IsTrace() bool {
|
func (h *HclogAdapter) IsTrace() bool {
|
||||||
|
|||||||
@@ -76,12 +76,22 @@ func FieldListDestruct(structPrefix string, fieldList *ast.FieldList, fileset *t
|
|||||||
}
|
}
|
||||||
nextLetter := 'A'
|
nextLetter := 'A'
|
||||||
for _, field := range fieldList.List {
|
for _, field := range fieldList.List {
|
||||||
|
typeNameBuffer := &bytes.Buffer{}
|
||||||
|
err := printer.Fprint(typeNameBuffer, fileset, field.Type)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
typeName := typeNameBuffer.String()
|
||||||
|
suffix := ""
|
||||||
|
if strings.HasPrefix(typeName, "...") {
|
||||||
|
suffix = "..."
|
||||||
|
}
|
||||||
if len(field.Names) == 0 {
|
if len(field.Names) == 0 {
|
||||||
result = append(result, structPrefix+string(nextLetter))
|
result = append(result, structPrefix+string(nextLetter)+suffix)
|
||||||
nextLetter += 1
|
nextLetter += 1
|
||||||
} else {
|
} else {
|
||||||
for range field.Names {
|
for range field.Names {
|
||||||
result = append(result, structPrefix+string(nextLetter))
|
result = append(result, structPrefix+string(nextLetter)+suffix)
|
||||||
nextLetter += 1
|
nextLetter += 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,6 +113,9 @@ func FieldListToStructList(fieldList *ast.FieldList, fileset *token.FileSet) str
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
typeName := typeNameBuffer.String()
|
typeName := typeNameBuffer.String()
|
||||||
|
if strings.HasPrefix(typeName, "...") {
|
||||||
|
typeName = strings.Replace(typeName, "...", "[]", 1)
|
||||||
|
}
|
||||||
if len(field.Names) == 0 {
|
if len(field.Names) == 0 {
|
||||||
result = append(result, string(nextLetter)+" "+typeName)
|
result = append(result, string(nextLetter)+" "+typeName)
|
||||||
nextLetter += 1
|
nextLetter += 1
|
||||||
@@ -224,6 +237,8 @@ func (s *HooksRPCServer) {{.Name}}(args *{{.Name}}Args, returns *{{.Name}}Return
|
|||||||
{{.Name}}{{funcStyle .Params}} {{funcStyle .Return}}
|
{{.Name}}{{funcStyle .Params}} {{funcStyle .Return}}
|
||||||
}); ok {
|
}); ok {
|
||||||
{{if .Return}}{{destruct "returns." .Return}} = {{end}}hook.{{.Name}}({{destruct "args." .Params}})
|
{{if .Return}}{{destruct "returns." .Return}} = {{end}}hook.{{.Name}}({{destruct "args." .Params}})
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("Hook {{.Name}} called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -253,6 +268,8 @@ func (s *APIRPCServer) {{.Name}}(args *{{.Name}}Args, returns *{{.Name}}Returns)
|
|||||||
{{.Name}}{{funcStyle .Params}} {{funcStyle .Return}}
|
{{.Name}}{{funcStyle .Params}} {{funcStyle .Return}}
|
||||||
}); ok {
|
}); ok {
|
||||||
{{if .Return}}{{destruct "returns." .Return}} = {{end}}hook.{{.Name}}({{destruct "args." .Params}})
|
{{if .Return}}{{destruct "returns." .Return}} = {{end}}hook.{{.Name}}({{destruct "args." .Params}})
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("API {{.Name}} called but not implemented.")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Code generated by mockery v1.0.0
|
// Code generated by mockery v1.0.0. DO NOT EDIT.
|
||||||
|
|
||||||
// Regenerate this file using `make plugin-mocks`.
|
// Regenerate this file using `make plugin-mocks`.
|
||||||
|
|
||||||
@@ -563,6 +563,38 @@ func (_m *API) LoadPluginConfiguration(dest interface{}) error {
|
|||||||
return r0
|
return r0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LogDebug provides a mock function with given fields: msg, keyValuePairs
|
||||||
|
func (_m *API) LogDebug(msg string, keyValuePairs ...interface{}) {
|
||||||
|
var _ca []interface{}
|
||||||
|
_ca = append(_ca, msg)
|
||||||
|
_ca = append(_ca, keyValuePairs...)
|
||||||
|
_m.Called(_ca...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LogError provides a mock function with given fields: msg, keyValuePairs
|
||||||
|
func (_m *API) LogError(msg string, keyValuePairs ...interface{}) {
|
||||||
|
var _ca []interface{}
|
||||||
|
_ca = append(_ca, msg)
|
||||||
|
_ca = append(_ca, keyValuePairs...)
|
||||||
|
_m.Called(_ca...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LogInfo provides a mock function with given fields: msg, keyValuePairs
|
||||||
|
func (_m *API) LogInfo(msg string, keyValuePairs ...interface{}) {
|
||||||
|
var _ca []interface{}
|
||||||
|
_ca = append(_ca, msg)
|
||||||
|
_ca = append(_ca, keyValuePairs...)
|
||||||
|
_m.Called(_ca...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LogWarn provides a mock function with given fields: msg, keyValuePairs
|
||||||
|
func (_m *API) LogWarn(msg string, keyValuePairs ...interface{}) {
|
||||||
|
var _ca []interface{}
|
||||||
|
_ca = append(_ca, msg)
|
||||||
|
_ca = append(_ca, keyValuePairs...)
|
||||||
|
_m.Called(_ca...)
|
||||||
|
}
|
||||||
|
|
||||||
// PublishWebSocketEvent provides a mock function with given fields: event, payload, broadcast
|
// PublishWebSocketEvent provides a mock function with given fields: event, payload, broadcast
|
||||||
func (_m *API) PublishWebSocketEvent(event string, payload map[string]interface{}, broadcast *model.WebsocketBroadcast) {
|
func (_m *API) PublishWebSocketEvent(event string, payload map[string]interface{}, broadcast *model.WebsocketBroadcast) {
|
||||||
_m.Called(event, payload, broadcast)
|
_m.Called(event, payload, broadcast)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Code generated by mockery v1.0.0
|
// Code generated by mockery v1.0.0. DO NOT EDIT.
|
||||||
|
|
||||||
// Regenerate this file using `make plugin-mocks`.
|
// Regenerate this file using `make plugin-mocks`.
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ package plugin
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -29,7 +28,7 @@ func NewSupervisor(pluginInfo *model.BundleInfo, parentLogger *mlog.Logger, apiI
|
|||||||
wrappedLogger := pluginInfo.WrapLogger(parentLogger)
|
wrappedLogger := pluginInfo.WrapLogger(parentLogger)
|
||||||
|
|
||||||
hclogAdaptedLogger := &HclogAdapter{
|
hclogAdaptedLogger := &HclogAdapter{
|
||||||
wrappedLogger: wrappedLogger,
|
wrappedLogger: wrappedLogger.WithCallerSkip(1),
|
||||||
extrasKey: "wrapped_extras",
|
extrasKey: "wrapped_extras",
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,8 +49,8 @@ func NewSupervisor(pluginInfo *model.BundleInfo, parentLogger *mlog.Logger, apiI
|
|||||||
HandshakeConfig: Handshake,
|
HandshakeConfig: Handshake,
|
||||||
Plugins: pluginMap,
|
Plugins: pluginMap,
|
||||||
Cmd: exec.Command(executable),
|
Cmd: exec.Command(executable),
|
||||||
SyncStdout: os.Stdout,
|
SyncStdout: wrappedLogger.With(mlog.String("source", "plugin_stdout")).StdLogWriter(),
|
||||||
SyncStderr: os.Stdout,
|
SyncStderr: wrappedLogger.With(mlog.String("source", "plugin_stderr")).StdLogWriter(),
|
||||||
Logger: hclogAdaptedLogger,
|
Logger: hclogAdaptedLogger,
|
||||||
StartTimeout: time.Second * 3,
|
StartTimeout: time.Second * 3,
|
||||||
})
|
})
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user