2019/05/18(土)に行われた、第16回redmine.tokyo勉強会でファーエンドテクノロジーの石川さんから、redmine_message_customizeプラグインの発表がありました。
これはいいオモチャをいただいた!ということで、Redmineのメッセージを安全にいじって遊ぶことにします。
出オチなので、変数や句点の不整合は無視してます。
スクリプト
redmine_nyan.sh
#!/bin/bash
#####################################################
# 環境依存値
DB_NAME=db_redmine
PG_USER=postgres
LOCALE_FILE=/opt/redmine/config/locales/ja.yml
SUFFIX="にょ"
# 固定置換用
declare -A FIX_REP
FIX_REP["button_submit"]="目からビーム"
#####################################################
PID=$$
if [ "$1" == "RESET" ]; then
cat << EOS > /tmp/${PID}.sql
UPDATE settings
SET value=E'--- \n:custom_messages: {} \n'
WHERE name='plugin_redmine_message_customize'
EOS
else
IFS_BACKUP=$IFS
IFS=$'\n'
declare -a NOTICES=( $(grep -E '^ (label|notice|error|field|setting|permission|button)' ${LOCALE_FILE} ) )
for NOTICE in ${NOTICES[@]}
do
MSG_KEY=$(echo $NOTICE | awk -F': ' '{print $1}' | sed -e 's/ //g' )
MSG_VALUE=$(echo $NOTICE | awk -F': ' '{c="";for(i=2;i<=NF;i++) c=c $i": "; print c}' | sed -e 's/: $//g' )
# 下のいずれでもない
REP_PTN=0
# 固定置換あり
if [ "${FIX_REP[${MSG_KEY}]}" != "" ]; then
REP_PTN=1
fi
# 句点を含む
echo ${MSG_VALUE} | grep -E '。' > /dev/null
if [ $? -eq 0 -a "${REP_PTN}" == "0" ]; then
REP_PTN=2
fi
# ダブルクォートで終わる
echo ${MSG_VALUE} | grep -E '"$' > /dev/null
if [ $? -eq 0 -a "${REP_PTN}" == "0" ]; then
REP_PTN=3
fi
# シングルクォートで終わる
echo ${MSG_VALUE} | grep -E "'$" > /dev/null
if [ $? -eq 0 -a "${REP_PTN}" == "0" ]; then
REP_PTN=4
fi
# コロンで終わる
echo ${MSG_VALUE} | grep -E ":$" > /dev/null
if [ $? -eq 0 -a "${REP_PTN}" == "0" ]; then
REP_PTN=5
fi
case "${REP_PTN}" in
"0" ) MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/$/${SUFFIX}/g") ;;
"1" ) MSG_VALUE=${FIX_REP[${MSG_KEY}]} ;;
"2" ) MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/。/${SUFFIX}。/g") ;;
"3" ) MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/\"$/${SUFFIX}\"/g") ;;
"4" ) MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/'$/${SUFFIX}'/g") ;;
"5" ) MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/:$/${SUFFIX}: /g") ;;
esac
MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/'/''/g")
MSG+=" ${MSG_KEY}: ${MSG_VALUE}\n"
done
cat << EOS > /tmp/${PID}.sql
UPDATE settings
SET value=E'--- \n:custom_messages: \n ja:\n${MSG}'
WHERE name='plugin_redmine_message_customize'
EOS
fi
IFS=$IFS_BACKUP
sudo su - ${PG_USER} -c "psql ${DB_NAME} -f /tmp/${PID}.sql"
rm -f /tmp/${PID}.sql
sudo systemctl restart redmine
使い方
- メッセージ設定
./redmine_nyan.sh
語尾をつけるのではなく、固定で置換したい場合はFIX_REP
の行をコピーして増やしてください。
- メッセージ設定取消
./redmine_nyan.sh RESET
結果
注意点
- あらかじめ redmine_message_customize をインストールしておいてください。
- redmineの再起動が必要です。
- 「管理」→「メッセージをカスタマイズする」メニューを表示し、いったん保存してください。
- settingsテーブルにレコードを作成するためです。
- 今のところ、PostgreSQL11でしか確認していません。
- 対象のメッセージを多くしすぎると、MySQLではTEXTカラムの64KB制限に引っかかると思います。
変更
- 2019/09/04
- labelを追加したので、末尾が”:”のパターンを考慮