apc-p15-tool/pkg/app/cmd_install.go
Greg T. Wallace dda11df624 install: add support for native ssl command
The code should auto-select the native ssl method if the ssl command is available on the UPS.

If this fails, install will drop back to the original install method used by this tool (which works on NMC2).
2024-06-06 22:52:54 -04:00

90 lines
2.5 KiB
Go

package app
import (
"apc-p15-tool/pkg/apcssh"
"context"
"errors"
"fmt"
)
// cmdInstall is the app's command to create apc p15 file content from key and cert
// pem files and upload the p15 to the specified APC UPS
func (app *app) cmdInstall(cmdCtx context.Context, args []string) error {
// done
defer app.stdLogger.Println("install: done")
// extra args == error
if len(args) != 0 {
return fmt.Errorf("install: failed, %w (%d)", ErrExtraArgs, len(args))
}
// must have username
if app.config.install.username == nil || *app.config.install.username == "" {
return errors.New("install: failed, username not specified")
}
// must have password
if app.config.install.password == nil || *app.config.install.password == "" {
return errors.New("install: failed, password not specified")
}
// must have fingerprint
if app.config.install.fingerprint == nil || *app.config.install.fingerprint == "" {
return errors.New("install: failed, fingerprint not specified")
}
keyPem, certPem, err := app.config.install.keyCertPemCfg.GetPemBytes("install")
if err != nil {
return err
}
// host to install on must be specified
if app.config.install.hostAndPort == nil || *app.config.install.hostAndPort == "" {
return errors.New("install: failed, apc host not specified")
}
// validation done
// make p15 file
keyP15, keyCertP15, err := app.pemToAPCP15(keyPem, certPem, "install")
if err != nil {
return err
}
// make APC SSH client
cfg := &apcssh.Config{
Hostname: *app.config.install.hostAndPort,
Username: *app.config.install.username,
Password: *app.config.install.password,
ServerFingerprint: *app.config.install.fingerprint,
InsecureCipher: *app.config.install.insecureCipher,
}
client, err := apcssh.New(cfg)
if err != nil {
return fmt.Errorf("install: failed to connect to host (%w)", err)
}
// install SSL Cert
err = client.InstallSSLCert(keyP15, certPem, keyCertP15)
if err != nil {
return fmt.Errorf("install: failed to send file to ups over scp (%w)", err)
}
// installed
app.stdLogger.Printf("install: apc p15 file installed on %s", *app.config.install.hostAndPort)
// restart UPS webUI
if app.config.install.restartWebUI != nil && *app.config.install.restartWebUI {
app.stdLogger.Println("install: sending restart command")
err = client.RestartWebUI()
if err != nil {
return fmt.Errorf("install: failed to send webui restart command (%w)", err)
}
app.stdLogger.Println("install: sent webui restart command")
}
return nil
}