35
35
// SshproxyVersion is set by Makefile
36
36
SshproxyVersion = "0.0.0+noproperlybuilt"
37
37
defaultConfig = "/etc/sshproxy/sshproxy.yaml"
38
- defaultHostPort = "22"
39
38
)
40
39
41
40
func mustInitEtcdClient (configFile string ) * utils.Client {
@@ -536,6 +535,13 @@ func setErrorBanner(errorBanner string, expire time.Time, configFile string) err
536
535
return cli .SetErrorBanner (errorBanner , expire )
537
536
}
538
537
538
+ func delErrorBanner (configFile string ) error {
539
+ cli := mustInitEtcdClient (configFile )
540
+ defer cli .Close ()
541
+
542
+ return cli .DelErrorBanner ()
543
+ }
544
+
539
545
func showErrorBanner (configFile string ) {
540
546
cli := mustInitEtcdClient (configFile )
541
547
defer cli .Close ()
@@ -654,39 +660,53 @@ The options are:
654
660
return fs
655
661
}
656
662
657
- func newEnableParser () * flag.FlagSet {
663
+ func newEnableParser (allFlag * bool , hostString * string , portString * string ) * flag.FlagSet {
658
664
fs := flag .NewFlagSet ("enable" , flag .ExitOnError )
665
+ fs .BoolVar (allFlag , "all" , false , "enable all hosts present in config" )
666
+ fs .StringVar (hostString , "host" , "" , "hostname to enable (can be a nodeset)" )
667
+ fs .StringVar (portString , "port" , "" , "port to enable (can be a nodeset)" )
659
668
fs .Usage = func () {
660
- fmt .Fprintf (flag .CommandLine .Output (), `Usage: %s enable HOST [PORT]
669
+ fmt .Fprintf (flag .CommandLine .Output (), `Usage: %s enable -all|-host HOST [-port PORT]
661
670
662
- Enable a previously disabled host in etcd. The default port is %s. Host and port
663
- can be nodesets.
664
- ` , os . Args [ 0 ], defaultHostPort )
671
+ Enable a previously disabled host in etcd.
672
+ ` , os . Args [ 0 ])
673
+ fs . PrintDefaults ( )
665
674
os .Exit (2 )
666
675
}
667
676
return fs
668
677
}
669
678
670
- func newForgetParser () * flag.FlagSet {
679
+ func newForgetParser (allFlag * bool , hostString * string , portString * string ) * flag.FlagSet {
671
680
fs := flag .NewFlagSet ("forget" , flag .ExitOnError )
681
+ fs .BoolVar (allFlag , "all" , false , "forget all hosts present in config" )
682
+ fs .StringVar (hostString , "host" , "" , "hostname to forget (can be a nodeset)" )
683
+ fs .StringVar (portString , "port" , "" , "port to forget (can be a nodeset)" )
672
684
fs .Usage = func () {
673
- fmt .Fprintf (flag .CommandLine .Output (), `Usage: %s forget HOST [PORT ]
685
+ fmt .Fprintf (flag .CommandLine .Output (), `Usage: %s forget COMMAND [OPTIONS ]
674
686
675
- Forget a host in etcd. The default port is %s. Remember that if this host is
676
- used, it will appear back in the list. Host and port can be nodesets.
677
- ` , os .Args [0 ], defaultHostPort )
687
+ The cammands are:
688
+ host -all|-host HOST [-port PORT] forget a host in etcd
689
+ error_banner forget the error_banner in etcd
690
+
691
+ The options are:
692
+ ` , os .Args [0 ])
693
+ fs .PrintDefaults ()
678
694
os .Exit (2 )
679
695
}
680
696
return fs
681
697
}
682
698
683
- func newDisableParser () * flag.FlagSet {
699
+ func newDisableParser (allFlag * bool , hostString * string , portString * string ) * flag.FlagSet {
684
700
fs := flag .NewFlagSet ("disable" , flag .ExitOnError )
701
+ fs .BoolVar (allFlag , "all" , false , "disable all hosts present in config" )
702
+ fs .StringVar (hostString , "host" , "" , "hostname to disable (can be a nodeset)" )
703
+ fs .StringVar (portString , "port" , "" , "port to disable (can be a nodeset)" )
685
704
fs .Usage = func () {
686
- fmt .Fprintf (flag .CommandLine .Output (), `Usage: %s disable HOST [PORT]
705
+ fmt .Fprintf (flag .CommandLine .Output (), `Usage: %s disable -all|-host HOST [-port PORT]
687
706
688
- Disable a host in etcd. The default port is %s. Host and port can be nodesets.
689
- ` , os .Args [0 ], defaultHostPort )
707
+ Disable a host in etcd.
708
+ ` , os .Args [0 ])
709
+ fs .PrintDefaults ()
690
710
os .Exit (2 )
691
711
}
692
712
return fs
@@ -708,53 +728,73 @@ The options are:
708
728
return fs
709
729
}
710
730
711
- func getHostPortFromCommandLine (args [] string ) ([] string , []string , error ) {
731
+ func getHostPortFromCommandLine (allFlag bool , hostsNodeset string , portsNodeset string , configFile string ) ( []string , error ) {
712
732
_ , nodesetDlclose , nodesetExpand := nodesets .InitExpander ()
713
733
defer nodesetDlclose ()
714
- hostsNodeset , portsNodeset := "" , defaultHostPort
715
- switch len (args ) {
716
- case 2 :
717
- hostsNodeset , portsNodeset = args [0 ], args [1 ]
718
- case 1 :
719
- hostsNodeset = args [0 ]
720
- default :
721
- return []string {}, []string {}, fmt .Errorf ("wrong number of arguments" )
722
- }
723
734
724
- hosts , err := nodesetExpand ( hostsNodeset )
735
+ configDests , err := utils . LoadAllDestsFromConfig ( configFile )
725
736
if err != nil {
726
- return []string {}, [] string {}, fmt .Errorf ("%s" , err )
737
+ return []string {}, fmt .Errorf ("%s" , err )
727
738
}
728
- ports , err := nodesetExpand (portsNodeset )
729
- if err != nil {
730
- return []string {}, []string {}, fmt .Errorf ("%s" , err )
739
+
740
+ if allFlag && portsNodeset == "" {
741
+ return configDests , nil
742
+ }
743
+
744
+ var hosts []string
745
+ if allFlag {
746
+ for _ , configDest := range configDests {
747
+ host , _ , err := utils .SplitHostPort (configDest )
748
+ if err != nil {
749
+ return []string {}, fmt .Errorf ("%s" , err )
750
+ }
751
+ hosts = append (hosts , host )
752
+ }
753
+ } else {
754
+ hosts , err = nodesetExpand (hostsNodeset )
755
+ if err != nil {
756
+ return []string {}, fmt .Errorf ("%s" , err )
757
+ }
758
+ }
759
+
760
+ var ports []string
761
+ if portsNodeset == "" {
762
+ for _ , configDest := range configDests {
763
+ _ , port , err := utils .SplitHostPort (configDest )
764
+ if err != nil {
765
+ return []string {}, fmt .Errorf ("%s" , err )
766
+ }
767
+ ports = append (ports , port )
768
+ }
769
+ } else {
770
+ ports , err = nodesetExpand (portsNodeset )
771
+ if err != nil {
772
+ return []string {}, fmt .Errorf ("%s" , err )
773
+ }
731
774
}
775
+
776
+ var hostPorts []string
732
777
for _ , port := range ports {
733
778
if iport , err := strconv .Atoi (port ); err != nil {
734
- return []string {}, [] string {}, fmt .Errorf ("port \" %s\" must be an integer" , port )
779
+ return []string {}, fmt .Errorf ("port \" %s\" must be an integer" , port )
735
780
} else if iport < 0 || iport > 65535 {
736
- return []string {}, [] string {}, fmt .Errorf ("port \" %s\" must be in the 0-65535 range" , port )
781
+ return []string {}, fmt .Errorf ("port \" %s\" must be in the 0-65535 range" , port )
737
782
}
738
783
for _ , host := range hosts {
739
784
if _ , _ , err := net .SplitHostPort (host + ":" + port ); err != nil {
740
- return []string {}, [] string {}, fmt .Errorf ("%s" , err )
785
+ return []string {}, fmt .Errorf ("%s" , err )
741
786
}
787
+ hostPorts = append (hostPorts , host + ":" + port )
742
788
}
743
789
}
744
- return hosts , ports , nil
790
+ return hostPorts , nil
745
791
}
746
792
747
793
func getErrorBannerFromCommandLine (args []string ) (string , error ) {
748
- errorBanner := ""
749
- switch len (args ) {
750
- case 0 :
751
- errorBanner = ""
752
- case 1 :
753
- errorBanner = args [0 ]
754
- default :
755
- return "" , fmt .Errorf ("wrong number of arguments" )
794
+ if len (args ) == 1 {
795
+ return args [0 ], nil
756
796
}
757
- return errorBanner , nil
797
+ return "" , fmt . Errorf ( "wrong number of arguments" )
758
798
}
759
799
760
800
func byteToHuman (b int , passthrough bool ) string {
@@ -831,14 +871,16 @@ func main() {
831
871
var userString string
832
872
var groupsString string
833
873
var sourceString string
874
+ var hostString string
875
+ var portString string
834
876
835
877
parsers := map [string ]* flag.FlagSet {
836
878
"help" : newHelpParser (),
837
879
"version" : newVersionParser (),
838
880
"show" : newShowParser (& csvFlag , & jsonFlag , & allFlag , & userString , & groupsString , & sourceString ),
839
- "enable" : newEnableParser (),
840
- "forget" : newForgetParser (),
841
- "disable" : newDisableParser (),
881
+ "enable" : newEnableParser (& allFlag , & hostString , & portString ),
882
+ "forget" : newForgetParser (& allFlag , & hostString , & portString ),
883
+ "disable" : newDisableParser (& allFlag , & hostString , & portString ),
842
884
"error_banner" : newErrorBannerParser (& expire ),
843
885
}
844
886
@@ -866,7 +908,7 @@ func main() {
866
908
p := parsers [cmd ]
867
909
p .Parse (args )
868
910
if p .NArg () == 0 {
869
- fmt .Fprintf (os .Stderr , "ERROR: missing 'hosts' or 'connections '\n \n " )
911
+ fmt .Fprintf (os .Stderr , "ERROR: missing 'hosts', 'connections', 'users', 'groups', 'error_banner' or 'config '\n \n " )
870
912
p .Usage ()
871
913
}
872
914
subcmd := p .Arg (0 )
@@ -893,41 +935,75 @@ func main() {
893
935
case "enable" :
894
936
p := parsers [cmd ]
895
937
p .Parse (args )
896
- hosts , ports , err := getHostPortFromCommandLine (p .Args ())
938
+ if ! allFlag && hostString == "" {
939
+ fmt .Fprintf (os .Stderr , "ERROR: missing '-all' or '-host'\n \n " )
940
+ p .Usage ()
941
+ }
942
+ hostPorts , err := getHostPortFromCommandLine (allFlag , hostString , portString , * configFile )
897
943
if err != nil {
898
944
fmt .Fprintf (os .Stderr , "ERROR: %s\n \n " , err )
899
945
p .Usage ()
900
946
}
901
- for _ , host := range hosts {
902
- for _ , port := range ports {
903
- enableHost (host , port , * configFile )
947
+ for _ , hostPort := range hostPorts {
948
+ host , port , err := utils .SplitHostPort (hostPort )
949
+ if err != nil {
950
+ fmt .Fprintf (os .Stderr , "ERROR: %s\n \n " , err )
951
+ p .Usage ()
904
952
}
953
+ enableHost (host , port , * configFile )
905
954
}
906
955
case "forget" :
907
956
p := parsers [cmd ]
908
957
p .Parse (args )
909
- hosts , ports , err := getHostPortFromCommandLine (p .Args ())
910
- if err != nil {
911
- fmt .Fprintf (os .Stderr , "ERROR: %s\n \n " , err )
958
+ if p .NArg () == 0 {
959
+ fmt .Fprintf (os .Stderr , "ERROR: missing 'host' or 'error_banner'\n \n " )
912
960
p .Usage ()
913
961
}
914
- for _ , host := range hosts {
915
- for _ , port := range ports {
962
+ subcmd := p .Arg (0 )
963
+ // parse flags after subcommand
964
+ args = p .Args ()[1 :]
965
+ p .Parse (args )
966
+ switch subcmd {
967
+ case "host" :
968
+ if ! allFlag && hostString == "" {
969
+ fmt .Fprintf (os .Stderr , "ERROR: missing '-all' or '-host'\n \n " )
970
+ p .Usage ()
971
+ }
972
+ hostPorts , err := getHostPortFromCommandLine (allFlag , hostString , portString , * configFile )
973
+ if err != nil {
974
+ fmt .Fprintf (os .Stderr , "ERROR: %s\n \n " , err )
975
+ p .Usage ()
976
+ }
977
+ for _ , hostPort := range hostPorts {
978
+ host , port , err := utils .SplitHostPort (hostPort )
979
+ if err != nil {
980
+ fmt .Fprintf (os .Stderr , "ERROR: %s\n \n " , err )
981
+ p .Usage ()
982
+ }
916
983
forgetHost (host , port , * configFile )
917
984
}
985
+ case "error_banner" :
986
+ delErrorBanner (* configFile )
918
987
}
919
988
case "disable" :
920
989
p := parsers [cmd ]
921
990
p .Parse (args )
922
- hosts , ports , err := getHostPortFromCommandLine (p .Args ())
991
+ if ! allFlag && hostString == "" {
992
+ fmt .Fprintf (os .Stderr , "ERROR: missing '-all' or '-host'\n \n " )
993
+ p .Usage ()
994
+ }
995
+ hostPorts , err := getHostPortFromCommandLine (allFlag , hostString , portString , * configFile )
923
996
if err != nil {
924
997
fmt .Fprintf (os .Stderr , "ERROR: %s\n \n " , err )
925
998
p .Usage ()
926
999
}
927
- for _ , host := range hosts {
928
- for _ , port := range ports {
929
- disableHost (host , port , * configFile )
1000
+ for _ , hostPort := range hostPorts {
1001
+ host , port , err := utils .SplitHostPort (hostPort )
1002
+ if err != nil {
1003
+ fmt .Fprintf (os .Stderr , "ERROR: %s\n \n " , err )
1004
+ p .Usage ()
930
1005
}
1006
+ disableHost (host , port , * configFile )
931
1007
}
932
1008
case "error_banner" :
933
1009
p := parsers [cmd ]
0 commit comments