From 18857b7d55dea927e312058a48f3932faae07acc Mon Sep 17 00:00:00 2001 From: Pierre-Lin Bonnemaison Date: Mon, 17 Aug 2015 20:07:55 +0200 Subject: [PATCH] Verification envoi et reception toutes les 2 secondes --- controllers/internalConsole.php | 330 ++++++++++++++++---------------- 1 file changed, 169 insertions(+), 161 deletions(-) diff --git a/controllers/internalConsole.php b/controllers/internalConsole.php index 56996ab..d7cae5b 100755 --- a/controllers/internalConsole.php +++ b/controllers/internalConsole.php @@ -71,88 +71,90 @@ //On créé l'objet de base de données global $db; + for ($i = 0; $i < 30; $i++) + { + $now = new DateTime(); + $now = $now->format('Y-m-d H:i:s'); - $now = new DateTime(); - $now = $now->format('Y-m-d H:i:s'); + echo "Début de l'envoi des SMS programmés\n"; - echo "Début de l'envoi des SMS programmés\n"; + $scheduleds = $db->getScheduledsNotInProgressBefore($now); - $scheduleds = $db->getScheduledsNotInProgressBefore($now); + $ids_scheduleds = array(); - $ids_scheduleds = array(); - - //On passe en cours de progression tous les SMS - foreach ($scheduleds as $scheduled) - { - $ids_scheduleds[] = $scheduled['id']; - } - - echo count($ids_scheduleds) . " SMS à envoyer ont été trouvés et ajoutés à la liste des SMS en cours d'envoi.\n"; - - $db->updateProgressScheduledsIn($ids_scheduleds, true); - - //Pour chaque SMS à envoyer - foreach ($scheduleds as $scheduled) - { - $id_scheduled = $scheduled['id']; - $text_sms = escapeshellarg($scheduled['content']); - - //On initialise les numéros auxquelles envoyer le SMS - $numbers = array(); - - //On récupère les numéros pour le SMS et on les ajoute - $target_numbers = $db->getNumbersForScheduled($id_scheduled); - foreach ($target_numbers as $target_number) + //On passe en cours de progression tous les SMS + foreach ($scheduleds as $scheduled) { - $numbers[] = $target_number['number']; + $ids_scheduleds[] = $scheduled['id']; } - //On récupère les contacts, et on ajoute les numéros - $contacts = $db->getContactsForScheduled($id_scheduled); - foreach ($contacts as $contact) - { - $numbers[] = $contact['number']; - } + echo count($ids_scheduleds) . " SMS à envoyer ont été trouvés et ajoutés à la liste des SMS en cours d'envoi.\n"; - //On récupère les groupes - $groups = $db->getGroupsForScheduled($id_scheduled); - foreach ($groups as $group) + $db->updateProgressScheduledsIn($ids_scheduleds, true); + + //Pour chaque SMS à envoyer + foreach ($scheduleds as $scheduled) { - //On récupère les contacts du groupe et on les ajoute aux numéros - $contacts = $db->getContactsForGroup($group['id']); + $id_scheduled = $scheduled['id']; + $text_sms = escapeshellarg($scheduled['content']); + + //On initialise les numéros auxquelles envoyer le SMS + $numbers = array(); + + //On récupère les numéros pour le SMS et on les ajoute + $target_numbers = $db->getNumbersForScheduled($id_scheduled); + foreach ($target_numbers as $target_number) + { + $numbers[] = $target_number['number']; + } + + //On récupère les contacts, et on ajoute les numéros + $contacts = $db->getContactsForScheduled($id_scheduled); foreach ($contacts as $contact) { $numbers[] = $contact['number']; } - } - - foreach ($numbers as $number) - { - echo " Envoi d'un SMS au " . $number . "\n"; - //On ajoute le SMS aux SMS envoyés - //Pour plus de précision, on remet la date à jour en réinstanciant l'objet DateTime (et on reformatte la date, bien entendu) - $now = new DateTime(); - $now = $now->format('Y-m-d H:i:s'); - //On peut maintenant ajouter le SMS - if (!$db->insertIntoTable('sendeds', ['at' => $now, 'target' => $number, 'content' => $scheduled['content']])) + + //On récupère les groupes + $groups = $db->getGroupsForScheduled($id_scheduled); + foreach ($groups as $group) { - echo 'Impossible d\'inserer le sms pour le numero ' . $number . "\n"; + //On récupère les contacts du groupe et on les ajoute aux numéros + $contacts = $db->getContactsForGroup($group['id']); + foreach ($contacts as $contact) + { + $numbers[] = $contact['number']; + } } - $id_sended = $db->lastId(); - //Commande qui envoie le SMS - $commande_send_sms = 'gammu-smsd-inject TEXT ' . escapeshellarg($number) . ' -len ' . mb_strlen($text_sms) . ' -text ' . $text_sms; - //Commande qui s'assure de passer le SMS dans ceux envoyés, et de lui donner le bon statut + foreach ($numbers as $number) + { + echo " Envoi d'un SMS au " . $number . "\n"; + //On ajoute le SMS aux SMS envoyés + //Pour plus de précision, on remet la date à jour en réinstanciant l'objet DateTime (et on reformatte la date, bien entendu) + $now = new DateTime(); + $now = $now->format('Y-m-d H:i:s'); + //On peut maintenant ajouter le SMS + if (!$db->insertIntoTable('sendeds', ['at' => $now, 'target' => $number, 'content' => $scheduled['content']])) + { + echo 'Impossible d\'inserer le sms pour le numero ' . $number . "\n"; + } + $id_sended = $db->lastId(); + + //Commande qui envoie le SMS + $commande_send_sms = 'gammu-smsd-inject TEXT ' . escapeshellarg($number) . ' -len ' . mb_strlen($text_sms) . ' -text ' . $text_sms; + //Commande qui s'assure de passer le SMS dans ceux envoyés, et de lui donner le bon statut - //On va liée les deux commandes pour envoyer le SMS puis le passer en echec - $commande = '(' . $commande_send_sms . ') >/dev/null 2>/dev/null &'; - exec($commande); //On execute la commande d'envoie d'un SMS + //On va liée les deux commandes pour envoyer le SMS puis le passer en echec + $commande = '(' . $commande_send_sms . ') >/dev/null 2>/dev/null &'; + exec($commande); //On execute la commande d'envoie d'un SMS + } } - } - echo "Tous les SMS sont en cours d'envoi.\n"; - //Tous les SMS ont été envoyés. - $db->deleteScheduledsIn($ids_scheduleds); + echo "Tous les SMS sont en cours d'envoi.\n"; + //Tous les SMS ont été envoyés. + $db->deleteScheduledsIn($ids_scheduleds); + } } /** @@ -163,116 +165,122 @@ //On créer l'objet de base de données global $db; - foreach (scandir(PWD_RECEIVEDS) as $dir) - { - //Si le fichier est un fichier système, on passe à l'itération suivante - if ($dir == '.' || $dir == '..') + for ($i = 0; $i < 30; $i++) + { + foreach (scandir(PWD_RECEIVEDS) as $dir) { - continue; - } - - //On récupère la date du SMS à la seconde près grâce au nom du fichier (Cf. parseSMS.sh) - //Il faut mettre la date au format Y-m-d H:i:s - $date = substr($dir, 0, 4) . '-' . substr($dir, 4, 2) . '-' . substr($dir, 6, 2) . ' ' . substr($dir, 8, 2) . ':' . substr($dir, 10, 2) . ':' . substr($dir, 12, 2); - - //On récupère le fichier, et on récupère la chaine jusqu'au premier ':' pour le numéro de téléphone source, et la fin pour le message - $content_file = file_get_contents(PWD_RECEIVEDS . $dir); - - //Si on peux pas ouvrir le fichier, on quitte en logant une erreur - if ($content_file == false) - { - $this->wlog('Unable to read file "' . $dir); - die(4); - } - - //On supprime le fichier. Si on n'y arrive pas, alors on log - if (!unlink(PWD_RECEIVEDS . $dir)) - { - $this->wlog('Unable to delete file "' . $dir); - die(8); - } - - $content_file = explode(':', $content_file, 2); - - //Si on a pas passé de numéro ou de message, alors on lève une erreur - if (!isset($content_file[0], $content_file[1])) - { - $this->wlog('Missing params in file "' . $dir); - die(5); - } - - $number = $content_file[0]; - $number = internalTools::parsePhone($number); - $text = $content_file[1]; - - - if (!$number) - { - $this->wlog('Invalid phone number in file "' . $dir); - die(6); - } - - //On va vérifier si on a reçu une commande, et des identifiants - $flags = internalTools::parseForFlag($text); - - //On créer le tableau qui permettra de stocker les commandes trouvées - - $found_commands = array(); - - //Si on reçu des identifiants - if (array_key_exists('LOGIN', $flags) && array_key_exists('PASSWORD', $flags)) - { - //Si on a bien un utilisateur avec les identifiants reçus - $user = $db->getUserFromEmail($flags['LOGIN']); - $this->wlog('We found ' . count($user) . ' users'); - if ($user && $user['password'] == sha1($flags['PASSWORD'])) + //Si le fichier est un fichier système, on passe à l'itération suivante + if ($dir == '.' || $dir == '..') { - $this->wlog('Password is valid'); - //On va passer en revue toutes les commandes, pour voir si on en trouve dans ce message - $commands = $db->getAll('commands'); + continue; + } - $this->wlog('We found ' . count($commands) . ' commands'); - foreach ($commands as $command) + //On récupère la date du SMS à la seconde près grâce au nom du fichier (Cf. parseSMS.sh) + //Il faut mettre la date au format Y-m-d H:i:s + $date = substr($dir, 0, 4) . '-' . substr($dir, 4, 2) . '-' . substr($dir, 6, 2) . ' ' . substr($dir, 8, 2) . ':' . substr($dir, 10, 2) . ':' . substr($dir, 12, 2); + + //On récupère le fichier, et on récupère la chaine jusqu'au premier ':' pour le numéro de téléphone source, et la fin pour le message + $content_file = file_get_contents(PWD_RECEIVEDS . $dir); + + //Si on peux pas ouvrir le fichier, on quitte en logant une erreur + if ($content_file == false) + { + $this->wlog('Unable to read file "' . $dir); + die(4); + } + + //On supprime le fichier. Si on n'y arrive pas, alors on log + if (!unlink(PWD_RECEIVEDS . $dir)) + { + $this->wlog('Unable to delete file "' . $dir); + die(8); + } + + $content_file = explode(':', $content_file, 2); + + //Si on a pas passé de numéro ou de message, alors on lève une erreur + if (!isset($content_file[0], $content_file[1])) + { + $this->wlog('Missing params in file "' . $dir); + die(5); + } + + $number = $content_file[0]; + $number = internalTools::parsePhone($number); + $text = $content_file[1]; + + + if (!$number) + { + $this->wlog('Invalid phone number in file "' . $dir); + die(6); + } + + //On va vérifier si on a reçu une commande, et des identifiants + $flags = internalTools::parseForFlag($text); + + //On créer le tableau qui permettra de stocker les commandes trouvées + + $found_commands = array(); + + //Si on reçu des identifiants + if (array_key_exists('LOGIN', $flags) && array_key_exists('PASSWORD', $flags)) + { + //Si on a bien un utilisateur avec les identifiants reçus + $user = $db->getUserFromEmail($flags['LOGIN']); + $this->wlog('We found ' . count($user) . ' users'); + if ($user && $user['password'] == sha1($flags['PASSWORD'])) { - $command_name = mb_strtoupper($command['name']); - if (array_key_exists($command_name, $flags)) + $this->wlog('Password is valid'); + //On va passer en revue toutes les commandes, pour voir si on en trouve dans ce message + $commands = $db->getAll('commands'); + + $this->wlog('We found ' . count($commands) . ' commands'); + foreach ($commands as $command) { - $this->wlog('We found command ' . $command_name); - - //Si la commande ne nécessite pas d'être admin, ou si on est admin - if (!$command['admin'] || $user['admin']) + $command_name = mb_strtoupper($command['name']); + if (array_key_exists($command_name, $flags)) { - $this->wlog('And the count is ok'); - $found_commands[$command_name] = PWD_SCRIPTS . $command['script'] . escapeshellcmd($flags[$command_name]); + $this->wlog('We found command ' . $command_name); + + //Si la commande ne nécessite pas d'être admin, ou si on est admin + if (!$command['admin'] || $user['admin']) + { + $this->wlog('And the count is ok'); + $found_commands[$command_name] = PWD_SCRIPTS . $command['script'] . escapeshellcmd($flags[$command_name]); + } } } } } + + //On va supprimer le mot de passe du SMS pour pouvoir l'enregistrer sans danger + if (isset($flags['PASSWORD'])) + { + $text = str_replace($flags['PASSWORD'], '*****', $text); + } + + //On map les données et on créer le SMS reçu + $send_by = $number; + $content = $text; + $is_command = count($found_commands); + if (!$db->insertIntoTable('receiveds', ['at' => $date, 'send_by' => $send_by, 'content' => $content, 'is_command' => $is_command])) + { + echo "Erreur lors de l'enregistrement du SMS\n"; + $this->wlog('Unable to process the SMS in file "' . $dir); + die(7); + } + + //Chaque commande sera executée. + foreach ($found_commands as $command_name => $command) + { + echo 'Execution de la commande : ' . $command_name . ' :: ' . $command . "\n"; + exec($command); + } } - //On va supprimer le mot de passe du SMS pour pouvoir l'enregistrer sans danger - if (isset($flags['PASSWORD'])) - { - $text = str_replace($flags['PASSWORD'], '*****', $text); - } - - //On map les données et on créer le SMS reçu - $send_by = $number; - $content = $text; - $is_command = count($found_commands); - if (!$db->insertIntoTable('receiveds', ['at' => $date, 'send_by' => $send_by, 'content' => $content, 'is_command' => $is_command])) - { - echo "Erreur lors de l'enregistrement du SMS\n"; - $this->wlog('Unable to process the SMS in file "' . $dir); - die(7); - } - - //Chaque commande sera executée. - foreach ($found_commands as $command_name => $command) - { - echo 'Execution de la commande : ' . $command_name . ' :: ' . $command . "\n"; - exec($command); - } + //On attend 2 secondes + sleep(2); } } }