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/

メモ
rpmbuild のコマンドで -ba だと rpm と spec が。 -bb だと rpm だけ作られる。

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^)\ナンテコッタイ