2024-06-06 11:44:55 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2024-06-12 18:12:27 +02:00
|
|
|
"crypto/rand"
|
|
|
|
"encoding/hex"
|
2024-06-06 11:44:55 +02:00
|
|
|
"fmt"
|
|
|
|
"io/fs"
|
|
|
|
"log"
|
|
|
|
"os"
|
2024-06-07 09:29:07 +02:00
|
|
|
"os/exec"
|
2024-06-06 11:44:55 +02:00
|
|
|
"path"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
replaceID = "AABBCCDD"
|
|
|
|
bootstrapFolderName = "bootstrap"
|
2024-06-07 09:31:22 +02:00
|
|
|
reponame = "https://github.com/anthdm/gothkit.git"
|
2024-06-06 11:44:55 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
args := os.Args[1:]
|
|
|
|
|
|
|
|
if len(args) == 0 {
|
|
|
|
fmt.Println()
|
|
|
|
fmt.Println("install requires your project name as the first argument")
|
|
|
|
fmt.Println()
|
|
|
|
fmt.Println("\tgo run gothkit/install.go [your_project_name]")
|
|
|
|
fmt.Println()
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
|
|
|
|
projectName := args[0]
|
|
|
|
|
2024-06-07 11:03:09 +02:00
|
|
|
// check if gothkit folder already exists, if so, delete
|
2024-06-09 20:45:12 +02:00
|
|
|
_, err := os.Stat("gothkit")
|
|
|
|
if !os.IsNotExist(err) {
|
2024-06-07 11:03:09 +02:00
|
|
|
fmt.Println("-- deleting gothkit folder cause its already present")
|
|
|
|
if err := os.RemoveAll("gothkit"); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println("-- cloning", reponame)
|
|
|
|
clone := exec.Command("git", "clone", reponame)
|
2024-06-07 09:29:07 +02:00
|
|
|
if err := clone.Run(); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2024-06-12 18:12:27 +02:00
|
|
|
fmt.Println("-- renaming bootstrap ->", projectName)
|
2024-06-06 11:44:55 +02:00
|
|
|
if err := os.Rename(path.Join("gothkit", bootstrapFolderName), projectName); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2024-06-07 11:03:09 +02:00
|
|
|
err = filepath.Walk(path.Join(projectName), func(fullPath string, info fs.FileInfo, err error) error {
|
2024-06-06 11:44:55 +02:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if info.IsDir() {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
b, err := os.ReadFile(fullPath)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
contentStr := string(b)
|
|
|
|
if strings.Contains(contentStr, replaceID) {
|
|
|
|
replacedContent := strings.ReplaceAll(contentStr, replaceID, projectName)
|
|
|
|
file, err := os.OpenFile(fullPath, os.O_WRONLY|os.O_TRUNC, 0644)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
_, err = file.WriteString(replacedContent)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2024-06-12 18:12:27 +02:00
|
|
|
fmt.Println("-- renaming .env.local -> .env")
|
|
|
|
if err := os.Rename(
|
|
|
|
path.Join(projectName, ".env.local"),
|
|
|
|
path.Join(projectName, ".env"),
|
|
|
|
); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println("-- generating secure secret")
|
|
|
|
pathToDotEnv := path.Join(projectName, ".env")
|
|
|
|
fmt.Println("rewriting ->", pathToDotEnv)
|
|
|
|
b, err := os.ReadFile(pathToDotEnv)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
replacedContent := strings.Replace(string(b), "{{app_secret}}", "foobar", -1)
|
|
|
|
fmt.Println(replacedContent)
|
|
|
|
file, err := os.OpenFile(pathToDotEnv, os.O_WRONLY|os.O_TRUNC, 0644)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
_, err = file.WriteString(replacedContent)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
2024-06-07 11:03:09 +02:00
|
|
|
fmt.Printf("-- project (%s) successfully installed!\n", projectName)
|
2024-06-06 11:44:55 +02:00
|
|
|
}
|
2024-06-12 18:12:27 +02:00
|
|
|
|
|
|
|
func generateSecret() string {
|
|
|
|
bytes := make([]byte, 32)
|
|
|
|
if _, err := rand.Read(bytes); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
return hex.EncodeToString(bytes)
|
|
|
|
}
|