コンテンツにスキップ
ステージングサーバー
開発サーバー

Smart blaze REST APIリファレンス#

このトピックでは、Smart blazeカメラが提供するREST APIについて説明します。

REST APIを使用して仮想マシン(VM)を制御できます。これにより、コマンドラインまたはカスタムスクリプトから、VMのライフサイクルの管理、イメージのアップロード、ネットワーク設定の構成が可能になります。

すべてのAPIエンドポイントには、カメラのIPアドレス経由でアクセスします。

http://${cameraip}

情報

置換 ${cameraip} カメラの実際のIPアドレスを入力します。

認証#

Smart blaze REST APIは、不正アクセスから保護するためにチャレンジ・レスポンスメカニズムを使用したセッションベースの認証を使用します。デフォルトのパスワードはカメラごとに異なり、カメラのラベルに記載されています。

すべてのAPIエンドポイント(以下を除く) /loginには、セッションCookieによる認証が必要です。認証には次の3つのステップが含まれます。

  1. ログインチャレンジの取得 にGETリクエストを送信することによる /login
  2. チャレンジレスポンスの計算 チャレンジからのナンスを使用
  3. チャレンジレスポンスの送信 認証を完了するため

ログインチャレンジの取得#

エンドポイント: /login

メソッド: GET

レスポンス: 非表示のフォームフィールドにナンスを含むHTMLページ

チャレンジレスポンスの計算#

チャレンジレスポンスは次のように計算する必要があります。

response = SHA256(nonce + ":" + SHA256(password))

ここで:

  • nonce これはログインチャレンジから得られた値です。
  • password はあなたの平文パスワードです。
  • SHA256は小文字の16進数文字列を生成します。

例(シェルを使用):

