FileMaker で SSHトンネル接続をもっと簡素に行う

SSHトンネル接続してMySQL に接続するタイプのFileMaker書類を使うとき、事前に接続しておくのが面倒なので書類の中から接続してしまう措置を執っていました。しかしそれさえ面倒なのでもっと簡単シンプルにしたのです。

Introduction

FileMakerでは、SSH越しのトンネル接続という方法でレンタルサーバーのMySQLデータベースにも接続することができます。

そういうファイルを実際に利用するには、事前にトンネル接続を済ませてから開きます。これが面倒で、接続し忘れたまま開いてしまうミスも誘発しがちでした。そこで、config を利用して FileMaker 書類の内部から接続を司るというやり方で一旦解決しました。

しかしやがてそれすらも面倒に思い始めます。余計な操作や仕組みが鬱陶しいし、他の同じ目的のFileMaker書類で使い回したいことも多いからです。

「FileMakerファイルの中で接続操作を行う」ことは最良とは言えなかった。もっとシンプルなやり方に変更しました。

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

↑このポストの続き、というか改訂、というか、さらなる簡素化のお話です。内部か外部かの違いだけで、内容ダダ被りですが気にせずいきます。

SSHトンネル接続だけの単機能ファイルを作った

接続だけを行う単機能なFMファイル「SSH接続.fmp12」を作ったんです。それを利用します。基本機能はターミナルコマンド「ssh host名」を実行させてトンネル接続します。

  • 開いたら勝手に接続する
  • 閉じる時に勝手に解除する
  • オマケで、ボタンでも接続/解除ができる
開いたら接続するFMファイル SSH接続.fmp12

基本、接続が必要なときにファイルを開いて用が済めば閉じるだけです。まるで単機能ミニアプリのようなファイルが出来上がりました。

さらに、わざわざファイルとして開くのも面倒なので、接続が必要な他のFMファイルを開く際、オープン時トリガ(OnFirstWindowOpen)内で「SSH接続.fmp12」が勝手に開くようスクリプトを設定しておきます。

これだけで「事前に接続しておく」ことの煩わしさからも、「ファイル内部に接続機能を仕込む」面倒な作業からも「接続したいときにボタンをクリック」のうざい操作からも解放されました。何もしなくていいというぬるま湯の世界が実現。何もかもが簡単シンプルらくらくふぉんです。

ということで大体これでお仕舞いですが、以下に注意する点と詳細を書き加えておきます。

ご利用の注意点

トンネル接続が必要な他のFMファイルのオープントリガに SSH接続.fmp12 を開くよう設定するわけですが、ひとつだけ注意点があります。

接続が不要なテーブルのレイアウトをオープン時のレイアウトに指定しておくことが必須です。

ファイルを開いたときに接続が必要なテーブルが表示されていると、同時に開くSSH接続.fmp12 の接続が間に合わず、不愉快なダイアログまたは接続エラーが出てしまいます。接続と無関係なスタートアップレイアウトはとても大事。そういうテーブルがなければわざわざ作りましょう。

クローズ時にも同様に接続不要テーブルのレイアウトに移動しておくことがより安全かもしれません。

実例 SSH接続.fmp12 の詳細

さて SSH接続.fmp12 を実例として詳細いきます。

前提の config

config にトンネル接続の設定を保存してあることが前提です。これは見えない .ssh フォルダの中に置くテキストファイルで、host名や接続先、トンネル先のデータベース情報などを書いておくものです。host名がそのままコマンドとなり「ssh host名」とターミナルに入力すると接続できます。

参考: SSH トンネル 複数の接続 – config で賄う

すでにODBC接続の設定がされていることも当然大前提です。ODBCドライバに購入したアダプタを設定するわけですが、さすがに数ワードでこれを説明するのは困難で…。

参考: FileMaker Pro を MySQL サーバーに接続する

接続と解除

ターミナルのコマンド

SSH接続.fmp12 の基本の機能は「接続する」「停止する」です。ターミナルのコマンドを実行させます。FileMakerからターミナルのコマンドを送るには、MacだとAppleScriptを実行を使います(他の方法を知りません)

送り込むコマンドは「ssh host名」です。例えば config で host digitalboo と設定しているならコマンドは「ssh digitalboo」です。接続停止は「exit」を送り込みます。

AppleScriptとして用意

これをAppleScriptとして用意します。グローバルなフィールドとして作成しておいてもいいかもしれません。スクリプトステップでフィールドを指定するだけで済みますから。

例えば接続はこのような。

tell application "Terminal"
  activate
  set currentTab to do script with command "ssh $sshName"
end tell

( $sshName のところは、config の host名 に置き換えます)

解除はこう。

tell application "Terminal"
  activate
  set currentTab to do script with command "exit" in front window
  delay .5
    do script "exit" in currentTab
end tell

