APIを利用したownCloudの活用方法

2016年9月13日(火)
高橋 裕樹

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"

ファイルの取得の他に以下のファイル操作を行うことが可能です。

表1: WebDAVのファイル操作

操作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コラム

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の種類と仕様を以下に紹介します。

表7.2: 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日本語公式サイトやユーザーフォーラムに訪問して貰えれば日本語で情報が入手できます。

また、より充実したサポートを必要とするお客様へのサポートメニューも用意しています。お客様のご利用形態に応じてサポートメニューもご用意しておりますので、「オープンソースを利用するのは少し不安だ」というお客様にも安心して利用して貰えるように行っております。

本連載のまとめ

全7回に渡り、エンタープライズで利用可能なオンラインストレージであるownCloudの魅力をお伝えしてきました。今回の記事掲載にあたり、ご協力をいただきましたThink ITの皆様をはじめ、記事をご覧いただいた皆様に感謝いたします。なお、2016年11月に今回の記事をまとめて書籍として出版する予定です。書籍には以下の様なownCloudを実際に運用する時のノウハウが盛り込まれる予定です。

  • ownCloudのアップグレード方法について
  • occ コマンドについて
  • Active Directoryとの接続設定方法
  • S3への接続、設定方法
  • CIFSへの接続、設定方法
  • ban4ipでの不正アクセス対策、設定方法
  • ユーザーマニュアル等、運用のノウハウ

書籍の販売に関しましては、ownCloud日本語公式サイト等で告知を行いますので、どうぞご期待下さい。

株式会社スタイルズ

ownCloudを始めとするOSS関連の技術調査、啓蒙活動が主な業務。システム運用部門、システム開発部門での経験を経て現部門に着任。最近はIoTに手を出し始めている。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています