@@ -54,6 +54,7 @@ type sshConfigOptions struct {
54
54
disableAutostart bool
55
55
header []string
56
56
headerCommand string
57
+ removedKeys map [string ]bool
57
58
}
58
59
59
60
// addOptions expects options in the form of "option=value" or "option value".
@@ -74,30 +75,19 @@ func (o *sshConfigOptions) addOption(option string) error {
74
75
if err != nil {
75
76
return err
76
77
}
77
- for i , existing := range o .sshOptions {
78
- // Override existing option if they share the same key.
79
- // This is case-insensitive. Parsing each time might be a little slow,
80
- // but it is ok.
81
- existingKey , _ , err := codersdk .ParseSSHConfigOption (existing )
82
- if err != nil {
83
- // Don't mess with original values if there is an error.
84
- // This could have come from the user's manual edits.
85
- continue
86
- }
87
- if strings .EqualFold (existingKey , key ) {
88
- if value == "" {
89
- // Delete existing option.
90
- o .sshOptions = append (o .sshOptions [:i ], o .sshOptions [i + 1 :]... )
91
- } else {
92
- // Override existing option.
93
- o .sshOptions [i ] = option
94
- }
95
- return nil
96
- }
78
+ if o .removedKeys != nil && o .removedKeys [key ] {
79
+ // Key marked as removed, skip.
80
+ return nil
97
81
}
98
- // Only append the option if it is not empty.
82
+ // Only append the option if it is not empty
83
+ // (we interpret empty as removal).
99
84
if value != "" {
100
85
o .sshOptions = append (o .sshOptions , option )
86
+ } else {
87
+ if o .removedKeys == nil {
88
+ o .removedKeys = make (map [string ]bool )
89
+ }
90
+ o .removedKeys [key ] = true
101
91
}
102
92
return nil
103
93
}
@@ -440,26 +430,29 @@ func (r *RootCmd) configSSH() *serpent.Command {
440
430
configOptions := sshConfigOpts
441
431
configOptions .sshOptions = nil
442
432
443
- // Add standard options.
444
- err := configOptions .addOptions (defaultOptions ... )
445
- if err != nil {
446
- return err
433
+ // User options first (SSH only uses the first
434
+ // option unless it can be given multiple times)
435
+ for _ , opt := range sshConfigOpts .sshOptions {
436
+ err := configOptions .addOptions (opt )
437
+ if err != nil {
438
+ return xerrors .Errorf ("add flag config option %q: %w" , opt , err )
439
+ }
447
440
}
448
441
449
- // Override with deployment options
442
+ // Deployment options second, allow them to
443
+ // override standard options.
450
444
for k , v := range coderdConfig .SSHConfigOptions {
451
445
opt := fmt .Sprintf ("%s %s" , k , v )
452
446
err := configOptions .addOptions (opt )
453
447
if err != nil {
454
448
return xerrors .Errorf ("add coderd config option %q: %w" , opt , err )
455
449
}
456
450
}
457
- // Override with flag options
458
- for _ , opt := range sshConfigOpts .sshOptions {
459
- err := configOptions .addOptions (opt )
460
- if err != nil {
461
- return xerrors .Errorf ("add flag config option %q: %w" , opt , err )
462
- }
451
+
452
+ // Finally, add the standard options.
453
+ err := configOptions .addOptions (defaultOptions ... )
454
+ if err != nil {
455
+ return err
463
456
}
464
457
465
458
hostBlock := []string {
0 commit comments