BILLmanager เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ ISPManager5 เจฒเจพเจˆเจŸ เจตเจฟเฉฑเจš เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเจพ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจกเจฟเจธเจ•เจจเฉˆเจ•เจธเจผเจจ

เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ†:

  1. เจธเจฅเจพเจˆ เจฒเจพเจ‡เจธเฉฐเจธ ispmanager เจฒเจพเจˆเจŸ 5 เจตเจพเจฒเจพ VPS เจธเจฐเจตเจฐ
  2. เจชเฉเจฐเจคเฉ€ เจธเจฐเจตเจฐ 10-20 เจ‰เจชเจญเฉ‹เจ—เจคเจพ
  3. เจ—เฉ‚เจ—เจฒ เจ•เฉˆเจฒเฉฐเจกเจฐ เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจจเจฟเจฏเจฎเจค เจฐเฉ€เจฎเจพเจˆเจ‚เจกเจฐ เจฆเฉ‡ เจจเจพเจฒ เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเฉ€ เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจ–เจคเจฎ เจนเฉ‹ เจ—เจˆ เจนเฉˆ
  4. เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจšเฉ€เจœเจผ เจฒเจˆ เจญเฉเจ—เจคเจพเจจ เจ•เจฐเจจเจพ เจธเจผเจฐเจฎเจจเจพเจ• เจนเฉˆ, เจ–เจพเจธ เจ•เจฐเจ•เฉ‡ เจ—เจพเจนเจ•เฉ€ เจฆเฉ‡ เจจเจพเจฒเฅค

เจŸเฉ€เจšเจพ เจ—เจพเจนเจ• เจจเฉ‚เฉฐ เจ—เฉ‚เจ—เจฒ เจ•เฉˆเจฒเฉฐเจกเจฐ เจ…เจคเฉ‡ เจฎเฉˆเจจเฉ‚เจ…เจฒ เจฐเฉ€เจฎเจพเจˆเจ‚เจกเจฐ เจคเฉ‹เจ‚ เจ›เฉเจŸเจ•เจพเจฐเจพ เจชเจพเจ‰เจฃเจพ เจนเฉˆ เจœเฉ‹ เจ‰เจธเจจเฉ‚เฉฐ เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจฒเจˆ เจญเฉเจ—เจคเจพเจจ เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ. เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ โ€œเจ‰เจธเจจเฉ‚เฉฐ เจฅเฉ‹เฉœเจพ เจนเฉ‹เจฐ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเจฟเจ“, เจ‰เจน เจœเจฒเจฆเฉ€ เจนเฉ€ เจญเฉเจ—เจคเจพเจจ เจ•เจฐเฉ‡เจ—เจพโ€, โ€œเจ‡เจธ เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐเจจเจพ เจ•เจฟเจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจ…เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจนเฉˆโ€ เจคเฉ‹เจ‚ เจฎเฉเจ•เจค เจนเฉ‹เจตเฉ‹, เจ…เจคเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฌเฉ‡เจฐเจนเจฟเจฎ เจฎเจธเจผเฉ€เจจ เจจเฉ‚เฉฐ เจธเฉŒเจ‚เจช เจฆเจฟเจ“เฅค

เจฌเฉ‡เจธเจผเฉฑเจ•, เจฎเฉˆเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ—เฉ‚เจ—เจฒ เจ•เฉ€เจคเฉ€ เจ…เจคเฉ‡ เจ–เฉ‹เจœ เจ•เฉ€เจคเฉ€, เจชเจฐ เจ•เฉ‹เจˆ เจนเฉฑเจฒ เจจเจนเฉ€เจ‚ เจฒเฉฑเจญเจฟเจ†, เจ‡เจน เจธเจญ เจ‡เจธ เจคเฉฑเจฅ 'เจคเฉ‡ เจ‰เจฌเจพเจฒเจฟเจ† เจ—เจฟเจ† เจ•เจฟ เจคเฉเจนเจพเจจเฉ‚เฉฐ BILLmanager เจฆเฉ€ เจ—เจพเจนเจ•เฉ€ เจฒเฉˆเจฃ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ, เจชเจฐ เจฌเจฟเฉฐเจฆเฉ‚ เจจเฉฐเจฌเจฐ 4 เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ เจฌเจนเฉเจค เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจ…เจคเฉ‡ เจ—เฉฐเจญเฉ€เจฐ เจนเฉˆ, เจฎเฉˆเจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเฉ‡เจ—เจพ เจ‡เจธ เจคเฉ‹เจ‚ เจ›เฉเจŸเจ•เจพเจฐเจพ เจ…เจคเฉ‡ เจ‡เจน เจซเฉˆเจธเจฒเจพ เจ‡เฉฐเจจเจพ เจฎเฉเจธเจผเจ•เจฒ เจจเจนเฉ€เจ‚ เจจเจฟเจ•เจฒเจฟเจ†.

เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ•เฉ€ เจ•เจฐเฉ€เจ?

