agent/checknet/path.go (79 lines of code) (raw):
package checknet
import (
"fmt"
"os"
"path/filepath"
"sync"
"github.com/aliyun/aliyun_assist_client/agent/log"
"github.com/aliyun/aliyun_assist_client/agent/pluginmanager"
"github.com/aliyun/aliyun_assist_client/agent/pluginmanager/acspluginmanager"
"github.com/aliyun/aliyun_assist_client/agent/util/versionutil"
"github.com/aliyun/aliyun_assist_client/common/fileutil"
"github.com/aliyun/aliyun_assist_client/common/pathutil"
"github.com/aliyun/aliyun_assist_client/thirdparty/sirupsen/logrus"
)
const (
defaultCommanderName = "ACS-ECS-SysInfoGatherer"
)
var (
_netcheckPath string
_netcheckPathLock sync.Mutex
)
// initNetcheckPath detects whether netcheck program is bundled within current
// agent release version
func initNetcheckPath() error {
logger := log.GetLogger().WithFields(logrus.Fields{
"module": "checknet",
})
pluginDir, err := pathutil.GetPluginPath()
if err != nil {
_netcheckPath = ""
return err
}
preInstalledPluginDir, err := pathutil.GetPreInstalledPluginPath()
if err != nil {
_netcheckPath = ""
return err
}
var currentVersionNetcheckPath string
installedPlugin, err1 := acspluginmanager.QueryPluginFromLocal(defaultCommanderName, pluginmanager.PLUGIN_COMMANDER)
preInstalledPlugin, err2 := acspluginmanager.QueryPluginFromLocalPreInstalled(defaultCommanderName, pluginmanager.PLUGIN_COMMANDER)
if err1 != nil && err2 != nil {
logger.Errorf("query installed plugin failed:%v; query pre-installed plugin failed:%v", err1, err2)
return fmt.Errorf("query installed plugin failed:%v; query pre-installed plugin failed:%v", err1, err2)
} else if err1 != nil {
logger.WithError(err1).Errorln("Failed to query installed plugin, use pre-installed plugin")
currentVersionNetcheckPath = filepath.Join(preInstalledPluginDir, defaultCommanderName, preInstalledPlugin.Version, preInstalledPlugin.RunPath)
} else if err2 != nil {
logger.WithError(err2).Errorln("Failed to query pre-installed plugin, use installed plugin")
currentVersionNetcheckPath = filepath.Join(pluginDir, defaultCommanderName, installedPlugin.Version, installedPlugin.RunPath)
} else {
// compare version
if versionutil.CompareVersion(installedPlugin.Version, preInstalledPlugin.Version) > 0 {
logger.Infoln("Use installed plugin")
currentVersionNetcheckPath = filepath.Join(pluginDir, defaultCommanderName, installedPlugin.Version, installedPlugin.RunPath)
} else {
logger.Infoln("Use pre-installed plugin")
currentVersionNetcheckPath = filepath.Join(preInstalledPluginDir, defaultCommanderName, preInstalledPlugin.Version, preInstalledPlugin.RunPath)
}
}
if !fileutil.CheckFileIsExist(currentVersionNetcheckPath) {
_netcheckPath = ""
logger.Errorf("Netcheck executable not found at %s", currentVersionNetcheckPath)
return fmt.Errorf("Netcheck executable not found at %s", currentVersionNetcheckPath)
}
if !fileutil.CheckFileIsExecutable(currentVersionNetcheckPath) {
os.Chmod(currentVersionNetcheckPath, os.FileMode(0o744))
}
_netcheckPath = currentVersionNetcheckPath
return nil
}
func getNetcheckPath() string {
_netcheckPathLock.Lock()
defer _netcheckPathLock.Unlock()
if _netcheckPath == "" || !fileutil.CheckFileIsExist(_netcheckPath) {
if err := initNetcheckPath(); err != nil {
log.GetLogger().WithFields(logrus.Fields{
"module": "checknet",
}).WithError(err).Errorln("Failed to detect netcheck executable path")
}
}
return _netcheckPath
}