forked from kevinowino869/mitrobill
Enhancement and Improvements
Refactor CSRF class: improve token handling and update session variable names Replace bulk message with ajax based message sending. Added support for multiple recipients in bulk message, and also router based filtering. Add support for multiple recipients in bulk message from customer list as requested by one of our Member. you can now send messages to multiple recipients at once from customer list. Added Exception for CRON but not tested yet. i dont have multiple routers. Added notify to know if cron has been executed or not.
This commit is contained in:
164
system/cron.php
164
system/cron.php
@ -30,7 +30,7 @@ if (php_sapi_name() !== 'cli') {
|
||||
echo "PHP Time\t" . date('Y-m-d H:i:s') . "\n";
|
||||
$res = ORM::raw_execute('SELECT NOW() AS WAKTU;');
|
||||
$statement = ORM::get_last_statement();
|
||||
$rows = array();
|
||||
$rows = [];
|
||||
while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
|
||||
echo "MYSQL Time\t" . $row['WAKTU'] . "\n";
|
||||
}
|
||||
@ -45,80 +45,111 @@ echo "Found " . count($d) . " user(s)\n";
|
||||
run_hook('cronjob'); #HOOK
|
||||
|
||||
foreach ($d as $ds) {
|
||||
$date_now = strtotime(date("Y-m-d H:i:s"));
|
||||
$expiration = strtotime($ds['expiration'] . ' ' . $ds['time']);
|
||||
echo $ds['expiration'] . " : " . (($isCli) ? $ds['username'] : Lang::maskText($ds['username']));
|
||||
if ($date_now >= $expiration) {
|
||||
echo " : EXPIRED \r\n";
|
||||
$u = ORM::for_table('tbl_user_recharges')->where('id', $ds['id'])->find_one();
|
||||
$c = ORM::for_table('tbl_customers')->where('id', $ds['customer_id'])->find_one();
|
||||
$p = ORM::for_table('tbl_plans')->where('id', $u['plan_id'])->find_one();
|
||||
if (empty($c)) {
|
||||
$c = $u;
|
||||
}
|
||||
$dvc = Package::getDevice($p);
|
||||
if ($_app_stage != 'demo') {
|
||||
if (file_exists($dvc)) {
|
||||
require_once $dvc;
|
||||
(new $p['device'])->remove_customer($c, $p);
|
||||
} else {
|
||||
echo "Cron error Devices $p[device] not found, cannot disconnect $c[username]";
|
||||
Message::sendTelegram("Cron error Devices $p[device] not found, cannot disconnect $c[username]");
|
||||
}
|
||||
}
|
||||
echo Message::sendPackageNotification($c, $u['namebp'], $p['price'], $textExpired, $config['user_notification_expired']) . "\n";
|
||||
//update database user dengan status off
|
||||
$u->status = 'off';
|
||||
$u->save();
|
||||
try {
|
||||
$date_now = strtotime(date("Y-m-d H:i:s"));
|
||||
$expiration = strtotime($ds['expiration'] . ' ' . $ds['time']);
|
||||
echo $ds['expiration'] . " : " . ($isCli ? $ds['username'] : Lang::maskText($ds['username']));
|
||||
|
||||
// autorenewal from deposit
|
||||
if ($config['enable_balance'] == 'yes' && $c['auto_renewal']) {
|
||||
list($bills, $add_cost) = User::getBills($ds['customer_id']);
|
||||
if ($add_cost != 0) {
|
||||
if (!empty($add_cost)) {
|
||||
if ($date_now >= $expiration) {
|
||||
echo " : EXPIRED \r\n";
|
||||
|
||||
// Fetch user recharge details
|
||||
$u = ORM::for_table('tbl_user_recharges')->where('id', $ds['id'])->find_one();
|
||||
if (!$u) {
|
||||
throw new Exception("User recharge record not found for ID: " . $ds['id']);
|
||||
}
|
||||
|
||||
// Fetch customer details
|
||||
$c = ORM::for_table('tbl_customers')->where('id', $ds['customer_id'])->find_one();
|
||||
if (!$c) {
|
||||
$c = $u;
|
||||
}
|
||||
|
||||
// Fetch plan details
|
||||
$p = ORM::for_table('tbl_plans')->where('id', $u['plan_id'])->find_one();
|
||||
if (!$p) {
|
||||
throw new Exception("Plan not found for ID: " . $u['plan_id']);
|
||||
}
|
||||
|
||||
$dvc = Package::getDevice($p);
|
||||
if ($_app_stage != 'demo') {
|
||||
if (file_exists($dvc)) {
|
||||
require_once $dvc;
|
||||
try {
|
||||
(new $p['device'])->remove_customer($c, $p);
|
||||
} catch (Throwable $e) {
|
||||
_log($e->getMessage());
|
||||
sendTelegram($e->getMessage());
|
||||
echo "Error: " . $e->getMessage() . "\n";
|
||||
}
|
||||
} else {
|
||||
throw new Exception("Cron error: Devices " . $p['device'] . "not found, cannot disconnect ".$c['username']."\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Send notification and update user status
|
||||
try {
|
||||
echo Message::sendPackageNotification($c, $u['namebp'], $p['price'], $textExpired, $config['user_notification_expired']) . "\n";
|
||||
$u->status = 'off';
|
||||
$u->save();
|
||||
} catch (Throwable $e) {
|
||||
_log($e->getMessage());
|
||||
sendTelegram($e->getMessage());
|
||||
echo "Error: " . $e->getMessage() . "\n";
|
||||
}
|
||||
|
||||
// Auto-renewal from deposit
|
||||
if ($config['enable_balance'] == 'yes' && $c['auto_renewal']) {
|
||||
[$bills, $add_cost] = User::getBills($ds['customer_id']);
|
||||
if ($add_cost != 0) {
|
||||
$p['price'] += $add_cost;
|
||||
}
|
||||
}
|
||||
if ($p && $c['balance'] >= $p['price']) {
|
||||
if (Package::rechargeUser($ds['customer_id'], $ds['routers'], $p['id'], 'Customer', 'Balance')) {
|
||||
// if success, then get the balance
|
||||
Balance::min($ds['customer_id'], $p['price']);
|
||||
echo "plan enabled: $p[enabled] | User balance: $c[balance] | price $p[price]\n";
|
||||
echo "auto renewall Success\n";
|
||||
|
||||
if ($p && $c['balance'] >= $p['price']) {
|
||||
if (Package::rechargeUser($ds['customer_id'], $ds['routers'], $p['id'], 'Customer', 'Balance')) {
|
||||
Balance::min($ds['customer_id'], $p['price']);
|
||||
echo "plan enabled: " . (string) $p['enabled'] . " | User balance: " . (string) $c['balance'] . " | price " . (string) $p['price'] . "\n";
|
||||
echo "auto renewal Success\n";
|
||||
} else {
|
||||
echo "plan enabled: " . $p['enabled'] . " | User balance: " . $c['balance'] . " | price " . $p['price'] . "\n";
|
||||
echo "auto renewal Failed\n";
|
||||
Message::sendTelegram("FAILED RENEWAL #cron\n\n#u." . $c['username'] . " #buy #Hotspot \n" . $p['name_plan'] .
|
||||
"\nRouter: " . $p['routers'] .
|
||||
"\nPrice: " . $p['price']);
|
||||
}
|
||||
} else {
|
||||
echo "plan enabled: $p[enabled] | User balance: $c[balance] | price $p[price]\n";
|
||||
echo "auto renewall Failed\n";
|
||||
Message::sendTelegram("FAILED RENEWAL #cron\n\n#u$c[username] #buy #Hotspot \n" . $p['name_plan'] .
|
||||
"\nRouter: " . $p['routers'] .
|
||||
"\nPrice: " . $p['price']);
|
||||
echo "no renewal | plan enabled: " . (string) $p['enabled'] . " | User balance: " . (string) $c['balance'] . " | price " . (string) $p['price'] . "\n";
|
||||
}
|
||||
} else {
|
||||
echo "no renewall | plan enabled: $p[enabled] | User balance: $c[balance] | price $p[price]\n";
|
||||
echo "no renewal | balance" . $config['enable_balance'] . " auto_renewal " . $c['auto_renewal'] . "\n";
|
||||
}
|
||||
} else {
|
||||
echo "no renewall | balance $config[enable_balance] auto_renewal $c[auto_renewal]\n";
|
||||
echo " : ACTIVE \r\n";
|
||||
}
|
||||
} else {
|
||||
echo " : ACTIVE \r\n";
|
||||
} catch (Throwable $e) {
|
||||
// Catch any unexpected errors
|
||||
_log($e->getMessage());
|
||||
sendTelegram($e->getMessage());
|
||||
echo "Unexpected Error: " . $e->getMessage() . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
//Cek interim-update radiusrest
|
||||
if ($config['frrest_interim_update'] != 0) {
|
||||
//Cek interim-update radiusrest
|
||||
if ($config['frrest_interim_update'] != 0) {
|
||||
|
||||
$r_a = ORM::for_table('rad_acct')
|
||||
->whereRaw("BINARY acctstatustype = 'Start' OR acctstatustype = 'Interim-Update'")
|
||||
->where_lte('dateAdded', date("Y-m-d H:i:s"))->find_many();
|
||||
->whereRaw("BINARY acctstatustype = 'Start' OR acctstatustype = 'Interim-Update'")
|
||||
->where_lte('dateAdded', date("Y-m-d H:i:s"))->find_many();
|
||||
|
||||
foreach ($r_a as $ra) {
|
||||
$interval = $_c['frrest_interim_update']*60;
|
||||
$timeUpdate = strtotime($ra['dateAdded'])+$interval;
|
||||
$timeNow = strtotime(date("Y-m-d H:i:s"));
|
||||
if ($timeNow >= $timeUpdate) {
|
||||
$ra->acctstatustype = 'Stop';
|
||||
$ra->save();
|
||||
}
|
||||
}
|
||||
foreach ($r_a as $ra) {
|
||||
$interval = $_c['frrest_interim_update'] * 60;
|
||||
$timeUpdate = strtotime($ra['dateAdded']) + $interval;
|
||||
$timeNow = strtotime(date("Y-m-d H:i:s"));
|
||||
if ($timeNow >= $timeUpdate) {
|
||||
$ra->acctstatustype = 'Stop';
|
||||
$ra->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($config['router_check']) {
|
||||
@ -137,7 +168,7 @@ if ($config['router_check']) {
|
||||
|
||||
foreach ($routers as $router) {
|
||||
// check if custom port
|
||||
if (strpos($router->ip_address, ':') === false){
|
||||
if (strpos($router->ip_address, ':') === false) {
|
||||
$ip = $router->ip_address;
|
||||
$port = 8728;
|
||||
} else {
|
||||
@ -207,14 +238,7 @@ if ($config['router_check']) {
|
||||
Message::SendEmail($adminEmail, $subject, $message);
|
||||
sendTelegram($message);
|
||||
}
|
||||
echo "Router monitoring finished\n";
|
||||
}
|
||||
|
||||
|
||||
if (defined('PHP_SAPI') && PHP_SAPI === 'cli') {
|
||||
echo "Cronjob finished\n";
|
||||
} else {
|
||||
echo "</pre>";
|
||||
echo "Router monitoring finished checking.\n";
|
||||
}
|
||||
|
||||
flock($lock, LOCK_UN);
|
||||
@ -224,5 +248,5 @@ unlink($lockFile);
|
||||
$timestampFile = "$UPLOAD_PATH/cron_last_run.txt";
|
||||
file_put_contents($timestampFile, time());
|
||||
|
||||
|
||||
run_hook('cronjob_end'); #HOOK
|
||||
echo "Cron job finished and completed successfully.\n";
|
Reference in New Issue
Block a user