Open5

メモ

epsilon phoenixepsilon phoenix

fail2ban調整

arch,Manjaroでjournalctlでログを取得して、メールで送る。

journalctlでログを検索するときに、ページャーを使わない、色装飾を行わない場合のコマンド例

SYSTEMD_COLORS=0 journalctl -b --no-pager -g "検索"

backendがsystemd(sshd,postfixなど)

logpathなし。nftablesを使用。
sendmail-whois-matches.confをsendmail-whois-lines.confを参考に修正。

diff -ur fail2ban-orig/action.d/helpers-common.conf fail2ban/action.d/helpers-common.conf
--- fail2ban-orig/action.d/helpers-common.conf	2023-05-21 04:38:09.000000000 +0900
+++ fail2ban/action.d/helpers-common.conf	2024-04-10 23:26:49.136663349 +0900
@@ -8,6 +8,7 @@
 # options `-wF` used to match only whole words and fixed string (not as pattern)
 _grep_logs_args = -wF "<ip>"
 
+_matches_logs = SYSTEMD_COLORS=0 journalctl -b -u <unitname> --no-pager -g "<ip>" | <greplimit>
 # Used for actions, that should not by executed if ticket was restored:
 _bypass_if_restored = if [ '<restored>' = '1' ]; then exit 0; fi;
 
diff -ur fail2ban-orig/action.d/sendmail-whois-matches.conf fail2ban/action.d/sendmail-whois-matches.conf
--- fail2ban-orig/action.d/sendmail-whois-matches.conf	2023-05-21 04:38:09.000000000 +0900
+++ fail2ban/action.d/sendmail-whois-matches.conf	2024-04-10 23:15:42.076663402 +0900
@@ -8,6 +8,7 @@
 
 before = sendmail-common.conf
          mail-whois-common.conf
+         helpers-common.conf
 
 [Definition]
 
@@ -20,22 +21,24 @@
 # Tags:    See jail.conf(5) man page
 # Values:  CMD
 #
