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  }