カテゴリー: Linux Page 2 of 34

Redmineサイトの区別。(Watermarkプラグイン)

家と公開用のRedmineで同じテーマを使っているので、「どちらのサイトにいるか」が少し分からなくなります。

そこで、こういうプラグインを付けてみました。

Redmine Watermark

https://github.com/witcan/redmine_watermark

その名の通り、サイト全体にウォーターマークをつけるプラグインです。

インストール

  • Redmineのプラグインディレクトリに移動
cd /var/lib/redminep/pugins && pwd

自分の環境に合わせます。

  • git clone
sudo -u www-data git clone https://github.com/witcan/redmine_watermark
  • サービス再起動
sudo systemctl restart apache2.service

アプリを動かしているサービスを再起動させます。

導入後の設定

Redmineに管理者権限でログイン後、

管理>プラグイン>Redmine Watermarkに進みます。

  • Enable watarmark :チェック
  • ユーザ名や現在日付、テキストなどを入力して保存します。

サイトの背景にすかしが表示されれば設定完了です。

Redmineにチケットの終了日を知らせるプラグイン。

概要

そのチケットがいつ閉じられたかを詳細に表示させます。

シンプルで便利なプラグインです。

動作を確認した環境

  • Ubuntu 20.04 / Redmine 4.2
  • Ubuntu 22.04 / Redmine 5.1

両方で動きました。また、両方ともApache環境です。

手順

  • ディレクトリ移動
cd /var/lib/redmine/plugins && pwd

自分の環境に合わせます。

  • git clone
sudo -u www-data git clone https://github.com/fraoustin/redmine_closed_date
  • マイグレーション
sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production
  • サービス再起動
sudo systemctl restart apache2.service
  • 動作確認

クローズしたチケット詳細に「クローズしたチケット」とその日付が出てくればOKです。

Ubuntu 22.04に構築したNextcloudとClamAVを連携させる。

概要

NextcloudとClamAVを連携させます。

環境

  • Ubuntu 22.04
  • Nextcloud 28.02
  • ClamAV 0.103

さっくりとした手順

  1. clamav-daemonを有効化します。
  2. ウイルス定義ファイル(freshclam)を定期的に実行させます。
  3. NextcloudにAntivirusを導入します。
  4. NextcloudのAntivirusを連携させます。

参考にした手順:
https://rair.dev/nextcloud-clamav-antivirus/

前提

  • 性質上、かなりリソースを消費します。ある程度のマシンスペックを覚悟してください。
  • ClamAVをインストールしていることが条件です。

ClamAVを有効化します。

  • ClamAV daemon 状況確認
sudo systemctl status clamav-daemon.service

実行結果

