1package lib 2 3import ( 4 "archive/zip" 5 "bufio" 6 "bytes" 7 "fmt" 8 "io" 9 "io/ioutil" 10 "log" 11 "os" 12 "path/filepath" 13 "strings" 14 15 "github.com/mitchellh/go-homedir" 16) 17 18// RenameFile : rename file name 19func RenameFile(src string, dest string) { 20 err := os.Rename(src, dest) 21 if err != nil { 22 fmt.Println(err) 23 return 24 } 25} 26 27// RemoveFiles : remove file 28func RemoveFiles(src string) { 29 files, err := filepath.Glob(src) 30 if err != nil { 31 32 panic(err) 33 } 34 for _, f := range files { 35 if err := os.Remove(f); err != nil { 36 panic(err) 37 } 38 } 39} 40 41// CheckFileExist : check if file exist in directory 42func CheckFileExist(file string) bool { 43 _, err := os.Stat(file) 44 if err != nil { 45 return false 46 } 47 return true 48} 49 50// Unzip will decompress a zip archive, moving all files and folders 51// within the zip file (parameter 1) to an output directory (parameter 2). 52func Unzip(src string, dest string) ([]string, error) { 53 54 var filenames []string 55 56 r, err := zip.OpenReader(src) 57 if err != nil { 58 return filenames, err 59 } 60 defer r.Close() 61 62 for _, f := range r.File { 63 64 rc, err := f.Open() 65 if err != nil { 66 return filenames, err 67 } 68 defer rc.Close() 69 70 // Store filename/path for returning and using later on 71 fpath := filepath.Join(dest, f.Name) 72 filenames = append(filenames, fpath) 73 74 if f.FileInfo().IsDir() { 75 76 // Make Folder 77 os.MkdirAll(fpath, os.ModePerm) 78 79 } else { 80 81 // Make File 82 if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { 83 return filenames, err 84 } 85 86 outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) 87 if err != nil { 88 return filenames, err 89 } 90 91 _, err = io.Copy(outFile, rc) 92 93 // Close the file without defer to close before next iteration of loop 94 outFile.Close() 95 96 if err != nil { 97 return filenames, err 98 } 99 100 } 101 } 102 return filenames, nil 103} 104 105//CreateDirIfNotExist : create directory if directory does not exist 106func CreateDirIfNotExist(dir string) { 107 if _, err := os.Stat(dir); os.IsNotExist(err) { 108 fmt.Printf("Creating directory for terraform binary at: %v\n", dir) 109 err = os.MkdirAll(dir, 0755) 110 if err != nil { 111 fmt.Printf("Unable to create directory for terraform binary at: %v", dir) 112 panic(err) 113 } 114 } 115} 116 117//WriteLines : writes into file 118func WriteLines(lines []string, path string) (err error) { 119 var ( 120 file *os.File 121 ) 122 123 if file, err = os.Create(path); err != nil { 124 return err 125 } 126 defer file.Close() 127 128 for _, item := range lines { 129 _, err := file.WriteString(strings.TrimSpace(item) + "\n") 130 if err != nil { 131 fmt.Println(err) 132 break 133 } 134 } 135 136 return nil 137} 138 139// ReadLines : Read a whole file into the memory and store it as array of lines 140func ReadLines(path string) (lines []string, err error) { 141 var ( 142 file *os.File 143 part []byte 144 prefix bool 145 ) 146 if file, err = os.Open(path); err != nil { 147 return 148 } 149 defer file.Close() 150 151 reader := bufio.NewReader(file) 152 buffer := bytes.NewBuffer(make([]byte, 0)) 153 for { 154 if part, prefix, err = reader.ReadLine(); err != nil { 155 break 156 } 157 buffer.Write(part) 158 if !prefix { 159 lines = append(lines, buffer.String()) 160 buffer.Reset() 161 } 162 } 163 if err == io.EOF { 164 err = nil 165 } 166 return 167} 168 169//IsDirEmpty : check if directory is empty (TODO UNIT TEST) 170func IsDirEmpty(name string) bool { 171 172 exist := false 173 174 f, err := os.Open(name) 175 if err != nil { 176 log.Fatal(err) 177 } 178 defer f.Close() 179 180 _, err = f.Readdirnames(1) // Or f.Readdir(1) 181 if err == io.EOF { 182 exist = true 183 } 184 return exist // Either not empty or error, suits both cases 185} 186 187//CheckDirHasTGBin : // check binary exist (TODO UNIT TEST) 188func CheckDirHasTGBin(dir, prefix string) bool { 189 190 exist := false 191 192 files, err := ioutil.ReadDir(dir) 193 if err != nil { 194 log.Fatal(err) 195 //return exist, err 196 } 197 res := []string{} 198 for _, f := range files { 199 if !f.IsDir() && strings.HasPrefix(f.Name(), prefix) { 200 res = append(res, filepath.Join(dir, f.Name())) 201 exist = true 202 } 203 } 204 return exist 205} 206 207//CheckDirExist : check if directory exist 208//dir=path to file 209//return bool 210func CheckDirExist(dir string) bool { 211 if _, err := os.Stat(dir); os.IsNotExist(err) { 212 return false 213 } 214 return true 215} 216 217// Path : returns path of directory 218// value=path to file 219func Path(value string) string { 220 return filepath.Dir(value) 221} 222 223// GetFileName : remove file ext. .tfswitch.config returns .tfswitch 224func GetFileName(configfile string) string { 225 return strings.TrimSuffix(configfile, filepath.Ext(configfile)) 226} 227 228// GetCurrentDirectory : return the current directory 229func GetCurrentDirectory() string { 230 231 dir, err := os.Getwd() //get current directory 232 if err != nil { 233 log.Printf("Failed to get current directory %v\n", err) 234 os.Exit(1) 235 } 236 return dir 237} 238 239// GetHomeDirectory : return the home directory 240func GetHomeDirectory() string { 241 242 homedir, errHome := homedir.Dir() 243 if errHome != nil { 244 log.Printf("Failed to get home directory %v\n", errHome) 245 os.Exit(1) 246 } 247 248 return homedir 249} 250