Browse Source

优化app-install服务的extractTarGz()代码

niujiuru 14 hours ago
parent
commit
feab30791f
3 changed files with 48 additions and 6 deletions
  1. BIN
      app-install.service/hello.tar.gz
  2. 48 6
      app-install.service/rpc_handler.go
  3. 0 0
      upgrade.service/upgrade.go

BIN
app-install.service/hello.tar.gz


+ 48 - 6
app-install.service/rpc_handler.go

@@ -202,7 +202,7 @@ func appInstall(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
 
 	defer func() {
 		if !success {
-			baseapp.Logger.Warnf("安装用户应用失败状态回滚: %s", userAppInsDir)
+			baseapp.Logger.Warnf("用户应用安装失败!!")
 
 			systemctlIgnoreError("stop", "yfkj-user-app.service")
 			systemctlIgnoreError("disable", "yfkj-user-app.service")
@@ -557,7 +557,7 @@ func writeFileAtomic(name string, data []byte, perm os.FileMode) error {
 	return os.Rename(tmp, name)
 }
 
-func extractTarGz(src string, dst string) error {
+func extractTarGz(src, dst string) error {
 	f, err := os.Open(src)
 	if err != nil {
 		return err
@@ -602,25 +602,67 @@ func extractTarGz(src string, dst string) error {
 				return err
 			}
 
+			mode := header.Mode
+			if mode == 0 {
+				mode = 0644
+			}
+
 			out, err := os.OpenFile(
 				name,
 				os.O_CREATE|os.O_WRONLY|os.O_TRUNC,
-				os.FileMode(header.Mode),
+				os.FileMode(mode),
 			)
 
 			if err != nil {
 				return err
 			}
 
-			_, err = io.Copy(out, tr)
+			if _, err := io.Copy(out, tr); err != nil {
+				out.Close()
+				return err
+			}
+
+			if err := out.Sync(); err != nil {
+				out.Close()
+				return err
+			}
 
 			out.Close()
+		case tar.TypeSymlink:
+			if err := os.MkdirAll(filepath.Dir(name), 0755); err != nil {
+				return err
+			}
 
-			if err != nil {
+			linkTarget := filepath.Join(filepath.Dir(name), header.Linkname)
+			linkTarget = filepath.Clean(linkTarget)
+
+			if rel, err := filepath.Rel(root, linkTarget); err != nil || strings.HasPrefix(rel, "..") {
+				return fmt.Errorf("invalid symlink target: %s", header.Linkname)
+			}
+
+			os.Remove(name)
+
+			if err := os.Symlink(header.Linkname, name); err != nil {
+				return err
+			}
+		case tar.TypeLink:
+			if err := os.MkdirAll(filepath.Dir(name), 0755); err != nil {
+				return err
+			}
+
+			link := filepath.Clean(filepath.Join(dst, header.Linkname))
+
+			if !strings.HasPrefix(link+string(os.PathSeparator), root) {
+				return fmt.Errorf("invalid hardlink target: %s", header.Linkname)
+			}
+
+			os.Remove(name)
+
+			if err := os.Link(link, name); err != nil {
 				return err
 			}
 		default:
-			return fmt.Errorf("unsupported tar entry: %s", header.Name)
+			return fmt.Errorf("unsupported tar entry: %s (type %c)", header.Name, header.Typeflag)
 		}
 	}
 

upgrade.service/rpc_handler.go → upgrade.service/upgrade.go