やりたいことが一つ叶いました。
中古のノートPCを手に入れ、整備したのが先月の出来事。
思いの外出来が良かったので、これを持って実用に耐えられるかどうかの検証を行いました。
というのは口実で、
コメダのモーニング
朝からガッツリ、コメダで食べたいという理由付けの一つです。
モーニングセットや食事のグラタンを食べながら、PCを広げる。
相当な英気を養っています。
やりたいことが一つ叶いました。
中古のノートPCを手に入れ、整備したのが先月の出来事。
思いの外出来が良かったので、これを持って実用に耐えられるかどうかの検証を行いました。
というのは口実で、
朝からガッツリ、コメダで食べたいという理由付けの一つです。
モーニングセットや食事のグラタンを食べながら、PCを広げる。
相当な英気を養っています。
家と公開用のRedmineで同じテーマを使っているので、「どちらのサイトにいるか」が少し分からなくなります。
そこで、こういうプラグインを付けてみました。
https://github.com/witcan/redmine_watermark
その名の通り、サイト全体にウォーターマークをつけるプラグインです。
cd /var/lib/redminep/pugins && pwd
自分の環境に合わせます。
sudo -u www-data git clone https://github.com/witcan/redmine_watermark
sudo systemctl restart apache2.service
アプリを動かしているサービスを再起動させます。
Redmineに管理者権限でログイン後、
管理>プラグイン>Redmine Watermarkに進みます。
サイトの背景にすかしが表示されれば設定完了です。
そのチケットがいつ閉じられたかを詳細に表示させます。
シンプルで便利なプラグインです。
両方で動きました。また、両方ともApache環境です。
cd /var/lib/redmine/plugins && pwd
自分の環境に合わせます。
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です。
NextcloudとClamAVを連携させます。
参考にした手順:
https://rair.dev/nextcloud-clamav-antivirus/
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/
最初はエラーになったので、再起動をします。
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
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.と出ていれば動作に問題はありません。
設定後、「保存」をクリックして、設定完了です。
Ubuntu 22.04の検証機が、16GBほどの余裕があったのでclamavをインストールしてみます。
sudo add-apt-repository ppa:deadsnakes/ppa
sudo aptitude update
sudo aptitude install clamav clamav-daemon
clamd --version
2024/02/20現在、以下を確認しました。
ClamAV 0.103.11/27190/Mon Feb 19 18:24:27 2024
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
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
任意のディレクトリを指定してください。
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
などを行っていきます。
メンテナンスなどで、指定する時刻にLinuxサーバを停止・再起動したいときは割合にあります。
そこで、そんなスクリプトです。
#!/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
該当するバックグラウンドの処理がなければ大丈夫です。
Ubuntu 22.04でも稼働を始めたNextcloud。28.02にアップグレード後、管理者画面から以下の警告が出てきました。
サーバーにはメンテナンスウィンドウの開始時間が設定されていません。これは、リソースを多く使用する日常のバックグラウンドジョブが、メインの利用時間中にも実行されることを意味します。利用者がこれらの重いタスクによる負荷の影響を受けにくくするために、低い利用時間に設定することをおすすめします。 詳細については、ドキュメント↗を参照してください。
上記の通りに行うこととします。
以下、NextcloudがインストールされているサーバにSSHログイン(または直接コンソール接続)での操作です。
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)
エラーが出なければ(差分がなければ)バックアップ成功です。
以下のファイルを、以下の通り追記します。
/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でタイムゾーンを指定済みであれば、追記は下の行だけで大丈夫です。
systemctl restart apache2.service
exit
ブラウザから上記の処置を施したNextcloudにアクセス。管理者画面で「サーバーにはメンテナンスウィンドウの開始時間が設定されていません~」が出なければOKです。
自分のタスクやスケジュール管理に利用しているRedmine。
作って間もない頃はプロジェクトやトラッカーに合わせて専用のステータスを作っていましたが、
「どれがどの状態か不明」
という状況に陥りました。
自分にとって必要なのは
の3つぐらいだという結論。人に任せるわけでもない自分のタスク管理なので、ステータスはプロジェクト共通でいいと判断。
ステータス | 説明 |
---|---|
Alohomora(開けよ) | 新たにチケットを発行するとき |
Locomotor(動け) | チケットを開始する |
Arresto Momentum(遅く) | 様子見の必要があるため、一時的に中断したい場合 |
Depulso(除け) | ボールが自分にあるとき。すなわち、自分の案件を押しつける。 |
Accio(来い) | ボールが他人にあるとき。すなわち、状況を呼び寄せる。 |
Lumos(光よ) | 案件にスポットライトを当てる。フィードバック待ちのとき。 |
Obliviate(忘却せよ) | 準備が整って、実行するだけのチケット。なので、時期が来るまで忘れてもいいステータス。 |
Finito(終われ) | 案件が解決し、チケットを終わらせるとき |
Avada Kedavra(息絶えよ) | 却下されたり却下したなどで、未解決状態でチケットをクローズ |
『ハリー・ポッター』シリーズで出てくる呪文と擬えました。これなら、分かりやすく、必要なステータスのみに集中できます。
そして、自分が発行したチケットは「期待通りか」のフィードバックが必要だと思いまして、カスタムフィールドを利用して、以下の形にしました。
「Ordinary Wizard's Level:OWL」試験の評価に、現段階では評価できない不明「Ungraded and Unglued」を加えました。
自分だけが使うツールは、こういう遊びの余地があるから好きです。
Windows 11にアップデートしてから、jpg画像の拡張子が「jfif」となりました。
Nextcloudでの画像プレビューに支障を来すので、修正を行います。
レジストリを修正します。作業には細心の注意を払ってください。
参考:
https://ameblo.jp/yuhwila/entry-12503707873.html
\HKEY_CLASSES_ROOT\MIME\Database\Content Type\image/jpeg
.jfifを.jpgに変更して「OK」
念のため、再起動を行います。
画像を保存する際の形式が.jpgになっていればOKです。
いちいち拡張子を変えるのが面倒だったので、これで一安心です。
前回作成したパスワード生成スクリプト。変数で指定するのはCron処理などでは便利でしたが、日常には不向き。
そこで、再びChatGPTに相談し、
以下の要件でスクリプトを作成です。
できあがったのがこちら。
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
Powered by WordPress & Theme by Anders Norén