@ -66,10 +66,8 @@ func Generate(options Options) (*manifestgen.Manifest, error) {
switch {
switch {
case options . Username != "" && options . Password != "" :
case options . Username != "" && options . Password != "" :
// noop
// noop
case len ( options . PrivateKeyPath ) > 0 :
case options . Keypair != nil :
if keypair , err = loadKeyPair ( options . PrivateKeyPath , options . Password ) ; err != nil {
keypair = options . Keypair
return nil , err
}
case len ( options . PrivateKeyAlgorithm ) > 0 :
case len ( options . PrivateKeyAlgorithm ) > 0 :
if keypair , err = generateKeyPair ( options ) ; err != nil {
if keypair , err = generateKeyPair ( options ) ; err != nil {
return nil , err
return nil , err
@ -83,23 +81,6 @@ func Generate(options Options) (*manifestgen.Manifest, error) {
}
}
}
}
var caFile [ ] byte
if options . CAFilePath != "" {
if caFile , err = os . ReadFile ( options . CAFilePath ) ; err != nil {
return nil , fmt . Errorf ( "failed to read CA file: %w" , err )
}
}
var certFile , keyFile [ ] byte
if options . CertFilePath != "" && options . KeyFilePath != "" {
if certFile , err = os . ReadFile ( options . CertFilePath ) ; err != nil {
return nil , fmt . Errorf ( "failed to read cert file: %w" , err )
}
if keyFile , err = os . ReadFile ( options . KeyFilePath ) ; err != nil {
return nil , fmt . Errorf ( "failed to read key file: %w" , err )
}
}
var dockerCfgJson [ ] byte
var dockerCfgJson [ ] byte
if options . Registry != "" {
if options . Registry != "" {
dockerCfgJson , err = generateDockerConfigJson ( options . Registry , options . Username , options . Password )
dockerCfgJson , err = generateDockerConfigJson ( options . Registry , options . Username , options . Password )
@ -108,7 +89,7 @@ func Generate(options Options) (*manifestgen.Manifest, error) {
}
}
}
}
secret := buildSecret ( keypair , hostKey , caFile, certFile , k eyFile, dockerCfgJson , options )
secret := buildSecret ( keypair , hostKey , options. CAFile , options . CertFile , options . K eyFile, dockerCfgJson , options )
b , err := yaml . Marshal ( secret )
b , err := yaml . Marshal ( secret )
if err != nil {
if err != nil {
return nil , err
return nil , err
@ -120,6 +101,35 @@ func Generate(options Options) (*manifestgen.Manifest, error) {
} , nil
} , nil
}
}
func LoadKeyPairFromPath ( path , password string ) ( * ssh . KeyPair , error ) {
if path == "" {
return nil , nil
}
b , err := os . ReadFile ( path )
if err != nil {
return nil , fmt . Errorf ( "failed to open private key file: %w" , err )
}
return LoadKeyPair ( b , password )
}
func LoadKeyPair ( privateKey [ ] byte , password string ) ( * ssh . KeyPair , error ) {
var ppk cryptssh . Signer
var err error
if password != "" {
ppk , err = cryptssh . ParsePrivateKeyWithPassphrase ( privateKey , [ ] byte ( password ) )
} else {
ppk , err = cryptssh . ParsePrivateKey ( privateKey )
}
if err != nil {
return nil , err
}
return & ssh . KeyPair {
PublicKey : cryptssh . MarshalAuthorizedKey ( ppk . PublicKey ( ) ) ,
PrivateKey : privateKey ,
} , nil
}
func buildSecret ( keypair * ssh . KeyPair , hostKey , caFile , certFile , keyFile , dockerCfg [ ] byte , options Options ) ( secret corev1 . Secret ) {
func buildSecret ( keypair * ssh . KeyPair , hostKey , caFile , certFile , keyFile , dockerCfg [ ] byte , options Options ) ( secret corev1 . Secret ) {
secret . TypeMeta = metav1 . TypeMeta {
secret . TypeMeta = metav1 . TypeMeta {
APIVersion : "v1" ,
APIVersion : "v1" ,
@ -143,16 +153,16 @@ func buildSecret(keypair *ssh.KeyPair, hostKey, caFile, certFile, keyFile, docke
secret . StringData [ PasswordSecretKey ] = options . Password
secret . StringData [ PasswordSecretKey ] = options . Password
}
}
if caFile != nil {
if len ( caFile ) != 0 {
secret . StringData [ CAFileSecretKey ] = string ( caFile )
secret . StringData [ CAFileSecretKey ] = string ( caFile )
}
}
if certFile != nil && keyFile != nil {
if len ( certFile ) != 0 && len ( keyFile ) != 0 {
secret . StringData [ CertFileSecretKey ] = string ( certFile )
secret . StringData [ CertFileSecretKey ] = string ( certFile )
secret . StringData [ KeyFileSecretKey ] = string ( keyFile )
secret . StringData [ KeyFileSecretKey ] = string ( keyFile )
}
}
if keypair != nil && hostKey != nil {
if keypair != nil && len ( hostKey ) != 0 {
secret . StringData [ PrivateKeySecretKey ] = string ( keypair . PrivateKey )
secret . StringData [ PrivateKeySecretKey ] = string ( keypair . PrivateKey )
secret . StringData [ PublicKeySecretKey ] = string ( keypair . PublicKey )
secret . StringData [ PublicKeySecretKey ] = string ( keypair . PublicKey )
secret . StringData [ KnownHostsSecretKey ] = string ( hostKey )
secret . StringData [ KnownHostsSecretKey ] = string ( hostKey )
@ -165,29 +175,6 @@ func buildSecret(keypair *ssh.KeyPair, hostKey, caFile, certFile, keyFile, docke
return
return
}
}
func loadKeyPair ( path string , password string ) ( * ssh . KeyPair , error ) {
b , err := os . ReadFile ( path )
if err != nil {
return nil , fmt . Errorf ( "failed to open private key file: %w" , err )
}
var ppk cryptssh . Signer
if password != "" {
ppk , err = cryptssh . ParsePrivateKeyWithPassphrase ( b , [ ] byte ( password ) )
} else {
ppk , err = cryptssh . ParsePrivateKey ( b )
}
if err != nil {
return nil , err
}
return & ssh . KeyPair {
PublicKey : cryptssh . MarshalAuthorizedKey ( ppk . PublicKey ( ) ) ,
PrivateKey : b ,
} , nil
}
func generateKeyPair ( options Options ) ( * ssh . KeyPair , error ) {
func generateKeyPair ( options Options ) ( * ssh . KeyPair , error ) {
var keyGen ssh . KeyPairGenerator
var keyGen ssh . KeyPairGenerator
switch options . PrivateKeyAlgorithm {
switch options . PrivateKeyAlgorithm {