○ clamav-daemon.service - Clam AntiVirus userspace daemon
     Loaded: loaded (/lib/systemd/system/clamav-daemon.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/clamav-daemon.service.d
             └─extend.conf
     Active: inactive (dead)
  Condition: start condition failed at Tue 2024-02-20 16:09:56 JST; 19h ago
             └─ ConditionPathExistsGlob=/var/lib/clamav/daily.{c[vl]d,inc} was not met
       Docs: man:clamd(8)
             man:clamd.conf(5)
             https://docs.clamav.net/

最初はエラーになったので、再起動をします。

  • ClamAV daemon 再起動
sudo systemctl restart clamav-daemon.service
  • 再起動後の状況確認
sudo systemctl status clamav-daemon.service
● clamav-daemon.service - Clam AntiVirus userspace daemon
     Loaded: loaded (/lib/systemd/system/clamav-daemon.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/clamav-daemon.service.d
             └─extend.conf
     Active: active (running) since Wed 2024-02-21 11:44:33 JST; 4s ago
       Docs: man:clamd(8)
             man:clamd.conf(5)
             https://docs.clamav.net/
    Process: 54279 ExecStartPre=/bin/mkdir -p /run/clamav (code=exited, status=0/SUCCESS)
    Process: 54280 ExecStartPre=/bin/chown clamav /run/clamav (code=exited, status=0/SUCCESS)
   Main PID: 54281 (clamd)
      Tasks: 1 (limit: 18920)
     Memory: 955.7M
        CPU: 4.215s
     CGroup: /system.slice/clamav-daemon.service
             └─54281 /usr/sbin/clamd --foreground=true

今度はOKです。この結果を見てもわかるように、消費メモリが1GBほど。

  • ソケットがリッスンされていることを確認
netstat -a|grep clam
unix  2      [ ACC ]     STREAM     LISTENING     1516341  /var/run/clamav/clamd.ctl

freshclamを定期実行させます。

  • サービススクリプトを作成
cat <<- __EOF__ | sudo tee -a /etc/systemd/system/freshclam.service
[Unit]
Description=Freshclam virus database updater

[Service]
Type=simple
ExecStart=/usr/bin/freshclam -d -c 4
# -c 数字で 頻度を指定します。ここでは日に4回(6時間おき)に更新します

[Install]
WantedBy=multi-user.target
__EOF__
  • 実行権付与
sudo chmod +x /etc/systemd/system/freshclam.service
  • サービス反映
sudo systemctl daemon-reload
  • サービス開始
sudo systemctl start freshclam.service
  • 自動起動有効化
sudo systemctl enable freshclam.service
  • サービス開始確認
systemctl status freshclam.service

Active :inactive (dead)と表示されますが、 freshclam.service: Deactivated successfully.と出ていれば動作に問題はありません。

NextcloudでAntiVirusをインストール

  1. Nextcloudに管理者権限でログインします。
  2. アプリから「Antivirus for files」を検索してインストールします。

Nextcloud Antivirus for files設定

  1. 管理者メニューの「セキュリティ」に進みます。
  2. ファイルのウイルス対策で、以下の通り設定します。
  • モード: ClamAV Daemon (Socket)
  • ソケット: /var/run/clamav/clamd.ctl
  • ストリームの長さ: 262144000 (アップロードできるファイルの容量に合わせます)
  • File size limit for periodic background scans and chunked uploads, -1 means no limit:-1
  • Check only first bytes of the file, -1 means no limit :-1
  • バックグラウンドスキャン中に感染ファイルが見つかった場合: ログのみ (運用に合わせます)

設定後、「保存」をクリックして、設定完了です。

Ubuntu 22.04にclamavを設定。(インストールと動作確認)

Ubuntu 22.04の検証機が、16GBほどの余裕があったのでclamavをインストールしてみます。

さっくりとした手順

  1. レポジトリを追加します。
  2. clamavをインストールします。
  3. 定義ファイルをアップデートします。
  4. 動作を確認します。

手順

レポジトリを追加します。

sudo add-apt-repository ppa:deadsnakes/ppa

clamavのインストールを行います。

  • パッケージ更新
sudo aptitude update
  • clamavインストール
sudo aptitude install clamav clamav-daemon
  • インストール確認
clamd --version

2024/02/20現在、以下を確認しました。

ClamAV 0.103.11/27190/Mon Feb 19 18:24:27 2024

定義ファイルの更新を行います。

  • freshclam 起動(失敗)
sudo freshclam 

以下のエラーが出ました。

ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).
ERROR: initialize: libfreshclam init failed.
  • エラー対処
sudo rm /var/log/clamav/freshclam.log
  • エラー対処後のfreshclam 起動(OK)
sudo freshclam

定義ファイル更新確認

Tue Feb 20 15:35:41 2024 -> ClamAV update process started at Tue Feb 20 15:35:41 2024
Tue Feb 20 15:35:41 2024 -> daily.cvd database is up-to-date (version: 27190, sigs: 2053641, f-level: 90, builder: raynman)
Tue Feb 20 15:35:41 2024 -> main.cvd database is up-to-date (version: 62, sigs: 6647427, f-level: 90, builder: sigmgr)
Tue Feb 20 15:35:41 2024 -> bytecode.cvd database is up-to-date (version: 334, sigs: 91, f-level: 90, builder: anvilleg)

インストール後のステータスを確認します。

systemctl status clamav-daemon
systemctl status clamav-freshclam

それぞれactive(running)を確認します

テストファイルを用いて動作を確認します。

  • ディレクトリ移動
cd /hoge && pwd

任意のディレクトリを指定してください。

  • eicarテストファイル作成
echo "X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*" > eicar
  • ディレクトリスキャン
clamscan ./

以下を確認したら、スキャンはできています。

/hoge/eicar: Eicar-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 8685351
Engine version: 0.103.11
Scanned directories: 1
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 16.689 sec (0 m 16 s)
Start Date: 2024:02:20 16:12:15
End Date:   2024:02:20 16:12:32

これから

  1. 設定ファイルを編集
  2. ファイル追加時などにスキャンをするようにする

などを行っていきます。

対話式にLinuxサーバの再起動・停止を行うシェルスクリプト。

概要

メンテナンスなどで、指定する時刻にLinuxサーバを停止・再起動したいときは割合にあります。

そこで、そんなスクリプトです。

スクリプト内容

  • server_shutdown.sh
#!/bin/bash

# メッセージを表示して日付を入力
read -p "このサーバを停止・再起動する日付をyyyymmdd形式で入力してください: " input_date

# メッセージを表示して時刻を入力
read -p "このサーバを停止・再起動する時刻をhhmm形式で入力してください: " input_time

# メッセージを表示して再起動か停止かを入力
read -p "再起動は1、停止は2を入力してください(空エンターは1): " restart_option
restart_option=${restart_option:-1}  # デフォルトは再起動(1)

# 日付と時刻を結合
scheduled_datetime="${input_date} ${input_time}"

# オプションに応じてコマンドを設定
case $restart_option in
    1)
        action="再起動"
        ;;
    2)
        action="システム停止"
        ;;
    *)
        echo "無効なオプションが選択されました。スクリプトを終了します。"
        exit 1
        ;;
