FemaInstaller/internal/installer/installer.go

97 lines
2.5 KiB
Go

package installer
import (
"fmt"
"os"
"gitea.unprism.ru/KRBL/FemaInstaller/internal/ssh"
"gitea.unprism.ru/KRBL/FemaInstaller/pkg/config"
"gitea.unprism.ru/KRBL/FemaInstaller/pkg/fileutils"
)
// Installer handles the installation process
type Installer struct {
DefaultSettings string
}
// NewInstaller creates a new installer with the provided default settings
func NewInstaller(defaultSettings string) *Installer {
return &Installer{
DefaultSettings: defaultSettings,
}
}
// Install performs the installation process
func (i *Installer) Install(sshConfig *config.SSHConfig) error {
// Validate serial number
if len([]rune(sshConfig.Serial)) != 16 {
return fmt.Errorf("serial number must be 16 characters")
}
// Update settings with user configuration
updatedSettings, err := config.UpdateSettingsJSON(i.DefaultSettings, sshConfig)
if err != nil {
return fmt.Errorf("failed to update settings: %w", err)
}
// Save updated settings to file
err = config.SaveSettingsJSON(updatedSettings, "settings.json")
if err != nil {
return fmt.Errorf("failed to save settings: %w", err)
}
// Create SSH client configuration
clientConfig := ssh.NewClientConfig(
sshConfig.IP,
sshConfig.Port,
sshConfig.Login,
sshConfig.Password,
)
// Connect to SSH server
sshClient, err := ssh.CreateSSHClient(clientConfig)
if err != nil {
return fmt.Errorf("SSH connection failed: %w", err)
}
defer sshClient.Close()
// Create SFTP client
sftpClient, err := ssh.CreateSFTPClient(clientConfig)
if err != nil {
return fmt.Errorf("SFTP connection failed: %w", err)
}
defer sftpClient.Close()
// Upload archive
remotePath := "/root/dict.tar"
if err = fileutils.UploadFile(sftpClient, sshConfig.ArchivePath, remotePath); err != nil {
return fmt.Errorf("file upload failed: %w", err)
}
// Upload settings
settingsPath := "/root/settings.json"
if err = fileutils.UploadFile(sftpClient, "settings.json", settingsPath); err != nil {
return fmt.Errorf("settings upload failed: %w", err)
}
// Execute installation commands
commands := []string{
"tar -xf /root/dict.tar -C /root/",
"mkdir -p /root/fema/storage",
"mv -f ~/settings.json /root/fema/storage",
"chmod +x /root/dict/*",
fmt.Sprintf("sudo /root/dict/install.sh -s %s", sshConfig.Serial),
}
for _, cmd := range commands {
if err := ssh.ExecuteCommand(sshClient, cmd); err != nil {
return fmt.Errorf("command execution failed: %w", err)
}
}
// Clean up temporary files
os.Remove("settings.json")
return nil
}