|
|
@@ -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)
|
|
|
}
|
|
|
}
|
|
|
|