mirror of
https://github.com/danderson/netboot.git
synced 2025-10-16 18:11:21 +02:00
pixiecore/cli: unify flags related to Pixiecore server configuration.
This commit is contained in:
parent
f54844f56e
commit
37e2de8ead
@ -41,36 +41,20 @@ the Pixiecore boot API. The specification can be found at <TODO>.`,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
fatalf("Error reading flag: %s", err)
|
fatalf("Error reading flag: %s", err)
|
||||||
}
|
}
|
||||||
debug, err := cmd.Flags().GetBool("debug")
|
|
||||||
if err != nil {
|
|
||||||
fatalf("Error reading flag: %s", err)
|
|
||||||
}
|
|
||||||
timestamps, err := cmd.Flags().GetBool("log-timestamps")
|
|
||||||
if err != nil {
|
|
||||||
fatalf("Error reading flag: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
booter, err := pixiecore.APIBooter(server, timeout)
|
booter, err := pixiecore.APIBooter(server, timeout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatalf("Failed to create API booter: %s", err)
|
fatalf("Failed to create API booter: %s", err)
|
||||||
}
|
}
|
||||||
s := &pixiecore.Server{
|
s := serverFromFlags(cmd)
|
||||||
Booter: booter,
|
s.Booter = booter
|
||||||
Ipxe: Ipxe,
|
|
||||||
Log: logWithStdFmt,
|
|
||||||
}
|
|
||||||
if timestamps {
|
|
||||||
s.Log = logWithStdLog
|
|
||||||
}
|
|
||||||
if debug {
|
|
||||||
s.Debug = s.Log
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(s.Serve())
|
fmt.Println(s.Serve())
|
||||||
}}
|
}}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.AddCommand(apiCmd)
|
rootCmd.AddCommand(apiCmd)
|
||||||
|
serverConfigFlags(apiCmd)
|
||||||
apiCmd.Flags().Duration("api-request-timeout", 5*time.Second, "Timeout for request to the API server")
|
apiCmd.Flags().Duration("api-request-timeout", 5*time.Second, "Timeout for request to the API server")
|
||||||
// TODO: SSL cert flags for both client and server auth.
|
// TODO: SSL cert flags for both client and server auth.
|
||||||
}
|
}
|
||||||
|
@ -38,14 +38,6 @@ var bootCmd = &cobra.Command{
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
fatalf("Error reading flag: %s", err)
|
fatalf("Error reading flag: %s", err)
|
||||||
}
|
}
|
||||||
debug, err := cmd.Flags().GetBool("debug")
|
|
||||||
if err != nil {
|
|
||||||
fatalf("Error reading flag: %s", err)
|
|
||||||
}
|
|
||||||
timestamps, err := cmd.Flags().GetBool("log-timestamps")
|
|
||||||
if err != nil {
|
|
||||||
fatalf("Error reading flag: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
spec := &pixiecore.Spec{
|
spec := &pixiecore.Spec{
|
||||||
Kernel: pixiecore.ID(kernel),
|
Kernel: pixiecore.ID(kernel),
|
||||||
@ -61,17 +53,8 @@ var bootCmd = &cobra.Command{
|
|||||||
fatalf("Couldn't make static booter: %s", err)
|
fatalf("Couldn't make static booter: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
s := &pixiecore.Server{
|
s := serverFromFlags(cmd)
|
||||||
Booter: booter,
|
s.Booter = booter
|
||||||
Ipxe: Ipxe,
|
|
||||||
Log: logWithStdFmt,
|
|
||||||
}
|
|
||||||
if timestamps {
|
|
||||||
s.Log = logWithStdLog
|
|
||||||
}
|
|
||||||
if debug {
|
|
||||||
s.Debug = s.Log
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(s.Serve())
|
fmt.Println(s.Serve())
|
||||||
},
|
},
|
||||||
@ -79,6 +62,7 @@ var bootCmd = &cobra.Command{
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.AddCommand(bootCmd)
|
rootCmd.AddCommand(bootCmd)
|
||||||
|
serverConfigFlags(bootCmd)
|
||||||
bootCmd.Flags().String("cmdline", "", "Kernel commandline arguments")
|
bootCmd.Flags().String("cmdline", "", "Kernel commandline arguments")
|
||||||
bootCmd.Flags().String("bootmsg", "", "Message to print on machines before booting")
|
bootCmd.Flags().String("bootmsg", "", "Message to print on machines before booting")
|
||||||
}
|
}
|
||||||
|
@ -35,13 +35,6 @@ var Ipxe = map[pixiecore.Firmware][]byte{}
|
|||||||
//
|
//
|
||||||
// This function always exits back to the OS when finished.
|
// This function always exits back to the OS when finished.
|
||||||
func CLI() {
|
func CLI() {
|
||||||
// The ipxe firmware flags need to be set outside init(), so that
|
|
||||||
// the default flag value is computed appropriately based on
|
|
||||||
// whether the caller preseeded Ipxe.
|
|
||||||
rootCmd.PersistentFlags().Var(ipxeFirmwareFlag(pixiecore.FirmwareX86PC), "ipxe-bios", "iPXE binary for BIOS/UNDI")
|
|
||||||
rootCmd.PersistentFlags().Var(ipxeFirmwareFlag(pixiecore.FirmwareEFI32), "ipxe-efi32", "iPXE binary for 32-bit UEFI")
|
|
||||||
rootCmd.PersistentFlags().Var(ipxeFirmwareFlag(pixiecore.FirmwareEFI64), "ipxe-efi64", "iPXE binary for 64-bit UEFI")
|
|
||||||
|
|
||||||
if v1compatCLI() {
|
if v1compatCLI() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -60,36 +53,6 @@ var rootCmd = &cobra.Command{
|
|||||||
Long: `Pixiecore is a tool to make network booting easy.`,
|
Long: `Pixiecore is a tool to make network booting easy.`,
|
||||||
}
|
}
|
||||||
|
|
||||||
type ipxeFirmwareFlag pixiecore.Firmware
|
|
||||||
|
|
||||||
func (iff ipxeFirmwareFlag) String() string {
|
|
||||||
if Ipxe[pixiecore.Firmware(iff)] != nil {
|
|
||||||
return "<builtin>"
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (iff ipxeFirmwareFlag) Set(v string) error {
|
|
||||||
bs, err := ioutil.ReadFile(v)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("couldn't read ipxe binary %q: %s", v, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
Ipxe[pixiecore.Firmware(iff)] = bs
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ipxeFirmwareFlag) Type() string {
|
|
||||||
return "filename"
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
cobra.OnInitialize(initConfig)
|
|
||||||
rootCmd.PersistentFlags().BoolP("debug", "d", false, "Log more things that aren't directly related to booting a recognized client")
|
|
||||||
rootCmd.PersistentFlags().BoolP("log-timestamps", "t", false, "Add a timestamp to each log line")
|
|
||||||
}
|
|
||||||
|
|
||||||
func initConfig() {
|
func initConfig() {
|
||||||
viper.SetEnvPrefix("pixiecore")
|
viper.SetEnvPrefix("pixiecore")
|
||||||
viper.AutomaticEnv() // read in environment variables that match
|
viper.AutomaticEnv() // read in environment variables that match
|
||||||
@ -103,3 +66,90 @@ func fatalf(msg string, args ...interface{}) {
|
|||||||
func todo(msg string, args ...interface{}) {
|
func todo(msg string, args ...interface{}) {
|
||||||
fatalf("TODO: "+msg, args...)
|
fatalf("TODO: "+msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func serverConfigFlags(cmd *cobra.Command) {
|
||||||
|
cmd.Flags().BoolP("debug", "d", false, "Log more things that aren't directly related to booting a recognized client")
|
||||||
|
cmd.Flags().BoolP("log-timestamps", "t", false, "Add a timestamp to each log line")
|
||||||
|
cmd.Flags().IPP("listen-addr", "l", nil, "IPv4 address to listen on")
|
||||||
|
cmd.Flags().IntP("port", "p", 80, "Port to listen on for HTTP")
|
||||||
|
cmd.Flags().String("ipxe-bios", "", "path to an iPXE binary for BIOS/UNDI")
|
||||||
|
cmd.Flags().String("ipxe-efi32", "", "path to an iPXE binary for 32-bit UEFI")
|
||||||
|
cmd.Flags().String("ipxe-efi64", "", "path to an iPXE binary for 64-bit UEFI")
|
||||||
|
}
|
||||||
|
|
||||||
|
func mustFile(path string) []byte {
|
||||||
|
bs, err := ioutil.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
fatalf("couldn't read file %q: %s", path, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return bs
|
||||||
|
}
|
||||||
|
|
||||||
|
func serverFromFlags(cmd *cobra.Command) *pixiecore.Server {
|
||||||
|
debug, err := cmd.Flags().GetBool("debug")
|
||||||
|
if err != nil {
|
||||||
|
fatalf("Error reading flag: %s", err)
|
||||||
|
}
|
||||||
|
timestamps, err := cmd.Flags().GetBool("log-timestamps")
|
||||||
|
if err != nil {
|
||||||
|
fatalf("Error reading flag: %s", err)
|
||||||
|
}
|
||||||
|
addr, err := cmd.Flags().GetIP("listen-addr")
|
||||||
|
if err != nil {
|
||||||
|
fatalf("Error reading flag: %s", err)
|
||||||
|
}
|
||||||
|
httpPort, err := cmd.Flags().GetInt("port")
|
||||||
|
if err != nil {
|
||||||
|
fatalf("Error reading flag: %s", err)
|
||||||
|
}
|
||||||
|
ipxeBios, err := cmd.Flags().GetString("ipxe-bios")
|
||||||
|
if err != nil {
|
||||||
|
fatalf("Error reading flag: %s", err)
|
||||||
|
}
|
||||||
|
ipxeEFI32, err := cmd.Flags().GetString("ipxe-efi32")
|
||||||
|
if err != nil {
|
||||||
|
fatalf("Error reading flag: %s", err)
|
||||||
|
}
|
||||||
|
ipxeEFI64, err := cmd.Flags().GetString("ipxe-efi64")
|
||||||
|
if err != nil {
|
||||||
|
fatalf("Error reading flag: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if addr != nil && addr.To4() == nil {
|
||||||
|
fatalf("Listen address must be IPv4")
|
||||||
|
}
|
||||||
|
if httpPort <= 0 {
|
||||||
|
fatalf("HTTP port must be >0")
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := &pixiecore.Server{
|
||||||
|
Ipxe: map[pixiecore.Firmware][]byte{},
|
||||||
|
Log: logWithStdFmt,
|
||||||
|
HTTPPort: httpPort,
|
||||||
|
}
|
||||||
|
for fwtype, bs := range Ipxe {
|
||||||
|
ret.Ipxe[fwtype] = bs
|
||||||
|
}
|
||||||
|
if ipxeBios != "" {
|
||||||
|
ret.Ipxe[pixiecore.FirmwareX86PC] = mustFile(ipxeBios)
|
||||||
|
}
|
||||||
|
if ipxeEFI32 != "" {
|
||||||
|
ret.Ipxe[pixiecore.FirmwareEFI32] = mustFile(ipxeEFI32)
|
||||||
|
}
|
||||||
|
if ipxeEFI64 != "" {
|
||||||
|
ret.Ipxe[pixiecore.FirmwareEFI64] = mustFile(ipxeEFI64)
|
||||||
|
}
|
||||||
|
|
||||||
|
if timestamps {
|
||||||
|
ret.Log = logWithStdLog
|
||||||
|
}
|
||||||
|
if debug {
|
||||||
|
ret.Debug = ret.Log
|
||||||
|
}
|
||||||
|
if addr != nil {
|
||||||
|
ret.Address = addr.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user