veyron/services/mgmt/device/impl: share packages across instances
Instead of making a fresh copy of all package dirs and files for each new
instance, only create them once in the version directory, and add a symlink from
each instance.
To make this work in multi-user mode, change the permissions for the created
package dirs and files to 755.
Change-Id: I28ac21f69ade980824349b1aa435bf19baac51f7
diff --git a/services/mgmt/lib/packages/packages.go b/services/mgmt/lib/packages/packages.go
index 2b42ade..9f3accf 100644
--- a/services/mgmt/lib/packages/packages.go
+++ b/services/mgmt/lib/packages/packages.go
@@ -17,7 +17,10 @@
"v.io/v23/services/mgmt/repository"
)
-const defaultType = "application/octet-stream"
+const (
+ defaultType = "application/octet-stream"
+ createFileMode = 0755
+)
var typemap = map[string]repository.MediaInfo{
".zip": repository.MediaInfo{Type: "application/zip"},
@@ -153,7 +156,7 @@
}
func extractZip(zipFile, installDir string) error {
- if err := os.Mkdir(installDir, os.FileMode(0700)); err != nil {
+ if err := os.Mkdir(installDir, os.FileMode(createFileMode)); err != nil {
return fmt.Errorf("os.Mkdir(%q) failed: %v", installDir, err)
}
zr, err := zip.OpenReader(zipFile)
@@ -167,7 +170,7 @@
return fmt.Errorf("failed to extract file %q outside of install directory", file.Name)
}
if fi.IsDir() {
- if err := os.MkdirAll(name, os.FileMode(fi.Mode()&0700)); err != nil && !os.IsExist(err) {
+ if err := os.MkdirAll(name, os.FileMode(fi.Mode()&createFileMode)); err != nil && !os.IsExist(err) {
return err
}
continue
@@ -177,10 +180,10 @@
return err
}
parentName := filepath.Dir(name)
- if err := os.MkdirAll(parentName, os.FileMode(0700)); err != nil {
+ if err := os.MkdirAll(parentName, os.FileMode(createFileMode)); err != nil {
return err
}
- out, err := os.OpenFile(name, os.O_CREATE|os.O_WRONLY, os.FileMode(fi.Mode()&0700))
+ out, err := os.OpenFile(name, os.O_CREATE|os.O_WRONLY, os.FileMode(fi.Mode()&createFileMode))
if err != nil {
in.Close()
return err
@@ -199,7 +202,7 @@
}
func extractTar(pkgFile string, encoding string, installDir string) error {
- if err := os.Mkdir(installDir, os.FileMode(0700)); err != nil {
+ if err := os.Mkdir(installDir, os.FileMode(createFileMode)); err != nil {
return fmt.Errorf("os.Mkdir(%q) failed: %v", installDir, err)
}
f, err := os.Open(pkgFile)
@@ -238,7 +241,7 @@
}
// Regular file
if hdr.Typeflag == tar.TypeReg {
- out, err := os.OpenFile(name, os.O_CREATE|os.O_WRONLY, os.FileMode(hdr.Mode&0700))
+ out, err := os.OpenFile(name, os.O_CREATE|os.O_WRONLY, os.FileMode(hdr.Mode&createFileMode))
if err != nil {
return err
}
@@ -254,7 +257,7 @@
}
// Directory
if hdr.Typeflag == tar.TypeDir {
- if err := os.Mkdir(name, os.FileMode(hdr.Mode&0700)); err != nil && !os.IsExist(err) {
+ if err := os.Mkdir(name, os.FileMode(hdr.Mode&createFileMode)); err != nil && !os.IsExist(err) {
return err
}
continue