プログラミング
TailTalk: RustとTokioによるモダンな非同期ユーザースペースAppleTalkスタック
TailTalk: A modern async user space AppleTalk stack with Rust and Tokio (github.com)
要約
TailTalkは、RustとTokioを用いてゼロから構築された、Linux、Mac、Windows上で動作するユーザースペースAppleTalkスタック構築のためのツールキットです。Netatalkやカーネルドライバに依存せず、ファイル共有や古いMacとの通信を可能にします。現在開発中のプロトタイプであり、GUIやデーモンも提供されています。
全文翻訳
TailTalkは、Linux、Mac OS、Windowsシステム上で、EtherTalkまたはLocalTalkネットワーク経由で完全にユーザースペースのAppleTalk実装を構築するための「ツールキット」として設計されています。Netatalkやカーネルドライバへの依存は一切なく、生のソケットおよび/またはTashTalk互換デバイス(LocalTalk用)と、古いコンピュータへの忍耐があれば構築できます。これは完全なAppleTalkスタックを提供し、複数のコピーを同じマシン上で同時に実行できます。このプロジェクトは、古いMacとの間でファイルをコピーしたり、LaserWriters、ImageWriters、ネットワーク接続されたStyleWritersに印刷したり、それらと通信するためのモダンな非同期ソフトウェアを作成できるようにするために開始されました。現在、TailTalkはルーターのないセットアップでのみ動作します。ルーターが存在するネットワークに正常に接続できるようにするための作業が進められていますが、まだメインラインコードには含まれていません。スタックの各部分は、当時のMacで実行されるのと同様に、可能な限り「ゼロコンフィグ」になるように意図されています。接続して起動すれば、何も手間をかけずに動作するはずです。このプロジェクトは非常に開発途上のプロトタイプであり、バグや機能不足が予想されます。
TailTalk GUI
これは、TashTalk USBで使用するための現在のユーザー向けプログラムです。AFPサーバーが含まれており、LocalTalkポートを搭載して出荷されたほぼすべてのMacで動作するはずです。また、Stuff-Itアーカイブやフロッピーディスクイメージをインポートし、リソースフォークを保持したまま共有パスにロードして、リモートクライアントから利用可能にすることもできます。さらに、LocalTalk対応のLaserWriters、ImageWriters、StyleWritersをモダンなネットワークにAirPrint/IPPプリンターとして共有したり、モダンなプリンターをクラシックMacに共有したりすることもサポートしています。最新リリースはここで見つけることができます:https://github.com/FeralFirmware/TailTalk/releases/latest
機能
主要なAppleTalkプロトコルのほとんどに対するパケットパーサーと完全に非同期なAPI。
AppleTalk Address Resolution Protocol (AARP)
Datagram Delivery Protocol (DDP)
Name Binding Protocol (NBP)
AppleTalk Transaction Protocol (ATP)
Printer Access Protocol (PAP)
AppleTalk Session Protocol (ASP)
AppleTalk Filing Protocol (AFP)
AppleTalk Data Stream Protocol
さらに、TashTalkとの連携によるLocalTalk Macのサポートも提供します。AARP/DDPアンダーレイは、インプロセス(デフォルト)または共有デーモンtailtalkdで実行できます。tailtalkdはインターフェースを所有し、UnixまたはUDPソケット上のprotobufプロトコルを介して複数のクライアントにDDPソケット、アドレス指定、ルーティングルールを提供します。これはTailTalk(TalkStack::builder().daemon_unix(..))またはプレーンCクライアントから使用できます。詳細はdocs/daemon-protocol.mdを参照してください。
ビルドの前提条件
このプロジェクトにはRust 1.90以上が必要です。これはrustup.rsからインストールできます。これにより、デフォルトでOSとCPUアーキテクチャに合ったコンパイラがインストールされます。このプロジェクトでは、Linux用のAppImage、macOS用のAppバンドル、Windows用のインストーラーをビルドするためにcargo-packagerを使用しています。cargo install cargo-packagerでインストールしてください。
Windowsのみ
Rustupブックに指定されているWindows MSVCの前提条件がインストールされていることを確認してください。Windowsには、npcap SDKをマシン上のどこかに保存しておく必要があります。これはnpcap.comで入手できます。LIB環境変数をSDKを解凍したフォルダ(例:C:\npcap-sdk-1.13\Lib\x64)に設定してください。
ビルドの実行
前提条件がインストールされたら、リポジトリのルートでcargo build --releaseを実行してすべてをビルドするか、TailTail GUIのみをビルドするにはcargo build -p tailtalk-gui --releaseを実行します。ビルド後、バイナリはtarget/release/に配置されます。その後、OSに応じて以下を実行します。
# Linux
cargo packager --release -f appimage -p tailtalk-gui
# macOS
cargo packager --release -p tailtalk-gui
# Windows
cargo packager --release -f nsis -p tailtalk-gui
生成されたバンドルはdist/に配置されます。
TashTalk USB クイックスタートガイド:Setup.md
TashTalk USBは、Silicon Labs CP210x USB-to-UARTブリッジ(VID 10c4、PID ea60)を使用します。
Linux
cp210xカーネルモジュールはおそらくすでにインストールされていますが、デフォルトではデバイスノードはrootのみがアクセスできます。rootを必要とせずにユーザーにアクセス権を付与するには、udevルールを作成します。
echo 'SUBSYSTEM=="tty", ATTRS{idVendor}="10c4", ATTRS{idProduct}="ea60", TAG+="uaccess"' \
| sudo tee /etc/udev/rules.d/99-tashtalk-usb.rules
sudo udevadm control --reload-rules && sudo udevadm trigger
これらのコマンドを実行した後、TashTalk USBデバイスを取り外して再接続してください。/dev/ttyUSB0(または類似のもの)として表示され、rootなしでアクセスできるようになります。
Windows
Silicon LabsからCP210x VCP Windowsドライバーをインストールしてください。npcap 1.88をnpcap.comからインストールしてください。
macOS
macOS 11以降には、CP2102N USBチップのサポートが標準で含まれています。10.12から10.15では、Silicon Labsのドライバーが必要です(https://www.silabs.com/software-and-tools/usb-to-uart-bridge-vcp-drivers?tab=downloads)。
EtherTalk
EtherTalkはmacOSではデフォルトでGUIにコンパイルされます。macOSにはlibpcapがOSに付属しています。LinuxとWindowsではオプトインです。libpcap (libpcap-dev) またはnpcap SDKがインストールされた後、cargo build -p tailtalk-gui --features ethertalk でビルドしてください。
macOS
パケットキャプチャとインジェクションは/dev/bpf*を経由しますが、これはデフォルトではrootのみがアクセスできます。EtherTalkを一般ユーザーとして使用するには、Wiresharkディスクイメージに含まれるChmodBPFパッケージをインストールするか(またはbrew install --cask wireshark-chmodbpfを実行)、Wiresharkディスクイメージ内のChmodBPFパッケージをインストールしてください。これはaccess_bpfグループを作成し、BPFデバイスをそれに割り当て、あなたをグループに追加します。グループメンバーシップは新しいログインセッションにのみ適用されるため、その後ログアウトして再ログインしてください。それまで、またはChmodBPFがインストールされていない場合、GUIはEthernetインターフェイスピッカーを非表示にし、起動に失敗するトランスポートを提供しないようにします。
既存のプログラム
開発中にこのソフトウェアの機能を検証するために私が書いた4つのデモプログラムがあります。
aep-echo - ターゲットアドレスにエコーリクエストを送信し、応答時間を表示するシンプルなエコープログラム。
afp-server - AFP 1.0、1.1、2.0互換のAFPサーバー。まだ開発途上ですが、クラシックMacシステムとの間でファイルを読み書きできます。基本的なディレクトリブラウジングとファイル操作がサポートされています。
nbp-lookup - 指定されたリクエスト文字列に基づいてNBPルックアップを実行し、結果を返します。
pap-print - PAPプリンターにPostScriptファイルを送信します。LaserWritersを対象としており、私の4/600 PSでのみテストされています。
tailtalkd - TailTalkアンダーレイデーモン。物理AppleTalkインターフェイスを所有し、Unix/UDPソケット経由でクライアントアプリケーションにDDPソケット、アドレス指定、ルーティングを提供します。
tailtalk-gui - EtherTalkおよび/またはLocalTalk(TashTalk経由)としてフォルダを共有するためのシンプルなGUI。
これらの例はすべて、生のソケット(EtherTalkが有効な場合)を使用してスタックの完全なコピーを実行するため、root権限で実行するか、コンパイルされたバイナリに適切なsetcapを適用する必要があります(macOSでは、EtherTalkの項を参照)。TashTalkのみを使用する場合は、これは不要です。
テスト
単体テスト以外では、このソフトウェアをテストする最良の方法は実際のハードウェアを使用することだとわかりました。現在のテストセットアップは以下の通りです。
Linuxマシン(TailTalk実行中)
PowerBook G3(Mac OS 9.2、Ethernet経由)
LaserWriter 4/600 PS(AsanteTalk経由)
Color StyleWriter 2200(EtherTalkアダプター経由)
ImageWriter II(LocalTalk Option Card付き)
Macintosh SE/30(System 7.1、AsanteTalk経由)
Macintosh Classic(System 6.0.8、AsanteTalk経由)
AsanteTalk
AsanteTalkが最初に電源投入されると、Ethernet側で着信パケットを「リッスン」してから、どのEtherTalkフェーズで動作するかを選択します。EtherTalk Phase 2パケットが見つからない場合、デフォルトでPhase 1になります。TailTalkはPhase 1をサポートしており、LaserWriters、NBP、および一部の基本的な操作では問題なく動作しますが、AFPでは動作しません(MacはAFP TailTalkサーバーを検出しますが、私たちの応答はドロップされているようです)。
貢献
このプロジェクトがより完全なAppleTalk実装を構築するために使用できるものに成長するのを見るのが待ちきれません。すべての貢献を歓迎しますが、変更したい点については、まずイシューを開いて議論してください。さらに、プルリクエストも歓迎します。