昨晩

ハマりつつ死亡。

#!/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)))

上記、snmpd なサービスが起動されててもシェルには真が戻ってこない。ちなみに同様なソレを gosh 上で試験すると正常動作。

gosh> snmp
("udp        0      0 127.0.0.1:161           0.0.0.0:*")
gosh> (define l (string-split (car snmp) char-whitespace?))
l
gosh> l
("udp" "0" "0" "127.0.0.1:161" "0.0.0.0:*")
gosh> (match l ((_ _ _ "127.0.0.1:161" _) #t) (else #f))
#t
gosh> 

どうヤッたものか ...

確認事項

  • string-split したリストの要素を string? したら戻りは #t なので文字列

そういえば Gauche 本デバッグなナニが出てたな。
で、デバッグプリント使って以下。

#!/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?)
      (let ((x (string-split (car l) char-whitespace?)))
	(match #?=x
	     ((_ _ _ "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)))

出力の一部が以下ッス。

#?=x
#?-    ("udp" "0" "0" "127.0.0.1:161" "0.0.0.0:*" "")

なるほど。一つ多いのか ... (とほほほ
# これは分からんよ
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))))))