1
1
package main
2
2
3
3
import (
4
+ "encoding/json"
4
5
"fmt"
6
+ "io/ioutil"
7
+ "os"
8
+ "strings"
9
+
10
+ "golang.org/x/crypto/bcrypt"
5
11
6
12
"github.com/ansible-semaphore/semaphore/database"
7
13
"github.com/ansible-semaphore/semaphore/migration"
14
+ "github.com/ansible-semaphore/semaphore/models"
8
15
"github.com/ansible-semaphore/semaphore/routes"
9
16
"github.com/ansible-semaphore/semaphore/routes/sockets"
10
17
"github.com/ansible-semaphore/semaphore/routes/tasks"
@@ -14,12 +21,22 @@ import (
14
21
)
15
22
16
23
func main () {
24
+ if util .InteractiveSetup {
25
+ os .Exit (doSetup ())
26
+ }
27
+
17
28
fmt .Printf ("Semaphore %v\n " , util .Version )
18
29
fmt .Printf ("Port %v\n " , util .Config .Port )
19
- fmt .Printf ("MySQL %v@%v\n " , util .Config .MySQL .Username , util .Config .MySQL .Hostname )
30
+ fmt .Printf ("MySQL %v@%v %v \n " , util .Config .MySQL .Username , util .Config .MySQL .Hostname , util . Config . MySQL . DbName )
20
31
fmt .Printf ("Redis %v\n " , util .Config .SessionDb )
21
32
fmt .Printf ("Tmp Path (projects home) %v\n " , util .Config .TmpPath )
22
33
34
+ if err := database .Connect (); err != nil {
35
+ panic (err )
36
+ }
37
+
38
+ models .SetupDBLink ()
39
+
23
40
defer database .Mysql .Db .Close ()
24
41
database .RedisPing ()
25
42
@@ -46,3 +63,89 @@ func recovery(c *gin.Context) {
46
63
defer bugsnag .AutoNotify ()
47
64
c .Next ()
48
65
}
66
+
67
+ func doSetup () int {
68
+ fmt .Print (`
69
+ Hello, you will now be guided through a setup to:
70
+
71
+ - Set up configuration for a MySQL/MariaDB database
72
+ - Set up redis for session storage
73
+ - Set up a path for your playbooks
74
+ - Run DB Migrations
75
+ - Set up your user and password
76
+
77
+ ` )
78
+
79
+ var b []byte
80
+ setup := util .ScanSetup ()
81
+ for true {
82
+ var err error
83
+ b , err = json .MarshalIndent (& setup , "" , "\t " )
84
+ if err != nil {
85
+ panic (err )
86
+ }
87
+
88
+ fmt .Printf ("Config:\n %v\n \n " , string (b ))
89
+ fmt .Print ("Is this correct? (yes/no): " )
90
+
91
+ var answer string
92
+ fmt .Scanln (& answer )
93
+
94
+ if ! (answer == "yes" || answer == "y" ) {
95
+ fmt .Println ()
96
+ setup = util .ScanSetup ()
97
+
98
+ continue
99
+ }
100
+
101
+ break
102
+ }
103
+
104
+ fmt .Print ("Configuration written to /tmp/semaphore_config.json\n " )
105
+ if err := ioutil .WriteFile ("/tmp/semaphore_config.json" , b , 0644 ); err != nil {
106
+ panic (err )
107
+ }
108
+
109
+ fmt .Println ("\n Pinging database..." )
110
+ util .Config = setup
111
+
112
+ if err := database .Connect (); err != nil {
113
+ fmt .Println ("Connection to database unsuccessful." )
114
+ panic (err )
115
+ }
116
+
117
+ fmt .Println ("Pinging redis..." )
118
+ database .RedisPing ()
119
+
120
+ fmt .Println ("\n Running DB Migrations" )
121
+ if err := migration .MigrateAll (); err != nil {
122
+ panic (err )
123
+ }
124
+
125
+ var user models.User
126
+ fmt .Print ("\n \n Your name: " )
127
+ fmt .Scanln (& user .Name )
128
+
129
+ fmt .Print ("Username: " )
130
+ fmt .Scanln (& user .Username )
131
+
132
+ fmt .Print ("Email: " )
133
+ fmt .Scanln (& user .Email )
134
+
135
+ fmt .Print ("Password: " )
136
+ fmt .Scanln (& user .Password )
137
+
138
+ pwdHash , _ := bcrypt .GenerateFromPassword ([]byte (user .Password ), 11 )
139
+ user .Username = strings .ToLower (user .Username )
140
+ user .Email = strings .ToLower (user .Email )
141
+
142
+ if _ , err := database .Mysql .Exec ("insert into user set name=?, username=?, email=?, password=?, created=NOW()" , user .Name , user .Username , user .Email , pwdHash ); err != nil {
143
+ panic (err )
144
+ }
145
+
146
+ fmt .Printf ("\n You are all setup %v\n " , user .Name )
147
+ fmt .Println ("Re-launch this program pointing to the configuration file\n ./semaphore -config /tmp/semaphore_config.json" )
148
+ fmt .Println ("Your login is %v or %v." , user .Email , user .Username )
149
+
150
+ return 0
151
+ }
0 commit comments