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 }