2012年6月13日水曜日

Apacheのアクセスログを分間リクエスト数だけまとめる

Apacheのアクセスログから画像、CSS、Javascriptをすっ飛ばして簡易的に分間リクエスト数を算出するスクリプトを作ってみた。
時間がないのでPHPとBashがごっちゃになってる上に変数も何もあったもんじゃない糞っぷりですが、急いでいたもんですんません!
analytic.php
<?PHP
$argDate = strtotime($argv[1]);
$file = $argv[2];

for($i = -120; $i <= 120; $i++){
  echo date('d/M/Y:H:i', strtotime("+${i} minute", $argDate));
  if($i < 120){
    echo "\n";
  }
}
?>


analytic.sh
#!/bin/sh
echo '' > result.csv
for line in `php ./analytic.php "${1}" ./access_log` ; do
  count=`grep "${line}" ./access_log | egrep -v "\.(gif|jpg|css|js) " | wc -l`
  echo ${line},${count} >> result.csv  
done


access_logがあるフォルダに上記のファイル2点を作成して
sh ./analytic.sh "2012-06-13 18:00:00"

としてあげると数十分シェルが固まってから6月13日の18時から前後2時間で分毎のおよそのリクエスト数が
result.csvに出力されます。

2011年12月15日木曜日

WindowsでTapsを動かす

以前CentOS5.5でTapsを動かす のエントリーでLinux環境でTapsを動かしましたが、時は流れ、Windowsメインで仕事をするようになったため、Windows環境でtapsを動かす方法です。

以前はrubyもソースから入れていましたがyumもmakeもないWindowsでコンパイル環境から揃えるのは面倒なのでRailsInstallerでも使ってRuby&Gemsを入れてしまいましょう。Rubyのバージョンは1.9.1です。

gem install json --version '=1.5.1'
gem install sequel --version '=3.20.0'
gem install rack --version '=1.2.1'
gem install sqlite3-ruby --version '=1.2.5'
gem install pg --version '=0.11'
gem install mysql --version '= 2.8.1'
gem install sinatra --version '=1.1.2'
gem install rest-client --version '=1.6.1'

TapsのGithub  からバージョン「0.3.23-1」のファイルを落としてきてC:\RailsInstaller直下にでも解凍します。

cd C:\RailsInstaller\ricardochimal-taps-f5e01bc\bin
ruby taps server mysql://mysqluser:mysqlpassword@mysqlhost/databaseto?encoding=utf8 httpuser httppassword &

移行元のデータベースを指定して移行元からサーバーへデータをPushします。

cd C:\RailsInstaller\ricardochimal-taps-f5e01bc\bin
ruby taps push postgres://pguser:pgpassword@pghost/databasefrom http://httpuser:httppassword@localhost:5000

2011年9月30日金曜日

Google Apps ScriptでWeb監視的なサムシング

会社の先輩によるとGoogle Apps Scriptが何やらすごいらしいので、
試しにWeb監視的なサムシングを作ってみました。

Googleスプレッドシートで新規にシートを作って、下記のような表を手打ちで作ります

URL メアド ステータス 更新日時 メールログ
http://xxxxxxx/ xxxx@yyy.com (空欄) (空欄) (空欄)


