2016-01-05 00:32:53 +01:00
package main
import (
2016-04-18 02:58:29 +02:00
"encoding/json"
2016-01-05 00:32:53 +01:00
"fmt"
2016-04-18 02:58:29 +02:00
"io/ioutil"
"os"
2016-04-24 20:11:43 +02:00
"path"
2016-04-18 02:58:29 +02:00
"strings"
2016-03-16 22:49:43 +01:00
"github.com/ansible-semaphore/semaphore/database"
"github.com/ansible-semaphore/semaphore/migration"
2016-04-18 02:58:29 +02:00
"github.com/ansible-semaphore/semaphore/models"
2016-03-16 22:49:43 +01:00
"github.com/ansible-semaphore/semaphore/routes"
2016-04-02 14:40:07 +02:00
"github.com/ansible-semaphore/semaphore/routes/sockets"
2016-04-04 15:44:34 +02:00
"github.com/ansible-semaphore/semaphore/routes/tasks"
2016-04-26 20:18:28 +02:00
"github.com/ansible-semaphore/semaphore/upgrade"
2016-03-16 22:49:43 +01:00
"github.com/ansible-semaphore/semaphore/util"
2016-01-05 00:32:53 +01:00
"github.com/bugsnag/bugsnag-go"
"github.com/gin-gonic/gin"
2016-04-30 09:52:33 +02:00
"golang.org/x/crypto/bcrypt"
2016-01-05 00:32:53 +01:00
)
func main ( ) {
2016-04-18 02:58:29 +02:00
if util . InteractiveSetup {
os . Exit ( doSetup ( ) )
}
2016-04-26 20:18:28 +02:00
if util . Upgrade {
if err := upgrade . Upgrade ( util . Version ) ; err != nil {
panic ( err )
}
os . Exit ( 0 )
}
2016-01-05 00:32:53 +01:00
fmt . Printf ( "Semaphore %v\n" , util . Version )
fmt . Printf ( "Port %v\n" , util . Config . Port )
2016-04-18 02:58:29 +02:00
fmt . Printf ( "MySQL %v@%v %v\n" , util . Config . MySQL . Username , util . Config . MySQL . Hostname , util . Config . MySQL . DbName )
2016-04-07 14:49:34 +02:00
fmt . Printf ( "Tmp Path (projects home) %v\n" , util . Config . TmpPath )
2016-01-05 00:32:53 +01:00
2016-04-18 02:58:29 +02:00
if err := database . Connect ( ) ; err != nil {
panic ( err )
}
models . SetupDBLink ( )
2016-01-05 00:32:53 +01:00
defer database . Mysql . Db . Close ( )
if util . Migration {
fmt . Println ( "\n Running DB Migrations" )
if err := migration . MigrateAll ( ) ; err != nil {
panic ( err )
}
return
}
2016-04-02 14:40:07 +02:00
go sockets . StartWS ( )
2016-01-05 00:32:53 +01:00
r := gin . New ( )
r . Use ( gin . Recovery ( ) , recovery , gin . Logger ( ) )
routes . Route ( r )
2016-04-04 15:44:34 +02:00
go tasks . StartRunner ( )
2016-01-05 00:32:53 +01:00
r . Run ( util . Config . Port )
}
func recovery ( c * gin . Context ) {
defer bugsnag . AutoNotify ( )
c . Next ( )
}
2016-04-18 02:58:29 +02:00
func doSetup ( ) int {
fmt . Print ( `
2016-04-30 09:52:33 +02:00
Hello ! You will now be guided through a setup to :
2016-04-18 02:58:29 +02:00
2016-04-30 09:52:33 +02:00
1. Set up configuration for a MySQL / MariaDB database
2016-04-30 14:28:47 +02:00
2. Set up a path for your playbooks ( auto - created )
3. Run database Migrations
4. Set up initial seamphore user & password
2016-04-18 02:58:29 +02:00
` )
var b [ ] byte
2016-04-30 14:28:47 +02:00
setup := util . NewConfig ( )
2016-04-18 02:58:29 +02:00
for true {
2016-04-30 14:28:47 +02:00
setup . Scan ( )
2016-04-18 02:58:29 +02:00
var err error
2016-04-30 09:52:33 +02:00
b , err = json . MarshalIndent ( & setup , " " , "\t" )
2016-04-18 02:58:29 +02:00
if err != nil {
panic ( err )
}
2016-04-30 09:52:33 +02:00
fmt . Printf ( "\n Generated configuration:\n %v\n\n" , string ( b ) )
fmt . Print ( " > Is this correct? (yes/no): " )
2016-04-18 02:58:29 +02:00
var answer string
fmt . Scanln ( & answer )
2016-04-30 09:52:33 +02:00
if answer == "yes" || answer == "y" {
break
2016-04-18 02:58:29 +02:00
}
2016-04-30 09:52:33 +02:00
fmt . Println ( )
2016-04-30 14:28:47 +02:00
setup = util . NewConfig ( )
2016-04-18 02:58:29 +02:00
}
2016-04-30 14:28:47 +02:00
setup . GenerateCookieSecrets ( )
2016-04-30 09:52:33 +02:00
fmt . Printf ( " Running: mkdir -p %v..\n" , setup . TmpPath )
2016-04-24 20:11:43 +02:00
os . MkdirAll ( setup . TmpPath , 0755 )
configPath := path . Join ( setup . TmpPath , "/semaphore_config.json" )
2016-04-30 09:52:33 +02:00
fmt . Printf ( " Configuration written to %v..\n" , setup . TmpPath )
2016-04-24 20:11:43 +02:00
if err := ioutil . WriteFile ( configPath , b , 0644 ) ; err != nil {
2016-04-18 02:58:29 +02:00
panic ( err )
}
2016-04-30 09:52:33 +02:00
fmt . Println ( " Pinging database.." )
2016-04-18 02:58:29 +02:00
util . Config = setup
if err := database . Connect ( ) ; err != nil {
2016-04-30 09:52:33 +02:00
fmt . Printf ( "\n Cannot connect to database!\n %v\n" , err . Error ( ) )
os . Exit ( 1 )
2016-04-18 02:58:29 +02:00
}
2016-04-30 09:52:33 +02:00
fmt . Println ( "\n Running DB Migrations.." )
2016-04-18 02:58:29 +02:00
if err := migration . MigrateAll ( ) ; err != nil {
2016-04-30 09:52:33 +02:00
fmt . Printf ( "\n Database migrations failed!\n %v\n" , err . Error ( ) )
os . Exit ( 1 )
2016-04-18 02:58:29 +02:00
}
var user models . User
2016-04-30 09:52:33 +02:00
fmt . Print ( "\n\n > Your name: " )
2016-04-18 02:58:29 +02:00
fmt . Scanln ( & user . Name )
2016-04-30 09:52:33 +02:00
fmt . Print ( " > Username: " )
2016-04-18 02:58:29 +02:00
fmt . Scanln ( & user . Username )
2016-04-30 09:52:33 +02:00
fmt . Print ( " > Email: " )
2016-04-18 02:58:29 +02:00
fmt . Scanln ( & user . Email )
2016-04-30 09:52:33 +02:00
fmt . Print ( " > Password: " )
2016-04-18 02:58:29 +02:00
fmt . Scanln ( & user . Password )
pwdHash , _ := bcrypt . GenerateFromPassword ( [ ] byte ( user . Password ) , 11 )
user . Username = strings . ToLower ( user . Username )
user . Email = strings . ToLower ( user . Email )
if _ , err := database . Mysql . Exec ( "insert into user set name=?, username=?, email=?, password=?, created=NOW()" , user . Name , user . Username , user . Email , pwdHash ) ; err != nil {
2016-04-30 09:52:33 +02:00
fmt . Printf ( " Inserting user failed. If you already have a user, you can disregard this error.\n %v\n" , err . Error ( ) )
os . Exit ( 1 )
2016-04-18 02:58:29 +02:00
}
2016-04-30 09:52:33 +02:00
fmt . Printf ( "\n You are all setup %v!\n" , user . Name )
fmt . Printf ( " Re-launch this program pointing to the configuration file\n\n./semaphore -config %v\n\n" , configPath )
fmt . Printf ( " To run as daemon:\n\nnohup ./semaphore -config %v &\n\n" , configPath )
fmt . Println ( " Your login is %v or %v." , user . Email , user . Username )
2016-04-18 02:58:29 +02:00
return 0
}