comparison src/ut/main.go @ 16:38b64afbaf79

add ut. ( unix-like tools )
author pyon@macmini
date Sun, 17 Jun 2018 20:29:45 +0900
parents
children 72ce457fb99d
comparison
equal deleted inserted replaced
15:3673b244ad94 16:38b64afbaf79
1 /*
2 MU : muto's utility tool.
3
4 TODO:
5 password
6 delete file on server
7 */
8 package main
9
10 import (
11 "archive/tar"
12 "bufio"
13 "bytes"
14 "compress/gzip"
15 "flag"
16 "fmt"
17 "io"
18 "io/ioutil"
19 "log"
20 "mime/multipart"
21 "net"
22 "net/http"
23 "os"
24 "runtime"
25 "strconv"
26 "strings"
27 "time"
28
29 "./lu"
30 )
31
32 var version = "1.01"
33
34 func main() {
35
36 var getfile = flag.Bool( "g", false, "get a file from site." ) // ok
37 var putfile = flag.Bool( "G", false, "put a file to site." ) // ok
38 var compupld = flag.Bool( "zu", false, "compress & upload files. (.tgz)" ) // ok
39 var compress = flag.Bool( "z", false, "compress files. ( not upload. )" ) // ok
40 var uncmprss = flag.Bool( "x", false, "uncompress files. (.tgz )" ) // ok
41 var noprefix = flag.Bool( "n", false, "not add prefix(YYYYMMDDhhmm_) to filename." ) // ok
42
43 var wget = flag.Bool( "w", false, "little wget tool." ) // ok
44 var wc_l = flag.Bool( "l", false, "little wc -l tool." ) // ok
45 var catn = flag.Bool( "C", false, "little cat -n tool." ) // ok
46 var reverse = flag.Bool( "q", false, "little tac tool. ( reverse file )" ) // ok
47 var uniq = flag.Bool( "u", false, "little uniq tool." ) // ok
48 var uniqc = flag.Bool( "uc", false, "little uniq tool.( count )" ) // ok
49 var uniqd = flag.Bool( "ud", false, "little uniq tool.( only dup )" ) // ok
50 var uniqdc = flag.Bool( "udc", false, "little uniq tool.( count dup )" ) // ok
51 var md5 = flag.Bool( "md5", false, "md5." ) // ok
52 var sha256 = flag.Bool( "sha256", false, "sha256." ) // ok
53
54 var msleep = flag.Bool( "M", false, "sleep." )
55 //var swatch = flag.Bool( "W", false, "stop watch." )
56 //var bccalc = flag.Bool( "j", false, "calculator." )
57 //var bhole = flag.Bool( "k", false, "black hole. ( /dev/null )" )
58 var cmdtime = flag.Bool( "T", false, "measure program running time." )
59 var touch = flag.Bool( "t", false, "little touch tool." )
60 var replace = flag.Bool( "r", false, "replace strings. ( s/arg1/arg2/g )" )
61 var sort = flag.Bool( "s", false, "little sort tool." )
62 var nsort = flag.Bool( "ns", false, "little number sort tool." )
63 var grep = flag.Bool( "a", false, "little grep tool." )
64 var grepv = flag.Bool( "b", false, "little grep -v tool." )
65 var tree = flag.Bool( "f", false, "little tree tool." )
66 var head = flag.Int( "d", 0, "little head/tail tool.( head:n, tail:-n )" )
67 //var cut = flag.String( "c", "", "little cut tool ( only csv )." )
68 var migemo = flag.Bool( "m", false, "migemo tool." )
69 //var split = flag.Int( "s", 100, "split file ( default 100 MB )." )
70 var ipscan = flag.Bool( "p", false, "ping." )
71 var minfo = flag.Bool( "i", false, "print machine infomation." ) // half-ok
72
73 //var imgsz = flag.String( "is", "", "resize image" )
74 //var imgconv = flag.String( "ic", "", "convert image type" )
75
76 var pversion = flag.Bool( "v", false, "print version." ) // ok
77 var help = flag.Bool( "h", false, "help." ) // ok
78 flag.Parse()
79
80 if *pversion {
81 fmt.Fprintf( os.Stderr, "%s [ ver %s ]\n", os.Args[0], version )
82 os.Exit( 0 )
83 }
84
85 if *help {
86 print_help()
87 os.Exit( 0 )
88 }
89
90 if *minfo {
91 // IP, mask, gw, dns
92 host, _ := os.Hostname()
93 fmt.Fprintf( os.Stderr, "OS = %s\n", runtime.GOOS )
94 fmt.Fprintf( os.Stderr, "ARCH = %s\n", runtime.GOARCH )
95 fmt.Fprintf( os.Stderr, "HOSTNAME = %s", host )
96 addrs, err := net.InterfaceAddrs()
97 if err != nil {
98 log.Fatal( err )
99 }
100 ip := "127.0.0.1"
101 for _, addr := range addrs {
102 if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
103 if ipnet.IP.To4() != nil {
104 ip = ipnet.IP.String()
105 }
106 }
107 }
108 fmt.Fprintf( os.Stderr, " [%s]\n", ip )
109 os.Exit( 0 )
110 }
111
112 /* Here Utility Function ( unix tool like tools ) */
113 if *msleep {
114 fmt.Fprintln( os.Stderr, "not implement" )
115 os.Exit( 3 )
116 }
117
118 if *cmdtime {
119 fmt.Fprintln( os.Stderr, "not implement" )
120 os.Exit( 3 )
121 }
122
123 if *wget { // done.
124 if flag.NArg() == 0 {
125 fmt.Fprintln( os.Stderr, "no url" )
126 os.Exit( 1 )
127 }
128 url := flag.Args()[0]
129 if !strings.Contains( url, "://" ) {
130 url = "http://" + url
131 }
132
133 fmt.Printf( "%s", url_get( url ) )
134 os.Exit( 0 )
135 }
136
137 /*
138 if *cut {
139 fmt.Fprintln( os.Stderr, "not implement" )
140 if err := is_exist_files( flag.Args() ); err != nil {
141 log.Fatal( err )
142 }
143 lu.CutCsv( flag.Args() )
144 os.Exit( 3 )
145 }
146 */
147
148 if *sort {
149 fmt.Fprintln( os.Stderr, "not implement" )
150 os.Exit( 3 )
151 }
152
153 if *nsort {
154 fmt.Fprintln( os.Stderr, "not implement" )
155 os.Exit( 3 )
156 }
157
158 if *tree {
159 fmt.Fprintln( os.Stderr, "not implement" )
160 os.Exit( 3 )
161 }
162
163 if *catn { // done.
164 if err := is_exist_files( flag.Args() ); err != nil {
165 log.Fatal( err )
166 }
167 lu.Cat_n( flag.Args() )
168 os.Exit( 0 )
169 }
170
171 if *wc_l { // done.
172 if err := is_exist_files( flag.Args() ); err != nil {
173 log.Fatal( err )
174 }
175 lu.Wc_l( flag.Args() )
176 os.Exit( 0 )
177 }
178
179 if *uniq || *uniqc || *uniqd || *uniqdc { // done.
180 if err := is_exist_files( flag.Args() ); err != nil {
181 log.Fatal( err )
182 }
183 if *uniqdc {
184 *uniqc, *uniqd = true, true
185 }
186 lu.Uniq( *uniqc, *uniqd, flag.Args() )
187 os.Exit( 0 )
188 }
189
190 if *head != 0 {
191 fmt.Fprintln( os.Stderr, "not implement" )
192 if err := is_exist_files( flag.Args() ); err != nil {
193 log.Fatal( err )
194 }
195 lu.Head( *head, flag.Args() )
196 os.Exit( 0 )
197 }
198
199 if *reverse { // done.
200 if err := is_exist_files( flag.Args() ); err != nil {
201 log.Fatal( err )
202 }
203 lu.Reverse( flag.Args() )
204 os.Exit( 0 )
205 }
206
207 if *grep || *grepv {
208 if flag.NArg() < 2 {
209 fmt.Println( "too ?? argnument." )
210 os.Exit( 0 )
211 }
212 if err := is_exist_files( flag.Args()[1:] ); err != nil {
213 log.Fatal( err )
214 }
215 lu.Grep( flag.Args()[0], *grepv, flag.Args()[1:] )
216 os.Exit( 0 )
217 }
218
219 if *migemo {
220 fmt.Fprintln( os.Stderr, "not implement" )
221 os.Exit( 3 )
222 }
223
224 if *replace {
225 if err := is_exist_files( flag.Args() ); err != nil {
226 log.Fatal( err )
227 }
228 lu.Replace( "", "", flag.Args() )
229 os.Exit( 0 )
230 }
231
232 if *touch {
233 if err := is_exist_files( flag.Args() ); err != nil {
234 log.Fatal( err )
235 }
236 lu.Touch( flag.Args() )
237 os.Exit( 0 )
238 }
239
240 if *md5 { // done.
241 if err := is_exist_files( flag.Args() ); err != nil {
242 log.Fatal( err )
243 }
244 lu.Md5( flag.Args() )
245 os.Exit( 0 )
246 }
247
248 if *sha256 { // done.
249 if err := is_exist_files( flag.Args() ); err != nil {
250 log.Fatal( err )
251 }
252 lu.Sha256( flag.Args() )
253 os.Exit( 0 )
254 }
255
256 if *ipscan {
257 fmt.Fprintln( os.Stderr, "not implement" )
258 os.Exit( 2 )
259 }
260
261 if *uncmprss { // done.
262 if err := is_exist_files( flag.Args() ); err != nil {
263 log.Fatal( err )
264 }
265 lu.UnTgz( flag.Args() )
266 os.Exit( 0 )
267 }
268
269 /* Here My Uplaad / Download Function */
270 host := "http://777.nazo.cc"
271 // 引数が指定されたらアップロード
272 if *putfile {
273 if flag.NArg() > 0 {
274
275 // アップロードには,このプログラムで認証が必要:未実装
276 if !is_valid_user() {
277 fmt.Println( "wrong password." )
278 os.Exit( 0 )
279 }
280
281 for _, file := range flag.Args() {
282 if _, err := os.Stat( file ); os.IsNotExist( err ) {
283 fmt.Fprintf( os.Stderr, "%s: not exist\n", file )
284 }
285 }
286
287 url := host + "/uploader/index.cgi/goup/post"
288 //url = "http://localhost:3000/gofile"
289
290 var prefix string
291 if !*noprefix {
292 prefix = time.Now().Format( "200601021504_" )
293 }
294
295 // 圧縮
296 if *compress || *compupld {
297 tmpfile, err := ioutil.TempFile( ".", "muxx" )
298 if err != nil {
299 log.Fatal( err )
300 }
301
302 if err := archive_compress( tmpfile.Name(), flag.Args() ); err != nil {
303 log.Fatal( err )
304 }
305
306 tgz := prefix + tmpfile.Name() + ".tgz"
307 os.Rename( tmpfile.Name(), tgz )
308 fmt.Printf( "archive & compress ...done [%s].\n", tgz )
309
310 if *compupld {
311 if err := post_file( url, tgz ); err != nil {
312 log.Fatal( err )
313 }
314 fmt.Println( "upload ...done." )
315 defer os.Remove( tgz )
316 }
317 // 非圧縮
318 } else {
319 for _, file := range flag.Args() {
320 if !*noprefix {
321 c, err := ioutil.ReadFile( file )
322 if err != nil {
323 log.Fatal( err )
324 }
325 if err := ioutil.WriteFile( prefix + file, c, 0644 ); err != nil {
326 log.Fatal( err )
327 }
328 }
329 if err := post_file( url, prefix + file ); err != nil {
330 log.Fatal( err )
331 }
332 fmt.Println( file + "\tupload ...done." )
333 }
334 }
335 os.Exit( 0 )
336 }
337 }
338
339 // ファイル一覧を取得
340 if *getfile {
341 url := host + "/uploader/index.cgi/goup/"
342 list := url_get( url )
343 files := strings.Split( string( list ), "\n" )
344
345 var filename [100]string
346 for i, file := range files {
347 info := strings.Split( file, "#" )
348 fmt.Printf( "[%3d] %-28s %10s %s\n", i + 1, info[0], info[1], info[2] )
349 filename[i] = info[0]
350 }
351
352 fmt.Print( "> " )
353 scanner := bufio.NewScanner( os.Stdin )
354 scanner.Scan()
355 input := scanner.Text()
356
357 if strings.Compare( input, "q" ) == 0 || strings.Compare( input, "bye" ) == 0 {
358 fmt.Println( "bye." )
359 os.Exit( 0 )
360 }
361
362 no, err := strconv.Atoi( input )
363 if err != nil || no < 1 || no > len( files ) {
364 fmt.Fprint( os.Stderr, "bad input\n" )
365 os.Exit( 0 )
366 }
367
368 url = host + "/uploader/files/goup/" + filename[ no - 1 ]
369 fmt.Printf( "downloading %s...\n", filename[ no - 1 ] )
370 bytes := url_get( url )
371 if err := ioutil.WriteFile( filename[ no - 1 ], bytes, 0644 ); err != nil {
372 log.Fatal( err )
373 }
374 os.Exit( 0 )
375 }
376
377 print_help()
378 }
379
380 // Subroutines
381 func url_get( url string ) []byte {
382 res, err := http.Get( url )
383 if err != nil {
384 log.Fatal( err )
385 }
386 b, err := ioutil.ReadAll( res.Body )
387 res.Body.Close()
388 if err != nil {
389 log.Fatal( err )
390 }
391 return b
392 }
393
394 func post_file( url, file string ) error {
395
396 f, err := os.Open( file )
397 if err != nil {
398 return err
399 }
400 defer f.Close()
401
402 buf := &bytes.Buffer{}
403 writer := multipart.NewWriter( buf )
404 fw, err := writer.CreateFormFile( "filename", file )
405 if err != nil {
406 return err
407 }
408
409 if _, err = io.Copy( fw, f ); err != nil {
410 return err
411 }
412
413 ct := writer.FormDataContentType()
414 writer.Close()
415
416 resp, err := http.Post( url, ct, buf )
417 if err != nil {
418 fmt.Fprintf( os.Stderr, "%s", resp.Status )
419 return err
420 }
421
422 return nil
423 }
424
425 func is_valid_user() bool {
426 return true
427 return false
428 }
429
430 func archive_compress( zfile string, files []string ) ( error ) {
431 tgz, err := os.Create( zfile )
432 if err != nil {
433 return err
434 }
435 defer tgz.Close()
436
437 gw := gzip.NewWriter( tgz )
438 defer gw.Close()
439 tw := tar.NewWriter( gw )
440 defer tw.Close()
441
442 for _, file := range files {
443 f, err := os.Open( file )
444 if err != nil {
445 return err
446 }
447 defer f.Close()
448
449 stat, _ := f.Stat()
450 header := new( tar.Header )
451 header.Name = file
452 header.Size = stat.Size()
453 header.Mode = int64( stat.Mode() )
454 header.ModTime = stat.ModTime()
455
456 if err := tw.WriteHeader( header ); err != nil {
457 return err
458 }
459 if _, err := io.Copy( tw, f ); err != nil {
460 return err
461 }
462 }
463 return nil
464 }
465
466 func is_exist_files( files []string ) error {
467 for _, file := range files {
468 if _, err := os.Stat( file ); os.IsNotExist( err ) {
469 return fmt.Errorf( "%s: not exist\n", file )
470 }
471 }
472 return nil
473 }
474
475 func print_help() {
476 fmt.Fprintf( os.Stderr, "Usage of %s [%s]:\n", os.Args[0], version )
477 flag.PrintDefaults()
478 }