Armadilloフォーラム

swupdateの結果参照方法

kz21_ym

2024年4月11日 13時28分

お世話になります。

コンテナのプログラムから swupdate を実行した後
その結果を参照して結果(成功や失敗)を
自前のログに出力するということをやりたいのですが
「結果の参照方法」が分かりません。
どういったやりかたがあるかご教示いただける
と助かります。
環境としては
armadillo-640 baseos alpineコンテナになります。

swupdateの実行は
ftpやsshでswuファイルをarmadilloに送ってから
コンテナのプログラムから ssh 経由で
swupdate -i ファイル名
を実行するという形で考えています。

よろしくお願いします。

コメント

at_dominique.m…

2024年4月12日 11時54分

kz21_ymさん

お世話になっています、
マルティネです。

> コンテナのプログラムから swupdate を実行した後
> その結果を参照して結果(成功や失敗)を
> 自前のログに出力するということをやりたいのですが
> 「結果の参照方法」が分かりません。
> どういったやりかたがあるかご教示いただける
> と助かります。

申し訳ございません、かなり複雑なことなっています。
基本的には起動時に Armadillo Base OS (以下ABOS) の /etc/sw-versions を確認して、入れたいアップデートのバージョンと一致しているかどうかの判断しかありません。

細かいところまで説明すると数時間かかってしまって結局実装も大変になりますので、こちらで一度整理させてください。

> swupdateの実行は
> ftpやsshでswuファイルをarmadilloに送ってから
> コンテナのプログラムから ssh 経由で
> swupdate -i ファイル名
> を実行するという形で考えています。

ssh で swupdate -i を実行するといくつかの問題があります:
* 同じ TMPDIR で複数の swupdate コマンドを同時に実行する場合に不具合がでますので、ロックを自分で取るか TMPDIR を毎回 mktemp -d 等で作る必要があります
* exit status で成功かどうかの判断はできません。整理ができたら exit code で成功するようになりますが、作業の範囲が広いので5月末リリースになると思います。

ssh にこだわってなければ、ABOS 3.18.5-at8 以降では abos-web の REST API でも swu のアップロードか URL のアップデートをコンテナから実行できます。
その場合はちゃんと exit_code の最後の値で 0=成功 / 0以外=失敗で判断できます。
このインターフェースは整理の影響でメッセージが多少変わるかもしれませんが、最終の「exit_code」を維持しますので、今からでも実装できます。

失敗の場合:

$ curl $AUTH -F swu=@fail.swu https://host.containers.internal:58080/api/swu/install/upload
{"stdout":"SWUpdate v2023.05_git20231025-r1\n"}
{"stdout":"\n"}
{"stdout":"Licensed under GPLv2. See source distribution for detailed copyright notices.\n"}
{"stdout":"\n"}
{"stdout":"[INFO ] : SWUPDATE running :  [main] : Running on AGX4500 Revision at1\n"}
{"stdout":"[INFO ] : SWUPDATE started :  Software Update started !\n"}
{"stdout":"[INFO ] : SWUPDATE running :  [install_single_image] : Installing pre_script\n"}
{"stdout":"[INFO ] : SWUPDATE running :  [read_lines_notify] : No base os update: copying current os over\n"}
{"stdout":"[INFO ] : SWUPDATE running :  [install_single_image] : Installing swdesc_command false\n"}
{"stderr":"[ERROR] : SWUPDATE failed [0] ERROR : Command failed: podman run --net=host --rm -v ${TMPDIR:-/var/tmp}:${TMPDIR:-/var/tmp} --read-only -v /target/tmp:/tmp -v /target/var/app/volumes:/var/app/volumes -v /target/var/app/rollback/volumes:/var/app/rollback/volumes --rootfs /target sh -c false --  /var/tmp/swupdate-abosweb-upload.INoHbO/sh__c_false____4a0a23481fce1cd95e4da7e696a585eb4a63c2c0\n"}
{"stderr":"[ERROR] : SWUPDATE failed [0] ERROR : Error streaming _home_atmark_code_..3c2c0_sh__c_false____977454d4a7e7e6a9ba65445b13915d66ce84097e\n"}
{"stderr":"[ERROR] : SWUPDATE failed [1] Image invalid or corrupted. Not installing ...\n"}
{"stdout":"[INFO ] : No SWUPDATE running :  Waiting for requests...\n"}
{"stderr":"[ERROR] : SWUPDATE failed [0] ERROR : SWUpdate *failed* !\n"}
{"exit_code":1}

