Skip to content

Instantly share code, notes, and snippets.

@maximal
Last active August 1, 2016 14:42
Show Gist options
  • Save maximal/9a95e3f474d7f288ff7708a26816b711 to your computer and use it in GitHub Desktop.
Save maximal/9a95e3f474d7f288ff7708a26816b711 to your computer and use it in GitHub Desktop.
Hosting payment warning script
<?php
/**
* Скрипт предупреждения об оплате хостинга.
*
* Запускается, проверяет дату, шлёт письмо с уведомлением, если надо.
* Если просрочено, выключает веб-сервисы (поэтому скрипт надо запускать от рута).
*
* Можно добавить в планировщик крон-задачей (каждый день в полдень, 12:05):
* 5 12 * * * root php /full/path/to/hosting-warning.php
*
* @author MaximAL
* @since 2016-08-01
* @date 2016-08-01
* @time 17:07
* @copyright © MaximAL, Sijeko 2016
* @link http://maximals.ru
* @link http://sijeko.ru
**/
// Кодировка строк
mb_internal_encoding('utf-8');
//// Настройки
$emailTo = 'client@email.com';
$emailFrom = 'administrator@email.com';
$telegramLink = 'https://telegram.me/AdministratorTelegramName';
$daysMax = 8;
$lastDayTime = '2016-08-29T18:00:00';
$timeZone = 'Europe/Moscow';
// Проверяем, чтобы было запущено от рута
$user = posix_getpwuid(posix_geteuid());
if ($user['name'] !== 'root') {
echo 'Процесс запущен от пользователя `', $user['name'], '`, а должен быть запущен от пользователя `root`.', PHP_EOL;
exit(1);
}
//// Поехали!
// Смотрим, сколько осталось
$dateTo = new \DateTime($lastDayTime, new \DateTimeZone($timeZone));
$now = new \DateTime('now', new \DateTimeZone($timeZone));
$interval = $now->diff($dateTo);
// Если просрочили или количество дней меньше 8
if ($interval->invert || $interval->days < $daysMax) {
// Шлём письмо с предупреждением
email(
$emailTo,
'Оплата хостинга' . ($interval->invert ? ' [просрочена]' : (' [осталось дней: ' . $interval->days . ']')),
'Оплаченный период хостинга ' . ($interval->invert ? 'истёк ' : 'истекает ') .
$dateTo->format('j.m.Y в G:i.') . PHP_EOL . PHP_EOL .
'Свяжитесь с администратором (можно просто ответить на это письмо) и оплатите хостинг, пожалуйста.' .
PHP_EOL . PHP_EOL .
'Емейл: ' . $emailFrom . PHP_EOL .
'Телеграм: ' . $telegramLink,
$emailFrom
);
// Если просрочено, вырубаем веб-сервисы
if ($interval->invert) {
exec('service apache2 stop');
exec('service nginx stop');
}
} else {
// Всё нормально, удостоверяемся, что веб-сервисы работают
exec('service apache2 start');
exec('service nginx start');
}
exit(0);
/**
* Отсылка письма.
*
* @param string $to Адрес получателя (или адреса получателей) письма
* @param string $subject Тема письма
* @param string $text Текст письма
* @param string $from Адрес отправителя письма
* @return bool Возвращает `true`, если письмо было принято к отправке, и `false` в противном случае.
*/
function email($to, $subject, $text, $from)
{
$headers = [];
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/plain; charset=utf-8';
$headers[] = 'From: ' . $from;
$headers[] = 'Subject: ' . $subject;
$headers[] = 'X-Mailer: PHP/' . phpversion();
return mail($to, $subject, $text, implode("\r\n", $headers));
}
# Уведомление хостинга
# (c) MaximAL 2016-08-01
MAILTO=administrator@email.com
5 12 * * * root php /full/path/to/hosting-warning.php
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment