Mercurial > mercurial > hgweb_golang.cgi
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 } |