exitで接続解除したあと、また exit を送り込んでいますが、これはターミナルウインドウを閉じるためです(終了したらターミナルウインドウを閉じる

以上二つをグローバルなフィールド「AppleScript接続」と「AppleScript解除」として用意しました。

開くと接続、閉じるとき解除

スクリプト「SSH接続」と「SSH停止」を作って、それぞれに「AppleScriptを実行」スクリプトステップで接続と解除のフィールドを指定します。

このスクリプトを、ファイルオープン時のトリガ OnFirestWindowOpen と 閉じるときのトリガ OnLastWindowClose にそれぞれ割り当てます。

基本機能としては以上です。ですが多少の工夫もしておきましょう。

接続状態

接続/停止 ボタン

あまり使わないだろうけどボタンを使って接続制御できたほうがいいですよね。レイアウト上にボタンを置いて、手動でもオンオフできるようにします。

オンオフボタンはトグルで動いてほしい。即ち「現在接続中なら停止する。停止中なら接続する」という動きのスクリプトを作ってボタンに割り当てます。

「現在接続中なら」で分岐させるのですから、接続中かどうかを判断できないといけません。Get関数にそのようなものはありませんから、自分で対処します。

先ほどの接続/解除のスクリプトに一工夫入れましょう。

スクリプト「SSH接続」と「SSH停止」に追加

接続

スクリプト「SSH接続」には「AppleScriptを実行」で接続させることだけが書かれています。これに接続したことを保存するグローバル変数を追加しましょう。

変数を追加 [ $$SSH ; 1 ]

さらに親切に、ウインドウタイトルも変更しましょう。

ウインドウタイトルの設定 [ 現在のウインドウ ; 新規タイトル: "SSH 接続中" ]

最後に「ウインドウ内容の再表示」を追加しておきます。

まとめて書くとこう。

AppleScriptを実行 [ SSH接続::AppleScript接続 ]
変数を追加 [ $$SSH ; 値: 1 ]
ウインドウタイトルの設定 [ 現在のウインドウ ; 新規タイトル: "SSH 接続中" ]
ウインドウ内容の再表示 [ ]

これで「SSH接続」を実行すればトンネル接続してグローバル変数$$SSHに 1 が入り、ウインドウタイトルに「接続中」が入りました。

停止

接続を解除するスクリプトも同様にしておきます。$$SSH の値は 0 に、ウインドウタイトルは「SSH 停止中」としておきます。

さらに、全体を if で括ります。停止の処理は接続中の場合のみ発動させます。なぜなら、ファイルを閉じるときに発動させますが、そのとき接続中とは限らないからです。もし閉じる際に停止中なら接続解除のスクリプトを送り込んでも意味ないし、もしかするとエラーになるかもしれません。

if では「$$SSH が 1 なら」あるいは「ウインドウタイトルに接続中が含まれていれば」を条件にします。まとめるとこうなりました。

If [ patternContent ( Get ( ウインドウ名 ) ; "接続中" ) or $$SSH = 1
  AppleScriptを実行 [ SSH接続::AppleScript接続解除 ]
  変数を追加 [ $$SSH ; 値: 0 ]
  ウインドウタイトルの設定 [ 現在のウインドウ ; 新規タイトル: "SSH 停止中" ]
  ウインドウ内容の再表示 [ ]
End If

 

接続と停止のボタンに割り当てるトグルのスクリプトも、これで簡単に作れます。

もし$$SSH = 1 ならSSH停止スクリプト、そうでなければSSH接続スクリプトを実行させます。親切設計として「接続しますか?」「解除しますか?」のダイアログを挟んであげてもいいかなと思います。

ウインドウタイトルがただ「接続中」「停止中」でなく「SSH」を含めているのには理由があります。

それは他のファイルのオープン時に WindowNames 関数を使って、現在「SSH」を含むウインドウが開いているかどうかを見るためです。開いていなければファイルを開きます。開いていれば次に$$SSHを見て、停止中なら接続させます。

レイアウト

単機能の小さなファイルは画面も小さくあってほしい。メインのレイアウトは小さなボディのシンプルレイアウトです。

w180 h60の小さなウインドウ
w180 h60の小さなウインドウ

真ん中にボタンがあって、トグルスクリプトを割り当てます。端の歯車ボタンは、もう一つのレイアウトを新規ウインドウで開くボタンです。もう一つのレイアウトは普通の作業用で、グローバルフィールドなどいくつかのフィールドを確認するためにあります。

真ん中のトグルボタンは接続のインジケーターも兼ねていて、条件付き書式で$$SSHの値に応じたそれらしい色に変わるよう設定しています。

停止中のウインドウ
$$SSH ≠ 1 のとき
接続中のウインドウ
$SSH = 1 のとき

デスクトップの右上部近くに、メニューバーアイテムみたいにはいきませんがそれにちょっと近い気持ちを込めて配置しています。

WordPressの管理に威力を発揮

ということで小さなアプリのようなSSH接続というものを作ったという話でした。接続が必要なファイルのOnFirstWindowOpen にはもれなくこいつを開く一文が入っています。接続させるための一切の操作が不要になり、まるで普通のネット環境のように自然に繋がります。

一般人で雑魚の筆者がこの仕組みを何に使っているかというと、WordPressの管理です。タクソノミーやターム、Attachment のメディア管理などにFileMakerが威力を発揮します。

これまでは接続する僅かな一手間が気持ちのハードルとなり、ついついにローカルにがっつりデータを置いてリモートと同期するような面倒でややこしくてメタボでカオスなシステムを作ってきました。自然に接続されたようにも感じるこの仕組みを作ってからは、ファイルの中にリモートデータを気にせず配置する自由を手に入れました。

コマンドのアプリ化

ターミナルのコマンドをアプリ化するのはFileMakerを使わなくてもできます。ですが光るオンオフスイッチや接続状態の監視まで含めると途端に難易度が上がりますね。そんなアプリをどう作っていいのやら見当も付きません。FileMakerの作法ならナンチャッテで簡単に作れます。

近頃、FileMaker書類のことを「カスタムApp」とかって変な呼び方をしているようですが、アプリみたいな動作をしますけどアプリじゃありません。単なる小さなファイルメーカー書類です。

 

コメント

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください