nakamurakko’s diary

たまに書く

Postfixとclamav-milterの連携で「Permission denied」と出た時の対処

Postfixclamav-milterを連携させた時に「Permission denied」と出る。

  1. Apr 12 12:26:11 nakamurakko postfix/smtpd[23212]: warning: connect to Milter service unix:/var/run/clamav/clamav-milter.sock: Permission denied

その場合、は下記のように設定している。

 

「/etc/clamav-milter.conf」を開きソケットファイルの権限を変えて、同一グループからもソケットファイルを参照出来るようにする。

  1. MilterSocketMode 660

 

clamav-milterの起動グループユーザーにPostfixを参加させる。

  1. gpasswd -a postfix clam (※1)

 

clamav-milterを再起動。

  1. service clamav-milter restart

 

「/var/log/maillog」 に「Permission denied」が出なくなれば完了。
clamav-milterの起動スクリプトを編集する手順を載せているのは結構あるけど、この手順の方が安全な気がする。

 

※1…参加させるグループは「clamav」の場合もあるので、ソケットファイルのグループを確認する。

TStringHelperの弱点

実行環境:Delphi XE7 Professional Update 1

TStringHelperが用意された事で、文字列操作が

  1. Trim(' Hello ');


から

  1. ' Hello '.Trim


のように書けるようになった。

ただ困ったのは、例えば、TMaskEditが持っているTextプロパティに対して、

  1. MaskEdit1.Text.Trim


のように書くとコンパイルエラーになる。

  1. Trim(MaskEdit1.Text)


は問題ない。

Textプロパティの型定義はTMaskedTextとなっているため、「Text.Trim」と書けないらしいけど、TMaskedTextの定義を見るとUnicodeString(ソースを見るとstring)となっているから、

  1. string(MaskEdit1.Text).Trim


みたいにキャストすればコンパイルエラーは出なくなった。

TStringHelper(ヘルパークラス)は再定義されたstring型までは追えないらしいから、キャストするしかないのかな。

Delphiで文字列結合が楽になった

1.実行環境:Delphi XE7 Professional Update 1

Javaの「String,join」がDelphiでも出来ないかと思っていたけど、Delphi XE3から出来るようになっていたらしい。
気づいてなかった。

  1. program ConsoleApp;
  2. {$APPTYPE CONSOLE}
  3. uses
  4.   System.Classes,
  5.   System.SysUtils;
  6.  
  7. var
  8.   stringList: TStringList;
  9.   messageText: string;
  10. begin
  11.   stringList := TStringList.Create;
  12.  
  13.   // 文字列「aaa」「bbb」「ccc」を設定。
  14.   stringList.Append('aaa');
  15.   stringList.Append('bbb');
  16.   stringList.Append('ccc');
  17.  
  18.   // 1.カンマ区切りで出力。
  19.   messageText := stringList.DelimitedText;
  20.   Writeln('1.' + messageText);
  21.  
  22.   // 2.区切り文字を「&」に変えて出力。
  23.   stringList.Delimiter := '&';
  24.   messageText := stringList.DelimitedText;
  25.   Writeln('2.' + messageText);
  26.  
  27.   // 3.区切り文字を「 and 」で出力。
  28.   messageText := string.Join(' and ', stringList.ToStringArray);
  29.   Writeln('3.' + messageText);
  30.  
  31.   stringList.Free;
  32. end.



出力結果
1.aaa,bbb,ccc
2.aaa&bbb&ccc
3.aaa and bbb and ccc

 

TStringListのDelimitedTextはDelimiterを変更する事で区切り文字を変更出来たけど、設定できるのはCharのため、2バイト以上設定出来なかった。
Delphi XE3から導入されたTStringHelperのおかげでstring型が拡張されて、「string.join」が書けるようになり、第1引数「Separator」はstringのため、2バイト以上の区切り文字に指定出来るようになっている。

これは便利。

 

<2015/09/11>

ソースを一部修正。

CentOS 7でclamdがこける場合の対処

CentOS 7にclamdを起動しようとすると下記のようなメッセージが出る。
Job for clamd.service failed. See 'systemctl status clamd.service' and 'journalctl -xn' for details.

その時はどうやら起動時にSocketファイルを作成しようとして、指定ディレクトリが無いから、らしいので、
# mkdir /var/run/clamav
# chown clamav:clamav /var/run/clamav
を実行してディレクトリ作成+所有者設定してあげるとうまくいく。
(2014/11/12時点)


2014/11/18 追記
「/var/run/」以下はシャットダウン時に消えるから、起動するたびに実行する事になってしまうね…。

 

2015/05/08 追記

tmpfiles.dで対処出来るから問題無かった。

Delphi七不思議の一つ(個人的な)

Genericsの実装で
・リスト系→存在する(TObjectList)
・ディクショナリ系→存在する(TObjectDictionary)
・セット系→存在しない!(TObjectSetみたいなクラスが無い)
というのがDelphi XE7でも変わらず。

何か理由があるのだろうか?