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