mirror of
https://github.com/grafana/grafana.git
synced 2025-07-30 14:32:15 +08:00
cli: chmod 755 for backend plugin binaries
Fixes #15500. Does a simple filename check if the binary names ends with _linux_amd64 or _darwin_amd64 then sets the file mode to 755.
This commit is contained in:
@ -57,6 +57,8 @@ func installCommand(c CommandLine) error {
|
|||||||
return InstallPlugin(pluginToInstall, version, c)
|
return InstallPlugin(pluginToInstall, version, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InstallPlugin downloads the plugin code as a zip file from the Grafana.com API
|
||||||
|
// and then extracts the zip into the plugins directory.
|
||||||
func InstallPlugin(pluginName, version string, c CommandLine) error {
|
func InstallPlugin(pluginName, version string, c CommandLine) error {
|
||||||
pluginFolder := c.PluginDirectory()
|
pluginFolder := c.PluginDirectory()
|
||||||
downloadURL := c.PluginURL()
|
downloadURL := c.PluginURL()
|
||||||
@ -152,6 +154,10 @@ func downloadFile(pluginName, filePath, url string) (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return extractFiles(body, pluginName, filePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func extractFiles(body []byte, pluginName string, filePath string) error {
|
||||||
r, err := zip.NewReader(bytes.NewReader(body), int64(len(body)))
|
r, err := zip.NewReader(bytes.NewReader(body), int64(len(body)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -161,12 +167,18 @@ func downloadFile(pluginName, filePath, url string) (err error) {
|
|||||||
|
|
||||||
if zf.FileInfo().IsDir() {
|
if zf.FileInfo().IsDir() {
|
||||||
err := os.Mkdir(newFile, 0777)
|
err := os.Mkdir(newFile, 0777)
|
||||||
if PermissionsError(err) {
|
if permissionsError(err) {
|
||||||
return fmt.Errorf(permissionsDeniedMessage, newFile)
|
return fmt.Errorf(permissionsDeniedMessage, newFile)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dst, err := os.Create(newFile)
|
fileMode := zf.Mode()
|
||||||
if PermissionsError(err) {
|
|
||||||
|
if strings.HasSuffix(newFile, "_linux_amd64") || strings.HasSuffix(newFile, "_darwin_amd64") {
|
||||||
|
fileMode = os.FileMode(0755)
|
||||||
|
}
|
||||||
|
|
||||||
|
dst, err := os.OpenFile(newFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, fileMode)
|
||||||
|
if permissionsError(err) {
|
||||||
return fmt.Errorf(permissionsDeniedMessage, newFile)
|
return fmt.Errorf(permissionsDeniedMessage, newFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,6 +196,6 @@ func downloadFile(pluginName, filePath, url string) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func PermissionsError(err error) bool {
|
func permissionsError(err error) bool {
|
||||||
return err != nil && strings.Contains(err.Error(), "permission denied")
|
return err != nil && strings.Contains(err.Error(), "permission denied")
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package commands
|
package commands
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
. "github.com/smartystreets/goconvey/convey"
|
. "github.com/smartystreets/goconvey/convey"
|
||||||
@ -37,3 +39,42 @@ func TestFoldernameReplacement(t *testing.T) {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestExtractFiles(t *testing.T) {
|
||||||
|
Convey("Should preserve file permissions for plugin backend binaries for linux and darwin", t, func() {
|
||||||
|
err := os.RemoveAll("testdata/fake-plugins-dir")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
err = os.MkdirAll("testdata/fake-plugins-dir", 0774)
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
body, err := ioutil.ReadFile("testdata/grafana-simple-json-datasource-ec18fa4da8096a952608a7e4c7782b4260b41bcf.zip")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
err = extractFiles(body, "grafana-simple-json-datasource", "testdata/fake-plugins-dir")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
|
//File in zip has permissions 777
|
||||||
|
fileInfo, err := os.Stat("testdata/fake-plugins-dir/grafana-simple-json-datasource/simple-plugin_darwin_amd64")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
So(fileInfo.Mode().String(), ShouldEqual, "-rwxr-xr-x")
|
||||||
|
|
||||||
|
//File in zip has permission 664
|
||||||
|
fileInfo, err = os.Stat("testdata/fake-plugins-dir/grafana-simple-json-datasource/simple-plugin_linux_amd64")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
So(fileInfo.Mode().String(), ShouldEqual, "-rwxr-xr-x")
|
||||||
|
|
||||||
|
//File in zip has permission 644
|
||||||
|
fileInfo, err = os.Stat("testdata/fake-plugins-dir/grafana-simple-json-datasource/simple-plugin_windows_amd64.exe")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
So(fileInfo.Mode().String(), ShouldEqual, "-rw-r--r--")
|
||||||
|
|
||||||
|
//File in zip has permission 755
|
||||||
|
fileInfo, err = os.Stat("testdata/fake-plugins-dir/grafana-simple-json-datasource/non-plugin-binary")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
So(fileInfo.Mode().String(), ShouldEqual, "-rwxr-xr-x")
|
||||||
|
|
||||||
|
err = os.RemoveAll("testdata/fake-plugins-dir")
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Binary file not shown.
Reference in New Issue
Block a user