SSHトンネル接続や解除をFileMakerファイルの中で行う

トンネル接続のMySQLデータをリレーションしている場合、事前にSSHに接続してからFileMakerファイルを開きますが、「事前に」が面倒だしミスの元なので、ファイルの中から接続する仕組みを作ります。

今回ちょっとした小ネタです。当てはまる人は、普通のレンタルサーバー契約でFileMakerをトンネルごしにサーバー接続してWordPressの管理などをしているMacの人が対象です。当てはまる範囲狭すぎ?

SSHトンネル接続や解除をFileMaker書類の中で行う

SSHトンネル接続が必要なFileMakerの書類に、接続する仕組みを組み入れるという、それだけのことです。それだけのことがとても快適なんです。

アプリによる接続

トンネル接続するために SSH Tunnel ManagerSSH Tunnel Manager という小さなアプリケーションを利用しています。小気味の良い優れたアプリですが、EL Capitanまでしか使えない Coccinellida と違って複数の接続を管理することができません。

また、事前にアプリを使って接続するのを忘れたまま FileMaker の書類を起動してしまい「クエリを実行中・・・」で固まってしまうなど小さく不愉快な出来事によく遭遇していました。己のせいであり実害はないものの、この不愉快な出来事から解放されることを望んでいました。

流れはこうです。

  1. トンネル接続の設定を作っておく
  2. コマンドを実行するスクリプトを作る
  3. 接続や解除を司る
  4. レイアウトやスクリプトトリガに一工夫

では行きます。

トンネル接続の設定を作る

前提として、FileMakerをMySQLに接続する話は以下にあります。

FileMaker Pro を MySQL サーバーに接続する その1

アプリ

SSHでトンネル経由の接続することができるようになれば、小さなアプリを設定して使いたいときにクリック一発で接続、その後ファイルメーカーファイルを開くわけです。

それで問題ないのですが、アプリで接続→ファイルメーカーファイルを開くのルーティンが面倒という、そういうわがままです。

config

アプリを使って簡単に接続出来るようにしておくこともいいですが、もともとはアプリがなくてもターミナルで行えることがらです。アプリは小気味が良くて便利ですが、アプリの設定ができるくらいなら設定ファイルを自分で作れます。

ちょっとがんばってSSHトンネル接続の設定を config というファイルに書いておき、~/.ssh/ に保存します。

参照記事 -> SSH トンネル 複数の接続 – config で賄う

参照記事は複数の接続をconfigで管理するという内容ですが、複数じゃなくてもconfigを作成することは有効です。これにより「ssh ○○」とターミナルに入れるだけで接続できます。つまり自分専用SSHトンネル接続のコマンドを作り上げたということです。

コマンドを実行するスクリプト

簡単なコマンドを作り上げたはいいけれど、ターミナルを起動してコマンドを入力なりコピペする手間はアプリを起動するのと同じかそれ以上に面倒なことです。

なんだ、やっぱり面倒じゃん。と、思考停止していました。が、FileMakerから直接接続コマンドを実行させることを思いつきます。

参照記事 -> Macで実行もできるFileMakerコード管理 

こういう記事を自分で書いていながら、ファイルから直接コマンドを送ることを思いつかなかったとはとんだアホたれ坊主ですね。

スクリプトステップ「AppleScriptを実行」を使って、config で作成した接続コマンドを実行させるスクリプトを作ります。

AppleScriptを実行

Macで実行もできるFileMakerコード管理では、ターミナルにコマンドを送り込む方法を二種類書いていますが、今回のコマンドは変数も何もない「ssh ○○」というだけの極めて単純なものです。ですので、do script を使えばいいと思います。

tell application "Terminal" activate
 do script with command "ssh ○○"
end tell

こうですね。このスクリプトを実行させれば、SSHトンネルに接続できます。

なんでこんな単純なことに今まで気づかなかったんだろう。

ターミナルのウインドウについて

接続している間、ターミナルのウインドウ操作をしないのが吉です。接続を解除するとき、同じウインドウ内に「exit」コマンドを送り込みますから。exitくらい普通に手入力してもいいんですが、FileMakerの内部から行う必要があるんです。変数を弄りたいので。それは後ほど。

目的ターミナルウインドウを記憶したり再アクティブするには、それなりのAppleScriptを駆使する必要があります。そこまで踏み込みません。日常的にターミナルをガシガシ使うような人は想定しません😆 接続したら、そのウインドウは出しっぱなしで、exit をいつでも送り込める状態で放置です。

