【bashスクリプト実装】ブラウザからAPIのようにbashスクリプトを実行する

## 背景
スクリプトを実行する際にTeratermからコマンドを実行するのに慣れてない場合
操作するのが戸惑うかと思います。

ブラウザから実行できるようにするには、
```
・HTML→php→python→bash
・HTML→javascript→python→bash
```
のような構成で実現できるのですが、phpやjavascriptを作成するのに時間がかかります。

## 実施内容
下記の方法で、GUIベースでもスクリプトをワンクリックで実行できるようにします。
やりたいことは

①ブラウザ→Apache→アクセスログ（access_log）にログを出力
②出力されたログをリアルタイムでtail監視
③結果を定期的に監視し、アクセスがあればファイルとして一時的なディレクトリに格納
※①～③ジョブキューのようにスクリプトを実行できるようにしました。

### Apacheを標準インストール
下記で標準インストールします。
```
yum install httpd
```

### htmlファイル
スクリプトを実行するためのwebブラウザです。
htmlファイルを作成し、リンクを静的コンテンツにします。
```
[root@homeserver001 homeserver_execbatchscript]# cat jobexec.html 
<h1>This site is job exec menu</h1></pre>
<ul><a href="https://homeserver/homeserver_execbatchscript/dummybashscript/dummy_testhoge_access_curl"><img src="" alt="testhoge.sh"></a></ul>
<ul><a href="https://homeserver/homeserver_execbatchscript/dummybashscript/dummy_phpexectest_access_curl"><img src="" alt="phpexectest.sh"></a></ul>
<ul><a href="https://homeserver/homeserver_execbatchscript/dummybashscript/dummy_testsleep_access_curl"><img src="" alt="testsleep.sh"></a></ul>
<ul><a href="https://homeserver/homeserver_execbatchscript/dummybashscript/dummy_javascripttest_access_curl"><img src="" alt="javascripttest.sh"></a></ul>
[root@homeserver001 homeserver_execbatchscript]#
```

### 監視スクリプト
60秒ごとにスクリプト実行キューを監視して、
・あればファイル名からスクリプト名を取得して、実際のスクリプトを実行する。
・なければ60秒まってから再度確認する。
仕様になっています。

```
[root@homeserver ~]# cat online_shellexec_extractpoling.sh
#!/bin/bash
while true
do
scriptqueuePath=/var/www/html/homeserver_execbatchscript/dummybashscript/scriptqueue/
scriptFilePath=/root
ls -1rt ${scriptqueuePath}*dummy*curl 2>/dev/null
res_2=`echo $?`
if [ ${res_2} = 0 ]; then
   queueOldest=`ls -1rt ${scriptqueuePath}*dummy*curl | head -1 2>/dev/null`
   queueCount=`ls -1rt ${scriptqueuePath}*dummy*curl | wc -l 2>/dev/null`
   if [ ${queueCount} = 0 ]; then
      sleep 60
   else
      screptFilename=`ls ${queueOldest} | head -1 | cut -b95-3000 | sed 's/_access_curl/.sh/g'`
      mv ${queueOldest} ${queueOldest}_used
      ${scriptFilePath}/${screptFilename}
      res=`echo $?`
      if [ ${res} = 0 ]; then
         echo queue is delete | logger
         rm -fv ${queueOldest}_used | logger
      fi
   fi
fi
done
```

### Apacheアクセスログtail監視スクリプト

Apacheのアクセスログを監視するスクリプトです。
accessがきたらダミーファイルを生成します。

```
[root@homeserver ~]# cat online_wrap_poling_tailex.sh
#!/bin/bash
TARGET_LOG="/var/log/httpd/homeserver_execbatchscript-access_log"
scriptqueuePath=/var/www/html/homeserver_execbatchscript/dummybashscript/scriptqueue/

_senten_conditions="access_curl"

hit_action() {
    while read i
    do
        echo $i | grep -q "${_senten_conditions}"
        if [ $? = "0" ];then
            tmpfilename=`date +%Y%m%d%H%M%S%N`_`tail -1 /var/log/httpd/homeserver_execbatchscript-access_log | awk -F ' ' '{print $7}' | awk -F '/' '{print $NF}'`
            touch ${scriptqueuePath}${tmpfilename}
        fi
    done
}

tail -n 0 --follow=name --retry $TARGET_LOG | hit_action

[root@homeserver ~]#
```

### 常駐スクリプトの起動
Apacheが起動していることを確認し、上記の常駐スクリプトを&指定で実行します。
```
systemctl status httpd
systemctl start httpd（※上がっていなければ不要）
systemctl status httpd（※上がっていなければ不要）
online_shellexec_poling.sh &
online_shellexec_extractpoling.sh &
```

### アクセスログとキューの確認
こんな感じのログが出力され、キューの出力先にファイルが作成されていればOK
```
[root@homeserver001 homeserver_execbatchscript]# tail /var/log/httpd/access_log* | grep test | tail -1
162.168.0.231 - - [14/Aug/2022:19:59:00 +0900] "GET /homeserver_execbatchscript/jobexec.html HTTP/1.1" 304 - "https://homeserver/homeserver_execbatchscript/dummybashscript/dummy_javascripttest_access_curl" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0"
[root@homeserver001 homeserver_execbatchscript]#
[root@homeserver001 homeserver001_execbatchscript]# ls -lrt dummybashscript/scriptqueue/*
-rw-r--r--. 1 root root 0  8月 14 18:57 dummybashscript/scriptqueue/testhoge_access_curl
```