/usr/local/mgr5/etc/sql/ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจซเฉ‹เจฒเจกเจฐ user.addon เจฌเจฃเจพเจ“, เจฆเฉ‹ เจ–เจพเจฒเฉ€ เจซเจพเจˆเจฒเจพเจ‚:

  1. เจญเฉเจ—เจคเจพเจจ_เจคเจฐเฉ€เจ•
  2. uwemail

เจ‡เจน เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจชเฉˆเจจเจฒ เจจเฉ‚เฉฐ เจนเฉเจ•เจฎ เจฆเฉ‡เจตเฉ‡เจ—เจพ
/usr/local/mgr5/etc/ispmgr.db
เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจฆเฉ‹ เจ…เจจเฉเจธเจพเจฐเฉ€ เจ–เฉ‡เจคเจฐ เจนเจจ เจœเจฟเฉฑเจฅเฉ‡ เจเจกเจฎเจฟเจจ เจชเฉˆเจจเจฒ เจฆเฉ‡ เจฎเฉเฉฑเจฒ เจฒเจฟเจ–เฉ‡ เจœเจพเจฃเจ—เฉ‡เฅค

เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ‡ เจจเจพเจฒ /usr/local/mgr5/etc/xml เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš ispmgr_mod_pay_data.xml เจจเจพเจฎ เจฆเฉ€ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจฌเจฃเจพเจ“เฅค

<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
	<metadata name="user.edit">
		<form>
			<page name="main">
				<field name="pay_date">
					<input type="text" name="pay_date"/>
				</field>
				<field name="uwemail">
					<input type="text" name="uwemail"/>
				</field>
			</page>
		</form>
	</metadata>
	<lang name="ru">
		<messages name="user.edit">
			<msg name="pay_date" sqlname="pay_date">ะžะฟะปะฐั‡ะตะฝะพ ะดะพ</msg>
			<msg name="uwemail" sqlname="uwemail">ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะน email</msg>
		</messages>
	</lang>	
	<lang name="en">
		<messages name="user.edit">
			<msg name="pay_date" sqlname="pay_date">Paid before</msg>
			<msg name="uwemail" sqlname="uwemail">User email</msg>
		</messages>
	</lang>
</mgrdata>

เจ‡เจน เจชเฉˆเจจเจฒ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจจเจฟเจฏเจฎ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจคเจพเจ‚ เจœเฉ‹ เจธเจพเจกเฉ‡ เจ–เฉ‡เจคเจฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฆเฉ‡ เจธเฉฐเจชเจพเจฆเจจ เจซเจพเจฐเจฎ เจตเจฟเฉฑเจš เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจนเฉ‹เจฃเฅค

เจชเฉˆเจจเจฒ เจจเฉ‚เฉฐ เจฐเฉ€เจฌเฉ‚เจŸ เจ•เจฐเฉ‹:

/usr/local/mgr5/sbin/mgrctl -m ispmgr exit

เจธเจพเจจเฉ‚เฉฐ เจฎเจฟเจฒเจฆเจพ เจนเฉˆ:

BILLmanager เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ ISPManager5 เจฒเจพเจˆเจŸ เจตเจฟเฉฑเจš เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเจพ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจกเจฟเจธเจ•เจจเฉˆเจ•เจธเจผเจจ

เจ–เฉ‡เจคเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจฒเจฟเจ–เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจ•เจฟเจธ เจฆเจฟเจจ เจคเฉฑเจ• เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฆเฉ€ เจ•เจฟเจนเฉœเฉ€ เจˆเจฎเฉ‡เจฒ, เจ•เจฟเฉฑเจฅเฉ‡ เจฐเฉ€เจฎเจพเจˆเจ‚เจกเจฐ เจญเฉ‡เจœเจฃเฉ‡ เจนเจจ เจ•เจฟ เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจœเจฒเจฆเฉ€ เจนเฉ€ เจ–เจคเจฎ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

เจนเฉเจฃ เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจ•เฉเจฐเจฟเจชเจŸ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ เจœเฉ‹ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฏเจพเจฆ เจฆเจฟเจตเจพเจเจ—เฉ€ เจ•เจฟ เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจ•เฉเจ เจ…เฉฐเจคเจฐเจพเจฒเจพเจ‚ 'เจคเฉ‡ เจ–เจคเจฎ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจเจกเจฎเจฟเจจ เจจเฉ‚เฉฐ เจธเฉ‚เจšเจฟเจค เจ•เจฐเฉ‹ เจ•เจฟ เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจ–เจคเจฎ เจนเฉ‹ เจฐเจนเฉ€ เจนเฉˆเฅค เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ…เจคเฉ‡ เจชเฉเจฐเจธเจผเจพเจธเจ• เจจเฉ‚เฉฐ เจธเฉ‚เจšเจฟเจค เจ•เจฐเฉ‹ เจ•เจฟ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ…เจฏเฉ‹เจ— เจนเฉˆเฅค

เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เจธ 'เจคเฉ‡ php เจชเจธเฉฐเจฆ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจธเจ•เฉเจฐเจฟเจชเจŸ เจฒเจฟเจ–เฉ€.

