|
@@ -1,90 +1,39 @@
|
|
|
package main
|
|
|
|
|
|
import (
|
|
|
- "bytes"
|
|
|
"fmt"
|
|
|
"io/ioutil"
|
|
|
- "regexp"
|
|
|
- "syscall"
|
|
|
-
|
|
|
- "github.com/lib/pq"
|
|
|
- uuid "github.com/satori/go.uuid"
|
|
|
+ "strings"
|
|
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
|
"github.com/knadh/goyesql"
|
|
|
"github.com/knadh/listmonk/models"
|
|
|
+ "github.com/lib/pq"
|
|
|
+ uuid "github.com/satori/go.uuid"
|
|
|
"github.com/spf13/viper"
|
|
|
- "golang.org/x/crypto/bcrypt"
|
|
|
- "golang.org/x/crypto/ssh/terminal"
|
|
|
)
|
|
|
|
|
|
// install runs the first time setup of creating and
|
|
|
// migrating the database and creating the super user.
|
|
|
func install(app *App, qMap goyesql.Queries) {
|
|
|
- var (
|
|
|
- email, pw, pw2 []byte
|
|
|
- err error
|
|
|
-
|
|
|
- // Pseudo e-mail validation using Regexp, well ...
|
|
|
- emRegex, _ = regexp.Compile("(.+?)@(.+?)")
|
|
|
- )
|
|
|
-
|
|
|
fmt.Println("")
|
|
|
- fmt.Println("** First time installation. **")
|
|
|
- fmt.Println("** IMPORTANT: This will wipe existing listmonk tables and types. **")
|
|
|
+ fmt.Println("** First time installation **")
|
|
|
+ fmt.Printf("** IMPORTANT: This will wipe existing listmonk tables and types in the DB '%s' **",
|
|
|
+ viper.GetString("db.database"))
|
|
|
fmt.Println("")
|
|
|
|
|
|
- for len(email) == 0 {
|
|
|
- fmt.Print("Enter the superadmin login e-mail: ")
|
|
|
- if _, err = fmt.Scanf("%s", &email); err != nil {
|
|
|
- logger.Fatalf("Error reading e-mail from the terminal: %v", err)
|
|
|
- }
|
|
|
-
|
|
|
- if !emRegex.Match(email) {
|
|
|
- logger.Println("Please enter a valid e-mail")
|
|
|
- email = []byte{}
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for len(pw) < 8 {
|
|
|
- fmt.Print("Enter the superadmin password (min 8 chars): ")
|
|
|
- if pw, err = terminal.ReadPassword(int(syscall.Stdin)); err != nil {
|
|
|
- logger.Fatalf("Error reading password from the terminal: %v", err)
|
|
|
- }
|
|
|
-
|
|
|
- fmt.Println("")
|
|
|
- if len(pw) < 8 {
|
|
|
- logger.Println("Password should be min 8 characters")
|
|
|
- pw = []byte{}
|
|
|
- }
|
|
|
+ var ok string
|
|
|
+ fmt.Print("Continue (y/n)? ")
|
|
|
+ if _, err := fmt.Scanf("%s", &ok); err != nil {
|
|
|
+ logger.Fatalf("Error reading value from terminal: %v", err)
|
|
|
}
|
|
|
-
|
|
|
- for len(pw2) < 8 {
|
|
|
- fmt.Print("Repeat the superadmin password: ")
|
|
|
- if pw2, err = terminal.ReadPassword(int(syscall.Stdin)); err != nil {
|
|
|
- logger.Fatalf("Error reading password from the terminal: %v", err)
|
|
|
- }
|
|
|
-
|
|
|
- fmt.Println("")
|
|
|
- if len(pw2) < 8 {
|
|
|
- logger.Println("Password should be min 8 characters")
|
|
|
- pw2 = []byte{}
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Validate.
|
|
|
- if !bytes.Equal(pw, pw2) {
|
|
|
- logger.Fatalf("Passwords don't match")
|
|
|
- }
|
|
|
-
|
|
|
- // Hash the password.
|
|
|
- hash, err := bcrypt.GenerateFromPassword(pw, bcrypt.DefaultCost)
|
|
|
- if err != nil {
|
|
|
- logger.Fatalf("Error hashing password: %v", err)
|
|
|
+ if strings.ToLower(ok) != "y" {
|
|
|
+ fmt.Println("Installation cancelled.")
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
// Migrate the tables.
|
|
|
- err = installMigrate(app.DB, app)
|
|
|
+ err := installMigrate(app.DB, app)
|
|
|
if err != nil {
|
|
|
logger.Fatalf("Error migrating DB schema: %v", err)
|
|
|
}
|
|
@@ -95,17 +44,6 @@ func install(app *App, qMap goyesql.Queries) {
|
|
|
logger.Fatalf("error loading SQL queries: %v", err)
|
|
|
}
|
|
|
|
|
|
- // Create the superadmin user.
|
|
|
- if _, err := q.CreateUser.Exec(
|
|
|
- string(email),
|
|
|
- models.UserTypeSuperadmin, // name
|
|
|
- string(hash),
|
|
|
- models.UserTypeSuperadmin,
|
|
|
- models.UserStatusEnabled,
|
|
|
- ); err != nil {
|
|
|
- logger.Fatalf("Error creating superadmin user: %v", err)
|
|
|
- }
|
|
|
-
|
|
|
// Sample list.
|
|
|
var listID int
|
|
|
if err := q.CreateList.Get(&listID,
|
|
@@ -118,11 +56,10 @@ func install(app *App, qMap goyesql.Queries) {
|
|
|
}
|
|
|
|
|
|
// Sample subscriber.
|
|
|
- name := bytes.Split(email, []byte("@"))
|
|
|
if _, err := q.UpsertSubscriber.Exec(
|
|
|
uuid.NewV4(),
|
|
|
- email,
|
|
|
- bytes.Title(name[0]),
|
|
|
+ "test@test.com",
|
|
|
+ "Test Subscriber",
|
|
|
`{"type": "known", "good": true}`,
|
|
|
pq.Int64Array{int64(listID)},
|
|
|
); err != nil {
|
|
@@ -147,8 +84,7 @@ func install(app *App, qMap goyesql.Queries) {
|
|
|
}
|
|
|
|
|
|
logger.Printf("Setup complete")
|
|
|
- logger.Printf(`Run the program and login with the username "superadmin" and your password at %s`,
|
|
|
- viper.GetString("server.address"))
|
|
|
+ logger.Printf(`Run the program view it at %s`, viper.GetString("app.address"))
|
|
|
|
|
|
}
|
|
|
|