今天來透過 SFTPGO 的 Event 來做到類似資料處理的功能
以使用者會想把壓縮過的檔案上傳到 OVM 的情境來說
我們目前只有提供直接上傳音樂檔而已 SFTPGO 本身也不支援資料夾上傳
所以當要一次上傳一個專輯時就只能一個一個上傳似乎有點麻煩
所以就透過在壓縮檔指定專輯名稱 裡面塞滿專輯的音樂檔
透過上傳到 SFTPGO 的另一個 Folder 透過 Event 觸發一個 Pipeline 來處理檔案
就能做到一次上傳一整個專輯的設定了 就來看看該如何實作這個功能吧
這邊先透過 docker exec 進入 Container 的 Shell 來進行控制
docker exec -it -u root sftpgo sh
要建立暫時存放 ZIP 的 Folder 還有放 Shell 的 Folder
並且將權限轉給 sftpgo 再透過 vi 來寫要用到的 Shell Script
mkdir /tmp/unzip_pipeline
mkdir /shell
chown sftpgo:sftpgo /shell
chown sftpgo:sftpgo /tmp/unzip_pipeline
vi /shell/pipeline_unzip.bash
來寫一下處理解壓縮和刪除 ZIP 檔的 Shell Script
這邊透過暴力處理檔案名稱==
#!/bin/sh
INPUT_PATH="/tmp/unzip_pipeline"
OBJECT_NAME=$1
IFS="."
if [ -z $OBJECT_NAME ]; then
echo "Error: No name on input"
exit 1
fi
if [[ $FILE_NAME != *.zip ]]; then
echo "Error: This file isn't ZIP"
exit 1
fi
set -- $OBJECT_NAME
for part; do
FILE_NAME=$part
break
done
mkdir /navidrome-upload/$FILE_NAME
unzip "$INPUT_PATH/$OBJECT_NAME" -d /navidrome-upload/$FILE_NAME/
rm "$INPUT_PATH/$OBJECT_NAME"
來新增一個暫時存放 ZIP 檔的儲存空間
這邊實體路徑使用剛剛在 /tmp 創出來的 Folder
這邊來設定 Event 觸發時要執行的事件
這邊透過 Type Command 來讓他觸發 Shell Script
並透過 Arguments 來傳入 upload 的檔案名稱給 Shell Script 使用
這邊來設定甚麼條件下會觸發 Event
這邊透過 Filesystem 發生 Upload 且
檔案是在 Virtual Folder 路徑 /upload-zip 檔案名稱是 .zip 結尾的會觸發剛剛寫好的 Event Action
接著在 Navidrome 的 Group 把剛剛新增的 Folder 加上去
接著可以透過 ACL 來限制一下 User 可以上傳那些檔案上去
這邊設定只有 .zip 副檔名的檔案可以上傳到 /upload-zip 這個 Virtual Folder 上
這樣該設定的東西都設定好了 接下來測試看看
先來 Preview 一下我要傳的檔案
接著就開始準備上傳 打開另一個 SFTPGO 網頁登入 User
點進 /upload-zip 裡面準備上傳
上傳後會看到檔案在 /upload-zip 這一個路徑上
但過了 10 秒後按 Reload 就會發現不見了
這是因為我的 Shell Script 最後有指定要 rm 掉上傳的 ZIP 檔
既然不見就表示 Shell Script 有正確執行 那就到 Navidrome 的儲存區看看吧
有了 最後到 Navidrome 看看
該有的東西都有 也能正常撥放 很棒 下班 高歌離席