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 } |
