1
1
package main
2
2
3
3
import (
4
+ "archive/tar"
5
+ "bufio"
4
6
"bytes"
7
+ "compress/gzip"
5
8
"crypto/dsa"
6
9
"crypto/ecdsa"
7
10
"crypto/rsa"
46
49
certPath string
47
50
format string
48
51
recursive bool
52
+ tarball bool
49
53
}
50
54
51
55
bigNumber big.Int
81
85
db * sql.DB
82
86
confdir = flag .String ("c" , "conf.sample" , "configuration directory" )
83
87
recursive = flag .Bool ("r" , false , "should it open the directory recursively" )
88
+ tarball = flag .Bool ("t" , false , "is it a tar archive" )
84
89
format = flag .String ("f" , "json" , "certificate file format [json, crt, der]" )
85
90
pull = flag .Bool ("p" , true , "pull from redis?" )
86
91
cr redis.Conn
@@ -153,6 +158,7 @@ func main() {
153
158
// Parse Certificate Folder
154
159
c .certPath = string (readConfFile (* confdir , "certfolder" ))
155
160
c .recursive = * recursive
161
+ c .tarball = * tarball
156
162
c .format = * format
157
163
158
164
// DB
@@ -203,13 +209,30 @@ func main() {
203
209
return err
204
210
}
205
211
if ! info .IsDir () {
206
- processFile (c .certPath , path , c .format )
212
+ fd , err := os .Open (path )
213
+ if err != nil {
214
+ log .Fatal (err )
215
+ }
216
+ bf := bufio .NewReader (fd )
217
+ processFile (bf , path , c .format )
207
218
}
208
219
return nil
209
220
})
210
221
if err != nil {
211
222
log .Println (err )
212
223
}
224
+ } else if c .tarball {
225
+ fd , err := os .Stat (c .certPath )
226
+ if err != nil {
227
+ log .Fatal (err )
228
+ }
229
+ switch mode := fd .Mode (); {
230
+ case mode .IsDir ():
231
+ log .Fatal ("With -t=true flag, you need to input a tarball" )
232
+ case mode .IsRegular ():
233
+ processTar (c .certPath , jsonPath , c .format )
234
+ break
235
+ }
213
236
} else {
214
237
var path []string
215
238
path = append (path , "./sessions" )
@@ -221,7 +244,12 @@ func main() {
221
244
for _ , f := range files {
222
245
path [1 ] = f .Name ()
223
246
jsonPath = strings .Join (path , "/" )
224
- processFile (c .certPath , jsonPath , c .format )
247
+ fd , err := os .Open (jsonPath )
248
+ if err != nil {
249
+ log .Fatal (err )
250
+ }
251
+ bf := bufio .NewReader (fd )
252
+ processFile (bf , jsonPath , c .format )
225
253
226
254
// Exit Signal Handle
227
255
select {
@@ -235,23 +263,57 @@ func main() {
235
263
}
236
264
}
237
265
238
- func processFile (fp string , p string , f string ) {
266
+ func processTar (fp string , p string , f string ) error {
267
+ fd , err := os .Open (fp )
268
+ if err != nil {
269
+ log .Fatal (err )
270
+ }
271
+ bf := bufio .NewReader (fd )
272
+ gzr , err := gzip .NewReader (bf )
273
+ if err != nil {
274
+ return err
275
+ }
276
+ defer gzr .Close ()
277
+ tr := tar .NewReader (gzr )
278
+ for {
279
+ header , err := tr .Next ()
280
+ switch {
281
+ // if no more files are found return
282
+ case err == io .EOF :
283
+ return nil
284
+ // return any other error
285
+ case err != nil :
286
+ return err
287
+ // if the header is nil, just skip it (not sure how this happens)
288
+ case header == nil :
289
+ continue
290
+ }
291
+ switch header .Typeflag {
292
+ case tar .TypeDir :
293
+ continue
294
+ case tar .TypeReg :
295
+ processFile (tr , fp , f )
296
+ }
297
+ }
298
+ }
299
+
300
+ func processFile (r io.Reader , fp string , f string ) {
239
301
switch f {
240
302
case "json" :
241
- processJSON (fp , p )
303
+ processJSON (r , fp )
242
304
break
243
305
case "der" :
244
- processDER (fp , p )
306
+ processDER (r , fp )
245
307
break
246
308
case "crt" :
247
- processCRT (fp , p )
309
+ processCRT (r , fp )
248
310
break
249
311
}
250
312
}
251
313
252
- func processDER (fp string , p string ) bool {
314
+ func processDER (r io. Reader , p string ) bool {
253
315
// read corresponding der file
254
- dat , err := ioutil .ReadFile ( p )
316
+ dat , err := ioutil .ReadAll ( r )
255
317
if err != nil {
256
318
log .Fatal (err )
257
319
}
316
378
return nil
317
379
}
318
380
319
- func processCRT (fp string , p string ) bool {
381
+ func processCRT (r io. Reader , fp string ) bool {
320
382
321
383
return true
322
384
}
323
385
324
- func processJSON (fp string , p string ) bool {
386
+ func processJSON (r io. Reader , fp string ) bool {
325
387
// read corresponding json file
326
- dat , err := ioutil .ReadFile ( p )
388
+ dat , err := ioutil .ReadAll ( r )
327
389
if err != nil {
328
390
log .Fatal (err )
329
391
}
0 commit comments