unkontributors / super_unko

Super Unko project is the one of the awesome, clean and sophisticated OSS projects in the world.
Other
174 stars 21 forks source link

Add unko.ping #98

Closed Hayao0819 closed 3 years ago

Hayao0819 commented 3 years ago

unko.pingコマンドを追加しました。unko.csvの一覧のドメインにPingを送信します。 相手のサーバへの負荷がかからないようにコマンドラインオプションを設定しています。 Batsのテストも作成しましたが、コマンドの特性上どうしても実行に時間がかかってしまうのでコメントアウトしてあります。 ShellCheckやLintはテスト済みです。READMEに説明を追加してあります。

Check list

greymd commented 3 years ago

www Screenshot 2021-09-20 at 17 09 30

greymd commented 3 years ago

メモ: pingはマルチバイト文字が与えられたら勝手にpunycodeにしてくれる模様(知らなかった)。 最近のバージョンであればLinuxでもBSDでも大丈夫そう。

Linux (Ubuntu 18.04)

$ ping -c 1 -s 1 -W 0.25 うんこ.com
PING うんこ.com (157.7.44.218) 1(29) bytes of data.
9 bytes from users016.vip.heteml.jp (157.7.44.218): icmp_seq=1 ttl=26

--- うんこ.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
$ ping -V
ping utility, iputils-s20161105

macOS

$ ping -c 1 -s 1 -W 0.25 うんこ.com
PING xn--p8j0a9n.com (157.7.44.218): 1 data bytes
9 bytes from 157.7.44.218: icmp_seq=0 ttl=47

--- xn--p8j0a9n.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
$ man ping | tail -n 1
BSD                             March 29, 2013                             BSD

しかし dig は解決してくれないのはなぜ?ping独自でやっている?

$ dig +answer @8.8.8.8 うんこ.com

; <<>> DiG 9.10.6 <<>> +answer @8.8.8.8 うんこ.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 46466
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;\227\129\134\227\130\147\227\129\147.com. IN A

;; AUTHORITY SECTION:
com.                    900     IN      SOA     a.gtld-servers.net. nstld.verisign-grs.com. 1632158403 1800 900 604800 86400

;; Query time: 26 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Sep 20 18:20:23 IST 2021
;; MSG SIZE  rcvd: 115
greymd commented 3 years ago

メモ2: (pingの挙動調査) getaddrinfoコールの際に AI_IDN が指定されているから、うんこ.comでも問題なくIDNフォーマットに変換されてpingが飛ばせるらしい。 https://man7.org/linux/man-pages/man3/getaddrinfo.3.html

  AI_IDN If this flag is specified, then the node name given in
         node is converted to IDN format if necessary.  The source
         encoding is that of the current locale.

         If the input name contains non-ASCII characters, then the
         IDN encoding is used.  Those parts of the node name

iputils の ping には getaddrinfoフラグに AI_IDN が指定されているが、USE_IDN がないと Punycode 変換がされない。 しかし検証する限り最近のOSでは基本的に USE_IDN があるので、うんこ.com でもちゃんと ping が飛ばせるらしい。 https://github.com/iputils/iputils/blob/7b389d0c21f243ae10c87b43910609af70ae9f66/ping/ping.h#L45

ロケールがCのとき、AI_CANONIDN が外れるのが気になる。 https://github.com/iputils/iputils/blob/7b389d0c21f243ae10c87b43910609af70ae9f66/ping/ping.c#L298-L299

案の定、LANG によってエンコードが失敗するので、OS のロケールによっては ping ないし unko.ping は正常に動作しない。。

$ LANG=C ping -c 1 うんこ.com
ping: うんこ.com: Parameter string not correctly encoded
$ LANG=C ./unko.ping
Success ping to poo.com

明示的に UTF-8 を使うように指定してあげれば大丈夫そう。

$ LANG=C.UTF-8 ./unko.ping
Success ping to うんこ.com
Success ping to うんち.com
Success ping to poo.com
︙
Hayao0819 commented 3 years ago

バグの検証と提案ありがとうございます。指摘通り修正を行いました。

greymd commented 3 years ago
_人人人人人人人人人人人人人人人人_
> unko.ping を oshiri に merge! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
      👑
    (💩💩💩)
   (💩👁💩👁💩)
  (💩💩💩👃💩💩💩)
 (💩💩💩💩👄💩💩💩💩)