esac

# 確認メッセージを表示して、実行の可否を確認
read -p "$(date -d "$scheduled_datetime" '+%Y/%m/%d %H:%M') に$action します。よろしいですか?(y/n): " confirmation

if [ "$confirmation" == "y" ]; then
    # 指定した日時まで待機し、処理をバックグラウンドで実行
    (sleep $(( $(date -d "$scheduled_datetime" '+%s') - $(date '+%s') )) && {
        echo "システムに常駐し、指定日時に$action を行います。"
        if [ $restart_option -eq 1 ]; then
            shutdown -r now
        elif [ $restart_option -eq 2 ]; then
            shutdown -h now
        fi
    }) &
    disown  # バックグラウンドプロセスをデタッチ
    echo "処理をバックグラウンドで実行しました。プロンプトに戻ります。"
else
    echo "操作をキャンセルしました。"
fi

作成後、

sudo chown root:root server_shutdown.sh

として所有者をrootに変更。その後、

sudo chmod 744 server_shutdown.sh

で、rootのみに実行権を付与します。

実行時の動き

sudo bash server_shutdown.sh
このサーバを停止・再起動する日付をyyyymmdd形式で入力してください: 20240216
このサーバを停止・再起動する時刻をhhmm形式で入力してください: 0215
再起動は1、停止は2を入力してください(空エンターは1): 1
2024/02/16 02:15 に再起動 します。よろしいですか?(y/n): y
処理をバックグラウンドで実行しました。プロンプトに戻ります。

と、プロンプトが出て指定時刻にサーバーの再起動/停止を行います。

動きを止めたいとき

バックグラウンドで処理が走っているので、プロセスを確認して止めます。

  • プロセス確認
ps aux |grep server_shutdown
root        2202  0.0  0.0  11020  1528 ?        S    16:32   0:00 bash server_shutdown.sh

2202のように、PIDを確認します。

  • プロセス停止
sudo kill 2202

PIDに停止シグナルを送り、処理を止めます。

  • プロセス確認
ps aux |grep server_shutdown

該当するバックグラウンドの処理がなければ大丈夫です。

Nextcloud 28.02のエラー「メンテナンス

概要

Ubuntu 22.04でも稼働を始めたNextcloud。28.02にアップグレード後、管理者画面から以下の警告が出てきました。

サーバーにはメンテナンスウィンドウの開始時間が設定されていません。これは、リソースを多く使用する日常のバックグラウンドジョブが、メインの利用時間中にも実行されることを意味します。利用者がこれらの重いタスクによる負荷の影響を受けにくくするために、低い利用時間に設定することをおすすめします。 詳細については、ドキュメント↗を参照してください。

対処

https://docs.nextcloud.com/server/28/admin_manual/configuration_server/background_jobs_configuration.html

