APIを利用したownCloudの活用方法
ownCloudが提供するAPI
連載第6回はownCloudが提供するテンプレートを利用したブランディングやカスタマイズアプリケーションの適用方法について解説しました。本連載の最終回となる第7回では、ownCloudが提供するAPIについて解説します。
ownCloudにはWebDAVやShare API等の外部アプリケーションから呼び出し可能な外部APIやHooks、Background Jobs等のカスタマイズアプリケーションから利用可能な内部APIが用意されています。そのようなAPIを利用することで独自の実装を行わずにプラグアンドプレイすることが可能です。
外部APIについて
本セクションでは、自身の業務システムやモバイル端末等のクライアントとownCloudを連携し、ファイルの送受信やownCloud上のファイルの共有設定等のインテグレーションを行うためのAPIである外部APIについて紹介します。
WebDAV
WebDAVとは、HTTP 1.1*1を拡張し、クライアントからWebサーバー(ここではownCloud)上のファイルやフォルダを管理できるようにした仕様のことです。つまり、FTP等の転送プロトコルを使用せずにHTTPベースでクライアントからownCloudにファイルを送信したり、ownCloud上のファイルやフォルダの一覧を取得したり、ファイルのダウンロード・コピー・移動・削除のようなファイル操作が行えます。ownCloudでは、PHP製のオープンソースフレームワークであるSabreDAVが実装されており、Basic認証と組み合わせ、ownCloudのユーザー管理に従ったWebDAVによるファイル操作を行うことが可能です。例えば、“owncloud.jp”で動作するownCloud上に配置された“thinkit.txt”をWebDAVで取得する場合、以下のようなコマンドでファイルの取得が可能です。尚、当該ファイルは“user”というownCloud上のユーザーが所有するファイルであることを前提とします。
[*1] 1997年1月に RFC 2068 として初版が発表されたHTTP仕様で、名前ベースバーチャルホストがサポートされていることが特徴である。詳しくは以下リンクを参照
https://www.w3.org/Protocols/rfc2616/rfc2616.html
$ curl -u user:pass -X GET "http://owncloud.jp/remote.php/webdav/thinkit.txt"
ファイルの取得の他に以下のファイル操作を行うことが可能です。
操作 | WebDAVメソッド | URI | オプション |
---|---|---|---|
ファイルリスト/ファイル確認 | PROFIND | /remote.php/webdav/<ディレクトリ名> | |
ファイル取得 | GET | /remote.php/webdav/<ファイルパス> | |
ファイル送信 | PUT | /remote.php/webdav/<ファイルパス> | |
ファイル移動 ファイル名変更 | MOVE | /remote.php/webdav/<ファイルパス> | Destination:/remote.php/webdav/<ファイルパス> |
ファイルコピー | COPY | /remote.php/webdav/<ファイルパス> | Destination:/remote.php/webdav/<ファイルパス> |
ファイル属性変更 | PROPPATCH | /remote.php/webdav/<ファイルパス> | |
ディレクトリ作成 | MKCOL | /remote.php/webdav/<ディレクトリ名> | |
ディレクトリ削除 | DELETE | /remote.php/webdav/<ディレクトリ名> |
ownCloudではWebDAVを実現するためにPHP製のオープンソースフレームワークであるSabreDAVを利用しています。SabreDAVでは、WebDAVの他にカレンダー情報を連携するためのCalDAVや、電話帳情報を連携するためのCardDAVをサポートしています。
ownCloudの3rdParty製のアプリケーションである、カレンダーや電話帳ではそのCalDAVやCardDAVを利用することで外部アプリケーションとのAPI提供を実現しています。
sabre/dav(http://sabre.io/)
Share API
ownCloudの特徴として、ownCloud上のファイルやフォルダをownCloudの内部ユーザーや外部の匿名ユーザーと共有する機能があります。ブラウザにて共有の設定を利用することはもちろん可能ですが、共有ファイルの取得や設定・削除等をAPIにて利用することもできます。
そのようなAPIをownCloudでは“OCS Share API”と呼称しており、外部API提供の他にownCloudのWebUIを実現するためのjQueryでも利用することで、無駄な再開発を防いでいます。OCS Share APIの種類と仕様を以下に紹介します。
動作 | メソッド | URI | オプション |
---|---|---|---|
共有ファイルの取得 | GET | /shares | |
特定フォルダの共有取得 | GET | /shares/<ファイルパス> | |
共有情報の取得 | GET | /shares/<シェアID> | |
新規共有 | POST | /shares/ | path=<共有フォルダパス> shareType=<共有の種類> shareWith=<共有先> publicUpload=true | false password=<閲覧パスワード> |
permission=<共有権限> | |||
共有削除 | DELETE | /shares/<シェアID> | |
共有の更新 | PUT | /shares/<シェアID> | permission=<共有権限> password=<閲覧パスワード> publicUpload=true | false |
内部APIについて
本セクションでは、HooksやBackground Jobs等の実装レベルで呼び出し可能なAPIである内部APIについて紹介します。ownCloudでは、coreのフューチャーやカスタマイズアプリケーションを実装するために柔軟性のあるAPIが標準で実装されており、そのAPIを有効活用することで開発パフォーマンスを高めることが可能です。
Hooks
ファイルが更新や削除された場合やユーザーやグループが作成される前後にロギングやクリーンアップ等で処理を差し込むといった実装を行う場合、対象処理の前後に直接実装を追記するのではなく、Hooksを利用します。ownCloudで設定可能で主に利用されるHooksの設定を以下に紹介します。
【セッション関連】
- preLogin (string $user, string $password)
- postLogin (\OC\User\User $user)
- logout ()
【ユーザー管理関連】
- preSetPassword (\OC\User\User $user, string $password, string $recoverPassword)
- postSetPassword (\OC\User\User $user, string $password, string $recoverPassword)
- preDelete (\OC\User\User $user)
- postDelete (\OC\User\User $user)
- preCreateUser (string $uid, string $password)
- postCreateUser (\OC\User\User $user, string $password)
【ユーザー管理関連】
- preSetPassword (\OC\User\User $user, string $password, string $recoverPassword)
- postSetPassword (\OC\User\User $user, string $password, string $recoverPassword)
- preDelete (\OC\User\User $user)
- postDelete (\OC\User\User $user)
- preCreateUser (string $uid, string $password)
- postCreateUser (\OC\User\User $user, string $password)
【ファイル管理関連】
- ppreWrite (\OCP\Files\Node $node)
- postWrite (\OCP\Files\Node $node)
- preCreate (\OCP\Files\Node $node)
- postCreate (\OCP\Files\Node $node)
- preDelete (\OCP\Files\Node $node)
- postDelete (\OCP\Files\Node $node)
- preTouch (\OCP\Files\Node $node, int $mtime)
- postTouch (\OCP\Files\Node $node)
- preCopy (\OCP\Files\Node $source, \OCP\Files\Node $target)
- postCopy (\OCP\Files\Node $source, \OCP\Files\Node $target)
- preRename (\OCP\Files\Node $source, \OCP\Files\Node $target)
- postRename (\OCP\Files\Node $source, \OCP\Files\Node $target)
ユーザー作成時にログ出力するサンプル
以下では、例としてユーザーの作成が行われた場合にその内容をログに出力するサンプルを第6回の記事で作成したアプリケーションに実装します。
まず、/var/www/owncloud/apps/myapp/appinfo/app.phpの最後尾に今回Hooksの実装を行うインスタンスを宣言します。
<?php /** * ownCloud – myapp (省略) $container->registerService('UserHooks', function($c) { return new \OCA\MyApp\Hooks\UserHooks( $c->query('ServerContainer')->getUserManager(), $c->query('ServerContainer')->getLogger() ); }); $app->getContainer()->query('UserHooks')->register();
次に、/var/www/owncloud/apps/myapp/hooks/userhooks.phpを作成し、ユーザー作成時にログ出力を行う処理を実装します。本実装サンプルではHooksと併せてLoggerAPIについても利用しているので、参考にしてください。
<?php namespace OCA\MyApp\Hooks; class UserHooks { private $userManager; private $logger; public function __construct($userManager, $logger){ $this->userManager = $userManager; $this->logger = $logger; } public function register() { $callback = function($user, $password) { $this->logger->info("Created user: {$user->getUID()}", array('app' => 'myapp')); }; $this->userManager->listen('\OC\User', 'postCreateUser', $callback); } }
以上の実装で、ユーザー管理画面からユーザーを作成する毎にowncloud.logに作成されたユーザーのUIDが出力されます。
Background Jobs
エンタープライズなオンラインストレージシステムを運用する上で、バッチタスクによる処理が必要となるシーンは様々です。ownCloudではそのようなバッチタスクをBackground Jobsとして、アプリケーションレイヤーで処理を登録することが可能です。
定期的にファイルのアーカイブや外部システムとの同期を行う等の処理をBackground Jobsに登録することで、容易にバッチタスクを実装することが可能となります。
例として日次で実行される同期処理をBackground Jobsに登録するサンプルを第6回の記事で作成したアプリケーションに実装します。
まず、/var/www/owncloud/apps/myapp/appinfo/app.phpの最後尾に今回Hooksの実装を行うインスタンスを宣言します。
<?php /** * ownCloud – myapp (省略) $server = \OC::$server; $server->getJobList()->add(new \OCA\MyApp\Cron\SyncJob());
次に、/var/www/owncloud/apps/myapp/cron/syncjob.phpを作成し、日次でSyncServiceを実行する処理を実装します。SyncServiceについては、適宜内容に合わせて実装することで日次でSyncServiceが実行されます。
<?php namespace OCA\MyApp\Cron; use OC\BackgroundJob\TimedJob; use OCA\MyApp\AppInfo\Application; class SyncJob extends TimedJob { public function __construct() { // Run once a day $this->setInterval(24 * 60 * 60); } protected function run($argument) { $app = new Application(); $container = $app->getContainer(); $container->query('SyncService')->run(); } }
以上で、一部の外部APIおよび内部APIの利用方法について説明しました。ownCloudはオープンプロダクトです。ownCloudのcoreの機能を利用するシーンが必要な場合、coreの実装を修正することや、DBアクセスやファイル操作を独自の実装で行わず、まずownCloudが標準で提供しているAPIが利用可能かを確認してください。APIを活用することで、新たな実装を行わず効率的に開発することが可能となります。
スタイルズのownCloudサポートサービス
ownCloudは、オープンソースで拡張性が高く、柔軟に使うことができる一方で、トラブル発生時には全部自分で責任を負わなくてはいけません。スタイルズとしては、バージョンアップや構築から障害時のテクニカルサポートを中心に、サポートをおこなっております。不明点があれば弊社スタイルズが運用しているownCloud日本語公式サイトやユーザーフォーラムに訪問して貰えれば日本語で情報が入手できます。
- ownCloud日本語公式サイト:https://owncloud.jp/
- ownCloudユーザーフォーラム:https://owncloud.jp/forum/
また、より充実したサポートを必要とするお客様へのサポートメニューも用意しています。お客様のご利用形態に応じてサポートメニューもご用意しておりますので、「オープンソースを利用するのは少し不安だ」というお客様にも安心して利用して貰えるように行っております。
本連載のまとめ
全7回に渡り、エンタープライズで利用可能なオンラインストレージであるownCloudの魅力をお伝えしてきました。今回の記事掲載にあたり、ご協力をいただきましたThink ITの皆様をはじめ、記事をご覧いただいた皆様に感謝いたします。なお、2016年11月に今回の記事をまとめて書籍として出版する予定です。書籍には以下の様なownCloudを実際に運用する時のノウハウが盛り込まれる予定です。
- ownCloudのアップグレード方法について
- occ コマンドについて
- Active Directoryとの接続設定方法
- S3への接続、設定方法
- CIFSへの接続、設定方法
- ban4ipでの不正アクセス対策、設定方法
- ユーザーマニュアル等、運用のノウハウ
書籍の販売に関しましては、ownCloud日本語公式サイト等で告知を行いますので、どうぞご期待下さい。