# Get the nonce from the login page
NONCE=$(curl -s http://${cameraip}/login | grep -oP 'id="challenge-nonce"[^>]*value="\K[^"]+')

# Your password
PASSWORD="blaze-oh-yeah"

# Compute password hash
PASSWORD_HASH=$(echo -n "$PASSWORD" | sha256sum | awk '{print $1}')

# Compute challenge response
RESPONSE=$(echo -n "${NONCE}:${PASSWORD_HASH}" | sha256sum | awk '{print $1}')

チャレンジレスポンスの送信#

エンドポイント: /login

メソッド: POST

コンテンツタイプ: application/x-www-form-urlencoded

パラメータ:

パラメーター タイプ 必須 説明
challenge_response String はい 計算されたチャレンジレスポンス(SHA256 16進数文字列)

応答: 成功時はメインページにリダイレクトします。失敗時はエラーとともにログインページを返します。

例:

curl -c cookies.txt -b cookies.txt -X POST http://${cameraip}/login \
  -d "challenge_response=${RESPONSE}"

認証成功後、以降のすべてのAPIリクエストにセッションクッキーを含めます:

# Using curl with cookie file
curl -b cookies.txt -X POST http://${cameraip}/vm/restart

認証完了の例#

完全なシェルスクリプトの例は次のとおりです:

#!/bin/bash

CAMERA_IP="192.168.1.123"
PASSWORD="blaze-oh-yeah"

# Get login challenge
echo "Getting login challenge..."
NONCE=$(curl -s -c cookies.txt http://${CAMERA_IP}/login | \
    grep -oP 'id="challenge-nonce"[^>]*value="\K[^"]+')

if [ -z "$NONCE" ]; then
    echo "Failed to get login challenge"
    exit 1
fi

# Compute challenge response
PASSWORD_HASH=$(echo -n "$PASSWORD" | sha256sum | awk '{print $1}')
RESPONSE=$(echo -n "${NONCE}:${PASSWORD_HASH}" | sha256sum | awk '{print $1}')

# Login
echo "Logging in..."
curl -s -b cookies.txt -c cookies.txt -X POST http://${CAMERA_IP}/login \
    -d "challenge_response=${RESPONSE}" > /dev/null

# Now you can make authenticated API calls
echo "Making authenticated API call..."
curl -b cookies.txt -X POST http://${CAMERA_IP}/vm/restart

echo "Done"

セキュリティ機能#

  • チャレンジレスポンス認証: ネットワーク経由でのパスワードの送信を防ぎます。
  • レートリミット: ブルートフォース攻撃を防ぐため、ログイン失敗回数に制限が設けられます。
  • セッションセキュリティ:
    • HTTP-only クッキー(JavaScriptからはアクセス不可)
    • SameSite=Strict クッキーポリシー
    • 60秒のチャレンジタイムアウト
  • パスワードの保存: パスワードはSHA256ハッシュとしてのみ保存されます。

ユーザーはWebインターフェースからカスタムパスワードを設定できます。

セッションのログアウト#

ログアウトしてセッションをクリアするには:

エンドポイント: /logout

メソッド: POST

curl -b cookies.txt -X POST http://${cameraip}/logout

API エンドポイント#

情報

以下にリストされているすべてのエンドポイントには認証が必要です。まず次のエンドポイントを使用して認証を行い、 /login リクエストにセッションクッキーを含める必要があります。詳細は 認証 セクションを参照してください。

簡潔にするため、以下の例では認証ステップを省略したAPI呼び出しを示しています。実際には、認証を行った後、curlコマンドに -b cookies.txt を含めてください。

VM制御用APIコール#

VMの再起動#

仮想マシンを再起動します。

エンドポイント: /vm/restart

メソッド: POST

応答: メインページにリダイレクトします

例:

curl -X POST http://${cameraip}/vm/restart

VMの起動#

仮想マシンを起動します。

エンドポイント: /vm/start

メソッド: POST

応答: メインページにリダイレクトします

例:

curl -X POST http://${cameraip}/vm/start

VMの停止#

仮想マシンを停止します。

エンドポイント: /vm/stop

メソッド: POST

応答: メインページにリダイレクトします

例:

curl -X POST http://${cameraip}/vm/stop

VM構成用APIコール#

IP設定の構成#

VMのネットワーク設定(DHCPまたは静的IP)を構成します。

エンドポイント: /vm/ip

メソッド: POST

コンテンツタイプ: application/x-www-form-urlencoded

パラメータ:

パラメーター タイプ 必須 説明
mode String はい ネットワークモード: "DHCP" または "Manual"
address String 条件付き CIDR表記のIPアドレス(例: "192.168.1.127/24")。次の場合に必須: mode です。 "Manual".
gateway String いいえ ゲートウェイIPアドレス(例: "192.168.1.1")。省略する場合は空のままにします。
dns0 String いいえ プライマリDNSサーバーのアドレス(例: "8.8.8.8")。省略する場合は空のままにします。
dns1 String いいえ セカンダリDNSサーバーのアドレス。省略する場合は空のままにします。

応答: メインページにリダイレクトします

情報

このエンドポイントは、ネットワーク構成の変更を適用するためにVMを一時的に停止します。

例:静的IPの構成#
curl -X POST http://${cameraip}/vm/ip \
  -d "mode=Manual" \
  -d "address=192.168.1.127/24" \
  -d "gateway=192.168.1.1" \
  -d "dns0=8.8.8.8" \
  -d "dns1=8.8.4.4"
例:DHCPの有効化#
curl -X POST http://${cameraip}/vm/ip \
  -d "mode=DHCP" \
  -d "address=192.168.1.127/24" \
  -d "gateway=" \
  -d "dns0=" \
  -d "dns1="

VM設定の更新#

VMの動作設定を行います。

エンドポイント: /vm/settings

メソッド: POST

コンテンツタイプ: application/x-www-form-urlencoded

パラメータ:

パラメーター タイプ 必須 説明
wait_console String いいえ コンソール待機モードを有効にする: "on" または "true"。無効にするには、省略するか他の値を設定します。

応答: メインページにリダイレクトします

例:

curl -X POST http://${cameraip}/vm/settings \
  -d "wait_console=on"

イメージ管理#

利用可能なイメージの一覧表示#

インストールされているすべてのVMイメージを、アクティブ状態およびサイズとともに一覧表示します。

エンドポイント: /vm/images

メソッド: GET

応答: イメージオブジェクトのJSON配列

応答フィールド:

Field タイプ 説明
name String イメージの名前
is_active Boolean このイメージが現在アクティブかどうかを示します。
size String イメージのディスクサイズ(人間が読み取り可能な形式、例: "1.2G")

例:

curl http://${cameraip}/vm/images

応答:

[
  {"name": "debian-arm64-min", "is_active": true, "size": "1.2G"},
  {"name": "custom-app", "is_active": false, "size": "2.4G"}
]

VMイメージのアップロード状況の確認#

アーカイブを転送する前に、VMイメージをアップロードできるかどうかを確認します。これにより、アップロードエンドポイントと同じチェックを使用して、ファイル名、.tar.gz拡張子、イメージ名、上書きの制約、および利用可能なストレージ容量が検証されます。

エンドポイント: /vm/check_image_uploadable

メソッド: POST

コンテンツタイプ: application/json

リクエストフィールド:

Field タイプ 必須 説明
filename String はい .tar.gz拡張子を含むアーカイブの名前
size Integer はい バイト単位のアーカイブサイズ
overwrite Boolean いいえ 既存の非アクティブなイメージの置き換えを許可します。デフォルト: false

成功レスポンス:

{
  "success": true,
  "image_name": "debian-arm64-8GB"
}

同じ名前を持つ非アクティブなイメージが存在する場合、および overwrite です。 false:

{
  "success": false,
  "error": "Image 'debian-arm64-8GB' already exists.",
  "needs_confirmation": true
}

その他のバリデーションエラーの返り値:

{
  "success": false,
  "error": "Error message"
}

例:

curl -X POST http://${cameraip}/vm/check_image_uploadable \
  -H "Content-Type: application/json" \
  -d '{"filename":"debian-arm64-8GB.tar.gz","size":2147483648,"overwrite":false}'

情報

チェックが成功しても、イメージ名やストレージ容量は予約されません。アップロードエンドポイントでこれらのチェックが再度実行されます。アーカイブの内容とファイル形式のバリデーションは、アーカイブのアップロード後でのみ行われます。

VMイメージのアップロード#

新しいVMイメージのアーカイブをアップロードします。アーカイブには、rootfsファイルとカーネルファイルが含まれている必要があります。

エンドポイント: /vm/image

メソッド: POST

コンテンツタイプ: multipart/form-data

パラメータ:

パラメーター タイプ 必須 説明
file ファイル はい VMイメージアーカイブ(.tar.gz形式)
overwrite クエリ いいえ 次のように設定: "true" 同じ名前を持つ既存のイメージを上書きします。デフォルト: "false"
set_active クエリ いいえ 次のように設定: "true" アップロードしたイメージを即座に有効化します(VMが再起動します)。以下に設定します: "false" 有効化せずにアップロードします。デフォルト: "true"

サポートされているアーカイブの内容:

アップロードするアーカイブには、以下が含まれている必要があります:

  • rootfsファイル: rootfs.qcow2, rootfs.img、または rootfs.raw
  • カーネルファイル: kernel

詳細については、VM Image Structureを参照してください。

レスポンス: JSON

成功レスポンス:

{
  "success": true
}

エラーレスポンス:

{
  "success": false,
  "error": "Error message"
}
{
  "success": false,
  "error": "Image 'image-name' already exists.",
  "needs_confirmation": true
}
{
  "success": false,
  "error": "Cannot overwrite the active image: image-name"
}

情報

いつ set_active=true (デフォルト)、このエンドポイントはアップロードおよび有効化のプロセス中に一時的にVMを停止します。 set_active=falseの場合、実行中のVMに影響を与えることなく、イメージのアップロードと保存のみが行われます。

例:新しいイメージのアップロードと有効化(デフォルト)#
curl -F "file=@debian-arm64-8GB.tar.gz" http://${cameraip}/vm/image

応答:

{"success":true}
例:有効化せずにアップロード#
curl -F "file=@debian-arm64-8GB.tar.gz" "http://${cameraip}/vm/image?set_active=false"

応答:

{"success":true}
例:アップロード失敗(イメージが存在する)#
curl -F "file=@debian-arm64-8GB.tar.gz" http://${cameraip}/vm/image

応答:

{"error":"Image 'debian-arm64-8GB' already exists.","needs_confirmation":true,"success":false}
例:既存のイメージの上書きと有効化#
curl -F "file=@debian-arm64-8GB.tar.gz" "http://${cameraip}/vm/image?overwrite=true"
例:有効化せずに既存のイメージを上書き#
curl -F "file=@debian-arm64-8GB.tar.gz" "http://${cameraip}/vm/image?overwrite=true&set_active=false"

アクティブなイメージの選択#

アクティブなVMイメージを、インストール済みの別のイメージに変更します。

エンドポイント: /vm/select_image

メソッド: POST

コンテンツタイプ: application/x-www-form-urlencoded

パラメータ:

パラメーター タイプ 必須 説明
image_name String はい アクティブ化するイメージの名前

応答: メインページにリダイレクトします

情報

このエンドポイントは、アクティブなイメージを切り替えるためにVMを一時停止します。

例:

curl -X POST http://${cameraip}/vm/select_image \
  -d "image_name=debian-arm64-8GB"

VMイメージの削除#

インストール済みのVMイメージを削除します。

エンドポイント: /vm/delete_image

メソッド: POST

コンテンツタイプ: application/x-www-form-urlencoded

パラメータ:

パラメーター タイプ 必須 説明
image_name String はい 削除するイメージの名前

応答: メインページにリダイレクトします

情報

現在アクティブなイメージは削除できません。まず別のイメージを選択してください。

例:

curl -X POST http://${cameraip}/vm/delete_image \
  -d "image_name=old-image"

VMイメージの名前変更#

インストール済みのVMイメージの名前を変更します。

エンドポイント: /vm/rename_image

メソッド: POST

コンテンツタイプ: application/x-www-form-urlencoded

パラメータ:

パラメーター タイプ 必須 説明
old_image_name String はい イメージの現在の名前
new_image_name String はい イメージの新しい名前

応答: メインページにリダイレクトします

情報

アクティブなイメージの名前を変更する場合、このエンドポイントはVMを一時停止します。

例:

curl -X POST http://${cameraip}/vm/rename_image \
  -d "old_image_name=debian-arm64-8GB" \
  -d "new_image_name=my-custom-vm"

システムメンテナンス#

ファクトリーリセット#

VMを出荷時設定にリセットします。これにより、すべてのカスタムVMイメージが削除され、元のrootfsとカーネルが復元され、VMの設定がリセットされます。

エンドポイント: /vm/factory_reset

メソッド: POST

レスポンス: JSON

成功レスポンス:

{
  "success": true
}

エラーレスポンス:

{
  "success": false,
  "error": "Error message"
}

情報

このエンドポイントはVMを一時停止し、すべてのユーザーデータを削除します。使用には十分注意してください。

例:

curl -X POST http://${cameraip}/vm/factory_reset

応答:

{"success":true}

エラーハンドリング#

JSONを返すAPIエンドポイントには、以下のものが含まれます。 success フィールド:

  • true:操作が正常に完了しました。
  • false:操作が失敗しました。詳細については、 error フィールドを確認してください。

一部のエラーレスポンスには、追加のフィールドが含まれる場合があります。

  • needs_confirmation:設定対象: true 操作に明示的な確認が必要な場合(既存のイメージの上書きなど)。

一般的な使用例#

カスタムVMイメージのアップロードとアクティブ化#

#!/bin/bash

CAMERA_IP="192.168.1.123"
PASSWORD="blaze-oh-yeah"  # Replace with your camera's password
IMAGE_FILE="my-custom-vm.tar.gz"

# Authenticate
NONCE=$(curl -s -c cookies.txt http://${CAMERA_IP}/login | \
    grep -oP 'id="challenge-nonce"[^>]*value="\K[^"]+')
PASSWORD_HASH=$(echo -n "$PASSWORD" | sha256sum | awk '{print $1}')
RESPONSE=$(echo -n "${NONCE}:${PASSWORD_HASH}" | sha256sum | awk '{print $1}')
curl -s -b cookies.txt -c cookies.txt -X POST http://${CAMERA_IP}/login \
    -d "challenge_response=${RESPONSE}" > /dev/null

# Upload and activate the image archive (default behavior)
RESULT=$(curl -b cookies.txt -F "file=@${IMAGE_FILE}" http://${CAMERA_IP}/vm/image)
echo "$RESULT"

# The VM will automatically restart with the new image

アクティブ化せずにVMイメージをアップロード#

#!/bin/bash

CAMERA_IP="192.168.1.123"
PASSWORD="blaze-oh-yeah"  # Replace with your camera's password
IMAGE_FILE="backup-vm.tar.gz"

# Authenticate (authentication code omitted for brevity, see above)

# Upload the image without activating it (VM keeps running)
RESULT=$(curl -b cookies.txt -F "file=@${IMAGE_FILE}" \
    "http://${CAMERA_IP}/vm/image?set_active=false")
echo "$RESULT"

# The image is now stored but not active. You can activate it later using /vm/select_image

インストール済みイメージの切り替え#

# Authenticate (see above for full authentication example)
# Then select a different image
curl -b cookies.txt -X POST http://${cameraip}/vm/select_image \
    -d "image_name=debian-arm64-base"

ダイレクト接続用の静的IPの構成#

# Authenticate first, then configure network
curl -b cookies.txt -X POST http://${cameraip}/vm/ip \
  -d "mode=Manual" \
  -d "address=192.168.1.200/24" \
  -d "gateway=192.168.1.1" \
  -d "dns0=8.8.8.8" \
  -d "dns1="

VMイメージのデプロイの自動化#

#!/bin/bash

CAMERA_IP="192.168.1.123"
PASSWORD="blaze-oh-yeah"  # Replace with your camera's password
IMAGE_FILE="production-vm.tar.gz"

# Function to authenticate
authenticate() {
    echo "Authenticating..."
    NONCE=$(curl -s -c cookies.txt http://${CAMERA_IP}/login | \
        grep -oP 'id="challenge-nonce"[^>]*value="\K[^"]+')

    if [ -z "$NONCE" ]; then
        echo "Failed to get login challenge"
        return 1
    fi

    PASSWORD_HASH=$(echo -n "$PASSWORD" | sha256sum | awk '{print $1}')
    RESPONSE=$(echo -n "${NONCE}:${PASSWORD_HASH}" | sha256sum | awk '{print $1}')

    curl -s -b cookies.txt -c cookies.txt -X POST http://${CAMERA_IP}/login \
        -d "challenge_response=${RESPONSE}" > /dev/null

    return 0
}

# Authenticate
if ! authenticate; then
    echo "Authentication failed"
    exit 1
fi

# Upload VM image without activating it
echo "Uploading VM image to camera..."
RESPONSE=$(curl -s -b cookies.txt -F "file=@${IMAGE_FILE}" \
    "http://${CAMERA_IP}/vm/image?set_active=false")

if echo "$RESPONSE" | grep -q '"success":true'; then
    echo "Upload successful!"
else
    echo "Upload failed:"
    echo "$RESPONSE"
    exit 1
fi

# Activate the uploaded image
echo "Activating new VM image..."
IMAGE_NAME="${IMAGE_FILE%.tar.gz}"
curl -s -b cookies.txt -X POST http://${CAMERA_IP}/vm/select_image \
    -d "image_name=${IMAGE_NAME}"

echo "VM is restarting with new image."

情報

このスクリプトは、VM内を含め、カメラへのネットワークアクセスを持つ任意のシステムから実行できます。VMから実行した場合、スクリプトは新しいイメージをアップロードし、アクティベーション後にVMは新しいイメージで再起動します。これにより、VMの自己アップデートが可能になります。

VM Control Web Interface#

インタラクティブな管理を行うには、Smart blaze VM ControlのWebインターフェイスにアクセスしてください:

xdg-open http://${cameraip}

Webインターフェイスは、以下のタスクを実行するためのグラフィカルユーザーインターフェイスを提供します。

  • VMステータスの表示
  • VMのライフサイクルの制御(開始/停止/再起動)
  • ネットワーク設定の構成
  • VMイメージのアップロードと管理
  • ディスク使用量の監視
  • パスワードの変更

情報

Webインターフェースでは、REST APIと同じ認証メカニズムが使用されます。

詳細情報#

  • 初期セットアップと構成の詳細については、Getting Startedを参照してください。