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

2011年2月16日水曜日

Tapsについて追記

前回 tapsの導入について書きましたが、実際にデータをプッシュしてみると2点ほど
エラーが出たので、一応回避手段をメモしておきます。

(1) データ転送中に何度か「MySQL server has gone away」のエラーがでる。

ISSUES におんなじ現象にぶち当たってる人がいていくつか回避策が載っていました。
私の場合は「/etc/my.cnf」を編集して「max_allowed_packet」の値を大きくする方法で
とりあえずエラーは出なくなりました。

(2) データの行数が多いテーブルを移行している途中で
「can't add a new key into hash during iteration」のエラーが発生して処理が中断される。

→どうやらメモリが足りなかった模様です。。VMWareで検証していたので、
割り当てメモリを1GB増やしたらエラーがでなくなりました。

2011年2月15日火曜日

CentOS5.5でTapsを動かす

Taps というツールを使ってPostgreSQLのデータをMySQLに移行しようとしたんですが、CentOS5.5へのRubyやらGemやらのインストールで割と手こずったのでメモ書きを。

まずはgemのインストールで使うライブラリとcheckinstallをyumでインストールします。

yum install mysql-devel postgresql-devel sqlite-devel checkinstall

Rubyは2011年2月現在yumでインストールできる1.8.5では
うまく動かなかったので公式サイトからファイル落としてきてインストールします。

wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p136.tar.gz
tar zxvf ruby-1.9.2-p136.tar.gz
cd ruby-1.9.2-p136
./configure --prefix=/usr
make
/usr/sbin/checkinstall --fstrans=no
### 対話でRPMを選択 ###

rpm -Uvh /usr/src/redhat/RPMS/i386/ruby-1.9.2-p136-1.i386.rpm

各種gemをインストールします。

gem update --system
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' -- --with-sqlite3-lib="/usr/lib/sqlite"
gem install pg --version '=0.10.1' -- --with-pg-lib="/usr/lib/pgsql"
gem install mysql --version '= 2.8.1' -- --with-mysql-lib=/usr/lib/mysql
gem install sinatra --version '=1.1.2'
gem install rest-client --version '=1.6.1'

TapsのGithub からバージョン「0.3.15」のファイルを落としてきて/usr/local/tapsに展開します。
そのまま起動してもgemのファイルが読み込めないエラーが出る場合は下記のファイルを書き換えます。

/usr/local/taps/lib/taps/cli.rb
一行目に下記を追加

require 'rubygems'

移行先のデータベース情報でtapsサーバー起動します。
/usr/local/taps/bin/taps server mysql://mysqluser:mysqlpassword@mysqlhost/databaseto?encoding=utf8 httpuser httppassword &

移行元のデータベースを指定して移行元からサーバーへデータをPushします。
/usr/local/taps/bin/taps push postgres://pguser:pgpassword@pghost/databasefrom http://httpuser:httppassword@localhost:5000

とりあえず動くところまで・・・。
データの検証とかは別途必要になります。

2011年2月12日土曜日

Slim3 + Scalaをはじめてみる

仕事とは関係なく純粋な趣味でScalaをお勉強してみたいと思います。
Scalaを選んだ理由は特にないのですが、強いてあげるなら
  1. Javaのクラスをつかえるからとりあえず動くものをつくってためしやすそう
  2. 学生時代にMLを習って関数型言語に何となく苦手意識をもっていたので
  3. NetBeansのプラグインをつかえばけっこう補完とかもきくみたい
といったところでしょうか。

ものを作りながら勉強するほうが楽しいので、
Google App Engine/JavaとSlim3をつかって
イージーなWebアプリでもつくりながらまったりやっていきたいと思います。

そんなわけでまずは環境構築から。
開発環境はこんな感じで
  • MacOSX - 10.6.6
  • Netbeans - 6.9.1
  • Scala - 2.8.0
  • AppEngine Java SDK - 1.4.0
  • Slim3 - 1.0.6
まずはMavenで下記のコマンドを実行します。

cd ~/workspace
mvn archetype:generate -DarchetypeCatalog=http://slim3.googlecode.com/svn/trunk/repository

