apt install 時のログ再現スクリプトを作成してみました


apt install 時のログ再現装置を作成してみました
（役に立つかは不明だが、インストール成功時の爽快感を感じられるはず、、）

例えば以下のように`sudo apt-get update -y`時のログを再現するために``test-update.sh`を作成する。

```shell:test-update.sh
#!/bin/bash
sudo apt-get update -y
```

ログの記録/再現用のスクリプトは`replay.sh`の通り
> [https://github.com/seigot/replay_log](https://github.com/seigot/replay_log)

```shell:replay.sh
#!/bin/bash -x

set -e
set -u

IS_RECORD="n"
IS_REPLAY="n"
OUTPUT_LOG_FNAME="output.log"
TMP_LOG_FNAME="tmp.log"

# option
while getopts rp OPT
do
    case $OPT in
        "r" ) IS_RECORD="y"
          shift;;
        "p" ) IS_REPLAY="y"
          shift;;
    esac
done

if [ $IS_RECORD != "n"  ];then
    ############
    ##        ##
    ## record ##
    ##        ##
    ############
    echo "RECORD command:[$*], see $OUTPUT_LOG_FNAME"
    echo "$*" | xargs bash -c 'printf "%s %s\n" "$(date +%Y%m%d%H%M%S%N)" "$*"' bash 2>&1 | tee $OUTPUT_LOG_FNAME
    $* | xargs -L 1 bash -c 'printf "%s %s\n" "$(date +%Y%m%d%H%M%S%N)" "$*"' bash 2>&1 | tee $TMP_LOG_FNAME
    cat $TMP_LOG_FNAME >> $OUTPUT_LOG_FNAME
    rm $TMP_LOG_FNAME
    echo "record replay log: $OUTPUT_LOG_FNAME"

elif [ $IS_REPLAY != "n"  ];then
    ############
    ##        ##
    ## replay ##
    ##        ##
    ############
    echo "REPLAY command:[`head -1 $OUTPUT_LOG_FNAME`]"
    PREV_TIME=`head -1 $OUTPUT_LOG_FNAME | cut -d' ' -f1`
    while read line; do
    CURRENT_TIME=`echo $line | cut -d' ' -f1`
    TMP=`echo $((CURRENT_TIME-PREV_TIME))`
    TIME_DIFF=`echo "scale=5; $TMP / 1000000000.0" | bc`
    PREV_TIME=$CURRENT_TIME
    COMMAND_LOG=`echo $line | cut -d' ' -f2-`

    #echo "$TIME_DIFF $COMMAND_LOG"
    echo "$COMMAND_LOG"
    sleep $TIME_DIFF

    done < $OUTPUT_LOG_FNAME
fi
```

#### ログを記録

`-r`で実行コマンドを指定する（例:`bash test-update.sh`）

```bash
$ bash replay.sh -r "bash test-update.sh"
RECORD command:[bash test-update.sh], see output.log
...
```

### ログを再現

`bash replay.sh`に`-p`オプションを指定すると記録したログを再現する

```bash
$ bash replay.sh -p
REPLAY command:[20201230225127118529673 bash test-update.sh]
0 bash test-update.sh
.03175 取得:1 file:/var/cuda-repo-10-2-local-10.2.89 InRelease
.00096 無視:1 file:/var/cuda-repo-10-2-local-10.2.89 InRelease
.00106 取得:2 file:/var/visionworks-repo InRelease
.00097 無視:2 file:/var/visionworks-repo InRelease
.00099 取得:3 file:/var/visionworks-sfm-repo InRelease
.00095 無視:3 file:/var/visionworks-sfm-repo InRelease
.00090 取得:4 file:/var/visionworks-tracking-repo InRelease
.00121 無視:4 file:/var/visionworks-tracking-repo InRelease
.00145 取得:5 file:/var/cuda-repo-10-2-local-10.2.89 Release [574 B]
.00106 取得:6 file:/var/visionworks-repo Release [2,001 B]
.00097 取得:7 file:/var/visionworks-sfm-repo Release [2,005 B]
.00101 取得:5 file:/var/cuda-repo-10-2-local-10.2.89 Release [574 B]
.00090 取得:8 file:/var/visionworks-tracking-repo Release [2,010 B]
.00111 取得:6 file:/var/visionworks-repo Release [2,001 B]
.00094 取得:7 file:/var/visionworks-sfm-repo Release [2,005 B]
.00088 取得:8 file:/var/visionworks-tracking-repo Release [2,010 B]
.02595 ヒット:10 http://packages.osrfoundation.org/gazebo/ubuntu-stable bionic InRelease
.00495 ヒット:11 http://packages.ros.org/ros/ubuntu bionic InRelease
.00751 ヒット:12 https://repo.download.nvidia.com/jetson/common r32.4 InRelease
.00474 ヒット:14 http://ports.ubuntu.com/ubuntu-ports bionic InRelease
.02960 ヒット:16 http://ports.ubuntu.com/ubuntu-ports bionic-updates InRelease
.17503 ヒット:18 http://ports.ubuntu.com/ubuntu-ports bionic-backports InRelease
.03971 ヒット:19 http://ports.ubuntu.com/ubuntu-ports bionic-security InRelease
.02077 ヒット:20 https://repo.download.nvidia.com/jetson/t210 r32.4 InRelease
.37960 パッケージリストを読み込んでいます...
```

何か役に立てる事がありそうでしたらご教授いただけると幸いです。

# 備考

デモ機作成したい

# 参考
[aptコマンドの操作ログの在処と確認方法](https://linux.just4fun.biz/?Ubuntu/aptコマンドの操作ログの在処と確認方法)
[aptで行われた履歴を表示する](https://www.laddy.info/2019/06/29352/)
[[bash]エラー内容に時刻を付加してファイル出力](http://blog.livedoor.jp/sce_info3-craft/archives/9454089.html)
[標準出力に出力日時をprependする](https://hacknote.jp/archives/23827/)
[プログラムを変更せずに標準出力ごとにタイムスタンプを付ける方法とPythonでのサンプル](https://amaya382.hatenablog.jp/entry/2019/05/18/182539)
[dateコマンドで日付からミリ秒までフルに取りたい！](https://yajamon.hatenablog.com/entry/2017/11/09/125956)
[bash によるオプション解析](https://qiita.com/r18j21/items/70018b98509309a0d2c5)
[bash：標準出力も標準エラーもログに出力](https://qiita.com/okisanjp/items/4bdf009176ecae312f84)