<?php
$adminemail = "[email protected]"; // email ะฐะดะผะธะฝะฐ
$day_send_message = [30,7,5,3,1]; // ะทะฐ ัะบะพะปัŒะบะพ ะดะฝะตะน ะธ ั ะบะฐะบะพะน ะฟะตั€ะตะพะดะธั‡ะฝะพัั‚ัŒัŽ ะฑัƒะดะตั‚ ะฝะฐะฟะพะผะธะฝะฐั‚ัŒ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŽ ั‡ั‚ะพ ั…ะพัั‚ะธะฝะณ ะทะฐะบะฐะฝั‡ะธะฒะฐะตั‚ัั
$db = new SQLite3('/usr/local/mgr5/etc/ispmgr.db');
$results = $db->query('SELECT * FROM users WHERE active == "on" AND pay_date IS NOT NULL');
while ($user = $results->fetchArray()) {
		$days_left=floor( ( strtotime($user['pay_date']) - time() ) / (60 * 60 * 24));
		if(in_array($days_left, $day_send_message)){
			if($user['uwemail'] != ""){
				mail($user['uwemail'], 'ISPMANAGER ะทะฐะบะฐะฝั‡ะธะฒะฐะตั‚ัั ั…ะพัั‚ะธะฝะณ ั‡ะตั€ะตะท '.$days_left.' ะดะฝะตะนั', "ะขะตะบัั‚ ะดะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั ะพ ั‚ะพะผ ั‡ั‚ะพ ะพัั‚ะฐะปะพััŒ ัั‚ะพะปัŒะบะพ ั‚ะพ ะดะฝะตะน");
			}
		}
		if( $days_left == 3 ) {
			mail($adminemail, 'ISPMANAGER USER '.$user['name'], $user['name'] . " ะ—ะฐะบะพะฝั‡ะธั‚ัั ั…ะพัั‚ะธะฝะณ ั‡ะตั€ะตะท ".$days_left." ะดะฝั");
		}
		if($days_left <= 0){
			mail($adminemail, 'ISPMANAGER USER '.$user['name'].' DISABLED', $user['name'].' ะžั‚ะบะปัŽั‡ะตะฝ');
			exec("/usr/local/mgr5/sbin/mgrctl -m ispmgr user.suspend elid=".$user["name"]);
			if( $user['uwemail'] != "" ) {
				mail($user['uwemail'], 'ISPMANAGER ั…ะพัั‚ะธะฝะณ ะพั‚ะบะปัŽั‡ะตะฝ', 'ะขะตะบัั‚ ะดะปั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั ั‡ั‚ะพ ั…ะพัั‚ะธะฝะณ ะทะฐะบะพะฝั‡ะธะปัั'); 
			}
		}
		// ะฟั€ะธ ะถะตะปะฐะฝะธะธ ะผะพะถะฝะพ ะตั‰ะต ะฝะฐะฟะธัะฐั‚ัŒ ะฝะตะฑะพะปัŒัˆะพะน IF ั‡ั‚ะพ ะฑั‹ ะดะฐะฝะฝั‹ะต ัƒะดะฐะปัะปะธััŒ ั‡ะตั€ะตะท ะฝะตะบะพั‚ะพั€ะพะต ะฒั€ะตะผั, ะฝะพ ะผะฝะต ัั‚ะพ ะฝะต ะฝัƒะถะฝะพ
}

เจ…เจธเฉ€เจ‚ เจ‡เจธ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจ•เจฟเจคเฉ‡ เจตเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจœเฉ‹ เจตเฉ€ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจพเจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฆเจฟเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจตเจพเจฐ เจ•เจพเจฒ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจ•เฉเจฐเฉ‹เจจ เจŸเจพเจธเจ• เจœเฉ‹เฉœเจฆเฉ‡ เจนเจพเจ‚เฅค เจธเจญ เจคเจฟเจ†เจฐ เจนเฉˆเฅค

เจนเฉเจฃ เจฎเฉ‡เจฐเฉ€ เจœเจผเจฎเฉ€เจฐ เจธเจพเจซเจผ เจนเฉˆ, เจŸเจพเจก เจธเฉฐเจคเฉเจธเจผเจŸ เจนเฉˆ, เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจ•เฉ‹เจˆ เจตเจพเจงเฉ‚ เจ–เจฐเจšเจพ เจจเจนเฉ€เจ‚ เจฒเจฟเจ† เจนเฉˆเฅค

เจœเฉ‹ เจตเฉ€ เจฌเจšเจฟเจ† เจนเฉˆ เจ‰เจน เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจญเจฐเจจเจพ เจนเฉˆ เจœเจฟเจธ เจคเจพเจฐเฉ€เจ– เจจเฉ‚เฉฐ เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจฒเจˆ เจญเฉเจ—เจคเจพเจจ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ€ เจˆเจฎเฉ‡เจฒ เจœเจฟเฉฑเจฅเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฐเฉ€เจฎเจพเจˆเจ‚เจกเจฐ เจญเฉ‡เจœเจฃเฉ‡ เจนเจจเฅค

เจ–เฉเจธเจผ เจนเฉˆ เจœเฉ‡ เจ‡เจน เจ•เจฟเจธเฉ‡ เจฆเฉ€ เจฎเจฆเจฆ เจ•เจฐเจฆเจพ เจนเฉˆ.

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