agent/pluginmanager/shim.go (79 lines of code) (raw):
package pluginmanager
import (
"bytes"
"strconv"
"github.com/aliyun/aliyun_assist_client/thirdparty/sirupsen/logrus"
"github.com/aliyun/aliyun_assist_client/agent/metrics"
"github.com/aliyun/aliyun_assist_client/agent/pluginmodel"
)
type shimLocalPlugin struct {
pi *PluginInfo
}
type ShimManager struct {}
func (lp *shimLocalPlugin) Name() string {
return lp.pi.Name
}
func (lp *shimLocalPlugin) Version() string {
return lp.pi.Version
}
func (*ShimManager) FindUpgradable(logger logrus.FieldLogger) ([]pluginmodel.LocalPlugin, error) {
recordeds, err := _findAllInstalledPlugins()
if err != nil {
logger.WithError(err).Error("pluginUpdateCheck fail: loadPlugins fail")
return nil, err
}
if len(recordeds) == 0 {
logger.Info("pluginUpdateCheck cancel: there is no plugins")
return nil, nil
}
upgradables := make([]pluginmodel.LocalPlugin, 0, len(recordeds))
for _, pluginInfo := range recordeds {
if (pluginInfo.PluginType() == PLUGIN_PERSIST || pluginInfo.PluginType() == PLUGIN_COMMANDER) && !pluginInfo.IsRemoved {
func(pi PluginInfo){
upgradables = append(upgradables, &shimLocalPlugin{
pi: &pi,
})
}(pluginInfo)
}
}
return upgradables, nil
}
func (*ShimManager) Update(logger logrus.FieldLogger, target pluginmodel.RemotePlugin) error {
handler := getUpdateHandler()
if handler != nil && handler(target.Name(), target.Version()) {
return nil
}
command := "acs-plugin-manager"
arguments := []string{"--exec", "-P", target.Name(), "-n", target.Version(), "-p", "--upgrade"}
mixedOutput := bytes.Buffer{}
exitCode, status, err := syncRunKillGroup("", command, arguments, &mixedOutput, &mixedOutput, target.TimeoutSecs()+5)
output := mixedOutput.String()
if len(output) > 1024 {
output = output[:1024]
}
errMsg := ""
if err != nil {
errMsg = err.Error()
}
metrics.GetPluginUpdateEvent(
"name", target.Name(),
"version", target.Version(),
"exitCode", strconv.Itoa(exitCode),
"status", strconv.Itoa(status),
"errMsg", errMsg,
"output", output,
).ReportEvent()
updatedLogger := logger.WithFields(logrus.Fields{
"name": target.Name(),
"version": target.Version(),
"exitcode": exitCode,
"status": status,
"output": output,
})
if err != nil {
updatedLogger.WithError(err).Errorf("pluginUpdateCheck: failed to update plugin")
} else {
updatedLogger.Info("pluginUpdateCheck: plugin updated successfully")
}
return nil
}