mirror of https://github.com/statping/statping
				
				
				
			
		
			
				
	
	
		
			116 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
| // Statping
 | |
| // Copyright (C) 2018.  Hunter Long and the project contributors
 | |
| // Written by Hunter Long <info@socialeck.com> and the project contributors
 | |
| //
 | |
| // https://github.com/hunterlong/statping
 | |
| //
 | |
| // The licenses for most software and other practical works are designed
 | |
| // to take away your freedom to share and change the works.  By contrast,
 | |
| // the GNU General Public License is intended to guarantee your freedom to
 | |
| // share and change all versions of a program--to make sure it remains free
 | |
| // software for all its users.
 | |
| //
 | |
| // You should have received a copy of the GNU General Public License
 | |
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
| package plugin
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"github.com/hunterlong/statping/core"
 | |
| 	"github.com/hunterlong/statping/types"
 | |
| 	"github.com/hunterlong/statping/utils"
 | |
| 	"io/ioutil"
 | |
| 	"os"
 | |
| 	"plugin"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| //
 | |
| //     STATPING PLUGIN INTERFACE
 | |
| //
 | |
| //            v0.1
 | |
| //
 | |
| //       https://statping.com
 | |
| //
 | |
| //
 | |
| // An expandable plugin framework that will still
 | |
| // work even if there's an update or addition.
 | |
| //
 | |
| 
 | |
| var (
 | |
| 	AllPlugins []*types.PluginObject
 | |
| 	dir        string
 | |
| )
 | |
| 
 | |
| func init() {
 | |
| 	utils.InitLogs()
 | |
| 	dir = utils.Directory
 | |
| }
 | |
| 
 | |
| func LoadPlugin(file string) error {
 | |
| 	utils.Log(1, fmt.Sprintf("opening file %v", file))
 | |
| 	f, err := os.Open(file)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	fSplit := strings.Split(f.Name(), "/")
 | |
| 	fileBin := fSplit[len(fSplit)-1]
 | |
| 
 | |
| 	utils.Log(1, fmt.Sprintf("Attempting to load plugin '%v'", fileBin))
 | |
| 	ext := strings.Split(fileBin, ".")
 | |
| 	if len(ext) != 2 {
 | |
| 		utils.Log(3, fmt.Sprintf("Plugin '%v' must end in .so extension", fileBin))
 | |
| 		return fmt.Errorf("Plugin '%v' must end in .so extension %v", fileBin, len(ext))
 | |
| 	}
 | |
| 	if ext[1] != "so" {
 | |
| 		utils.Log(3, fmt.Sprintf("Plugin '%v' must end in .so extension", fileBin))
 | |
| 		return fmt.Errorf("Plugin '%v' must end in .so extension", fileBin)
 | |
| 	}
 | |
| 	plug, err := plugin.Open(file)
 | |
| 	if err != nil {
 | |
| 		utils.Log(3, fmt.Sprintf("Plugin '%v' could not load correctly. %v", fileBin, err))
 | |
| 		return err
 | |
| 	}
 | |
| 	symPlugin, err := plug.Lookup("Plugin")
 | |
| 	if err != nil {
 | |
| 		utils.Log(3, fmt.Sprintf("Plugin '%v' could not locate Plugin variable. %v", fileBin, err))
 | |
| 		return err
 | |
| 	}
 | |
| 	plugActions, ok := symPlugin.(types.PluginActions)
 | |
| 	if !ok {
 | |
| 		utils.Log(3, fmt.Sprintf("Plugin %v was not type PluginObject", f.Name()))
 | |
| 		return fmt.Errorf("Plugin %v was not type PluginActions %v", f.Name(), plugActions.GetInfo())
 | |
| 	}
 | |
| 	info := plugActions.GetInfo()
 | |
| 	err = plugActions.OnLoad()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	utils.Log(1, fmt.Sprintf("Plugin %v loaded from %v", info.Name, f.Name()))
 | |
| 	core.CoreApp.AllPlugins = append(core.CoreApp.AllPlugins, plugActions)
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func LoadPlugins() {
 | |
| 	pluginDir := dir + "/plugins"
 | |
| 	utils.Log(1, fmt.Sprintf("Loading any available Plugins from /plugins directory"))
 | |
| 	if _, err := os.Stat(pluginDir); os.IsNotExist(err) {
 | |
| 		os.Mkdir(pluginDir, os.ModePerm)
 | |
| 	}
 | |
| 	files, err := ioutil.ReadDir(pluginDir)
 | |
| 	if err != nil {
 | |
| 		utils.Log(2, fmt.Sprintf("Plugins directory was not found. Error: %v", err))
 | |
| 		return
 | |
| 	}
 | |
| 	for _, f := range files {
 | |
| 		err := LoadPlugin(f.Name())
 | |
| 		if err != nil {
 | |
| 			utils.Log(3, err)
 | |
| 			continue
 | |
| 		}
 | |
| 	}
 | |
| 	utils.Log(1, fmt.Sprintf("Loaded %v Plugins", len(core.CoreApp.Plugins)))
 | |
| }
 |