2018-05-04 16:53:21 +00:00
package main
import (
2021-11-22 14:13:26 +00:00
"errors"
2018-05-04 16:53:21 +00:00
"fmt"
2018-05-22 23:57:56 +00:00
"os"
2018-05-04 16:53:21 +00:00
2021-11-15 14:11:38 +00:00
"github.com/fleetdm/fleet/v4/server/contexts/ctxerr"
2021-06-26 04:46:51 +00:00
"github.com/fleetdm/fleet/v4/server/service"
2021-03-13 00:42:38 +00:00
"github.com/urfave/cli/v2"
2018-05-22 23:57:56 +00:00
"golang.org/x/crypto/ssh/terminal"
2018-05-04 16:53:21 +00:00
)
2021-03-13 00:42:38 +00:00
func setupCommand ( ) * cli . Command {
2018-05-04 16:53:21 +00:00
var (
flEmail string
2021-06-24 20:42:29 +00:00
flName string
2018-05-04 16:53:21 +00:00
flPassword string
flOrgName string
)
2021-03-13 00:42:38 +00:00
return & cli . Command {
2018-05-04 16:53:21 +00:00
Name : "setup" ,
2021-02-02 20:16:59 +00:00
Usage : "Set up a Fleet instance" ,
2019-01-02 23:27:37 +00:00
UsageText : ` fleetctl setup [options] ` ,
2018-05-04 16:53:21 +00:00
Flags : [ ] cli . Flag {
2021-03-13 00:42:38 +00:00
& cli . StringFlag {
2018-05-04 16:53:21 +00:00
Name : "email" ,
2021-03-13 00:42:38 +00:00
EnvVars : [ ] string { "EMAIL" } ,
2018-05-04 16:53:21 +00:00
Value : "" ,
Destination : & flEmail ,
2021-06-24 20:42:29 +00:00
Usage : "Email of the admin user to create (required)" ,
Required : true ,
2018-05-04 16:53:21 +00:00
} ,
2021-03-13 00:42:38 +00:00
& cli . StringFlag {
2021-06-24 20:42:29 +00:00
Name : "name" ,
EnvVars : [ ] string { "NAME" } ,
2019-01-02 23:27:37 +00:00
Value : "" ,
2021-06-24 20:42:29 +00:00
Destination : & flName ,
Usage : "Name or nickname of the admin user to create (required)" ,
Required : true ,
2019-01-02 23:27:37 +00:00
} ,
2021-03-13 00:42:38 +00:00
& cli . StringFlag {
2018-05-04 16:53:21 +00:00
Name : "password" ,
2021-03-13 00:42:38 +00:00
EnvVars : [ ] string { "PASSWORD" } ,
2018-05-04 16:53:21 +00:00
Value : "" ,
Destination : & flPassword ,
2018-05-22 23:57:56 +00:00
Usage : "Password for the admin user (recommended to use interactive entry)" ,
2018-05-04 16:53:21 +00:00
} ,
2021-03-13 00:42:38 +00:00
& cli . StringFlag {
2018-05-04 16:53:21 +00:00
Name : "org-name" ,
2021-03-13 00:42:38 +00:00
EnvVars : [ ] string { "ORG_NAME" } ,
2018-05-04 16:53:21 +00:00
Value : "" ,
Destination : & flOrgName ,
2021-06-24 20:42:29 +00:00
Usage : "Name of the organization (required)" ,
Required : true ,
2018-05-04 16:53:21 +00:00
} ,
2021-02-03 02:55:16 +00:00
configFlag ( ) ,
contextFlag ( ) ,
debugFlag ( ) ,
2018-05-04 16:53:21 +00:00
} ,
Action : func ( c * cli . Context ) error {
2018-07-16 16:35:21 +00:00
fleet , err := unauthenticatedClientFromCLI ( c )
2018-05-04 16:53:21 +00:00
if err != nil {
return err
}
2018-05-17 14:29:04 +00:00
if flPassword == "" {
2018-05-22 23:57:56 +00:00
fmt . Print ( "Password: " )
passBytes , err := terminal . ReadPassword ( int ( os . Stdin . Fd ( ) ) )
if err != nil {
2021-11-22 14:13:26 +00:00
return fmt . Errorf ( "error reading password: %w" , err )
2018-05-22 23:57:56 +00:00
}
fmt . Println ( )
flPassword = string ( passBytes )
2018-07-16 17:03:50 +00:00
fmt . Print ( "Confirm Password: " )
passBytes , err = terminal . ReadPassword ( int ( os . Stdin . Fd ( ) ) )
if err != nil {
2021-11-22 14:13:26 +00:00
return fmt . Errorf ( "error reading password confirmation: %w" , err )
2018-07-16 17:03:50 +00:00
}
fmt . Println ( )
if flPassword != string ( passBytes ) {
return errors . New ( "passwords do not match" )
}
2018-05-17 14:29:04 +00:00
}
2018-05-22 23:57:56 +00:00
2021-06-24 20:42:29 +00:00
token , err := fleet . Setup ( flEmail , flName , flPassword , flOrgName )
2018-05-04 16:53:21 +00:00
if err != nil {
2021-11-15 14:11:38 +00:00
root := ctxerr . Cause ( err )
switch root . ( type ) {
2018-05-04 16:53:21 +00:00
case service . SetupAlreadyErr :
return err
}
2021-11-22 14:13:26 +00:00
return fmt . Errorf ( "error setting up Fleet: %w" , err )
2018-05-04 16:53:21 +00:00
}
2021-01-29 01:15:38 +00:00
configPath , context := c . String ( "config" ) , c . String ( "context" )
if err := setConfigValue ( configPath , context , "email" , flEmail ) ; err != nil {
2021-11-22 14:13:26 +00:00
return fmt . Errorf ( "error setting email for the current context: %w" , err )
2018-05-04 16:53:21 +00:00
}
2021-01-29 01:15:38 +00:00
if err := setConfigValue ( configPath , context , "token" , token ) ; err != nil {
2021-11-22 14:13:26 +00:00
return fmt . Errorf ( "error setting token for the current context: %w" , err )
2018-05-04 16:53:21 +00:00
}
2022-08-03 18:44:34 +00:00
fmt . Println ( "Fleet Device Management Inc. periodically collects information about your instance.\nSending usage statistics from your Fleet instance is optional and can be disabled in settings." )
2021-06-23 01:02:20 +00:00
fmt . Println ( "[+] Fleet setup successful and context configured!" )
2018-05-04 16:53:21 +00:00
return nil
} ,
}
}