<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$option = $_POST['opt'];
$selectday = $_POST['day'];
$nminute = $_POST['nminute'];
$nhour = $_POST['nhour'];
// 不正な値が登録されていないかのバリデーションなりサニタイズを行ってください。
// とりあえず英数字とハイフン、アンダーバー以外削除
$option = preg_replace('/^[^a-z0-9_-]+$/i', '', $option);
// selectdayは配列でないなら不正なのでとりあえずアプリ落とす
if (is_array($selectday)) {
exit;
}
// 渡されてきた値が文字列'0'から'6'の間以外全部削除する
$selectday = array_filter($selectday, function ($day) {
return in_array($day, ['0', '1', '2', '3', '4', '5', '6'], true);
});
if (!is_numeric($nminute) || !is_numeric($nhour)) {
// 数値以外が渡されてきているようならアプリを落とす
exit;
}
try {
// 書き込み処理
rewrite_cron_for_pbxrestart($option, $selectday, $nminute, $nhour);
} catch (Exception $e) {
echo $e->getMessage();
exit;
}
}
/**
* auto_pbxrestartにcronのスケジュールを書き込む関数
*
* @param string $option
* @param array $selectday
* @param string $nminute
* @param string $nhour
* @return void
*/
function rewrite_cron_for_pbxrestart($option, $selectday, $nminute, $nhour) {
// 汎用的な関数でもないので定数/グローバル変数などとせずスコープを限定してしまった方が安全
$path = '/etc/cron.d/auto_pbxrestart';
$fp = fopen($path, 'w');
if (!$fp) {
throw new Exception("'{$path}' が開けませんでした");
}
// ファイルの書き込み前にロックする
if (!flock($fp, LOCK_EX)) {
throw new Exception("'{$path}' がロックできませんでした");
}
// 選択した曜日を結合
$days = implode(',', $selectday);
if ($days === '') {
$days = '*';
}
// 書き込みしたい行を作成
$line = sprintf('%s%s %s * * %s %s %s', $option, $nminute, $nhour, $days, 'root', '/usr/local/sbin/auto_pbxrestart.pl');
// 書き込み
if (!fwrite($fp, $line)) {
throw new Exception("'{$path}' に書き込みができませんでした");
}
fclose($fp);
}
?>
回答No.1でもいただいているように、パーミッションの解決とかは適時考える必要があります。
また、システムに影響を与えるスクリプトですから外部からの攻撃が怖いところなので、安全策は慎重に行ってください。
お礼
ありがとうございます^^