-actionban = printf %%b "Subject: [Fail2Ban] <name>: banned <ip> from <fq-hostname>
+actionban = ( printf %%b "Subject: [Fail2Ban] <name>: banned <ip> from <fq-hostname>
             Date: `LC_ALL=C date +"%%a, %%d %%h %%Y %%T %%z"`
             From: <sendername> <<sender>>
             To: <dest>\n
             Hi,\n
             The IP <ip> has just been banned by Fail2Ban after
             <failures> attempts against <name>.\n\n
-            Here is more information about <ip> :\n
-            `%(_whois_command)s`\n\n
-            Matches:\n
-            <matches>\n\n
-            Regards,\n
-            Fail2Ban" | <mailcmd>
+            Here is more information about <ip> :\n"
+            %(_whois_command)s;
+            printf %%b "Matches:\n"
+            %(_matches_logs)s;
+            printf %%b "Regards,\n
+            Fail2Ban" ) | <mailcmd>
 
 [Init]
 
 # Default name of the chain
 #
 name = default
+logpath = /dev/null
+
diff -ur fail2ban-orig/jail.conf fail2ban/jail.conf
--- fail2ban-orig/jail.conf	2023-05-21 04:38:09.000000000 +0900
+++ fail2ban/jail.conf	2024-04-10 23:35:13.489996677 +0900
@@ -205,8 +205,8 @@
 # iptables-multiport, shorewall, etc) It is used to define
 # action_* variables. Can be overridden globally or per
 # section within jail.local file
-banaction = iptables-multiport
-banaction_allports = iptables-allports
+banaction = nftables-multiport
+banaction_allports = nftables-allports
 
 # The simplest action to take: ban only
 action_ = %(banaction)s[port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
@@ -220,6 +220,11 @@
 action_mwl = %(action_)s
              %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
 
+# ban & send an e-mail with whois report and relevant log lines(journalctl)
+# to the destemail.
+action_mwj = %(action_)s
+             %(mta)s-whois-matches[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s", unitname="%(unitname)s"]
+
 # See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
 #
 # ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
jail.local
[postfix]
unitname=postfix
enabled = true
action = %(action_mwj)s

[sshd]
unitname=sshd
action = %(action_mwj)s
epsilon phoenixepsilon phoenix

flatpak版bazelのコマンドライン

flatpak run --share=network --filesystem=home:rw org.freedesktop.Sdk -c "/usr/lib/sdk/bazel/bin/bazel --version"
bazel 7.1.1
epsilon phoenixepsilon phoenix

bazelであらかじめデータを揃えておいてビルドする際の手順は、flatpak版fcitx5-mozcの手順が参考になるかと思います。
最近、Mozc側のBazelの構成が変わったので、修正が必要そうです。

https://github.com/fcitx/flatpak-fcitx5
https://github.com/fcitx/flatpak-fcitx5/blob/master/org.fcitx.Fcitx5.Addon.Mozc.yaml
https://github.com/fcitx/flatpak-fcitx5/blob/master/mozc-deps.yaml
https://github.com/fcitx/flatpak-fcitx5/blob/master/update_mozc_deps

mozc-deps.yaml--distdir=$PWD/../bazel-depsなどの記述があるのがご確認できるかと思います。
mozc-deps.yamlの依存関係にあるファイルを更新するスクリプトがupdate_mozc_depsです。
このスクリプトが、現在はダウンロードしたファイルからファイル名が取得できない、config指定が増えたが追随できていないなどで利用できませんが、手順としては、下記手順と同じ感じになります。

原因は、bazelの新しいバージョンで内部ファイルの扱いが変わったからみたいです。オプションで戻せるかは未確認なので、いくつかの回避策をPRしておきました。(bazel 7.1.1を利用して、--noenable_bzlmodオプションを追加すれば回避できます。noenable_bzlmod enable_workspace。ただ依存関係のあるモジュールのバージョンが変わったりするので、不安定になるかもしれません。)
bzlmodを有効にしていると、いくつかのモジュールのパッチも追加で必要になるようです。それらのファイルをアップロードできていないので、ネットワークアクセスが必要になるようです。

https://github.com/fcitx/flatpak-fcitx5/issues/21
https://github.com/fcitx/flatpak-fcitx5/pull/23
https://github.com/fcitx/flatpak-fcitx5/pull/24

bazelでネットワーク接続なしでビルドする。

基本的な概略

  • 事前にモジュールなどのダウンロードは必要。
  • ソースとともにモジュールファイルもアップロードする
  1. モジュールのダウンロード
    --repository_cache=$PWD/../bazel-cacheフォルダにビルドに必要なファイルがダウンロードされます。
bazel clean --expunge
wget https://github.com/phoepsilonix/flatpak-fcitx5/raw/refs/heads/bazel-7.3.1/zip-code.patch
patch -p2 -i ./zip-code.patch
_BUILD_TARGETS="${_BUILD_TARGETS:-unix/fcitx5:fcitx5-mozc.so server:mozc_server gui/tool:mozc_tool}"
bazel build --nobuild --experimental_repository_resolved_file=resolved.bzl --repository_cache="$PWD/../bazel-cache" --config oss_linux --config release_build --noenable_bzlmod --enable_workspace $_BUILD_TARGETS

resolved.bzlファイルに詳細な情報が集まります。

  1. ビルドチェック
    その後、ネットワークなしで、ビルドできるか試します。
    キャッシュを削除して、ネットワークを遮断して試しましょう。
bazel clean --expunge
cp -a $PWD/../bazel-cache $PWD/../bazel-cache-backup
bazel build -c opt --copt=-fPIC --config oss_linux --config release_build --repotitory_cache=$PWD/../bazel-cache --linkopt "${LDFLAGS}" --noenable_bzlmod --enable_workspace $_BUILD_TARGETS

ビルドできたなら、ビルドする前の$PWD/../bazel-cache-backupフォルダを、Mozcのソースとともにアップロードできれば、OKということになります。
手順の概略は、こんな感じです。

レポジトリキャッシュそのままではなくて、モジュールのアーカイブを纏めていても可能だと思います。
distdirオプションを使う場合です。
ますはモジュールのURL情報を整理します。

wget https://github.com/phoepsilonix/flatpak-fcitx5/raw/refs/heads/bazel-7.3.1/zip-code.patch
wget https://github.com/phoepsilonix/flatpak-fcitx5/raw/refs/heads/bazel-7.3.1/resolved.jq
sed -e 's/^resolved = //' -e 's/ False/ "False"/g' -e 's/ None/ "None"/g' resolved.bzl > resolved.json
jq -r -f resolved.jq resolved.json > mozc-deps.json

mozc-deps.jsonファイルに必要なモジュールのURLが集まりました。
ダウンロードして、一つのフォルダに纏めておきます。

mkdir -p ../bazel-deps
cd ../bazel-deps
cat ../src/mozc-deps.json |jq -r '.[]| ( if ."dest-filename" != null and ."dest-filename" != "" then "wget \(.url) -O \(."dest-filename")" else "wget \(.url) -O \(.url |split("/")|last)" end )'|xargs -n3 wget -nc
cd ..src

そして、そのフォルダをdistdirで指定してビルドします。

bazel build -c opt --copt=-fPIC --config oss_linux --config release_build --distdir=$PWD/../bazel-deps --linkopt "${LDFLAGS}" --noenable_bzlmod --enable_workspace $_BUILD_TARGETS

flatpakでbuildオプションでネットワークを追加する場合

org.fcitx.Fcitx5.Addon.Mozc.yamlに書かれてあるとおりですが、説明しておくと、
mozc-deps.yamlbazel-depsディレクトリに展開させるためのファイル一覧を記述しておく感じです。
必要なファイルのURLとハッシュを記述して、そちらから取得させ、特定ディレクトリ(bazel-deps)に展開させて、その後、ビルドコマンドを実行する手順になります。
動作チェックとしては、bazel-depsに展開させたあとbazel clean --expungeでキャッシュをクリアさせておき、bazel buildコマンドでビルドしてみます。
これで最後までビルドが完了すれば、ネットワーク接続をビルド時に許容しない環境でも、一通りのファイルをまとめてアップロード、あるいは外部の信頼できるURLからのダウンロードが許容されている環境で、ビルド可能です。

flatpakに関しては、build-optionsのbuild-argsに--share=networkをオプションに追加すれば、ネットワークビルドも一応受け付けていたとは思います。ただ、外部モジュールは時々しか変更されません。あらかじめアップロードしておけば、あまり通信を発生させないで済むかもしれませんね。

flatpak-builderでネットワークを有効にしてビルドする場合には、次のようなオプション指定になります。ご参考まで。

diff --git a/org.fcitx.Fcitx5.Addon.Mozc.yaml b/org.fcitx.Fcitx5.Addon.Mozc.yaml
index 883d279..0610f27 100644
--- a/org.fcitx.Fcitx5.Addon.Mozc.yaml
+++ b/org.fcitx.Fcitx5.Addon.Mozc.yaml
@@ -14,6 +14,8 @@ build-options:
   prepend-path: /usr/lib/sdk/llvm17/bin:/usr/lib/sdk/bazel/bin
   prepend-pkg-config-path: /app/addons/Mozc/lib/pkgconfig
   prepend-ld-library-path: /usr/lib/sdk/llvm17/lib
+  build-args:
+    - --share=network
   env:
     - server_dir=/app/addons/Mozc/lib/mozc
     - document_dir=/app/ime/mozc/licenses/mozc

bzlmod

bzlmodを有効にしていると、distdirを指定していても、ネットワークがなぜ必要になるのか、確認したところ、remote_patchesをダウンロードしようとしているみたいです。repository_cacheを共有すれば、ネットワーク通信が発生しないので、パッチのファイルがdistdirに含まれていないことが原因です。

https://bcr.bazel.build/modules/apple_support/1.16.0/patches/module_dot_bazel_version.patch
https://bcr.bazel.build/modules/bazel_features/1.13.0/patches/module_dot_bazel_version.patch
:
:

これらのファイルは名前が衝突しているわけですが、distdirで指定しているフォルダに、どのように配置したらいいのだろうか?

bazelのコマンドオプションの--registryで下記のbcrフォルダを指定すると一連のファイルのダウンロードがなくなるそうです。

git clone https://github.com/bazelbuild/bazel-central-registry.git bcr

(まとめ)bzlmodを有効にした状態でのオフラインビルド

概略

  1. resolved.bzrから依存関係のモジュールの一覧を取得
  2. モジュールを一通りダウンロードしておく(bazel distdirオプション用)
  3. bazel-central-registryの準備(bazel regitryオプション用)
  4. オフラインビルド

依存モジュールのダウンロード

依存モジュール解析

ますはモジュールのURL情報を整理します。

export BASE=$PWD
git clone --filter=tree:0 https://github.com/fcitx/mozc
wget https://github.com/phoepsilonix/flatpak-fcitx5/raw/refs/heads/bazel-7.3.1/zip-code.patch
patch -p2 -i ./zip-code.patch
cd mozc/src
bazel clean --expunge
_BUILD_TARGETS="${_BUILD_TARGETS:-unix/fcitx5:fcitx5-mozc.so server:mozc_server gui/tool:mozc_tool}"
patch -p2 -i $BASE/zip-code.patch
bazel build --nobuild --experimental_repository_resolved_file=resolved.bzl --repository_cache="$PWD/../bazel-cache" --config oss_linux --config release_build $_BUILD_TARGETS

resolved.bzlから、URL情報を収集します。

wget https://github.com/phoepsilonix/flatpak-fcitx5/raw/refs/heads/bazel-7.3.1/resolved.jq
sed -e 's/^resolved = //' -e 's/ False/ "False"/g' -e 's/ None/ "None"/g' resolved.bzl > resolved.json
jq -r -f resolved.jq resolved.json > $BASE/mozc-deps.json

mozc-deps.jsonファイルに必要なモジュールのURLが集まりました。

依存モジュールのダウンロード

ダウンロードして、一つのフォルダに纏めておきます。

mkdir -p $BASE/bazel-deps
cd $BASE/bazel-deps
cat ../src/mozc-deps.json |jq -r '.[]| ( if ."dest-filename" != null and ."dest-filename" != "" then "wget \(.url) -O \(."dest-filename")" else "wget \(.url) -O \(.url |split("/")|last)" end )'|xargs -n3 wget -nc

bazel-central-registryの用意

cd $BASE
git clone --filter=tree:0 https://github.com/bazelbuild/bazel-central-registry.git bcr

オフラインビルド

ここからは、ネットワークを閉じても大丈夫です。

cd mozc/src
bazel build --config oss_linux --config release_build --linkopt "${LDFLAGS}" $_BUILD_TARGETS --distdir=$PWD/bazel-deps --registry=file:///$BASE/bcr/