@@ -28,9 +28,19 @@ func printReport(ms []member) {
28
28
var wg sync.WaitGroup
29
29
30
30
var (
31
- withSize uint32
32
- withoutSize uint32
33
- multipleSize uint32
31
+ keyDsaSize uint32
32
+ keyEddsaSize uint32
33
+ keyEd25519Size uint32
34
+ keyRsaSize uint32
35
+ userDsaSize uint32
36
+ userEddsaSize uint32
37
+ userEd25519Size uint32
38
+ userRsaSize uint32
39
+ userWithKeySize uint32
40
+ userWithoutKeySize uint32
41
+ userWithMultipleKeySize uint32
42
+ totalKeySize uint32
43
+ totalUserSize = len (ms )
34
44
)
35
45
36
46
for _ , m := range ms {
@@ -39,19 +49,57 @@ func printReport(ms []member) {
39
49
40
50
go func () {
41
51
defer wg .Done ()
42
- if len (m .Keys ) != 0 {
43
- atomic .AddUint32 (& withSize , 1 )
44
- if * showUsers == "with" || * showUsers == "all" {
52
+
53
+ var (
54
+ hasDsa bool
55
+ hasRsa bool
56
+ hasEddsa bool
57
+ hasEd25519 bool
58
+ )
59
+
60
+ for _ , key := range m .Keys {
61
+ atomic .AddUint32 (& totalKeySize , 1 )
62
+
63
+ switch {
64
+ case strings .Contains (key , "ssh-dsa" ):
65
+ atomic .AddUint32 (& keyDsaSize , 1 )
66
+ hasDsa = true
67
+ case strings .Contains (key , "ssh-rsa" ):
68
+ atomic .AddUint32 (& keyRsaSize , 1 )
69
+ hasRsa = true
70
+ case strings .Contains (key , "ssh-eddsa" ):
71
+ atomic .AddUint32 (& keyEddsaSize , 1 )
72
+ hasEddsa = true
73
+ case strings .Contains (key , "ssh-ed25519" ):
74
+ atomic .AddUint32 (& keyEd25519Size , 1 )
75
+ hasEd25519 = true
76
+ }
77
+ }
78
+
79
+ switch {
80
+ case hasDsa :
81
+ atomic .AddUint32 (& userDsaSize , 1 )
82
+ case hasRsa :
83
+ atomic .AddUint32 (& userRsaSize , 1 )
84
+ case hasEddsa :
85
+ atomic .AddUint32 (& userEddsaSize , 1 )
86
+ case hasEd25519 :
87
+ atomic .AddUint32 (& userEd25519Size , 1 )
88
+ }
89
+
90
+ if len (m .Keys ) == 0 {
91
+ atomic .AddUint32 (& userWithoutKeySize , 1 )
92
+ if * showUsers == "without" || * showUsers == "all" {
45
93
zap .S ().Infow ("retrieved keys" ,
46
94
"user" , m .Login ,
47
95
"keys" , m .Keys ,
48
96
)
49
97
}
50
98
}
51
99
52
- if len (m .Keys ) == 0 {
53
- atomic .AddUint32 (& withoutSize , 1 )
54
- if * showUsers == "without " || * showUsers == "all" {
100
+ if len (m .Keys ) > 0 {
101
+ atomic .AddUint32 (& userWithKeySize , 1 )
102
+ if * showUsers == "with " || * showUsers == "all" {
55
103
zap .S ().Infow ("retrieved keys" ,
56
104
"user" , m .Login ,
57
105
"keys" , m .Keys ,
@@ -60,39 +108,58 @@ func printReport(ms []member) {
60
108
}
61
109
62
110
if len (m .Keys ) > 1 {
63
- atomic .AddUint32 (& multipleSize , 1 )
111
+ atomic .AddUint32 (& userWithMultipleKeySize , 1 )
64
112
if * showUsers == "multiple" || * showUsers == "all" {
65
113
zap .S ().Infow ("retrieved keys" ,
66
114
"user" , m .Login ,
67
115
"keys" , m .Keys ,
68
116
)
69
117
}
70
118
}
71
- // todo strong and weak keys
72
119
}()
73
120
}
74
121
wg .Wait ()
75
122
76
- d := [][]string {
77
- {"users with keys" , fmt .Sprintf ("%d (%.2f%%)" , withSize ,
78
- float32 (withSize )/ float32 (len (ms )) * 100 )},
79
- {"users without keys" , fmt .Sprintf ("%d (%.2f%%)" , withoutSize ,
80
- float32 (withoutSize )/ float32 (len (ms )) * 100 )},
81
- {"users with multiple keys" , fmt .Sprintf ("%d (%.2f%%)" , multipleSize ,
82
- float32 (multipleSize )/ float32 (len (ms )) * 100 )},
83
- // todo: calculate bit length of keys
84
- //{"users with strong keys", fmt.Sprintf("%d", 0)},
85
- //{"users with weak keys", fmt.Sprintf("%d", 0)},
123
+ withKey := [][]string {
124
+ {"users with keys" , "DSA" ,
125
+ fmt .Sprintf ("%d (%.2f%%)" , keyDsaSize , float32 (keyDsaSize )/ float32 (totalKeySize )* 100 ),
126
+ fmt .Sprintf ("%d (%.2f%%)" , userDsaSize , float32 (userDsaSize )/ float32 (totalUserSize )* 100 )},
127
+ {"" , "RSA" ,
128
+ fmt .Sprintf ("%d (%.2f%%)" , keyRsaSize , float32 (keyRsaSize )/ float32 (totalKeySize )* 100 ),
129
+ fmt .Sprintf ("%d (%.2f%%)" , userRsaSize , float32 (userRsaSize )/ float32 (totalUserSize )* 100 )},
130
+ {"" , "ECDSA" ,
131
+ fmt .Sprintf ("%d (%.2f%%)" , keyEddsaSize , float32 (keyEddsaSize )/ float32 (totalKeySize )* 100 ),
132
+ fmt .Sprintf ("%d (%.2f%%)" , userEddsaSize , float32 (userEddsaSize )/ float32 (totalUserSize )* 100 )},
133
+ {"" , "Ed25519" ,
134
+ fmt .Sprintf ("%d (%.2f%%)" , keyEd25519Size , float32 (keyEd25519Size )/ float32 (totalKeySize )* 100 ),
135
+ fmt .Sprintf ("%d (%.2f%%)" , userEd25519Size , float32 (userEd25519Size )/ float32 (totalUserSize )* 100 )},
136
+ }
137
+
138
+ withoutKey := [][]string {
139
+ {"users without keys" , "" , "" , fmt .Sprintf ("%d (%.2f%%)" , userWithoutKeySize , float32 (userWithoutKeySize )/ float32 (totalUserSize )* 100 )},
140
+ }
141
+
142
+ withMultipleKey := [][]string {
143
+ {"users with multiple keys" , "" , "" , fmt .Sprintf ("%d (%.2f%%)" , userWithMultipleKeySize , float32 (userWithMultipleKeySize )/ float32 (totalUserSize )* 100 )},
86
144
}
87
145
88
146
t := tablewriter .NewWriter (os .Stdout )
89
- t .SetHeader ([]string {"description" , "# of users" })
147
+ t .SetHeader ([]string {"description" , "key type" , "# of keys" , " # of users" })
90
148
t .SetHeaderColor (tablewriter.Colors {tablewriter .FgCyanColor },
91
149
tablewriter.Colors {tablewriter .FgCyanColor },
150
+ tablewriter.Colors {tablewriter .FgCyanColor },
151
+ tablewriter.Colors {tablewriter .FgCyanColor },
92
152
)
93
- t .SetFooter ([]string {"total users" , fmt .Sprintf ("%d" , len (ms ))})
94
-
95
- t .AppendBulk (d )
153
+ t .SetFooter ([]string {"" , "total" , fmt .Sprintf ("%d" , totalKeySize ), fmt .Sprintf ("%d" , totalUserSize )})
154
+ t .SetFooterColor (tablewriter.Colors {tablewriter .FgCyanColor },
155
+ tablewriter.Colors {tablewriter .FgCyanColor },
156
+ tablewriter.Colors {tablewriter .FgCyanColor },
157
+ tablewriter.Colors {tablewriter .FgCyanColor },
158
+ )
159
+ t .SetRowLine (true )
160
+ t .AppendBulk (withKey )
161
+ t .AppendBulk (withoutKey )
162
+ t .AppendBulk (withMultipleKey )
96
163
t .Render ()
97
164
}
98
165
0 commit comments