Hatena::ブログ(Diary)

gnupackの開発メモ

2015-05-17

[] ドメイン環境下における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/perl

use 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);;
    }
}


スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ksugita0510/20150517/p1