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  }