2024-02-02 23:35:21 +00:00
|
|
|
package app
|
|
|
|
|
|
|
|
import (
|
2024-06-07 02:51:12 +00:00
|
|
|
"apc-p15-tool/pkg/apcssh"
|
2024-02-02 23:35:21 +00:00
|
|
|
"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 {
|
2024-02-05 23:25:55 +00:00
|
|
|
// done
|
|
|
|
defer app.stdLogger.Println("install: done")
|
|
|
|
|
2024-02-02 23:35:21 +00:00
|
|
|
// 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")
|
|
|
|
}
|
|
|
|
|
2024-02-02 23:35:22 +00:00
|
|
|
keyPem, certPem, err := app.config.install.keyCertPemCfg.GetPemBytes("install")
|
|
|
|
if err != nil {
|
|
|
|
return err
|
2024-02-02 23:35:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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
|
2024-06-07 02:51:12 +00:00
|
|
|
keyP15, keyCertP15, err := app.pemToAPCP15(keyPem, certPem, "install")
|
2024-02-02 23:35:21 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2024-06-07 02:51:12 +00:00
|
|
|
// 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,
|
2024-02-02 23:35:21 +00:00
|
|
|
}
|
|
|
|
|
2024-06-07 02:51:12 +00:00
|
|
|
client, err := apcssh.New(cfg)
|
2024-02-02 23:35:21 +00:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("install: failed to connect to host (%w)", err)
|
|
|
|
}
|
|
|
|
|
2024-06-07 02:51:12 +00:00
|
|
|
// install SSL Cert
|
2024-06-07 02:51:12 +00:00
|
|
|
err = client.InstallSSLCert(keyP15, certPem, keyCertP15)
|
2024-02-02 23:35:21 +00:00
|
|
|
if err != nil {
|
2024-06-07 02:51:12 +00:00
|
|
|
return fmt.Errorf("install: failed to send file to ups over scp (%w)", err)
|
2024-02-02 23:35:21 +00:00
|
|
|
}
|
|
|
|
|
2024-02-05 23:25:55 +00:00
|
|
|
// installed
|
2024-02-03 16:38:31 +00:00
|
|
|
app.stdLogger.Printf("install: apc p15 file installed on %s", *app.config.install.hostAndPort)
|
2024-02-02 23:35:21 +00:00
|
|
|
|
2024-02-05 23:25:55 +00:00
|
|
|
// restart UPS webUI
|
|
|
|
if app.config.install.restartWebUI != nil && *app.config.install.restartWebUI {
|
|
|
|
app.stdLogger.Println("install: sending restart command")
|
|
|
|
|
2024-06-07 02:51:12 +00:00
|
|
|
err = client.RestartWebUI()
|
2024-02-05 23:25:55 +00:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("install: failed to send webui restart command (%w)", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
app.stdLogger.Println("install: sent webui restart command")
|
|
|
|
}
|
|
|
|
|
2024-02-02 23:35:21 +00:00
|
|
|
return nil
|
|
|
|
}
|