Armadilloフォーラム

[Armadillo-610] 無線ネットワーク アクセスポイントの設定時における無線ネットワークのリスト取得

masa.yamaguchi

2024年12月4日 16時47分

==========
製品型番:Aramadillo-610
ABOSバージョン: 3.20.3-at.5
カーネルバージョン: 5.10.230-0
その他:ATDE9を使用
==========
Armadillo Base OSの「コンテナ内」から、REST APIを使用して動作確認をしています。
無線ネットワーク アクセスポイント設定時において、アクセスは確認できております。(AP接続にて、ABOS Web 表示を確認)
しかしながら、その状態で無線ネットワークのリスト取得をREST APIで実施した場合
取得できるのは空リストとなります。
これは想定通りの動作となるかご教示頂きたいです。

<以下コンテナ内でREST API実行時のコンソール画面>
root@5156224686cd:/# curl_rest -d ssid=test -d passphrase=testtest -d bridge_addr=192.168.1.1/24 -d channel=36 https://host.containers.internal:58080/api/wlan/ap
http code: 200
  →★AP接続実施
 
root@5156224686cd:/# curl_rest https://host.containers.internal:58080/api/dhcp/br_ap -d start_addr=192.168.1.10 -d end_addr=192.168.1.254
http code: 200
  →★DHCP設定
 
root@5156224686cd:/# curl_rest -X GET -H 'Content-type: application/json' -d '{}'  https://host.containers.internal:58080/api/wlan/scan
[] 
http code: 200
  →★無線ネットワークリストを取得しようとするが、空リストとなる
 
root@5156224686cd:/# curl_rest -X DELETE https://host.containers.internal:58080/api/wlan/ap
http code: 200
  →★AP接続削除
 
