ストレージサービスについて

[MyStorageServerの構成]

MyStorageServer/
	MyStorageServer.go	- サーバー本体実装
	config.json		- 設定ファイル
	Storage/		:ストレージ管理モジュール配置
		storage.go	- ファイル一覧取得処理実装
		DATA/		:デフォルトのデータ保存先
	test/			:テストコマンド配置場所
		test.sh		- テストスクリプト


[開発言語]
Go言語

[必要パッケージ]
go get github.com/labstack/echo
go get github.com/dgrijalva/jwt-go
go get github.com/tmc/scp


[機能]

ストレージサービスへは、REST APIを使用してアクセスします。
APIエンドポイントに対して、URLでファイル名を指定しHTTPリクエストを送ることでストレージサービスを利用します。
今版では以下の機能が提供されます。

1.ファイル保存
　ストレージサーバーにファイルを保存します。
　保存先ファイルが存在する場合は上書きとなります。

2.ファイル削除
　ストレージサーバーに保存されているファイルを削除します。
　ファイル名はURLで指定します。

3.ファイルデータ取得
　ストレージサーバーに保存されているファイルの内容を取り出します。
　ファイル名はURLで指定します。

4.ファイル一覧取得
　ストレージサーバーに保存されているファイルの一覧をファイル名のリストで取得します。

5.ファイル情報取得
　ストレージサーバーに保存されているファイルのサイズ、更新日時情報を取得します。
　ファイル名はURLで指定します。


なお、ユーザ管理によるアクセス制限や暗号化通信機能は提供されません。
家庭内などの閉じた環境、また、インターネットに公開する場合にはセキュリティー上不特定多数の
方がアクセスしても問題ないファイルのみ保存するように気をつけてください。


[API詳細]
エンドポイント
	http://<IP>:<port>/storage/

呼び出し形式
	<メソッド> <エンドポイント[+ファイルパス]>

	HTTPプロトコルで要求を送りますので形式は、HTTP/1.1に従います。
	基本的には、メソッドとURLのみで要求できます。
	ファイル名はURLで指定し、APIエンドポイントより後の要素がファイルの名前となります。
	なお、ファイル保存の場合のみ、POSTリクエストでのマルチパートフォームデータ形式、
	または、PUTリクエストでリクエストボディーへ埋め込んでのファイルデータ送信形式となります。


レスポンス
	処理結果は、HTTPのステータスコードで返される。
	レスポンスデータは以下のとおり。
	正常終了時
		ステータスコードは、200。
		・ファイル取得時にはファイルデータがレスポンスボディで返る
		・一覧取得時には、以下のJSON形式でファイル一覧が返る
			{"files": ["",...]}
		・それ以外は、データなし
	異常終了時
		ステータスコードは、4xx,5xx。
		{"message":エラーメッセージ} が返却される場合もある。



1.ファイル保存
　ストレージサーバーにファイルを保存します。

　ファイル保存は、
　・POSTリクエストでのファイルのアップロード
　・PUTリクエストでのデータ送信
　のどちらかで行えます。
　正常終了時は、ステータス200で応答があります。
　なお、保存先ファイルが存在する場合は上書きとなります。

　<POSTの場合>
　POSTメソッドでAPIエンドポイントにマルチパートフォームデータ形式でファイルデータを送信します。
　フォームデータ "name"でファイル名を指定し、"file"でファイルの内容を格納して送信します。

　<PUTの場合>
　URLでファイル名を指定し、PUTメソッドでファイルの内容をリクエストボディーに格納して送信します。


2.ファイル削除
　ストレージサーバーに保存されているファイルを削除します。
　URLでファイル名を指定し、DELETEメソッドで要求を送ります。

　正常終了時は、ステータス200で応答があります。


3.ファイルデータ取得
　ストレージサーバーに保存されているファイルの内容を取り出します。
　URLでファイル名を指定し、GETメソッドで要求を送ります。

　正常終了時は、ステータス200で応答があり、ファイルの内容が返されます。


4.ファイル一覧取得
　ストレージサーバーに保存されているファイルの一覧をファイル名のリストで取得します。
　APIエンドポイントに対してGETEメソッドで取得要求を送ります。

　正常終了時は、ステータス200で応答があり、ファイル一覧がJSON形式で返されます。
　JSONデータ形式
	{
		"files": ["ファイル名1","ファイル名2",...]
	}


5.ファイル情報取得
　ストレージサーバーに保存されているファイルのサイズ、更新日時情報を取得します。
　URLでファイル名を指定し、HEADメソッドで要求を送ります。

　正常終了時は、ステータス200で応答があり、HTTPヘッダで情報が返されます。

　<ヘッダ>         <内容>
  Content-Length   サイズ
　Last-Modified	   最終更新日時



[curlコマンドでのAPI呼び出し例]
ストレージサーバーが、192.168.10.1上のポート3001で動作している場合のAPI呼び出し例を説明します。

1.ファイル保存
　手元にあるdata_to_saveファイルを、my.dataという名前で保存する場合の実行例を以下に示します。
    <POST形式>
	$ curl -F "name=my.data" -F "file=@data_to_save" "http://192.168.10.1:3001/storage/"

    <PUT形式>
	$ curl -X PUT -T data_to_save "http://192.168.10.1:3001/storage/my.data"


2.ファイル削除
　ストレージサーバー上のmy.dataを削除する場合の実行例を以下に示します。
    $ curl -X DELETE "http://192.168.10.1:3001/storage/my.data"


3.ファイルデータ取得
　ストレージサーバー上のmy.dataの内容を取得する場合の実行例を以下に示します。
    $ curl "http://192.168.10.1:3001/storage/my.data" -o data
    $ cat data
    <ファイルの内容>
    $ 


4.ファイル一覧取得
　ストレージサーバー上のファイル一覧を取得する場合の実行例を以下に示します。
    $ curl "http://192.168.10.1:3001/storage/"
    {"files":["/my.data", "/DIR1/mydata","/mydata2"]}


5.ファイル情報取得
　ストレージサーバー上のmy.dataに関する情報を取得する場合の実行例を以下に示します。
    $ curl -I "http://192.168.10.1:3001/storage/mydata"
    HTTP/1.1 200 OK
    Content-Length: 11
    Content-Type: text
    Last-Modified: Tue, 17 Jan 2017 14:46:43 JST
    Date: Tue, 17 Jan 2017 05:46:47 GMT

    $



[設定ファイル]
JSON形式の設定ファイルで、設定可能項目は以下の通りです。

  "host"
	接続待ちするIPアドレスを文字列で指定します。
	通常はMyStorageServerを起動するサーバーのIPアドレスを指定します。

  "port"
	接続待ちするポート番号を数値で指定します。
	MyStorageServerサーバーを起動するサーバーで使用していないTCPポートを指定します。


  "data_store": 
  	データを保存するディレクトリを文字列で指定します。
	相対パス指定の場合は、MyStorageServerのトップディレクトリが起点となります。


[説明]
ストレージサーバーの実装ソースは、以下の２ファイルです。
・MyStorageServer.go
・Storage/storage.go

それぞれについて以降で説明します。