表ができたらツール→スクリプトエディタでエディタを開いて下記のようなスクリプトを書きます。
function checkUrl() {
  var sheet = SpreadsheetApp.openById("XXXXXXXXXXXXXXXXXXXXX");
  var child = sheet.getSheets()[0];
  var size = child.getMaxRows();
  
  // 1st row is url
  var urlList = child.getRange("A2:A" + size).getValues();
  // 2nd row is mail address to alert
  var mailList = child.getRange("B2:B" + size ).getValues();
  // 3rd row is status
  var statusCells = child.getRange("C2:C" + size );
  // 4th row is status
  var dateCells = child.getRange("D2:D" + size );
  // 5th row is log
  var logCells = child.getRange("G2:G" + size );
  
  var url = null;
  var line = 1;
  var time = new Date();
  while (url = urlList.shift()){
    //trim
    url = url.toString().replace(/^\s+|\s+$/g, "");
    if(url != ""){
      try{
        var response = UrlFetchApp.fetch(url);
        if(response.getResponseCode() == 200){
          statusCells.getCell(line, 1).setValue("OK");
        } else {
          throw (response.getResponseCode());    
        }
      } catch (e){
        statusCells.getCell(line, 1).setValue("Error: " + e.toString().substring(0, 100) + "...");
        errorMail(mailList[line - 1], logCells.getCell(line, 1), url, e);
      } finally {
        dateCells.getCell(line, 1).setValue(time);
      }
    }
    line++;
  }
}

function errorMail(mail, logCell, url, error){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var child = sheet.getSheets()[0];
  var size = child.getMaxRows();
  
  // 5th row is log
  var mailCells = child.getRange("G2:G" + size );
  try {
     MailApp.sendEmail(mail, "Web Check failed " + url, error);
  } catch (e){
     logCell.setValue("Error: " + e);
  } 
}
SpreadsheetApp.openByIdに指定するスプレッドシートのIDは一回下記スクリプトを実行してあげればその場で確認できます。
Browser.msgBox(SpreadsheetApp.getActiveSpreadsheet().getId());
最後にスクリプトエディタのウィンドウでトリガー→現在のスクリプトのトリガーで
[checkUrl] [Time Driven] [Minutes timer] [every 5 minutes]
とかって設定しておけば5分おきに1列目のURLを参照して200OKが帰ってこなかったら
2列目のメアドにアラートメールが送信されるっぽいです。

ものの30分くらいでできましたのでとりいそぎご報告まで

[追記] デバッグ中に何回かスクリプト実行に失敗しているのですが、今その失敗レポートが
「Google Apps スクリプト cloudbeat.js の失敗のまとめ」という件名のメールで
送信されてきました。なんというかスゴすぎですw

[追記 2011/10/18] スクリプトを毎分実行にして監視URLを5つ程度にしてみたところ、APIの呼び過ぎでエラーになりました^ ^; そらそうか… 

2011年7月28日木曜日

OpenSSLでオレオレ認証局(CA)を作る手順

# OpenSSLインストール
yum install openssl

# 設定ファイルをちょっとだけ変える
/bin/cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.bak
/bin/sed -i 's/^basicConstraints=CA:.*$/basicConstraints=CA:true/' /etc/pki/tls/openssl.cnf

# 自己認証局(CA)を作るためのスクリプトを実行する。
cd /etc/pki/tls/misc/
./CA -newca
# 自己認証局の情報を入力していく

# 設定ファイルをもとに戻す
/bin/cp /etc/pki/tls/openssl.cnf.bak /etc/pki/tls/openssl.cnf

# クライアント側でインストールするために認証局用の証明書をコピーしておく
cp ../../CA/cacert.pem ~/root.ca.crt

# Webサーバー側で作成したCSRをもとにサーバー証明書を発行(要パスワード)
openssl ca -in ~/yourdomain.csr -out ~/yourdomain.crt

# Tomcatで証明書を使う場合はx509 DER形式に変換
openssl x509 -inform pem -in ~/root.ca.crt -outform der -out ~/root.ca.der
openssl x509 -inform pem -in ~/yourdomain.crt -outform der -out ~/yourdomain.der
※サーバー側のCSRをyourdomain.csrとして発行している想定です。

2011年6月22日水曜日

appengineで10MB以上のjarファイルをdeployする方法

scalaを2.9.0にアップデートしたところ、アプリのdeployができなくなった。。。
エラーをみると

Unable to update app: Found a jar file too large to upload: "/var/folders/Bd/BdlXlBkEHI4YU+DlRT+3fE+++TI/-Tmp-/appcfg6468847202786792000.tmp/WEB-INF/lib/scala-compiler-2.9.0.jar".  Consider using --enable_jar_splitting.