で、最初にベースのarchetypeをきかれますのでとりあえず1を選択します。
あとはパッケージ名とプロジェクト名をお好みで入力します。

最後の確認で「y」を押すとプロジェクト名と同じディレクトリが
カレントフォルダ直下に出来上がります。

あとはpom.xmlにちまちまとScala用の設定を追記していく感じです。

<properties>タグに追記
    <!-- Scala -->
    <scala.version>2.8.0</scala.version>
    <!-- Common plugin settings -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>${project.build.sourceEncoding}</project.reporting.outputEncoding>

<repositories>タグに追記
    <!-- Scala -->
    <repository>
      <id>scala-tools.releases</id>
      <name>Scala-Tools Dependencies Repository for Releases</name>
      <url>http://scala-tools.org/repo-releases</url>
    </repository>

<pluginRepository>タグに追記
    <!-- Scala -->
    <pluginRepository>
      <id>scala-tools.releases</id>
      <name>Scala-Tools Plugins Repository for Releases</name>
      <url>http://scala-tools.org/repo-releases</url>
    </pluginRepository>

<dependencies>タグに追記
    <!-- Scala -->
    <!-- for Console -->
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-compiler</artifactId>
      <version>${scala.version}</version>
    </dependency>

<build><plugins>タグに追記
      <!-- Scala -->
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <version>2.14.3</version>
        <configuration>
          <charset>${project.build.sourceEncoding}</charset>
          <jvmArgs>
            <jvmArg>-Xmx1024m</jvmArg>
            <jvmArg>-DpackageLinkDefs=file://${project.build.directory}/packageLinkDefs.properties</jvmArg>
          </jvmArgs>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.4.2</version>
        <executions>
          <execution>
            <id>default-copy-resources</id>
            <phase>process-resources</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <overwrite>true</overwrite>
              <outputDirectory>${project.build.directory}</outputDirectory>
              <resources>
                <resource>
                  <directory>${project.basedir}/src</directory>
                  <includes>
                    <include>packageLinkDefs.properties</include>
                  </includes>
                  <filtering>true</filtering>
                </resource>
              </resources>
            </configuration>
          </execution>
        </executions>
      </plugin>

だいぶ長くなってしまいました・・・不要な部分もあるかと思うので
おいおい調整していきます。

以上でsrc/main/scala以下にscalaのソースをおいて
コンパイルされるようになるはずです。

試しにIndexControllerをScalaで書いてみましょう。
quickstartのarctypeで生成されるIndexController.javaを
削除して、src/main/scala/の下にScalaのパッケージを作成して、
下記のような形でIndexController.scalaを書いてみます。

package com.sample.controller;

import java.util.Date;

import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import org.slim3.datastore.Datastore;

import com.sample.meta.Slim3ModelMeta;
import com.sample.model.Slim3Model;

import scala.collection.JavaConversions._

class IndexController extends Controller {
  @throws(classOf[Exception])
  override protected def run():Navigation = {
    response.getWriter().println("hello, scala!");
    val m:Slim3Model = new Slim3Model();
    m.setProp1(new Date().toString());
    Datastore.put(m);
    val meta:Slim3ModelMeta = Slim3ModelMeta.get()
    Datastore.query(meta).asList().foreach{ model =>
      response.getWriter().println(model.getProp1())
    }
    response.flushBuffer();
    return null;
  }
}

pom.xmlがあるディレクトリでMavenコマンドを実行してコンパイルします。

mvn install

コンパイルが成功したらAppEngine Java SDK付属の
開発用サーバーを起動してみましょう。
dev_appserver.sh war


起動後に表示されるローカルのURLにアクセスして
「hello, scala」
と表示されていればとりあえず成功です。

毎回Javaで生成されたファイルをScalaに移動なんてやってられねーよ!!
という方のためにScala用の生成タスクを開発してくださった方がいます!


今回はまだ試してはいないのですが(すみません・・・)、
素敵なことにコントローラ、サービスの生成はもちろん、テストのひな形も
Scalaのテストツールで生成されるみたいです。

とりあえず今回はこの辺りで。