成功の場合:

$ curl $AUTH -F swu=@success.swu https://host.containers.internal:58080/api/swu/install/upload
{"stdout":"SWUpdate v2023.05_git20231025-r1\n"}
{"stdout":"\n"}
{"stdout":"Licensed under GPLv2. See source distribution for detailed copyright notices.\n"}
{"stdout":"\n"}
{"stdout":"[INFO ] : SWUPDATE running :  [main] : Running on AGX4500 Revision at1\n"}
{"stdout":"[INFO ] : SWUPDATE started :  Software Update started !\n"}
{"stdout":"[INFO ] : SWUPDATE running :  [install_single_image] : Installing pre_script\n"}
{"stdout":"[INFO ] : SWUPDATE running :  [read_lines_notify] : No base os update: copying current os over\n"}
{"stdout":"[INFO ] : SWUPDATE running :  [install_single_image] : Installing swdesc_command true\n"}
{"stdout":"[INFO ] : SWUPDATE running :  [install_single_image] : Installing post_script\n"}
{"stdout":"[INFO ] : SWUPDATE running :  [read_lines_notify] : swupdate triggering reboot!\n"}
{"stderr":"Killed\n"}
{"exit_code":0}

ABOS Web の REST API の詳細はこちらを参考にしてください:
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

よろしくお願いします。

マルティネ様
回答ありがとうございます。

swupdateでの実装は現時点では大変
ということ分かりました。

REST APIでの実装を検討しようと思います。
(swupdateにしようと思ったのは
REST APIの場合コンテナからホストに
ファイル転送されるのかなと思いそれが余計かなと
思ったためです。)

exit_code の確認方法なのですが
これはコンテナから確認可能なファイルなどに
出力されたりするのでしょうか?
何か実行時にどこかに出力するよう
操作しないといけないでしょうか?

まだ REST APIでのアップデートを試していないのですが
終了時に exit_code を確認してから
再起動するなどはできますか?

よろしくお願いします。

at_dominique.m…

2024年4月16日 14時04分

kz21_ymさん、

> swupdateでの実装は現時点では大変
> ということ分かりました。

すみません、整理できた際にまだ必要でしたらまた連絡しますので言ってください。

> REST APIでの実装を検討しようと思います。
> (swupdateにしようと思ったのは
> REST APIの場合コンテナからホストに
> ファイル転送されるのかなと思いそれが余計かなと
> 思ったためです。)

その点については、ストリームとしてインストールされていますので、ファイルを転送しながら効率よくインストールされています。
あらかじめコピーしてもメリットがないはずです。

> exit_code の確認方法なのですが
> これはコンテナから確認可能なファイルなどに
> 出力されたりするのでしょうか?
> 何か実行時にどこかに出力するよう
> 操作しないといけないでしょうか?

すみません、この質問が分かりませんでした。
前の返事に書いた curl の出力は REST API に対する返事なので、実行している環境(コンテナ)で取得しています。
sw-versions のファイルの確認でしたら、add_volumes などでコンテナのどこかにマウントしていただければ確認できます。

> まだ REST APIでのアップデートを試していないのですが
> 終了時に exit_code を確認してから
> 再起動するなどはできますか?

desc ファイルに 「swdesc_option POST_ACTION=wait」を記載していただければ再起動されませんので、その後は abosweb/api/reboot で再起動すればアップデートで適用されます。
その状態で別のアップデートをインストールしようとしても失敗しますので、早めに再起動することを推奨しています。

(確認したら、その再起動待ちの状態で別のアップデートを送信すると exit_code 0 で失敗しますね…今のスクリプトは再起動待ちで判断しているのでそれは不具合です、整理できたらちゃんと失敗します。それまでは同時アップデートなどしない様にしていただければ幸いです)

よろしくお願いします。

マルティネ様

REST APIでも特にインストールの効率落ちる
ことないとのことで承知しました。

> すみません、この質問が分かりませんでした。
REST APIの出力がホスト側に出力されると
勘違いしての質問でした。
コンテナ側で応答されること理解しました。

descファイルに指定記載することで再起動されないこと
承知しました。

ご教示いただいた内容で実装検討してみます。
ありがとうございました。