Chienomi

VPN(リバースフォワーディング)をアイコン操作にしてみる

書き捨てユーティリティコード

  • TOP
  • Old Archives
  • VPN(リバースフォワーディング)をアイコン操作にしてみる

先日の多段SSHによる外出時のログインだが、外出時にリバースフォワーディングをオンにし、帰ってきたらオフにするのはちょっと面倒だし、忘れそうだ。 そこで私は「システムトレイにアイコン出してもらって、クリックしたら閉じてくれるようにしたらいいじゃない」と考えた。

まず、「Linuxでシステムトレイにアイコン」と考えたらまずYadを考えて良い。 ZenityやKDialogはシステムトレイをサポートしていない。

yad --notification --image=<icon> --title=<title on hover>

の形式でシステムトレイにアイコンを表示できる。 --commandオプションをつかってクリック時の動作を指定することもできるし、--menuオプションで右クリックに対応させることもできる。 --commandオプションを指定した場合は終了するかわりにそのコマンドを実行する。

今回の場合クリックしたら終了を含む動作をさせたいので、特にコマンドは指定しない。 そこでyadプロセスが終了したらクリックした後の動作をさせていけばよいわけだ。

必ずしもこの操作をこのプログラムから行う、という制約はないこと、 そして「トンネルを解除しない」という選択がありえることから、ループとし、当該ユニットが動作中であればアイコンを表示する方式にした。

#!/usr/bin/zsh

unitname="sshproxy.service"

systemctl start --user $unitname

while systemctl status --user $unitname | grep -F "active (running)"
do
  yad --notification --image="network-vpn" --title="Reverse Forwarding is Now Active"
  if yad --title="Stop Reverse Forwarding" --image dialog-question --button=gtk-yes:0 --button=gtk-no:1 --text="Really stop reverse forwarding?"
  then
    systemctl stop --user $unitname
  fi
done

ひとつめのyadはシステムトレイにアイコンを表示し、クリックされるのを待つものだ。 これでクリックされるまではスクリプトはここでブロックされる。

ふたつ目のyadだが、yadの場合zenityと違い、タイプを指定しないで起動するとシンプルなダイアログになる。 アイコンとボタンのタイプはそれぞれ指定できる仕組みだ。 このため、ZenityやKDialogにあるいくつかの動作オプションがまとめられている。 ここではYes/Noダイアログを表示している。

なお、ボタンはボタンのあとに終了コードを書くようになっており、gtk-cancelも利用可能。それ以外は単にラベルとして使用される。

さらにランチャーで使用するため、.desktopファイルも作っておいた。 右クリックでの開始/停止もサポートしている。

[Desktop Entry]
Version=1.0
Name=Control Reverse Forwading
GenericName=Control Reverse Forwading
GenericName[ja]=リバースフォワーディングのコントロール
Comment=Start reverse forwarding and display systray control icon.
Comment[ja]=リバースフォワーディングのコントロール
Exec=/home/haruka/bin/control-reverse-forwarding.zsh
Terminal=false
Icon=network-vpn
Type=Application
Categories=Network;
Actions=StartProxy;StopProxy;

[Desktop Action StartProxy]
Name=Start Reverse Forwarding
Icon=network-vpn
Exec=systemctl --user start sshforward.service

[Desktop Action StopProxy]
Name=Stop Reverse Forwarding
Icon=network-vpn
Exec=systemctl --user stop sshforward.service

これでわかりやすく、操作しやすくなった。

もちろん、SSHフォワーディングを行うスクリプトに含めるというのも手だが、そうすると他の手段が失われてしまう。 Systemdユニットにした上で追加機能は別のスクリプトにするというのは良いアイディアだと思う。