タグ: ruby

ChatGPTによるスクリプト変換。(bash → Ruby)

ことのあらまし

手なりで作ったシェルスクリプトを発展させたり可読性を高めるために利用しているChatGPT。

考えを発展させて「スクリプトの変換はできるのではないか」と考えました。

元となったスクリプト

こちらにある

cat error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }' | sort | uniq > /var/lib/redmine/log/suspicious_ip/suspicious_ip.`date +%Y%m%d`
  • error.logを読み込み
  • IPアドレスにマッチする正規表現を取り出し
  • ソートした上で重複を排除
  • 指定のディレクトリに書き出す

という一文のシェルスクリプトをRubyで動かすにはとChatGPTに質問しました。

出来上がったRubyスクリプト

require 'date'

## 変数指定ここから
# error.log の格納ディレクトリ
log_dir = '/path/to/log_dir'
# error.log の名前
log_file = 'error.log'
# 別ファイルの出力ディレクトリ
output_dir = '/path/to/output_dir'
# 重複を排除する場合は 1、しない場合は 0 を指定
remove_duplicates = 1
# 別ファイルの名前
output_file = 'output.txt'
# IPアドレスを抜き出すための正規表現パターン
ip_regex = /client (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/
# error.log ファイルのフルパス
log_path = File.join(log_dir, log_file)
## 変数指定ここまで

# error.log ファイルを開く
File.open(log_path) do |file|
  # IPアドレスのみを格納する配列
  ips = []

  # 各行をチェックする
  file.each_line do |line|
    # 正規表現パターンに一致するか確認する
    match = line.match(ip_regex)
    if match
      # 一致した場合、IPアドレスを配列に格納する
      ips << match[1]
    end
  end

  # 重複を排除する場合
  if remove_duplicates == 1
    ips.uniq!
  end

  # 昇順にソートする
  ips.sort!

  # 結果を出力するファイルのパス
  output_path = File.join(output_dir, "error_#{Date.today.strftime('%Y%m%d')}_#{output_file}")

  # 結果を出力する
  File.open(output_path, 'w') do |file|
    ips.each do |ip|
      file.puts ip
    end
  end
end

スクリプトは長くなりましたが、以下の利点があります。

  • 読み込むディレクトリや正規表現のパターンを変数化しているため、他のログにも転用可能
  • 重複を排除するかしないかを決められる

また、可読性も高くなっています。

何より、シェルスクリプトの動きをRubyで動かすための文法を学べるのも素晴らしく。

今後の作業の大きな力になります。

Ubuntu 22.04系にRuby2.7をインストール

結論から言えば、Ubuntu 22.04系は普通にやったのではRuby 2.7はインストールできません。

なぜならRuby 2.7が必要とするOpenssl1.1.1系をUbuntu 22.04系がサポートしていないからです。

そんな中で、どうしてもこのバージョンを入れたいというケースがあったので対応を行いました。

手順

参考
https://github.com/rbenv/ruby-build/discussions/1940#discussioncomment-2663209

依存関係をインストールします。

sudo apt install git build-essential checkinstall zlib1g-dev

rbenvをインストールします。

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
rbenvのパスを通します。
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc

source ~/.bashrc

ruby-buildをインストールします。

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

OpenSSL 1.1.1をインストールします。

cd ~/Downloads
wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz
tar xf openssl-1.1.1q.tar.gz

cd ~/Downloads/openssl-1.1.1q
./config --prefix=/opt/openssl-1.1.1q --openssldir=/opt/openssl-1.1.1q shared zlib
make
make test
sudo make install

シンボリックリンクを張り替えます。

sudo rm -rf /opt/openssl-1.1.1q/certs
sudo ln -s /etc/ssl/certs /opt/openssl-1.1.1q

ruby 2.7系をインストールします。

RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/openssl-1.1.1q
RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/openssl-1.1.1q rbenv install 2.7.6

rbenv global 2.7.6

インストールされていることを確認します。

ruby -v
ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [x86_64-linux]

rootが参照できるようにパスを通します。

which ruby
# /home/user1/.rbenv/shims
# 結果を控えておきます
sudo su -

# ↓以下、rootでの作業↓
echo "export PATH=$PATH:/home/user1/.rbenv/shims" >> ~/.bashrc
source ~/.bashrc
which ruby
# /home/user1/.rbenv/shims
# 控えておいたパスであることを確認します
ruby -v
# ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [x86_64-linux]
# 2.7系であることを確認します

と、ここまで書きましたがきっとDockerなどのコンテナを使ったほうが楽かと思います。

Page 2 of 2

Powered by WordPress & Theme by Anders Norén