github.com/rajasrinivasan/spm@v0.0.0-20200125100127-755649755f3f/src/impl/install.go (about)

     1  package impl
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"os"
     7  	"os/exec"
     8  	"path/filepath"
     9  	"strings"
    10  
    11  	"../cfg"
    12  	"../pkg"
    13  )
    14  
    15  var ShowOption bool
    16  
    17  func verifyContents(filecfg *cfg.Config) error {
    18  
    19  	pubkeyfilename := filepath.Join(pkg.ContentsDir, pkg.DefaultPublicKeyFileName)
    20  
    21  	for _, c := range filecfg.Contents {
    22  		bn := filepath.Base(c.From)
    23  		cn := filepath.Join(pkg.ContentsDir, bn)
    24  		content, err := os.Open(cn)
    25  		if err != nil {
    26  			log.Printf("%s\n", err)
    27  			return err
    28  		}
    29  		content.Close()
    30  		err = pkg.AuthenticateFile(cn, cn+".sig", pubkeyfilename)
    31  		if err != nil {
    32  			return err
    33  		}
    34  	}
    35  	return nil
    36  }
    37  
    38  func showContents(filecfg *cfg.Config) {
    39  	log.Printf("\nContents of the Package : %s\nID: %s\nVerion : %s\nCreated on the host : %s\nOn : %s\n",
    40  		filecfg.Package.Name, filecfg.Package.ID, filecfg.Package.Version, filecfg.Package.Hostname, filecfg.Package.Created)
    41  	log.Printf("Preinstall steps\n")
    42  	for sn, step := range filecfg.Preinstall {
    43  		log.Printf("%3d : %s\n", sn, step)
    44  	}
    45  	log.Printf("Contents of Package\n")
    46  	filepath.Walk(pkg.ContentsDir, func(path string, info os.FileInfo, err error) error {
    47  		if err != nil {
    48  			fmt.Printf("prevent panic by handling failure accessing a path %q: %v\n", path, err)
    49  			return err
    50  		}
    51  		fmt.Printf("%s\n", info.Name())
    52  		return nil
    53  	})
    54  
    55  	log.Printf("Post steps\n")
    56  	for sn, step := range filecfg.Postinstall {
    57  		log.Printf("%3d : %s\n", sn, step)
    58  	}
    59  }
    60  
    61  func execCommand(cmdstr string) error {
    62  	cmdsplit := strings.Fields(cmdstr)
    63  	cmd := exec.Command(cmdsplit[0], cmdsplit[1:]...)
    64  	output, err := cmd.CombinedOutput()
    65  	if err != nil {
    66  		log.Printf("Executing %s\n", cmdstr)
    67  		log.Fatal(err)
    68  	}
    69  	if Verbose {
    70  		log.Printf("Executing: %s\n%s", cmdstr, output)
    71  	}
    72  	return nil
    73  }
    74  
    75  func executeSteps(steps []string) error {
    76  	for _, stepstr := range steps {
    77  		err := execCommand(stepstr)
    78  		if err != nil {
    79  			return err
    80  		}
    81  	}
    82  	return nil
    83  }
    84  
    85  func installFile(from, to string) error {
    86  	cmd := fmt.Sprintf("cp -p %s %s", from, to)
    87  	err := execCommand(cmd)
    88  	if err == nil {
    89  		log.Printf("Executed: %s", cmd)
    90  	}
    91  	return err
    92  }
    93  
    94  func installFiles(filecfg *cfg.Config) {
    95  	for _, c := range filecfg.Contents {
    96  		fname := filepath.Base(c.From)
    97  		if fname != "Packagefile" {
    98  			fromname := filepath.Join(pkg.ContentsDir, fname)
    99  			err := installFile(fromname, c.To)
   100  			if err != nil {
   101  				log.Fatal(err)
   102  			}
   103  		}
   104  	}
   105  }
   106  
   107  func Install(pkgfile string) {
   108  	fullname, _ := filepath.Abs(pkgfile)
   109  	log.Printf("Installing package %s\n", fullname)
   110  	pkg.CreateWorkArea(Workarea)
   111  	if !KeepWorkArea {
   112  		defer pkg.CleanupWorkArea()
   113  	}
   114  	pkgbasename := filepath.Base(pkgfile)
   115  	spmname := filepath.Join(pkg.WorkDir, pkgbasename)
   116  	pkg.Decrypt(PkgPassword, fullname, spmname)
   117  	log.Printf("Decrypted %s to create %s\n", fullname, spmname)
   118  
   119  	pkg.UnPackfiles(spmname, pkg.ContentsDir)
   120  
   121  	cfgfilename := filepath.Join(pkg.ContentsDir, ManifestFileName)
   122  	filecfg, err := cfg.LoadConfig(cfgfilename)
   123  	if err != nil {
   124  		return
   125  	}
   126  
   127  	err = verifyContents(filecfg)
   128  	if err != nil {
   129  		return
   130  	}
   131  
   132  	if ShowOption {
   133  		showContents(filecfg)
   134  		return
   135  	}
   136  	log.Printf("Executing Preinstall steps\n")
   137  	err = executeSteps(filecfg.Preinstall)
   138  	if err != nil {
   139  		log.Fatal(err)
   140  	}
   141  	installFiles(filecfg)
   142  	log.Printf("Executing Postinstall steps\n")
   143  	err = executeSteps(filecfg.Postinstall)
   144  	if err != nil {
   145  		log.Fatal(err)
   146  	}
   147  }