上記の通りに行うこととします。

以下、NextcloudがインストールされているサーバにSSHログイン(または直接コンソール接続)での操作です。

環境

  • Ubuntu 22.04
  • php 8.1
  • Apache 2.4

手順

root昇格

Nextcloudは、コンフィグ系が全てWeb実行ユーザ(www-data)等に統一されているため、

sudo su -

での操作を行います。

バックアップ取得

  • ディレクトリ移動
cd /home/www-data/nextcloud/config && pwd
  • バックアップ
cp -pi config.php /path/to/backup/directory/config.php.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • バックアップ確認
diff -u config.php /path/to/backup/directory/config.php.$(date +%Y%m%d)

エラーが出なければ(差分がなければ)バックアップ成功です。

config.php修正

以下のファイルを、以下の通り追記します。

/home/www-data/nextcloud/config/config.php

  • 追記内容
  'default_timezone' => 'Asia/Tokyo',
  'maintenance_window_start' => 1,
  • 差分
+  'default_timezone' => 'Asia/Tokyo',
+  'maintenance_window_start' => 1,

config.phpでタイムゾーンを指定済みであれば、追記は下の行だけで大丈夫です。

修正反映

  • Apache再起動
systemctl restart apache2.service
  • rootから抜ける
exit

解消確認

ブラウザから上記の処置を施したNextcloudにアクセス。管理者画面で「サーバーにはメンテナンスウィンドウの開始時間が設定されていません~」が出なければOKです。

自分用Redmineのステータスと評価。

自分のタスクやスケジュール管理に利用しているRedmine。

ステータスという呪文

作って間もない頃はプロジェクトやトラッカーに合わせて専用のステータスを作っていましたが、

「どれがどの状態か不明」

という状況に陥りました。

自分にとって必要なのは

  • ボールは自分にあるのか?
  • 相手にあるならいつチェックするのか?
  • フィードバックは必要か?

の3つぐらいだという結論。人に任せるわけでもない自分のタスク管理なので、ステータスはプロジェクト共通でいいと判断。

ステータス説明
Alohomora(開けよ)新たにチケットを発行するとき
Locomotor(動け)チケットを開始する
Arresto Momentum(遅く)様子見の必要があるため、一時的に中断したい場合
Depulso(除け)ボールが自分にあるとき。すなわち、自分の案件を押しつける。
Accio(来い)ボールが他人にあるとき。すなわち、状況を呼び寄せる。
Lumos(光よ)案件にスポットライトを当てる。フィードバック待ちのとき。
Obliviate(忘却せよ)準備が整って、実行するだけのチケット。なので、時期が来るまで忘れてもいいステータス。
Finito(終われ)案件が解決し、チケットを終わらせるとき
Avada Kedavra(息絶えよ)却下されたり却下したなどで、未解決状態でチケットをクローズ

『ハリー・ポッター』シリーズで出てくる呪文と擬えました。これなら、分かりやすく、必要なステータスのみに集中できます。

評価

そして、自分が発行したチケットは「期待通りか」のフィードバックが必要だと思いまして、カスタムフィールドを利用して、以下の形にしました。

  • U:不明 / Ungraded and Unglued
  • O:優 / Outstanding
  • E:良 / Exceeds Expectations
  • A:可 / Acceptable
  • P:不可 / Poor
  • D:落第 / Dreadful
  • T:トロール並 / Troll

「Ordinary Wizard's Level:OWL」試験の評価に、現段階では評価できない不明「Ungraded and Unglued」を加えました。

自分だけが使うツールは、こういう遊びの余地があるから好きです。

ChatGPTによるRubyスクリプト。(対話式パスワード生成)

前回作成したパスワード生成スクリプト。変数で指定するのはCron処理などでは便利でしたが、日常には不向き。

そこで、再びChatGPTに相談し、

以下の要件でスクリプトを作成です。

要件

  • スクリプトを実行する
  • 発行強度を1~3で指定する (空エンターは中)
    • 1:弱 8桁/英数字のみ
    • 2:中 10桁/小文字・大文字・英数字と単純な記号
    • 3.強 12桁/小文字・大文字・英数字と複雑な記号
  • 表示するパスワードの数を数字で指定する (空エンターは4個)

