Skip to content

Commit 21ad728

Browse files
Merge pull request #29 from stackroost/dev
feat(cli): add clone-domain and purge-domain-logs commands
2 parents 886745a + 65ed19a commit 21ad728

File tree

2 files changed

+98
-1
lines changed

2 files changed

+98
-1
lines changed

cmd/clone_domain.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"path/filepath"
7+
"strings"
8+
9+
"github.com/spf13/cobra"
10+
"stackroost/internal"
11+
"stackroost/internal/logger"
12+
)
13+
14+
var cloneDomainCmd = &cobra.Command{
15+
Use: "clone-domain",
16+
Short: "Clone configuration, files, and database from one domain to another",
17+
Run: func(cmd *cobra.Command, args []string) {
18+
src, _ := cmd.Flags().GetString("source")
19+
dest, _ := cmd.Flags().GetString("target")
20+
cloneDB, _ := cmd.Flags().GetBool("clone-db")
21+
cloneUser, _ := cmd.Flags().GetBool("clone-user")
22+
23+
if internal.IsNilOrEmpty(src) || internal.IsNilOrEmpty(dest) {
24+
logger.Error("Please provide both --source and --target domains")
25+
os.Exit(1)
26+
}
27+
28+
logger.Info(fmt.Sprintf("Cloning domain from %s to %s", src, dest))
29+
30+
serverType := internal.DetectServerType(src)
31+
if serverType == "" {
32+
logger.Error("Could not detect server type for source domain")
33+
os.Exit(1)
34+
}
35+
36+
// 1. Copy config
37+
srcConf := filepath.Join("/etc", serverType, "sites-available", src+".conf")
38+
destConf := filepath.Join("/etc", serverType, "sites-available", dest+".conf")
39+
40+
logger.Info("Copying config...")
41+
internal.RunCommand("sudo", "cp", srcConf, destConf)
42+
internal.RunCommand("sudo", "sed", "-i", fmt.Sprintf("s/%s/%s/g", src, dest), destConf)
43+
44+
// 2. Copy public_html
45+
srcUser := strings.Split(src, ".")[0]
46+
destUser := strings.Split(dest, ".")[0]
47+
48+
srcPath := fmt.Sprintf("/home/%s/public_html", srcUser)
49+
destPath := fmt.Sprintf("/home/%s/public_html", destUser)
50+
51+
logger.Info("Copying website files...")
52+
internal.RunCommand("sudo", "mkdir", "-p", destPath)
53+
internal.RunCommand("sudo", "cp", "-r", srcPath+"/.", destPath)
54+
55+
if cloneUser {
56+
logger.Info("Cloning user...")
57+
internal.RunCommand("sudo", "useradd", "-m", "-s", "/bin/bash", destUser)
58+
internal.RunCommand("sudo", "chown", "-R", fmt.Sprintf("%s:%s", destUser, destUser), "/home/"+destUser)
59+
}
60+
61+
if cloneDB {
62+
logger.Info("Cloning MySQL database...")
63+
dumpFile := fmt.Sprintf("/tmp/%s.sql", srcUser)
64+
internal.RunCommand("sudo", "mysqldump", "-u", "root", srcUser, "-r", dumpFile)
65+
internal.CreateMySQLUserAndDatabase(destUser, "changeme123")
66+
internal.RunCommand("sudo", "mysql", "-u", "root", destUser, "-e", fmt.Sprintf("source %s", dumpFile))
67+
internal.RunCommand("sudo", "rm", "-f", dumpFile)
68+
}
69+
70+
// 3. Enable new config
71+
logger.Info("Enabling cloned site...")
72+
switch serverType {
73+
case "apache":
74+
internal.RunCommand("sudo", "a2ensite", dest+".conf")
75+
internal.RunCommand("sudo", "systemctl", "reload", "apache2")
76+
case "nginx":
77+
link := filepath.Join("/etc/nginx/sites-enabled", dest+".conf")
78+
internal.RunCommand("sudo", "ln", "-s", destConf, link)
79+
internal.RunCommand("sudo", "systemctl", "reload", "nginx")
80+
case "caddy":
81+
link := filepath.Join("/etc/caddy/sites-enabled", dest+".conf")
82+
internal.RunCommand("sudo", "ln", "-s", destConf, link)
83+
internal.RunCommand("sudo", "systemctl", "reload", "caddy")
84+
}
85+
86+
logger.Success(fmt.Sprintf("Domain %s cloned to %s", src, dest))
87+
},
88+
}
89+
90+
func init() {
91+
rootCmd.AddCommand(cloneDomainCmd)
92+
cloneDomainCmd.Flags().String("source", "", "Source domain to clone from")
93+
cloneDomainCmd.Flags().String("target", "", "New domain name")
94+
cloneDomainCmd.Flags().Bool("clone-db", false, "Clone MySQL database")
95+
cloneDomainCmd.Flags().Bool("clone-user", false, "Clone shell user")
96+
cloneDomainCmd.MarkFlagRequired("source")
97+
cloneDomainCmd.MarkFlagRequired("target")
98+
}

cmd/purge_logs.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package cmd
22

33
import (
4-
"fmt"
54
"os"
65
"path/filepath"
76

0 commit comments

Comments
 (0)