github.com/cloudfoundry-incubator/stembuild@v0.0.0-20211223202937-5b61d62226c6/package_stemcell/config/output_config.go (about) 1 package config 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "regexp" 8 ) 9 10 type OutputConfig struct { 11 Os string 12 StemcellVersion string 13 OutputDir string 14 } 15 16 func (c OutputConfig) ValidateConfig() error { 17 if !IsValidOS(c.Os) { 18 return fmt.Errorf("versioning error; parsed os version is: %s\n", c.Os) 19 } 20 if !IsValidStemcellVersion(c.StemcellVersion) { 21 return fmt.Errorf("versioning error; parsed stemcell version is: %s. Expected format [NUMBER].[NUMBER] or "+ 22 "[NUMBER].[NUMBER].[NUMBER]\n", c.StemcellVersion) 23 } 24 25 if c.OutputDir == "" || c.OutputDir == "." { 26 cwd, err := os.Getwd() 27 if err != nil { 28 return fmt.Errorf("error getting working directory %s", err) 29 } 30 c.OutputDir = cwd 31 } else if err := ValidateOrCreateOutputDir(c.OutputDir); err != nil { 32 return err 33 } 34 35 name := filepath.Join(c.OutputDir, stemcellFilename(c.StemcellVersion, c.Os)) 36 if _, err := os.Stat(name); !os.IsNotExist(err) { 37 return fmt.Errorf("error with output file (%s): %v (file may already exist)", name, err) 38 } 39 return nil 40 } 41 42 func IsValidOS(os string) bool { 43 switch os { 44 case "2012R2", "1803", "2016", "2019": 45 return true 46 default: 47 return false 48 } 49 } 50 51 func ValidateOrCreateOutputDir(outputDir string) error { 52 53 fi, err := os.Stat(outputDir) 54 if err != nil && os.IsNotExist(err) { 55 if err = os.Mkdir(outputDir, 0700); err != nil { 56 return err 57 } 58 } else if err != nil || fi == nil { 59 return fmt.Errorf("error opening output directory (%s): %s\n", outputDir, err) 60 } else if !fi.IsDir() { 61 return fmt.Errorf("output argument (%s): is not a directory\n", outputDir) 62 } 63 64 return nil 65 } 66 67 func IsValidStemcellVersion(version string) bool { 68 69 if version == "" { 70 return false 71 } 72 73 patterns := []string{ 74 `^\d{1,}\.\d{1,}$`, 75 `^\d{1,}\.\d{1,}-build\.\d{1,}$`, 76 `^\d{1,}\.\d{1,}\.\d{1,}$`, 77 `^\d{1,}\.\d{1,}\.\d{1,}-build\.\d{1,}$`, 78 `^\d{1,}\.\d{1,}\.\d{1,}-manual\.\d{1,}$`, 79 } 80 81 for _, pattern := range patterns { 82 if regexp.MustCompile(pattern).MatchString(version) { 83 return true 84 } 85 } 86 87 return false 88 } 89 90 func stemcellFilename(version, os string) string { 91 return fmt.Sprintf("bosh-stemcell-%s-vsphere-esxi-windows%s-go_agent.tgz", 92 version, os) 93 }