あーアップロードするにはscala-compiler-2.9.0.jarがでかすぎるぜー「--enable_jar_splitting」を使いやがれーと。
んー。

あ!

scala-compiler-2.8.0.jar・・・8.7MB
scala-compiler-2.9.0.jar・・・11.8MB

膨らんできちゃった系ですか

appcfgのヘルプをみると

  --enable_jar_splitting
                        Split large jar files (> 10M) into smaller fragments.

10MBが境界線と・・・
素直にオプションつけて実行、と

appcfg.sh --enable_jar_splitting update war

うん、今度はうまくいったみたい。
でもこのファイルサイズだとスピンアップ重くなるのかな?
scala-compiler自体アップロードに含めない方がいいのかも・・・
mavenでパッケージングするときになんか指定できるのかな??
今度調べてみよう

2011年5月25日水曜日

s3fs をCentOSにインストール

インストール方法

yum install gcc libstdc++-devel gcc-c++ curl-devel libxml2-devel openssl-devel mailcap
rpm -Uvh http://rpm.vitki.net/pub/centos/5/i386/fuse-2.8.5-99.vitki.01.el5.i386.rpm
rpm -Uvh http://rpm.vitki.net/pub/centos/5/i386/fuse-libs-2.8.5-99.vitki.01.el5.i386.rpm
rpm -Uvh http://rpm.vitki.net/pub/centos/5/i386/fuse-devel-2.8.5-99.vitki.01.el5.i386.rpm
wget http://s3fs.googlecode.com/files/s3fs-1.40.tar.gz
tar xvzf s3fs-1.40.tar.gz
cd s3fs-1.40
./configure --prefix=/usr
make
make install

使用方法


1.S3へのアクセスキーを設定します。

sudo vi /etc/passwd-s3fs
-------------------------------------
{Access Key Id}:{Secret Access Key}
-------------------------------------

2.下記のコマンドで{Bucket}の部分をバケット名にして実行していただくことで
/mnt/s3/mypoint フォルダにS3がマウントされます。

sudo s3fs {Bucket} /mnt/s3/mypoint -o passwd_file=/etc/passwd-s3fs
ls -la /mnt/s3/mypoint

3.マウントを解除するときは下記のコマンドを実行してください。

sudo umount /mnt/s3/mypoint

2011年4月27日水曜日

ClamAv

yum install clamav
/usr/bin/freshclam
nice -n 19 clamscan --exclude-dir="(/dev|/sys|/usr/share/doc/clamav-0.97/test)" -i -r /

chkrootkit


mkdir -p /backup/bin/
cp -p `which --skip-alias awk cut echo egrep find head id ls netstat ps strings sed uname` /backup/bin/
yum install chkrootkit

chkrootkit

snort

rpm -ivh http://vscojot.free.fr/dist/snort/snort-2.9.0.4/RHEL5/i386/libpcap1-1.1.1-9.el5.i386.rpm
rpm -ivh http://vscojot.free.fr/dist/snort/snort-2.9.0.4/RHEL5/i386/libdnet-1.12-7.el5.i386.rpm
rpm -ivh http://vscojot.free.fr/dist/snort/snort-2.9.0.4/RHEL5/i386/daq-0.5-8.el5.i386.rpm
rpm -ivh http://vscojot.free.fr/dist/snort/snort-2.9.0.4/RHEL5/i386/snort-2.9.0.4-11.el5.i386.rpm
rpm -ivh http://vscojot.free.fr/dist/snort/snort-2.9.0.4/RHEL5/i386/snort-mysql-2.9.0.4-11.el5.i386.rpm
service snortd start

tripwire

