2014年12月23日火曜日

Beanstalk の eb コマンド (v.2.6.4 not v3) と VPC

Beanstalk のコマンドラインインタフェースである eb コマンドについて。v2.6.4 の eb コマンドは VPC と相性があまり良くない感じ。

eb startして environment を作成後、GUI で VPC を設定して eb stop すると、.elasticbeanstalk/optionsettings.<環境名> に以下のような値が返ってくる。

[aws:ec2:vpc]
Subnets=subnet-3fxxxxx
VPCId=vpc-dexxxxx
これをそのまま次回 eb start すると、すごく長い時間 launching... 状態となり以下のようなエラーが発生し environment が正常起動しない。どうやら、EC2 が正常起動したことを Beanstalk に通知できないでいるらしい。外部に出られる経路を確保する必要があるようだ。GUI的に Beanstalk 内の VPC 設定画面における「Associate Public IP Address」の
設定の部分だが、これが eb コマンド側の optionsettings.xxx に戻ってこないのが問題。

 Stack named 'awseb-e-xxxxxxxxxxxx' aborted operation. Current state: 'CREATE_FAILED' Reason: The following resource(s) failed to create: [ AWSEBInstanceLaunchWaitCondition ]. 
 The EC2 instances failed to communicate with AWS Elastic Beanstalk, either because of configuration problems with the VPC or a failed EC2 instance. Check your VPC configuration and try launching the environment again.


これを回避するため、eb start 前に optionsettings.xxx に以下のように
AssociatePublicIpAddress=true を追加するのが良い。

[aws:ec2:vpc]
Subnets=subnet-3fxxxxx
VPCId=vpc-dexxxxx
AssociatePublicIpAddress=true


なお、ELB 配下にいて Multi AZ な環境にしている場合は、以下の設定も引き継がれない
ので、eb start 前に要設定。

[aws:elb:loadbalancer]
CrossZone=true


ただ、eb start した直後に何故かこの設定が消されてしまう。eb start 毎度これを設定
しなきゃならんのがかなりダルい。


eb の v3 の方は引数で指定できるが、ローカルにファイルが残らないのがなんだかな...

2014年12月12日金曜日

Beanstalk の ebextensions から composer.phar