接続や解除を司る

接続を知る手立て

FileMakerにはいろんな「Get」コマンドがあります。私は「現在mySQLに接続中かどうか」の状態をゲットしたかったのですが、そのゲット方法がわかりませんでした。ご存じのかたはどうか教えてください。

状態がゲットできないので、仕方なしに他のやりかたで誤魔化します。

グローバル変数

接続中かどうかはわからない。じゃあしょうがない。今から接続する場合のみ、それを記録しようではないかということで、グローバル変数を使うことにします。

接続スクリプトが実行されれば $$接続 というグローバル変数に「1」をセット。解除スクリプトが実行されれば「1」を消します。

さらに、カッコつけて接続・解除トグルボタンに「接続中」ランプを灯します。

接続と解除のトグルボタン

$$接続=1なら解除コマンドを送り$$接続に””をセット、そうでなければ接続コマンドを送り$$接続に”1″をセット というトグルスクリプトをボタンに仕込み、「条件付き書式」でカッコ付けたらレイアウトの隅に置いておきます。

他の道

接続の印($$接続 “1”)が接続そのものを示している訳ではないので、逃げ道を用意しておくことも必要です。

例えばファイルを開く前にすでに接続中の場合、$$接続は “” ですが接続中です。$$接続 “1” のファイルではない別のファイルから接続を解除したら、接続は切れているのに $$接続 “1” のままです。

オンオフトグルだけでなく、第三の選択肢、即ち「コマンドは送らないが$$接続の値だけトグル操作する」という道も作っておくのが、より丁寧ですね。ボタンにダイアログを割り当てる、他の変数のみを操作するトグルボタンを用意しておくなど、手立てはいろいろ考えられます。

状態がゲットさえできればこんな手間いらないのに・・・

※ うっかりしてましたが、トグルのフラグは “1” と “” ではなく、”1″と”0″にしておくのがいいです

レイアウトやスクリプトトリガの工夫

最初に開くレイアウトでは接続必須のテーブルを避ける

OnFirstWindowOpen スクリプトトリガに、オープン時のレイアウトを定めておくのがより安全です。MySQLのテーブルとリレーションしていないテーブルのレイアウトを選びます。なければ作ります。最初に接続必須のレイアウトを開いてしまうと、接続中でない場合「クエリを実行中・・・」の悪夢が現れます。

接続中かどうかをGetできれば一番いいのに・・・

接続が必須のレイアウト

接続が必須のレイアウトにはOnLayoutEnterトリガで、何かしらの仕込みを行っておきます。

$$接続 が “1” でない場合の処理(レイアウトを戻す、ダイアログで訊いて接続して数秒間待つなど)をセットしておくことなんかが有効ですね。うっかりレイアウトを開いて「クエリを・・・」と出てしまったら失敗です。

どういう恩恵があったか

ということで接続状態をゲットできないために最後のほうは少々グダりましたが、まあ、オマケ的な措置ですし、大体以上です。

これまでは、事前に何らかの方法でSSHトンネル接続してから、FileMakerのファイルを開いていました。うっかり接続を忘れていたら「クエリを・・・」の画面でうんざりします。

何となくSSHトンネル接続そのものが面倒なことのように思いはじめ、結果「なるべく接続しなくて済むように」と、ローカルにデータを用意してローカル専用のファイルを作ったりし始めます。でもそうすると常にリモートとローカルの同期を行う必要が出てきますので、こんどは「同期」に関するファイルを作ることになり、気がつけば無用に「ローカル専用」ファイル群と「同期用」ファイル群が増え始め、やがてそれらすべてが面倒になり「リモート専用」ファイル群を作り始めたりと、混沌世界へと突入し始めました。「面倒くさいことを嫌い、面倒を避けるために100倍面倒なことをしてしまう」という特性を持つデジタル部活のアホたれ部長でございます。

ある日ふと気づきます。「それほど事前の接続が面倒ならファイル内部のボタン一発、あるいはトリガによる自動処理で済ませればいいのでは?」「すでにブログで書いてきたことの組み合わせで簡単に実現するのでは?」

「ほんまや」と己の問いに答えを見つけ、ファイルに接続を仕込みます。結果、想像以上の身軽さを手に入れ、事前接続の苦痛から解放され、たくさんあった無駄なファイル数をめちゃ減らすことに繋がりました。

ファイルを減らす恩恵は計り知れません。カスタム関数や共通スクリプト、テーマなどのファイル間同期からも解放され、システム全体をミニマム化することができました。