util.match
shiro さんからご紹介頂いたので色々試す。
ええと gosh で試してみましょう。
gosh> (use gauche.process) #<undef> gosh> (use util.match) #<undef> gosh> (define x (process-output->string-list '(netstat -n --all))) x gosh> (car x) "稼動中のインターネット接続 (サーバと確立)" gosh>
って色々ヤッてたんですが、ユーザリファレンスとか見てみるに正規表現云々、な世界ではない模様。もしかして、と言いつつ色々確認。とりあえず util.match をとフォロー頂いた意図は何か、が分かってないのが敗因ッス。
# 敗因って言ってますが未だ分かってなかったり (とほほ
続き
むむむ、とウナリつつ、以下のようなソレをでっち上げ。
#!/usr/bin/gosh (use gauche.process) (define main (lambda (args) (let f ((x (process-output->string-list '(netstat -n --all)))) (if (null? x) 1 (if (rxmatch #/:161 / (car x)) 0 (f (cdr x)))))))
これはある意味スクリプト向けですな。kahua の中で呼び出され、を前提に作った方が良さげですが ...
手続きに?
こんなカンジで
#!/usr/bin/gosh (use gauche.process) (define (snmp-port-check) (let f ((x (process-output->string-list '(netstat -n --all)))) (if (null? x) #f (if (rxmatch #/:161 / (car x)) #t (f (cdr x)))))) (define main (lambda (args) (if (snmp-port-check) 0 1)))
うーん。試験してみる。
# /etc/init.d/snmpd start Starting network management services: snmpd. # ./test4.scm # echo $? 0 # /etc/init.d/snmpd stop Stopping network management services: snmpd snmptrapd. # ./test4.scm # echo $? 1 #
抽象化?
ええと上記のナニで言えば
- '(netstat -n --all)
- #/:161 /
が微妙ですな。port で言えば下だけでも構わないのか工夫のしがいはも少しあるのか。
string-split?
む。
gosh> (string-split "udp 0 0 127.0.0.1:161 0.0.0.0:*" char-whitespace?) ("udp" "0" "0" "127.0.0.1:161" "0.0.0.0:*") gosh>
リストになったら util.match は使える?
でもなんとなく同じようなカンジ。
#!/usr/bin/gosh (use gauche.process) (define (snmp-port-check l) (if (null? l) #f (if (rxmatch #/127.0.0.1:161/ (cadddr (string-split (car l) char-whitespace?))) #t (snmp-port-check (cdr l))))) (define (port-check) (let f ((x (process-output->string-list '(netstat -n --all)))) (snmp-port-check x))) (define main (lambda (args) (if (port-check) 0 1)))
ちょっとだけなんとなく得してる感はありますが気のせいかも。何のサービスの死活監視か、なソレは抽象化できそげ。ってか match 使える、と思いつつ使ってないし。
で
match 使えるように書き換えてみたんですが微妙。しかも最初 util.match を use してなくって動かんじゃないか! って言ってたのは秘密。
テンパッてますので、現状のソレを以下に。
#!/usr/bin/gosh (use gauche.process) (use util.match) (define (snmp-port-check l) (if (null? l) #f (match (string-split (car l) char-whitespace?) ((_ _ _ "127.0.0.1:161" _) #t) (else (snmp-port-check (cdr l)))))) (define (port-check) (let ((x (process-output->string-list '(netstat -n --all)))) (snmp-port-check x))) (define main (lambda (args) (if (port-check) 0 1)))
うーん。