スクリプト

できあがったのがこちら。

  • password_generate.rb
def generate_password(length, complexity, password_count)
  case complexity
  when 1
    chars = [('a'..'z'), (0..9)].map(&:to_a).flatten
  when 2
    chars = [('a'..'z'), ('A'..'Z'), (0..9), ['!', '@', '#', '$', '%', '^', '&', '*']].map(&:to_a).flatten
  when 3
    chars = [('a'..'z'), ('A'..'Z'), (0..9), ['!', '@', '#', '$', '%', '^', '&', '*'], ['-', '_', '=', '+', '<', '>', '?']].map(&:to_a).flatten
  else
    puts "無効な発行強度です。"
    return
  end

  password_count.times do |i|
    password = (0...length).map { chars[rand(chars.length)] }.join
    puts "Password #{i + 1}: #{password}"
  end
end

def get_complexity
  print "発行強度を1から3の範囲で入力してください (デフォルトは2):\n"
  complexity_input = gets.chomp

  complexity = complexity_input.empty? ? 2 : complexity_input.to_i

  until (1..3).cover?(complexity)
    print "有効な範囲で入力してください(1から3): "
    complexity = gets.chomp.to_i
  end

  complexity
end

def get_password_count
  print "表示するパスワードの数を入力してください (デフォルトは4): "
  count_input = gets.chomp

  count = count_input.empty? ? 4 : count_input.to_i

  count
end

puts "パスワードを生成します。"
complexity = get_complexity
password_count = get_password_count

case complexity
when 1
  generate_password(8, complexity, password_count)
when 2
  generate_password(10, complexity, password_count)
when 3
  generate_password(12, complexity, password_count)
end

実行例

ruby password_generate.rb
発行強度を1から3の範囲で入力してください (デフォルトは2):
2
表示するパスワードの数を入力してください (デフォルトは4): 9
Password 1: ILAXRn!O47
Password 2: P^qmiduucK
Password 3: 8ytFezU%fU
Password 4: O!6OFeHgYe
Password 5: Ua&!Ryg039
Password 6: &T@AtiNpWy
Password 7: Jz8jyPbp#3
Password 8: HOWE66ki1I
Password 9: 9WRdsHhk*H

再評価の全文検索プラグイン。(Redmine 5.1検証)

ほぼ一年前、涙を呑んでアンインストールした全文検索プラグイン。

事情が変わったので再評価です。

理由1:プラグインでの支障が無くなった

これを諦めた最大の理由は、knowlegebaseプラグインの存在。

各種文書を記録できるこのプラグインは、導入当初:このプラグインがRedmine 4.2までしか対応していないからバージョンを落として使っていたほどです。

ところが5.0以降では(githubでは)使えないということで開き直ることができました。

knogwlegebaseという足かせがなくなれば、

  • チケットを細かく検索できる
  • 設定によって類似したチケットを表示する

このプラグインは高評価となります。

理由2:文書の保管に適したツールを見つけた

Bookstackを見つけたのが思いのほか大きいです。これによって、Wiki形式の文書のストックをこちらに出すことができます。

こちらも全文検索機能付きでバージョン管理も容易。

「使った当初は諦めたけど、事情やバージョンにより評価が変わる」話でした。

Redmine 5.1でのリマインダー設定。

概要

Redmine 4.1と同じような仕組みが構築できました。

前提

Redmineでメール送信ができることです。

手順

スクリプトを作成します。

  • ファイル名 `redmine_reminder.sh`
  • スクリプト内容
#!/bin/sh

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

cd /home/www-data/redmine
# 自分が格納しているRedmineのルートディレクトリ
bundle exec rake redmine:send_reminders days=7 RAILS_ENV=production
# この例では7日前に通知します。days=nの部分を変えることで日数を指定できます

作成後、以下を実行して実行権限を付与します。

sudo chmod +x redmine_reminder.sh

  • Crontab編集
sudo crontab -l -u -root
  • 記入例
30 15 * * * /path/to/script/directory/redmine_reminder.sh
# スクリプトを格納したディレクトリを指定します

編集後、指定した時刻にメールが送られてくれば成功です。

Page 2 of 34

Powered by WordPress & Theme by Anders Norén