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