From c2ccaff8ab1d0580e24ce40e31f39a99164ba7a8 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 10 Dec 2024 14:03:02 -0500 Subject: [PATCH] Progress on plugin loading --- cmd/stepd/main.go | 62 ++++++++++++++++++++++++++++++++--------------- environment.go | 2 +- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/cmd/stepd/main.go b/cmd/stepd/main.go index 240e893..4708fe6 100644 --- a/cmd/stepd/main.go +++ b/cmd/stepd/main.go @@ -41,6 +41,9 @@ func main () { flagDirectories := cli.NewFlag ( 'd', "directories", "Serve the contents of directories.") + flagUnsafePlugins := cli.NewFlag ( + 0, "unsafe-plugins", + "Load plugins not owned by the root user.") cmd := cli.New ( "Run an HTTP server that automaticaly executes STEP files.", flagPidFile, @@ -48,10 +51,24 @@ func main () { flagHTTPErrorDocument, flagHTTPDirectoryDocument, flagDirectories, + flagUnsafePlugins, cli.NewHelp()) cmd.Syntax = "[OPTIONS]... [DIRECTORY]" cmd.ParseOrExit(os.Args) - + + // get env variables + pluginPath := filepath.SplitList(os.Getenv("STEP_PLUGIN_PATH")) + if len(pluginPath) == 0 { + pluginPath = []string { + "/usr/lib/step/plugins", + "/usr/local/lib/step/plugins", + } + } + for index, pat := range pluginPath { + pluginPath[index], _ = filepath.Abs(pat) + } + + // log header for telling apart separate program runs log.Println(`==========| STEP |===========`) log.Println(`Scriptable Template Processor`) log.Println(`... initializing`) @@ -115,21 +132,21 @@ func main () { err := environment.Init(context.Background()) if err != nil { log.Fatal(err) } - // TODO: load plugins - pluginPath := os.Getenv("STEP_PLUGIN_PATH") - if pluginPath == "" { - pluginPath = "/usr/lib/step/plugins:/usr/local/lib/step/plugins" - } - for _, pat := range filepath.SplitList(pluginPath) { + // load plugins + for _, pat := range pluginPath { entries, err := os.ReadDir(pat) if err != nil { continue } for _, entry := range entries { pluginPath := filepath.Join(pat, entry.Name()) - _, err := environment.LoadProviderPlugin(pat) + ext := filepath.Ext(pluginPath) + if ext != ".so" { continue } + if flagUnsafePlugins.Value == "true" { + _, err = environment.LoadProviderPluginUnsafe(pluginPath) + } else { + _, err = environment.LoadProviderPlugin(pluginPath) + } if err != nil { - log.Printf ( - "!!! could not load plugin %s: %v", - pluginPath, err) + log.Println("!!!", err) } } } @@ -197,6 +214,18 @@ func (this *httpServerRoutine) Run (ctx context.Context) error { func logProviders (providers []step.Provider) { output := "providers: " x := utf8.RuneCountInString(output) + first := true + line := func () { + if output == "" { return } + if first { + first = false + log.Println("(i)", output) + } else { + log.Println(" ", output) + } + output = "" + x = 0 + } for index, provider := range providers { packag := provider.Package() if index != len(providers) - 1 { @@ -204,16 +233,11 @@ func logProviders (providers []step.Provider) { x += 2 } packageLen := utf8.RuneCountInString(packag) - if x + packageLen >= 60 && output != "" { - log.Println("(i)", output) - output = "" - x = 2 - continue + if x + packageLen >= 60 { + line() } output += packag x += packageLen } - if output != "" { - log.Println("(i)", output) - } + line() } diff --git a/environment.go b/environment.go index 356138b..670d724 100644 --- a/environment.go +++ b/environment.go @@ -129,7 +129,7 @@ func (this *Environment) LoadProviderPluginUnsafe (name string) (Provider, error func (this *Environment) loadProviderPlugin (name string, checkRoot bool) (Provider, error) { plugin, err := this.loadPlugin(name, checkRoot) if err != nil { return nil, err } - providerSymbol, err := plugin.Lookup("Provider") + providerSymbol, err := plugin.Lookup("NewProvider") if err != nil { return nil, err } providerFactory, ok := providerSymbol.(func () Provider) if !ok { return nil, ErrPluginBadSymbol }