Beanstalk の .ebextensions で command 定義にて composer.phar を呼んでいる
だけど、どうしても失敗してしまう。
Beanstalk はプロジェクトルートにある composer.json を勝手に実行してくれる
のになんでそんなことやるの?てツッコミはなしで。
(以下と同じことをやりたいため。
http://stackoverflow.com/questions/17521843/aws-elastic-beanstalk-and-composer)

こんなエラー↓
ERROR [Instance: i-070023f5 Module: AWSEBAutoScalingGroup ConfigSet: null] Command failed on instance. Return code: 1 Output: [CMD-AppDeploy/AppDeployStage0/EbExtensionPreBuild] command failed with error code 1: Error occurred during build: Command 30composer failed.
これ以上詳細なメッセージがなく困ってたんだけど、仕方なく command: の中で
出力をリダイレクトしてファイルに吐かせることに成功。以下のエラーだった。


  [RuntimeException]                                                                    
  The HOME or COMPOSER_HOME environment variable must be set for composer to run correctly

HOMEが無いから怒られている? env HOME=/root などとしたら解消。

2014年12月9日火曜日

.ebextension を git リポジトリに含めないと実行されない

Beanstalk の件。
.gitignore に .ebextension を書いちゃうとどうやら .config は実行
されないようだ。
.ebextension は git リポジトリから外せない。

2014年12月6日土曜日

PHP から作ったファイルが他のセッションから見えない

Fedora20, Apache 2.4.10, PHP5.5 な環境なんだけど、例えばこんな↓
ことして Apache からアクセスして /var/tmp/foo.txt とか作ってみる。

 <?php
  system("echo abc > /var/tmp/foo.txt");
  print("OK");
?>

でも、ターミナル等からは /var/tmp/foo.txt が見えない。
PHP からなら見える。で、Apache を再起動すると PHP からも見えなくなる。

おそらく mod_php がプログラムからのファイル作成をフックしてあらかじめ
unlink() してるんだろうと思い Apache 起動中に lsof で確認してみたが、
foo.txt は deleted な状態でも open されていない。

この動き不思議すぎるわ。selinux を disabled にしても同じ。
いったいなんじゃこれ。

2014年11月27日木曜日

Beanstalk の PHP55 の Apache

Prefork なんか Worker なんか (libphp5 なんか libphp5-zts なんか)わからんかったので
EC2 の中見てみたら以下だった。




[root@ip-xxx etc]# cat httpd/conf.modules.d/00-mpm.conf

# Select the MPM module which should be used by uncommenting exactly

# one of the following LoadModule lines:





# prefork MPM: Implements a non-threaded, pre-forking web server

# See: http://httpd.apache.org/docs/2.4/mod/prefork.html

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so





# worker MPM: Multi-Processing Module implementing a hybrid

# multi-threaded multi-process web server

# See: http://httpd.apache.org/docs/2.4/mod/worker.html

#

#LoadModule mpm_worker_module modules/mod_mpm_worker.so
デフォルトはこれだと思うが、変えるのはどうやるんだろ? 管理UIにはなさそうなので
直接編集なんだろうか?

2014年10月28日火曜日

keytool で秘密鍵と証明書をペアでインポートしたい

Java の証明書管理のコマンド keytool は、既存の秘密鍵と証明書をペア
でインポートするオプションがない。
PKCS#12 ならいけるらしい。PKCS#12 を keystore とみなすので
importkeystore オプションで行ける。

keytool -importkeystore -keystore keystore -srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass password

 http://cunning.sharp.fm/2008/06/importing_private_keys_into_a.html

2014年10月23日木曜日

Google Cloud SQL で set session time_zone = 'Asia/Tokyo'

Google Cluod SQL で、set session time_zone = 'Asia/Tokyo' としてセッションの
タイムゾーンを指定しようとしたら以下のエラー。

[ERROR] Fatal error: Illegal or unknown default time zone 'Asia/Tokyo'

どうも、mysql.time_zone あたりのテーブルに何も入っていないらしい。
手元の mysql クライアントが入ってるマシーンから以下実行で OK

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p -h 接続先 mysql

2014年10月8日水曜日

Google Cloud SQL での evnet_scheduler は裏ワザ?

以下によると、Google Cloud SQL で event_scheduler を on にするには
Google にメールで連絡しなければならないらしい。

http://stackoverflow.com/questions/22558985/is-event-scheduler-unavoidably-disabled-in-goolge-cloud-sql

まじ? 以下抜粋。

 
We can manually turn that on. Please contact us with the name of your instance at cloud-sql@google.com. –  Razvan Musaloiu-E. Mar 23 at 2:23

2014年9月1日月曜日

A start job is running for dev-disk-by ...

Fedora 20 でなんか起動時に下記メッセージが出て起動がめちゃくちゃ遅い。

A start job is running for dev-disk-by...

Web 調べたところ、fstab に書いてある UUID が見つからないからこんな症状
になるらしい。

  A start job is running for dev-disk-by\x2dlabel-swapspace.device
  https://bbs.archlinux.org/viewtopic.php?id=161814

/dev/disk/by-uuid/ 以下にちゃんと UUID の symlink を作ればいいっぽい。

2014年7月24日木曜日

Fedora 20 yum update したら ibus-mozc で入力できんぞ

Install Date から考えておそらく ibus-mozc だろう。
yum update して再起動したら日本語入力ができなくなった。
Shift-space で mozc の選択はできるんだけど、その後日本語が入力できん。
mozc 自体は先月にアップデートしたっきりだから、ibus-mozc のせいと思ってる。

仕事ができないので取り急ぎ以下実行
yum downgrade ibus-mozc mozc emacs-common-mozc emacs-mozc emacs-mozc-el

ibus-mozc-1.15.1814.102-1.fc20.x86_64

ibus-mozc-1.12.1599.102-1.fc20.x86_64

これで一応治ったが…
根本原因は後で調査しよう。。。あとで。。

2014年7月2日水曜日

www.jpcert.or.jp の証明書

https://www.jpcert.or.jp/ を firefox のホームにしてるんだけど、なんか
今日から急に証明書が信頼できない旨の警告が出始めた。
Verisign の中間の Symantec の証明書を使っているらしいのだが、Firefox
の設定を見るとデフォルトでは Symantec が入ってない...
一昨日の yum update が問題だったか?

しかし jpcert としても中間証明書を流していないのか? と疑問に思い
s_client で確認すると以下のような chain になっていて、確かに Symantec
の中間証明書を流していない(0と1の間に Symantec の証明書が必要なのでは)。

これでいいんすかね?


Certificate chain
 0 s:/1.3.6.1.4.1.311.60.2.1.3=JP/businessCategory=Private Organization/serialNumber=0100-05-006504/C=JP/postalCode=101-0054/ST=Tokyo/L=Chiyoda-ku/street=Hirose Bldg. 11F, 3-17 Kanda-nishikicho/O=Japan Computer Emergency Response Team Coordination Center/OU=System Administration Group/CN=www.jpcert.or.jp
   i:/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 EV SSL CA - G3

 1 s:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)06/CN=VeriSign Class 3 Extended Validation SSL CA
   i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5


 2 s:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority

2014年6月26日木曜日

keystone に endpoint 登録で "Malformed endpoint URL"

