github.com/alibaba/sealer@v0.8.6-0.20220430115802-37a2bdaa8173/utils/mount/default.go (about) 1 // Copyright © 2021 Alibaba Group Holding Ltd. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package mount 16 17 import ( 18 "fmt" 19 "io" 20 "io/ioutil" 21 "os" 22 "path" 23 "path/filepath" 24 25 "github.com/alibaba/sealer/logger" 26 27 "github.com/alibaba/sealer/utils" 28 ) 29 30 type Default struct { 31 } 32 33 // Unmount target 34 func (d *Default) Unmount(target string) error { 35 if err := os.RemoveAll(target); err != nil { 36 return fmt.Errorf("remote target failed: %s", err) 37 } 38 return nil 39 } 40 41 // copy all layers to target merged dir 42 func (d *Default) Mount(target string, upperDir string, layers ...string) error { 43 //if target is empty,return err 44 if target == "" { 45 return fmt.Errorf("target is empty") 46 } 47 48 utils.Reverse(layers) 49 50 for _, layer := range layers { 51 srcInfo, err := os.Stat(layer) 52 if err != nil { 53 return fmt.Errorf("get srcInfo err: %s", err) 54 } 55 if srcInfo.IsDir() { 56 err := copyDir(layer, target) 57 if err != nil { 58 return fmt.Errorf("copyDir [%s] to [%s] failed: %s", layer, target, err) 59 } 60 } else { 61 IsExist, err := PathExists(target) 62 if err != nil { 63 return err 64 } 65 if !IsExist { 66 err = os.Mkdir(target, 0666) 67 if err != nil { 68 return fmt.Errorf("mkdir [%s] error %v", target, err) 69 } 70 } 71 _file := filepath.Base(layer) 72 dst := path.Join(target, _file) 73 err = copyFile(layer, dst) 74 if err != nil { 75 return err 76 } 77 } 78 } 79 return nil 80 } 81 82 func copyDir(srcPath string, dstPath string) error { 83 IsExist, err := PathExists(dstPath) 84 if err != nil { 85 return err 86 } 87 if !IsExist { 88 err = os.Mkdir(dstPath, 0666) 89 if err != nil { 90 return fmt.Errorf("mkdir [%s] error %v", dstPath, err) 91 } 92 } 93 94 srcFiles, err := ioutil.ReadDir(srcPath) 95 if err != nil { 96 return err 97 } 98 for _, file := range srcFiles { 99 src := path.Join(srcPath, file.Name()) 100 dst := path.Join(dstPath, file.Name()) 101 if file.IsDir() { 102 err = copyDir(src, dst) 103 if err != nil { 104 return err 105 } 106 } else { 107 err = copyFile(src, dst) 108 if err != nil { 109 return err 110 } 111 } 112 } 113 114 return nil 115 } 116 117 func copyFile(src, dst string) error { 118 // open srcfile 119 srcFile, err := os.Open(filepath.Clean(src)) 120 if err != nil { 121 return fmt.Errorf("open file [%s] failed: %s", src, err) 122 } 123 defer func() { 124 if err := srcFile.Close(); err != nil { 125 logger.Fatal("failed to close file") 126 } 127 }() 128 // create dstfile 129 dstFile, err := os.Create(filepath.Clean(dst)) 130 if err != nil { 131 return fmt.Errorf("create file err: %s", err) 132 } 133 defer func() { 134 if err := dstFile.Close(); err != nil { 135 logger.Fatal("failed to close file") 136 } 137 }() 138 139 // copy file 140 _, err = io.Copy(dstFile, srcFile) 141 if err != nil { 142 return fmt.Errorf("copy file err: %s", err) 143 } 144 return nil 145 } 146 147 //notExist false ,Exist true 148 func PathExists(path string) (bool, error) { 149 _, err := os.Stat(path) 150 if err == nil { 151 return true, nil 152 } 153 if os.IsNotExist(err) { 154 return false, nil 155 } 156 return false, fmt.Errorf("os.Stat(%s) err: %s", path, err) 157 }