ドメイン環境下におけるgnupack 13でのユーザ名について
gnupack 13: emacs 起動時にエラーになるで取り上げていただいている件について。
現状、startupプログラムの起動において『mkpasswd -l > /etc/passwd』を行うことにより実行環境に応じた /etc/passwdを自動生成しています。
実行しているコマンドは正確には以下のとおり。
{ mkpasswd -l; getent passwd; } | sed "s=/home/\w\+:=/home:=g" | sort -u
これまでは上記方法で問題ありませんでしたが、どうやら cygwin 2.0.0から仕様が変わったようで、ドメイン環境化ではユーザ名が『<ドメイン名>+<ユーザー名>』となってしまい、emacsが /homeを見つけられない事象が起きているようです。
これに対して、専用のスクリプトを用意し /etc/passwdの自動生成する方法で対処することを考えています。ひとまず手元でしばらく動作確認のうえ、リリースに取り込みたいと思います。
startup_config.iniのMake_Passwd_Cmdの内容は以下のとおり。
Make_Passwd_Cmd = /app/script/mkpasswd.pl $USER /home
『/app/script/mkpasswd.pl』の内容は以下のとおり。
#!/usr/bin/perluse strict;
use warnings qw( all );
use autodie;
use utf8;
use constant { TRUE => 1, FALSE => 0 };
use English;
my ($user, $home) = @ARGV;
my $file = '/etc/passwd';
my @file = ();
if(! -f $file or -z $file) {
open(my $ch, '-|', '/usr/bin/mkpasswd -l');
@file = <$ch>;
}
else {
open(my $fh, '<', $file);
@file = <$fh>;
close($fh);
}
my $is_exist_id = sub {
foreach my $line (@_) {
return TRUE if($line =~ /^[^:]+:[^:]+:$UID:/);
}
return FALSE;
};
unless($is_exist_id->(@file)) {
open(my $ch, '-|', '/usr/bin/mkpasswd -c');
push(@file, <$ch>);
}
foreach my $line (@file) {
if($line =~ /^[^:]+:([^:]+:$UID:.*):[^:]+:([^:]+$)/) {
printf("%s:$1:%s:$2", $user, $home);
}
else {
printf("%s", $line);;
}
}