サスペンドから復帰したら再接続ってのを Gauche で書く

/etc/acpi/resume.d にサスペンドから復帰後に実行してほしいスクリプトがいろいろある。
これに、無線 LAN 自動接続スクリプトを足しておけば幸せなんじゃね?と思いつく。


練習がてら Gauche で書いてみよう。


仕様はシンプル。

  • 辞書に自分が知っている ESSID を登録しておく。
  • iwlist ath0 scanning を実行しその中に知っている ESSID があったら専用の起動スクリプトを起動する
  • 知っている ESSID がなかったら何もしない。


こんな感じでしょうか。
filter-map みたいなのがあるはずだ!と思って探したらあった。何ともいえずうれしかった。

#!/usr/bin/gosh
(use gauche.process)
(use srfi-1)
(use util.list)

(define my-essids (list '("home-essid"   . "/home/taro/home.sh")
                        '("office-essid" . "/home/taro/offiec.sh")
                        '("cafe-essid"   . "/home/taro/cafe.sh")))

;; iwlist を実行し存在する ESSID をリストで返す
(define (exist-essid-list)
  (define (find-essid line)
    (rxmatch-cond ((#/ESSID:\"([^\"]+)\"/ line)
                   (#f essid)
                   essid)
                  (else #f)))
  (filter-map find-essid (call-with-input-process "iwlist ath0 scanning" port->string-list)))

(define (main args)
  (let* ((essids (map car my-essids))
         (essid (find (lambda (o) (member o essids)) (exist-essid-list))))
    (if essid
        (sys-system (assoc-ref my-essids essid))))
  0)

/etc/acpi/resume.d/62-ifup.sh に追記。

        /usr/bin/gosh /home/taro/higepon/dotfiles/scripts/wifi_auto_connect.scm &

うまく動いた。あー幸せだ。
起動時にもこのスクリプトを動かしたいんだけどどこに書いておくのが筋だろうか。