root@5156224686cd:/# curl_rest -X GET -H 'Content-type: application/json' -d '{}'  https://host.containers.internal:58080/api/wlan/scan
[{"id":・・・・・・・・
  →★AP接続削除後は無線ネットワークリストが取得できる
コメント

佐藤です。

一点確認させてください。
アクセスポイントモード時でも、無線ネットワークのリストを取得して、
クライアントとしてリスト内にある無線ネットワークに接続したいということでしょうか。
つまり、アクセスポイントモードとクライアントモードを同時に使用したいということでしょうか。

佐藤様

masa.yamaguchiです。

一点確認させてください。
アクセスポイントモード時でも、無線ネットワークのリストを取得して、
クライアントとしてリスト内にある無線ネットワークに接続したいということでしょうか。
つまり、アクセスポイントモードとクライアントモードを同時に使用したいということでしょうか。

ご質問の件について回答いたします。
同時に使用というわけでは無く、以下ケースを想定しております。
-----
<想定するケース>
初期状態はアクセスポイントモードで起動する。
ユーザがアクセスポイントモードで接続しArmadillo-610から無線ネットワークのリストを取得する。
その後、ユーザが指定したアクセスポイントの情報を Armadillo-610が受信後、
クライアントモードに切り替えて、別のアクセスポイントに接続する。

佐藤です。

アクセスポイントモードに設定した時点で、 wlan0 を NetworkManger の管理から外しているため、
アクセスポイントモードとSSIDリスト取得は同時に行えません(SSIDリスト取得は NetworkManger を通して行っております)

手間がかかって申し訳ないのですが、NetworkMangerを使わずに iw コマンドでSSID を取得するカスタムスクリプトを作成し、
それを Rest API で呼び出すことでアクセスポイントモード設定時でもSSIDのリストが取得できるかと思います。

armadillo 上の "/etc/doas.d/abos_web_customize.conf" ファイルを開いて以下を追加します。

[armadillo]# vi /etc/doas.d/abos_web_customize.conf
permit nopass abos-web-admin as root cmd /etc/atmark/abos_web/customize_rest/ssid_list.sh  # ★これを追加
 
[armadillo]# persist_file -p /etc/doas.d/abos_web_customize.conf  # ★ファイルの永続化

"/etc/atmark/abos_web/customize_rest/" ディレクトリにカスタムスクリプト本体を用意します。
スクリプトのファイル名は "ssid_list.sh" とします。

[armadillo]# mkdir /etc/atmark/abos_web/customize_rest
[armadillo]# vi /etc/atmark/abos_web/customize_rest/ssid_list.sh
#!/bin/sh
 
iw dev wlan0 scan | grep "SSID:" | cut -d: -f2 | tr -d " "
 
 
[armadillo]# chmod +x /etc/atmark/abos_web/customize_rest/ssid_list.sh # ★実行権付与
[armadillo]# persist_file -p /etc/atmark/abos_web/customize_rest/ssid_list.sh # ★ファイルの永続化

次に、ABOS Web 上で Rest API 用のトークンに "Custom" の権限を追加してください。
そのトークンを使用して、以下のようにアクセスすると SSID 一覧が取得できるかと思います。

curl_rest -X POST https://host.containers.internal:58080/api/custom/print_args.sh -H 'Content-type: application/json' -d '{"root":true}'

佐藤様

masa.yamaguchiです。

ご回答ありがとうございます。
ご提示の方法でコンテナ内からREST APIを実行したところ、以下コンソール出力が表示されました。

root@1261e989ac1f:/# curl_rest -X POST https://host.containers.internal:58080/api/custom/print_args.sh -H 'Content-type: application/json' -d '{"root":true}'
{"stderr":"doas: Operation not permitted\n"}
{"exit_code":1}

上記エラーとなる事象につきまして、こちらの不足処理等ありましたら、ご指摘いただけますと幸いです。
[備考]
・アクセスポイントモードでスマホ直接接続できることを確認してから、上記処理を行っております。
・REST API トークンにはAdmin, Custom の権限を設定しています。
・ホストOSでは「iw dev wlan0 scan | grep "SSID:" | cut -d: -f2 | tr -d " "」 実行により、アクセスポイントリストが取得できたことを確認済みです。

佐藤です。

"/etc/doas.d/abos_web_customize.conf" ファイルは正しく編集しましたでしょうか。
以下のコマンドの実行結果はどうなってますでしょうか。

[armadillo]# cat /etc/doas.d/abos_web_customize.conf
[armadillo]# cat /etc/atmark/abos_web/customize_rest/ssid_list.sh

佐藤様

masa.yamaguchiです。

以下のコマンドの実行結果はどうなってますでしょうか。

ご依頼のコマンド確認結果について報告いたします。
(念のため実行時の状況を添付資料でも送付いたします)

/home/atmark # cat /etc/doas.d/abos_web_customize.conf
permit nopass abos-web-admin as root cmd /etc/atmark/abos_web/customize_rest/ssid_list.sh
 
/home/atmark # cat /etc/atmark/abos_web/customize_rest/ssid_list.sh
#!/bin/sh
 
iw dev wlan0 scan | grep "SSID:" | cut -d: -f2 | tr -d " "
 
 
/home/atmark # ls /etc/atmark/abos_web/customize_rest/ -la
total 3
drwxr-xr-x    2 root     root          1024 Dec  6 10:53 .
drwxr-xr-x    5 abos-web abos-web      1024 Dec  6 10:53 ..
-rwxr-xr-x    1 root     root            75 Dec  6 10:52 ssid_list.sh

[備考]
・コマンド実行は念のため、ファイル作成・設定したのちのリブート後に実施しています。

ファイル ファイルの説明
コマンド確認結果キャプチャ.png コマンド実行結果キャプチャ
コマンド確認結果.txt コマンド実行結果テキスト版(コマンド実行結果キャプチャ と内容は同じです)

佐藤です。

申し訳ありません。先にお伝えしたアクセス用のURLが間違っておりました。
誤:

curl_rest -X POST https://host.containers.internal:58080/api/custom/print_args.sh -H 'Content-type: application/json' -d '{"root":true}'

正:

curl_rest -X POST https://host.containers.internal:58080/api/custom/ssid_list.sh -H 'Content-type: application/json' -d '{"root":true}'

上記で試していただけますでしょうか。

佐藤様

masa.yamaguchiです。
ご回答ありがとうございます。
ご提示いただいたコマンドで無線ネットワークのリスト取得ができました。
ありがとうございました。
本質問はクローズさせて頂きます。