Commit 600bbf7e by Daniel Lee Committed by GitHub

Merge pull request #15502 from grafana/15500-cli

cli: chmod 755 for backend plugin binaries
parents 2afd3cf5 56c965e5
...@@ -57,6 +57,8 @@ func installCommand(c CommandLine) error { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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")
} }
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) { ...@@ -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)
})
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment