だるろぐ

だるいぶろぐです

yum reinstall

今まで yum でパッケージ管理してるソフトウェアの設定ファイルを書き換えまくりすぎて、元に戻したいけどバックアップ取ってねぇーってときは削除して入れ直してたけど、ふと man とか見たら reinstall というサブコマンドがあることを今更知った。
削除しようとすると依存解決でとんでもないもの削除しようとするので(postfix削除しようとするとcrontabまで道連れにしようとするとか)今度からこれでいいや。

Net::Google::Analytics::OAuth2 で google analytics api を叩こうとしたら refresh token が取得できなかった

google analytics には api*1 がある。
認証・認可には oauth2 を使う。authsub というのもあるみたいだけどどうやらこれから使うなら oauth2 使っとく方がいいらしい。


api を叩くための各種ライブラリ*2もある。
おいおい perl 無いじゃねーか、と思うと、載ってないだけで cpan にある*3
認証部分は Net::Google::Analytics::OAuth2 を使う。


よしこれを使おう、まずは pod に従い interactive メソッドで access_token / refresh_token を入手しよう、とすると中途半端に失敗するはず。access_token しか取れない。
実は最近 google 側の仕様変更があった*4ようで、 refresh token を受け取るにはパラメータを追加する必要がある。それにモジュールが追随してない。


というわけで。

--- a/lib/Net/Google/Analytics/OAuth2.pm
+++ b/lib/Net/Google/Analytics/OAuth2.pm
@@ -70,8 +70,9 @@ sub refresh_access_token {

 sub interactive {
     my $self = shift;
+    my $extra_params = @_ == 1 ? $_[0] : { @_ };

-    my $url = $self->authorize_url;
+    my $url = $self->authorize_url($extra_params);

とでもしてやって、

$oauth->interactive(
    approval_prompt => "force",
    access_type     => "offline",
);

とすると refresh token も取れる。
このモジュールは最近までメンテナンスされてるし github にあるので誰か pull req 送ったら世界が平和になる気がする。

叩く

たとえば

  • /you/want/page/path という uri に前方一致する
  • 2013/01/01-31 間の
  • pvの累計

が欲しいと思ったら

my $req = $analytics->new_request(
    ids         => "ga:$profile_id",
    dimensions  => "ga:pagePath",
    metrics     => "ga:Pageviews",
    filters     => "ga:pagePath=~/you/want/page/path",
    sort        => "-ga:Pageviews",
    start_date  => "2013-01-01",
    end_date    => "2013-01-31",
);

my $res = $analytics->retrieve($req);
$res->is_success or do {
    warn json->decode($res->content)->{error}->{message};
    exit;
};

my $pv = 0;
for my $row ( @{$res->rows} ) {
    $pv += $row->get_pageviews;
}
say $pv;

とかすると取れる。

python 2.4 の環境で autojump を使う

autojump は python 2.6 を要求するが入れたくないので 2.4 で動く古いバージョンを使っている。
配布元 に書いてある。

If you are unable to update Python to a supported version, older versions of autojump can be downloaded and installed manually.

 Python v2.4 is supported by release v12.


最新版とどのくらい違うかは知らないけどこれで十分。

Term::ANSIColorでターミナルに色付きで出力する

色々できるけど単純に color と colored だけ使って不便は無い。

use strict;
use warnings;
use Term::ANSIColor qw/colored/;

for my $c (qw/black red green yellow blue magenta cyan white/) {
    print colored(["$c"], "$c\t");
    print colored(["bright_$c"], "bright_$c\t");
    print colored(["on_$c"], "on_$c\t");
    print "\t" if length $c < 5;
    print colored(["on_bright_$c"], "on_bright_$c\t");
    print "\n";
}

for my $i (0..15) {
    print colored(["ansi$i"], "ansi$i\t");
    print colored(["grey$i"], "grey$i\t");
    print colored(["on_ansi$i"], "on_ansi$i\t");
    print colored(["on_grey$i"], "on_grey$i\t");
    print "\n";
}

perlbrew と CloudForecast を動かす

  • 環境
% cat /etc/redhat-release
CentOS release 6.3 (Final)

vim zsh screen あたりは入れておく。

perlbrew

まずは拾ってくる。

curl -kL http://install.perlbrew.pl | bash

そして使うためのファイルを読む設定。確か上記の作業後に指示された気がする。

echo " source ~/perl5/perlbrew/etc/bashrc " >> .zshrc_local

ときにこの場合、 .zshrc にはこう書いてある。

load_if_exists () {
    if [ -e $1 ]; then
        source $1
    fi
}

load_if_exists "$HOME/.zshrc_local"

普通に .bashrc / .zshrc に追記してもいい。


いったんシェルを抜けるなり、 source ~/perl5/perlbrew/etc/bashrc するなり。


無駄に最新版を入れる。

perlbrew install perl-5.16.2
perlbrew switch perl-5.16.2
perlbrew install-cpanm
perl -le "warn $]"
5.016002 at -e line 1.

daemontools

使うので。以下参考。
http://www.ftnk.jp/~fumi/cl/2010-04-19-2.html


コマンドは /command/ 以下にインストールされるので、自分のパス通ってるところに ln -s でもする。

memcached

使うよね。

wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
tar zxf memcached-1.4.15.tar.gz
cd memcached-1.4.15
sudo yum install libevent-devel
./configure --prefix=/usr/local/memcached
sudo make install

あとは適当に run ファイル書いて daemontools に任せる。

mysql

rpm を拾ってくるなど。
もうこれサーバ構築ですね。
http://dev.mysql.com/downloads/mysql/#downloads


この辺入れる。

MySQL-client-5.5.28-1.rhel5.x86_64.rpm
MySQL-devel-5.5.28-1.rhel5.x86_64.rpm
MySQL-server-5.5.28-1.rhel5.x86_64.rpm
MySQL-shared-5.5.28-1.rhel5.x86_64.rpm
MySQL-shared-compat-5.5.28-1.rhel5.x86_64.rpm


あと apache とか iptables とか色々と。

CloudForecast(準備)

本題。
拾ってくる。

git clone git://github.com/kazeburo/cloudforecast.git

依存ライブラリとか。以下参考。
http://memememomo.hatenablog.com/entry/20100726/1280124818
http://blog.riywo.com/2011/02/27/043646

あとこれ入れると多分いい。

cpanm Module::Install
cpanm Alien::RRDtool

依存perlモジュールは extlib に入れる想定みたいだけど、別に perlbrew 入れてるから構わず入れる。

cpanm --installdeps .

もう一度perlbrew

net-snmp 辺りを入れようとすると多分エラー吐く。
ググると、どうも perlbrew 入れるときに perlコンパイルオプション指定しないと駄目らしい。
泣きながら再インストール。

perlbrew uninstall perl-5.16.2
perlbrew install perl-5.16.2 -A ccflags=-fPIC

perl本体は削除され、再インストールされるけど、モジュールは削除されずに使いまわされたような気がする。いいのか?


改めて yum で net-snmp 辺りを入れる。当然インストールされるファイルの所有者が root になるので

cd ~/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/
sudo chown -R hirafoo:hirafoo *

する。そして先ほどのサイト見つつ snmp の何かをやるとか。

CloudForecast(起動)

yaml を用意する。

cp cloudforecast_sample.yaml cloudforecast.yaml
cp host_config/basic.yaml{,_org}

見たいの追加する。

--- a/host_config/basic.yaml
+++ b/host_config/basic.yaml
@@ -6,4 +6,9 @@
 component_config:
 resources:
   - traffic:eth0
+  - traffic:2:eth0
   - basic
+  - http:80
+  - memcached:11211
+  - mysql
+  - innodb

ディレクトリ作る。

mkdir data

daemontools で動かす前に、 daemontools でやるのと同等のコマンドを打つ。

root_path=/usr/local/cloudforecast
sudo /usr/local/bin/setuidgid hirafoo $root_path/cloudforecast_radar -c $root_path/cloudforecast.yaml -l $root_path/server_list.yaml

すると Can't locate local/lib.pm... とか怒られますね。


何でかってと

% head -n 1 /usr/local/cloudforecast/cloudforecast_radar
#!/usr/bin/env perl

このように cloudforecast_radar で /usr/bin/env perl を指定してるんですが、これ実際何が使われるかというとユーザによって変わるわけで。 perlbrew で入れた perl はそのアカウントでしか(普通)使えないわけで。つまり

% cat print_version.pl
#!/usr/bin/env perl
use strict;
use warnings;

print "$^V\n";

% chmod +x print_version.pl

% ./print_version.pl
v5.16.2

% sudo ./print_version.pl
v5.10.1

のように他ユーザで env perl すると perlbrew じゃない perl = システムの perl が使われるわけで。
だから run の中とかで

_perlhome="/home/hirafoo/perl5"

export PATH=$_perlhome/perlbrew/perls/perl-5.16.2/bin:/usr/local/bin:/usr/bin:/bin

とか書いてやる。あくまで一例。他にも色々やりようはある。


さーてこれで radar は動いたし、 web から見るかーと思うと

Odd number of elements in anonymous hash at /usr/local/cloudforecast/lib/CloudForecast/Host.pm line 19

とか言われます。該当部分を見ると

 12 sub list_graph {
 13     my $self = shift;
 14     my @ret;
 15     my $resources = $self->resources;
 16     for my $resource ( @$resources ) {
 17         my $data = $self->load_resource($resource);
 18         my @graphs = $data->list_graph;
 19         push @ret, {
 20             graph_title => $data->graph_title,
 21             resource_class => $data->resource_class,
 22             resource => $resource,
 23             graphs => \@graphs,
 24             sysinfo => $data->graph_sysinfo,
 25             last_error => $data->last_error,
 26         };
 27     }
 28     return @ret;
 29 }

とあるので、この @ret に突っ込んでる内容をダンプしてみると $data->last_error が undef だそうなので

-            last_error => $data->last_error,
+            last_error => $data->last_error || "",

とでもしてしまいます。

終わり

ここまで終えて、別にサーバで負荷かかるようなこと一切してないからグラフ見てもつまらないなーそもそもモニタリングする必要があるのって負荷かかってるサーバなんじゃ…そもそもこのサーバ何のために手に入れたの…とかは考えると落ち込むのでさっさと忘れてしまう。