openssh-5.8p2 の lpk 対応バージョン作ったよ
centos5 対応の openssh5.8p2 + lpkパッチバージョン作ったよ。
動かなくても泣かない人はどうぞ。
http://rtilabs.net/files/2011_05_05/
導入方法
wget http://rtilabs.net/files/2011_05_05/openssh-5.8p2-lpk.rti.1.x86_64.rpm wget http://rtilabs.net/files/2011_05_05/openssh-server-5.8p2-lpk.rti.1.x86_64.rpm wget http://rtilabs.net/files/2011_05_05/openssh-clients-5.8p2-lpk.rti.1.x86_64.rpm rpm -Uvh openssh-5.8p2-lpk.rti.1.x86_64.rpm openssh-server-5.8p2-lpk.rti.1.x86_64.rpm openssh-clients-5.8p2-lpk.rti.1.x86_64.rpm
src.rpm もあるよ!
wget http://rtilabs.net/files/2011_05_05/openssh-5.8p2-lpk.rti.1.src.rpm
作業メモ
忘れないようにメモっとく。
SPRMを取得
元々は この人がつくっていた srpm から派生。
http://marijuana.ddo.jp/
まずは、 srpm をダウンロードして展開する。
cd wget http://marijuana.ddo.jp/centos5.5/srpm/openssh-5.8p1-ma.1.src.rpm rpm -i openssh-5.8p1-ma.1.src.rpm
そうすると、 /usr/src/redhat/spec/ に spec が展開される。
この段階でもビルドは可能。
とりあえずビルドしてみるか。
SPRMをビルド
ビルドするのに必要なパッケージを入れる
yum -y install gtk2-devel libX11-devel openldap-devel autoconf automake perl zlib-devel util-linux groff pam-devel fipscheck-devel openssl-devel krb5-devel ncurses-devel libselinux-devel audit-libs xauth libX11* libXt*
できたので、ビルドしてみる。
rpmbuid -ba openssh.spec
うまく行けば、 以下のファイルが出来る。
find /usr/src/redhat/RPMS/ find /usr/src/redhat/SRPMS/
lpkパッチ
lpk用のパッチを持ってくる。
version lpk 5.5 ぐらいから SSHキーを格納する LDAPのカラム選べるようになったので最新版で作る。
open-ssh5.8p1 用のパッチを落としてくる。
cd /usr/src/redhat/BUILD wget http://jfut.integ.jp/linux/openssh/openssh-lpk-5.8p1-0.3.13.patch
あとは、spec を修正してビルドする。
cd /usr/src/redhat/SPEC vi openssh.spec
------------------------------------ %define ver 5.8p1 %define rel ma.1 ↓↓変更-----------↓↓ %define ver 5.8p2 %define rel lpk.rti.1 ------------------------------------
パッチを追加した。
------------------------------------ Patch0: openssh-5.8p1-initscript.patch ↓↓変更-----------↓↓ Patch0: openssh-5.8p1-initscript.patch Patch1: openssh-lpk-5.8p1-0.3.13.patch ------------------------------------
パッチを使うようにした。
------------------------------------ %patch0 -p1 -b .initscript ↓↓変更-----------↓↓ %patch0 -p1 -b .initscript %patch1 -p1 -b .initscript ------------------------------------
./configure でパッチを使うように修正 --with-ldap を追加.
------------------------------------ %configure \ --sysconfdir=%{_sysconfdir}/ssh \ --libexecdir=%{_libexecdir}/openssh \ --datadir=%{_datadir}/openssh \ --with-tcp-wrappers \ --with-rsh=%{_bindir}/rsh \ --with-default-path=/usr/local/bin:/bin:/usr/bin \ --with-superuser-path=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \ --with-privsep-path=%{_var}/empty/sshd \ --with-md5-passwords \ --without-zlib-version-check \ %if %{scard} --with-smartcard \ %endif %if %{rescue} --without-pam \ %else --with-pam \ %endif %if %{kerberos5} --with-kerberos5${krb5_prefix:+=${krb5_prefix}} %endif ↓↓変更-----------↓↓ %configure \ --sysconfdir=%{_sysconfdir}/ssh \ --libexecdir=%{_libexecdir}/openssh \ --datadir=%{_datadir}/openssh \ --with-tcp-wrappers \ --with-rsh=%{_bindir}/rsh \ --with-default-path=/usr/local/bin:/bin:/usr/bin \ --with-superuser-path=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \ --with-privsep-path=%{_var}/empty/sshd \ --with-md5-passwords \ --without-zlib-version-check \ --with-ldap \ %if %{scard} --with-smartcard \ %endif %if %{rescue} --without-pam \ %else --with-pam \ %endif %if %{kerberos5} --with-kerberos5${krb5_prefix:+=${krb5_prefix}} %endif ------------------------------------
修正をビルドしてみる。
できたので、ビルドしてみる。
rpmbuid -ba openssh.spec
うまく行けば、 以下のファイルが出来る。
find /usr/src/redhat/RPMS/ find /usr/src/redhat/SRPMS/
openssh を入れ替える。
注意: 最悪コンソールからしかログイン出来なくなる可能性があるので、コンソールを触れるように準備しておく。
cd /usr/src/redhat/RPMS/x86_64 rpm -Uvh openssh-5.8p2-lpk.rti.1.x86_64.rpm openssh-server-5.8p2-lpk.rti.1.x86_64.rpm openssh-clients-5.8p2-lpk.rti.1.x86_64.rpm /etc/init.d/sshd restart
念のため、 openssh が lpk 対応になったかどうか調べる。
対応ルーチンが入っていれば、 UseLPKって文字列があるはずだ!!
strings /usr/sbin/sshd | grep UseLPK
使い方はまた次回。
おしまい。
自作lambda 作って失敗した。
0xではないふつーのC++で独自実装によるラムダ式をつくってみようかなーって思っていろいろ実験していた。
結局うまくいかなかったけど、試行錯誤した記録を書いとく。
なんで boost のlambda があんなふうな複雑な文法になったのかわか気がした。
まず自作lambdaの文法を考えてみる。
やっぱ簡単に定義したいし、capture とかもやりたいなぁ。
MY_LAMBDA_BEGIN1(int,int) { return _1 + 12; } MY_LAMBDA2(capture...)
で、自由な構文を書くためには、 関数内class を取るしかない。
nazonazo() { struct InnerClass { int lambda(int _1) { return _1 + 12; } }; }
で、lambda なんだから、 lambda(1); とかで実行したい。
それには、operator () を利用する。
nazonazo() { struct InnerClass { int lambda(int _1) { return _1 + 12; } int operator ()(int _1) { return this->lambda(_1); } }; InnerClass a; a(1); //ok }
lambdaなんだから、 return で関数を返したい。
これは、継承とかをごにょって あげればできるる
struct Super { virtual operator ()(int _1) = 0; }; Super* nazonazo() { struct InnerClass : public Super { int lambda(int _1) { return _1 + 12; } int operator ()(int _1) { return this->lambda(_1); } }; //InnerClass a; //これはダメ。 //return &a; //ローカル変数の参照を返すとかマジキチ。 static InnerClass a; //動くけどスレッドセーフではないよね return &a; }
スレッドセーフにするためと、 static でずっとメモリが取られるのは嫌なのでなんとかする。
auto_ptr<> とかで逃げてみる。
struct Super { virtual operator ()(int _1) = 0; }; auto_ptr<Super> nazonazo() { struct InnerClass : public Super { int lambda(int _1) { return _1 + 12; } int operator ()(int _1) { return this->lambda(_1); } }; return auto_ptr<Super>( new InnerClass); }
これでOK。
しかし、利用する方がちょっとまずい。
今度は、 nazonazo() を受け取る方を考えてみる。
void main() { auto_ptr<Super> func = nazonazo(); (*func)(1); //OK しかしダサい。 //func(1) と呼び出したいよね!! }
(*func)(1); とか、まともな神経をしていたら、こんなの絶対おかしいよ!!ってしゃうとするところだと思う。
なんで、これを何とかして、 func(1)と呼び出せるようにしてみる。
auto_ptr を継承すればいいんじゃなイカ?
しかし、なんかこれがうまくいかんかった。
struct Super { virtual operator ()(int _1) = 0; }; remplate<classname _T> struct my_auto_ptr : public _auto_ptr<_T> { int operator ()(int _1) { return this->Ref->()(_1); } }; my_auto_ptr<Super> nazonazo() { struct InnerClass : public Super { int lambda(int _1) { return _1 + 12; } int operator ()(int _1) { return this->lambda(_1); } }; return my_auto_ptr<Super>( new InnerClass); }
仕方ないので、 自作 auto_ptr を作ってみた。
#たぶん、何か穴があると思うが細かいことは気にしない方向で。
template<typename _T> struct my_auto_ptr { _T* MyRef; _T* Ref; my_auto_ptr() { this->MyRef = NULL; this->Ref = NULL; } my_auto_ptr(_T* ref) { this->MyRef = ref; this->Ref = ref; } virtual ~my_auto_ptr() { delete Ref; } my_auto_ptr(const my_auto_ptr& obj) { if (this->Ref != obj.Ref){ delete this->Ref; } this->MyRef = obj.MyRef; this->Ref = NULL; } int operator()(int a1){ return this->MyRef->operator()(a1); } } struct Super { virtual operator ()(int _1) = 0; }; my_auto_ptr<Super> nazonazo() { struct InnerClass : public Super { int lambda(int _1) { return _1 + 12; } int operator ()(int _1) { return this->lambda(_1); } }; return my_auto_ptr<Super>( new InnerClass); } void main() { auto_ptr<Super> func = nazonazo(); func(1); //OK! }
やったー。うまくできた。
あとは、これを template で包んで揚げて、汎用化すればOK!だね!!!
最終的には、 こんな風に書きたいね!
my_auto_ptr<Super> nazonazo() { return LAMBDA_BEGIN() { return _1 + 1; } LAMBDA_END(); }
しかし!!
これではだめなのだ。
このラムダの実装だと、それができないのだ。
my_auto_ptr<Super> nazonazo() { return LAMBDA_BEGIN() { return _1 + 1; } LAMBDA_END(); } ↓↓↓↓↓↓↓↓↓↓↓↓↓ //こんな文法あるわけない!! my_auto_ptr<Super> nazonazo() { return struct InnerClass : public Super { int lambda(int _1) { return _1 + 12; } int operator ()(int _1) { return this->lambda(_1); } } ,my_auto_ptr<Super>( new InnerClass) } ↓↓↓↓↓↓↓↓↓↓↓↓↓ //どうやっても定義とreturn文は別だ! Super nazonazo() { return struct : public Super { int lambda(int _1) { return _1 + 12; } int operator ()(int _1) { return this->lambda(_1); } } InnerClass(); }
つまり、 struct は定義であり、値を返すわけではない。
return は文だから、 値を返す必要がある。
そんなわけで、どうしても、2行にならないといけない。
それで何が困るか?
→アルゴリズムに簡単に渡せなくなる。
sort(begin() , end() , LAMBDA ) ってやりたいぢゃん。
だけど、この実装だと、2行になってしまう。
LAMBDA myfunc; sort(begin() , end() , myfunc );
あーだめだ。オワタ。/(^o^)\ナンテコッタイ