OpenStack の keystone に endpoint 登録したのはいいが、その後 keystone endpoint-list とか
の関連コマンドを実行すると以下のエラーが出て苦しんだ。

Malformed endpoint URL (http://hoge.example.com:8080/v1/AUTH_%{tenant_id}s)
どうやら URL の中括弧がまずいらしい。正しくは %() と普通のカッコだった。
どうにもコマンドが実行できないので、直接 mysql にログインして endpoint テーブル
から該当の行を直接 delete したら治った...

ちなみに mysql の接続情報は keystone.conf にある。

Qcow2 のローカルマウント

Qcow2 のイメージの中をちゃちゃっと見たいとき、qemu-nbd を使うのが良いらしいが、
RHEL6 や Cent6 には標準で入ってないっす。

この場合 guestmount ってのを使うと良いようで、RHEL6 の場合、
yum install libguestfs-tools すればインストールされる。

で、hoge.img を /mnt/tmp 下にマウントしたい場合以下のコマンド実行

guestmount -a hoge.img -m /dev/sda1 /mnt/tmp

取り急ぎ調べたので -m を指定する意味がイマイチわからんが、あとで調べるってことで。

2014年6月19日木曜日

Fedora 19 -> Fedora 20 の fedup でハマったこと

# fedup --network 20 -v --debuglog /var/tmp/fedup.log --disablerepo google-chrome 
でエラーなくコマンドが終了したんだけど、一向に grub.cfg が書き換わらず、
仕方ないので fedup のソースを追ったところ boot.py 内で new-kernel-pkg なる
コマンドで grub の設定ファイルをいじっていることを発見。
このコマンドを手動で実行してみるも何のエラーもなし。
-v つけてみたところ、どうも /boot/grub2/grub.cfg は書き込み対象じゃないら
しい。以下のように /etc/grub2.cfg が対象の模様。
$ sudo new-kernel-pkg -v --initrdfile /boot/initramfs-fedup.img --banner 'System Upgrade' --kernel-args 'upgrade systemd.unit=system-upgrade.target plymouth.splash=fedup enforcing=0' --make-default --install fedup
initrdfile is /boot/initramfs-fedup.img
found /boot/initramfs-fedup.img and using it with grubby
/etc/grub.conf does not exist, not running grubby for grub 0.97
/etc/grub2.cfg does not exist, not running grubby for grub 2
/boot/efi/EFI/fedora/grub.cfg does not exist, not running grubby for grub 2 with UEFI
/etc/lilo.conf does not exist, not running grubby
/etc/extlinux.conf does not exist, not running grubby for extlinux
 仕方ないので ln -s /boot/grub2/grub.cfg /etc/grub2.cfg しました。
で、再起動後アップグレード処理が完了。

しかし今度は grub の起動時にFedora20 のカーネルで立ち上がらん。
以下のエラー。
alloc magic is broken at 0x8a9b0360: 73......
Aborted. Press any key to exit.
いろいろ調べたところ、 grub.cfg で initrd を指定するところの
パラメータ名が initrdefi になってなかった(EFIな環境)。
initrdefi /boot/initramfs-3.14.8-200.fc20.x86_64.img
上記に書き換えたら起動した。

あと、起動後音が出なかったのだが、これは以前経験済みで alsaunmute コマンドで
解決。

2014年5月22日木曜日

Google Groups の From が "送信者名" via "グループ名" <グループアドレス> になっちゃう件

@yahoo.com やら @yahoo.co.jp やら @aol.com などのメアドから Google Groups
にメールを送信するとメッセージヘッダの From: が以下に書き換えられる現象が
最近多発しているとのこと。

From: "送信者名" via "グループ名" <グループアドレス> 

どうも、Yahoo や AOL が DMARC レコードに p=reject を付与したことが要因
らしい。

$ dig +short _dmarc.yahoo.com txt
"v=DMARC1\; p=reject\; sp=none\; pct=100\; rua=mailto:dmarc-yahoo-rua@yahoo-inc.com, mailto:dmarc_y_rua@yahoo.com\;"

例えば、Google Groups が From の書き換えをしなかったとしたらどうだろう。

example@yahoo.com のメアドを持つ人が Google Groups 宛にメールを出すと、
Google Groups はそのままメンバーにそのメールを配信する。
そして配信されたメンバーのプロバイダが DMARC チェックしていたとしよう。
yahoo.com のポリシーは p=reject なので、外部からのメールは拒否しろという
指示に従い、そのメンバーのプロバイダはメールを受け取らず拒否する。

というわけで、Google はその対策として p=reject なドメインからの
Google Groups へのメールについて、その From: ヘッダをグループのメール
アドレスに書き換えるという暴挙に出たらしい(暴挙は大げさか)。

本当の送信者は X-Original-Sender ヘッダで確認できるようだ。

以下に議論があった。

Why do some messages sent to a group get rewritten From, X-Original-From headers?
https://productforums.google.com/forum/#!topic/apps/KHQceAbom5g

ただ、@yahoo.co.jp の DMARC は何も設定されていないのにこの目にあって
しまうのはなんで?

2014年2月27日木曜日

xfreerdp


rdesktop だと SSL の RDP ができない。以下のエラーが発生しちゃう。



ERROR: CredSSP: Initialize failed, do you have correct kerberos tgt initialized ?
Failed to connect, CredSSP required by server.

xfreerdp  というのが対応していた。Fedora 標準で入ってた。
これからこっちが主流?
コマンド実行の時点で ID/Password が必要だったんだけど、これは --no-auth
で解除できるんかな?

2014年2月26日水曜日

AD でオレオレ証明書で ldaps するのに AD CS で作った証明書じゃないとダメというデマ

Active Directory で ldaps するのにオレオレ証明書を使いたい場合、
AD DS(Active Directory Certificate Services)で作ったやつじゃないと
うまくいかないよなどというデマを某所で聞いた。

普通にできますが… 以下 openssl でオレオレ作った場合の例。

openssl で秘密鍵とオレオレ証明書を作成して pkcs12 で結ぶ。証明書を
作るときの CN は AD ドメインコントローラの「フル コンピュータ名」に
する必要あり。
openssl req -x509 -newkey rsa:2048 -keyout my.key -out my.crt
openssl pkcs12 -export -out my.p12 -inkey my.key -in my.crt

出来た証明書ファイルと pkcs12 ファイルを AD ドメインコントローラ
にコピー。んで、AD ドメインコントローラ上で mmc なるツールを起動。
# なんすかスナップインて?


  1. 出てきた画面(コンソール1)で「ファイル」→「スナップインの追加と削除」
    を選択。
  2. 「スナップインの追加と削除」画面の「利用できるスナップイン」
    のリストから「証明書」して「追加」をクリック。
  3. 「証明書スナップイン」の画面で「コンピュータアカウント」を選択。
    「次へ」クリック。
  4. 「ローカルコンピュータ」が選択されていることを確認の上「完了」を
    クリック。
  5. 「スナップインの追加と削除」画面に戻るので「OK」をクリック。
  6. 「コンソール1」に戻るので、画面左の「証明書(ローカルコンピュータ)」
    を開く。
  7. 開いたところの「信頼されたルート証明機関」を右クリックして「すべての
    タスク」を選択して「インポート」を選択。これで openssl で作った
    証明書ファイル(上記例だと my.crt)をウィザードに従いインポート。
  8. 今度は「個人」を右クリックして「すべてのタスク」を選択して「インポー
    ト」を選択。ここで openssl で作った pkcs12 ファイル(上記例だと my.p12)
    をウィザードに従いインポート。
  9. これでドメインコントローラマシンを再起動すれば ldaps が使えるように
    なる。
しかし Windows の作業手順を説明するのってなんでこんなにダルいんだろ。

2014年2月7日金曜日

parseExpressionBoolean returns -1

自作の rpm を mock で build すると以下のエラー。

parseExpressionBoolean returns -1

どうやら、Requires の前に以下のような %if をかましているのが原因らしい。
(根本的な原因は違うのだが)
%if 0%{rhel} == 5
Requires:       mod_python
%else
  : 
%rhel の定義は /etc/rpm/macros.dist に含まれるが、BuildRequires にこの
ファイル名もしくは buildsys-macros を記しても、ダウンロードの順序のせ
いかこのファイルが作成されない。

仕方ないので、mock の設定ファイルに以下を追記。

config_opts['macros'] += '%rhel 5'

2014年2月5日水曜日

Google APIs Client Library for python の process-safe 性

Google APIs Client Library for python で OAuth2 のアクセストークンを保存する
Storage として file.Storage を使う場合、アクセストークンのリフレッシュ時に
生じる書き込みにおいて、複数プロセスに対するロックが不完全なような気がする。

oauth2client/file.py には以下のように定義されており、そのロックには threading.Lock
を使っている。

     36 class Storage(BaseStorage):
     37   """Store and retrieve a single credential to and from a file."""
     38
     39   def __init__(self, filename):
     40     self._filename = filename
     41     self._lock = threading.Lock()
これだと同じ Python プロセスの複数スレッドからのアクセスには耐えうるものの、
python プロセスを fork するようなプログラムでは排他出来ないのではないか?
Storage がファイルの場合はロックファイルや共有メモリを使うべきと思うのだが
どうだろう…
実際 mod_python を使ったプログラムに Credentials::authorize() が入っていたり
すると、同時アクセスがあった場合に何度も同時にリフレッシュがかかってしまう
動きをしていた。Prefork だからだろうか?

認識が違ってたら誰かツッコミください。