http://sourceforge.net/projects/tripwire/files/tripwire-src/
wget http://downloads.sourceforge.net/project/tripwire/tripwire-src/tripwire-2.4.2-src/tripwire-2.4.2-src.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Ftripwire%2Ffiles%2Ftripwire-src%2Ftripwire-2.4.2-src%2F&ts=1303841362&use_mirror=jaist
tar -jxvf tripwire-2.4.2-src.tar.bz2 
cd tripwire-2.4.2-src/
./configure

vim ./install/install.cfg
------------------------------------
LOOSEDIRECTORYCHECKING =false
▼ (ファイル変更時の親ディレクトリをチェックしない)
LOOSEDIRECTORYCHECKING =true
------------------------------------

make
make install

install時にパスフレーズを入力するため、checkinstallでRPMの生成とかはむりっぽいです。
初期化でいくつかコマンドを・・・最後のはスペックによっては結構時間かかります。
twadmin --create-polfile -S /usr/local/etc/site.key /usr/local/etc/twpol.txt
twadmin --create-cfgfile -S /usr/local/etc/site.key /usr/local/etc/twcfg.txt
tripwire --init

スキャン実行・・・これも結構時間かかります。
tripwire --check

スキャン実行後、「Error Report」にファイルが見つからない旨エラーが出る場合は
「/usr/local/etc/twpol.txt」を編集して不要なパスをコメントアウトして再度初期化します。

twadmin --create-polfile -S /usr/local/etc/site.key /usr/local/etc/twpol.txt
tripwire --init

蛇足 snortをソースからインスコする手順途中まで(挫折して上のRPMをさがしました)


rpmforge導入(http://rpmrepo.org/RPMforge/Using)
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
rpm -ivh rpmforge-release-0.5.2-2.el5.rf.i386.rpm

ビルドツール諸々 インストール
yum --enablerepo=rpmforge install gcc gcc-c++ rpm-build  checkinstall

vim /usr/lib/checkinstall/checkinstallrc
===============
# Comma delimited list of files/directories to be ignored
EXCLUDE="/selinux"
===============

vim /usr/lib/checkinstall/checkinstallrc
===============
# Comma delimited list of files/directories to be ignored
EXCLUDE="/selinux"
===============


snort

yum install autoconf automake flex bison
wget http://www.tcpdump.org/release/libpcap-1.1.1.tar.gz
tar -zxvf libpcap-1.1.1.tar.gz 
cd libpcap-1.1.1
./configure 
/usr/sbin/checkinstall --fstrans=no

rpm -Uvh /usr/src/redhat/RPMS/i386/libpcap-1.1.1-1.i386.rpm

wget http://www.snort.org/downloads/860
tar -zxvf daq-0.5.tar.gz\?AWSAccessKeyId\=AKIAJJSHU7YNPLE5MKOQ\&Expires\=1303836479\&Signature\=y%2FsqPtdlaAmo4vnGfE618JKIEcU\= 
cd daq-0.5
./configure -with-libpcap_includes=/usr/local/include -with-libpcap_libraries=/usr/local/lib
/usr/sbin/checkinstall --fstrans=no

rpm -Uvh /usr/src/redhat/RPMS/i386/daq-0.5-1.i386.rpm

yum install pcre-devel libdnet-devel mysql-devel

wget http://www.snort.org/downloads/867
tar -zxvf snort-2.9.0.5.tar.gz\?AWSAccessKeyId\=AKIAJJSHU7YNPLE5MKOQ\&Expires\=1303837814\&Signature\=6uJfY+ZLlfvwAj5zUmY0OvbIZ9Y\= 
cd snort-2.9.0.5
./configure --with-mysql=yes
/usr/sbin/checkinstall --fstrans=no

rpm -Uvh /usr/src/redhat/RPMS/i386/snort-2.9.0.5-1.i386.rpm

/usr/sbin/groupadd snort
/usr/sbin/useradd -g snort -s /bin/false snort

mkdir /var/log/snort
chown snort:snort /var/log/snort

# rules
mkdir /etc/snort


参考リンク: http://www.geocities.jp/gronlijus/skill/linux/centos5-tripwire.html