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

うーん。