Using Constants in YAML Configuration Files

symfony PHP5 framework Chapter 5 - Configuring Symfony

Using Constants in YAML Configuration Files

Some configuration settings rely on the value of other settings. To avoid setting the same value twice, symfony supports constants in YAML files. On encountering a setting name (one that can be accessed by sfConfig::get()) in capital letters enclosed in % signs, the configuration handlers replace them with their current value. See Listing 5-20 for an example.

Listing 5-20 - Using Constants in YAML Files, Example from autoload.yml

autoload:
  symfony:
    name:           symfony
    path:           %SF_SYMFONY_LIB_DIR%
    recursive:      on
    exclude:        [vendor]

The path parameter will take the value returned by sfConfig::get('sf_symfony_lib_dir'). If you want one configuration file to rely on another, you need to make sure that the file you rely on is already parsed (look in the symfony source to find out the order in which the configuration files are parsed). app.yml is one of the last files parsed, so you may rely on others in it.

SSHで公開鍵認証を使う

1. ssh-keygen コマンドで鍵ペアを作成する

$ ssh-keygen -t rsa

秘密鍵の保存先を聞いてくるので、デフォルトのままEnter。
パスフレーズを2回入力。
すると、以下の鍵ペアのファイルが ~/.ssh/ に作成される。

  • id_rsa
  • id_rsa.pub

2. SSHサーバに公開鍵を登録する

ユーザのホームディレクトリに1.で作成した公開鍵を転送する。(FTPで転送してもよい。)

$ scp ~/.ssh/id_rsa.pub user@host:

サーバ側で、catコマンドとリダイレクションを使って転送した公開鍵を登録する。(登録するファイルは ~/.ssh/authorized_keys)

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

「~/.ssh」ディレクトリと「~/.ssh/authorized_keys」はオーナーだけに読み書き可能なようにパーミッションを設定する。

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
  • クライアント側のユーザのホームディレクトリのパーミッションにも注意する。所有者以外の書込み権を設定してあるとだめ。
    たとえば、/home/hogeのパーミッションが777の場合、公開鍵認証でsshログインしようとすると、
    Permission denied (publickey,gssapi-with-mic).
    というエラーになる。この場合、サーバ側のログ(/var/log/secure)では
    Authentication refused: bad ownership or modes for directory /home/hoge
    となっていて、/hoem/hogeのパーミッションに問題があるということ。
    所有者以外の書込み権を設定してあるとだめ。700、711、755にすればOK。

3. 公開鍵認証方式でログインする

$ ssh -l user host

パスフレーズを聞いてくるので、ssh-keygenコマンドで指定したパスフレーズを入力する。
接続先サーバのパスワードではないことに注意

4. クライアント側の設定

id_rsa ファイルをクライアント側にコピーする。
例:
ユーザのホームディレクトリ\.ssh

  • 秘密鍵のパーミッションに注意。秘密鍵のパーミッションがopenすぎるとだめ。
    以下はmacosxでのエラーの例。

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    Permissions 0640 for '/Users/xxx/.ssh/id_rsa' are too open.
    It is recommended that your private key files are NOT accessible by others.
    This private key will be ignored.
    bad permissions: ignore key: /Users/xxx/.ssh/id_rsa
    Permission denied (publickey,gssapi-with-mic).
    

    id_rsaを600にすればOK。

  • cwRsyncで公開鍵認証を使用する場合は、環境変数HOMEの下の「.ssh」(known_hostsファイルが作成されるディレクトリ)に秘密鍵ファイル(id_rsa)を置く。
    例:
    HOME=/home/pistolfly
    でcygwinがD:\cygwinの場合、
    D:\cygwin\home\.ssh
    に秘密鍵ファイルを置く。
    (rsyncの-eまたは--rshオプションのsshコマンドで-iオプションで秘密鍵のパスを指定してもよい。)

    rsyncしてパスフレーズの入力を促されたところ

    C:\sfprojects\reserve>symfony sync production
    >> exec      rsync --progress --dry-run -azC...s.net:/usr/local/share/reserve/
    Enter passphrase for key '/cygdrive/c/Documents and Settings/pistolfly/.ssh/id_r
    sa':
    
  • TeraTermでは、ログイン時に「RSA/DSA鍵を使う」を選択して、秘密鍵に上記ディレクトリの秘密鍵ファイルを指定して、秘密鍵のパスフレーズを入力する。

5. パスワード認証を許可しないようする

/etc/ssh/sshd_config (サーバ側) を編集する。

PasswordAuthentication yes

PasswordAuthentication no

にする。

rootのログインも禁止しておく。

PermitRootLogin no

root権限でsshdをreloadする。(rootでログインしたままで)

$ /etc/init.d/sshd reload

参考:
FedoraCore5ビギナーズバイブル11-2-2
最終回 セキュアなSSHサーバーを構築する:ITpro
リモート接続に SSH を使う
@IT:鍵交換方式のsshでアクセスするには

request parameterからの更新

基本パターン

if ($this->hasRequestParameter('xxx'))
{
  $this->model->setXxx($this->getRequestParameter('xxx'));
}

または

if ($this->getRequestParameter('xxx') !== null)
{
  $this->model->setXxx($this->getRequestParameter('xxx'));
}

※チェックボックスの場合は、チェックボックスを含むフォームを処理するアクションで、以下のようにデフォルトをセットする必要がある。

if (!$this->hasRequestParameter('xxx'))
{
  $this->getRequest()->setParameter('xxx', false);
}

または

if ($this->getRequestParameter('xxx') == null)
{
  $this->getRequest()->setParameter('xxx', false);
}

日付
(input_date_tag, select_day_tag+select_month_tag+select_year_tag)

if ($this->hasRequestParameter('date'))
// または if ($this->getRequestParameter('date') !== null)
{
  if ($this->getRequestParameter('date'))
  {
    try
    {
      $dateFormat = new sfDateFormat($this->getUser()->getCulture());
      if (!is_array($this->getRequestParameter('date')))
      {
        $value = $dateFormat->format($this->getRequestParameter('date'), 'i', $dateFormat->getInputPattern('d'));
      }
      else
      {
        $value_array = $this->getRequestParameter('date');
        if (is_numeric($value_array['year']) && is_numeric($value_array['month']) && is_numeric($value_array['day']))
        {
          $value = $value_array['year'].'-'.$value_array['month'].'-'.$value_array['day'].(isset($value_array['hour']) ? ' '.$value_array['hour'].':'.$value_array['minute'].(isset($value_array['second']) ? ':'.$value_array['second'] : '') : '');
        }
        else
        {
          $value = null;
        }
      }
      $this->model->setDate($value);
    }
    catch (sfException $e)
    {
      // not a date
    }
  }
  else
  {
    $this->model->setDate(null);
  }
}

日付時刻
日付とほぼ同じだが、値をテキストで受け取った場合(rich=true)のフォーマット引数が異なる。

$value = $dateFormat->format($this->getRequestParameter('date'), 'i', $dateFormat->getInputPattern('d'));

日付時刻

$value = $dateFormat->format($this->getRequestParameter('date'), 'I', $dateFormat->getInputPattern('g'));