Cron.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. /* @usage - inside cli script:
  4. * $cronTaskName = 'checkInstall';
  5. * $keyToken = 'bash_install_check';
  6. * $token = Router::getRoute('Cron')->generateCliAuthToken($keyToken, $cronTaskName, 300 * 10);
  7. * $output = Router::getRoute('Cron')->executeCurlTastByToken($cronTaskName, $keyToken, $token);
  8. */
  9. /* @usage - inside cli script with args:
  10. * $cronTaskName = 'forceTablePerms';
  11. * $keyToken = 'bash_force_table_perms';
  12. * $token = Router::getRoute('Cron')->generateCliAuthToken($keyToken, $cronTaskName, 300 * 10);
  13. * $output = Router::getRoute('Cron')->executeCurlTastByToken($cronTaskName, $keyToken, $token, [ 'idGroup' => 3, 'table' => 'CRM_PROCES' ]);
  14. */
  15. // TEST: $ php SE/se-lib/Route/Cron-test.php biuro.biall-net.pl
  16. class Route_Cron extends RouteBase {
  17. public function handleAuth() {
  18. if (User::logged()) {
  19. } else if ($this->authByToken()) {
  20. } else throw new HttpException('Unauthorized', 401);
  21. }
  22. public function generateCliAuthToken($cliKey, $task, $ttl = 300) {
  23. $generatedToken = uniqid();
  24. $parts = array();
  25. $parts[] = $generatedToken;
  26. $parts[] = $task;
  27. $parts[] = $ttl;
  28. $parts[] = time();
  29. $token = implode(",", $parts);
  30. $sqlCliKey = "CronCliAuthToken:{$cliKey}";
  31. $sth = DB::getPDO()->prepare("
  32. insert into CRM_CONFIG (CONF_KEY, CONF_VAL)
  33. values ( :cliKey, :token )
  34. on duplicate key update CONF_VAL = :token
  35. ");
  36. $sth->bindValue(':cliKey', $sqlCliKey, PDO::PARAM_STR);
  37. $sth->bindValue(':token', $token, PDO::PARAM_STR);
  38. $sth->execute();
  39. return $generatedToken;
  40. }
  41. public function authByToken() {
  42. $cliKey = V::get('_key', '', $_REQUEST);
  43. $cliToken = V::get('_token', '', $_REQUEST);
  44. $sqlCliKey = "CronCliAuthToken:{$cliKey}";
  45. $sth = DB::getPDO()->prepare("
  46. select c.CONF_VAL
  47. from CRM_CONFIG c
  48. where CONF_KEY = :cliKey
  49. order by c.ID desc
  50. limit 1
  51. ");
  52. $sth->bindValue(':cliKey', $sqlCliKey, PDO::PARAM_STR);
  53. $sth->execute();
  54. $rawToken = $sth->fetch();
  55. if (!$rawToken || !$rawToken['CONF_VAL']) throw new HttpException("Unauthorized - token not found #1-" . __LINE__, 401);
  56. $rawToken = explode(',', $rawToken['CONF_VAL']);
  57. DBG::_('DBG_CRON', '>1', 'rawToken', $rawToken, __CLASS__, __FUNCTION__, __LINE__);
  58. if (4 != count($rawToken)) throw new HttpException("Unauthorized - token not found #2-" . __LINE__, 401);
  59. if ($cliToken != $rawToken[0]) throw new HttpException("Unauthorized - token not found #3-" . __LINE__, 401);
  60. $task = $rawToken[1];
  61. $ttl = (int)$rawToken[2];
  62. $createDateTimestamp = (int)$rawToken[3];
  63. if (!$ttl) throw new HttpException("Unauthorized - token not found #4-" . __LINE__, 401);
  64. if (!$createDateTimestamp) throw new HttpException("Unauthorized - token not found #5-" . __LINE__, 401);
  65. DBG::_('DBG_CRON', '>1', 'rawToken', array('createDateTimestamp'=>$createDateTimestamp, 'ttl'=>$ttl, 'cur'=>time()), __CLASS__, __FUNCTION__, __LINE__);
  66. if ($createDateTimestamp + $ttl < time()) {
  67. // TODO: remove record from table - one time action?
  68. throw new HttpException("Unauthorized - token expired #6-" . __LINE__, 401);
  69. }
  70. session_write_close();// changes in $_SESSION visible only in current process
  71. $_SESSION['AUTHORIZE_USER'] = 'anonymous';
  72. $_SESSION['ADM_NAME'] = 'Anonymous';
  73. $_SESSION['ADM_ACCOUNT'] = $_SERVER['REMOTE_ADDR'];
  74. $_SESSION['ADM_ADMIN_LEVEL'] = 10;
  75. $_SESSION['ADM_ID'] = 9999999999;
  76. DBG::_('DBG_CRON', '>1', 'rawToken', array('createDateTimestamp'=>$createDateTimestamp, 'ttl'=>$ttl, 'cur'=>time()), __CLASS__, __FUNCTION__, __LINE__);
  77. $this->runTask($task);
  78. exit;
  79. }
  80. public function executeCurlTastByToken($cronTaskName, $keyToken, $token, $args = []) { // @require $_SERVER['SERVER_NAME']
  81. $baseUrl = "https://{$_SERVER['SERVER_NAME']}/SE";
  82. if ('biuro.biall-net.pl' == $_SERVER['SERVER_NAME']) $baseUrl = "https://{$_SERVER['SERVER_NAME']}/SE/version-git";
  83. // if ('biuro.biall-net.pl' == $_SERVER['SERVER_NAME']) $baseUrl = "https://{$_SERVER['SERVER_NAME']}/dev-pl/se-master"; // DBG
  84. //file_get_contents("https://{$baseUrl}/index.php?_route=Cron&_key={$keyToken}&_token={$token}&_task=sendNotify");
  85. $url = "{$baseUrl}/index.php?_route=Cron&_key={$keyToken}&_token={$token}&_task={$cronTaskName}";
  86. if (!empty($args)) $url .= "&" . implode("&", array_map(function ($key, $val) {
  87. return "{$key}={$val}";
  88. }, array_keys($args), array_values($args)));
  89. $ch = curl_init();
  90. curl_setopt($ch, CURLOPT_VERBOSE, true);
  91. curl_setopt($ch, CURLOPT_URL, $url);
  92. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  93. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  94. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  95. $return = curl_exec($ch);
  96. curl_close($ch);
  97. return $return;
  98. }
  99. public function defaultAction() {
  100. Lib::loadClass('UI');
  101. UI::gora();
  102. echo UI::h('div', [ 'class' => "container" ], [
  103. UI::h('h1', [], "Cron"),
  104. "...",
  105. ]);
  106. UI::dol();
  107. }
  108. public function dbgClearNofityAction() {
  109. Lib::loadClass('UI');
  110. UI::gora();
  111. try {
  112. DB::getPDO()->execSql("update `CRM_NOTIFY` set `last_exec_time` = null");
  113. UI::alert('info', "Notify cleared");
  114. } catch (Exception $e) {
  115. UI::alert('danger', "Error: " . $e->getMessage());
  116. }
  117. UI::dol();
  118. }
  119. public function dbgChangeNofityToDayBeforeAction() {
  120. Lib::loadClass('UI');
  121. UI::gora();
  122. try {
  123. DB::getPDO()->execSql("update `CRM_NOTIFY` set `last_exec_time` = DATE_SUB(NOW(), INTERVAL 1 DAY)");
  124. UI::alert('info', "Notify cleared");
  125. } catch (Exception $e) {
  126. UI::alert('danger', "Error: " . $e->getMessage());
  127. }
  128. UI::dol();
  129. }
  130. public function sendNotifyAction() {
  131. Lib::loadClass('UI');
  132. $notify = Router::getRoute('Notify');
  133. $todoReminders = array();
  134. if (V::get('DBG_CRON', null, $_GET) > 0) UI::gora();
  135. echo '<div class="container">' . "\n";
  136. echo '<h1>Cron</h1>' . "\n";
  137. try {
  138. if (V::get('DBG_CRON', null, $_GET) > 0) DBG::table("reminders state - before", DB::getPDO()->fetchAll("select * from CRM_NOTIFY order by last_exec_time limit 20"), __CLASS__, __FUNCTION__, __LINE__);
  139. {// limit send time to 8 - 20
  140. $timeNow = time();
  141. $timeSendLimitFrom = mktime(8, 0, 0, date('n'), date('j'), date('Y'));
  142. $timeSendLimitTo = mktime(20, 0, 0, date('n'), date('j'), date('Y'));
  143. $dayNrNow = date('N');
  144. $daysAllowed = array(1, 2, 3, 4, 5);// 1 = Poniedziałek, ... , 6 - Sobota, 7 - Niedziela
  145. if ($timeNow > $timeSendLimitFrom && $timeNow < $timeSendLimitTo && in_array($dayNrNow, $daysAllowed)) {
  146. $todoReminders = $notify->getTodoList(2, array('once_a_day', 'immediately'));
  147. }
  148. }
  149. DBG::_('DBG_CRON', '>0', 'todoReminders', $todoReminders, __CLASS__, __FUNCTION__, __LINE__);
  150. foreach ($todoReminders as $who => $userReminders) {
  151. echo "<p>Sending to {$who} reminders {" . json_encode($userReminders) . "}</p>" . "\n";
  152. //$notify->sendUserReminders($who, $userReminders, $forceMail = 'plabudda@biall-net.pl');// TEST
  153. $notify->sendUserReminders($who, $userReminders);
  154. foreach ($userReminders as $when => $listWhat) {
  155. if (!empty($listWhat)) {
  156. // $reminders = array_keys($listWhat);
  157. // echo "<p>Sending to {$who} reminders [" . implode(",", $reminders) . "] at '{$when}'</p>" . "\n";
  158. // $notify->send($who, $listWhat, $when, $forceMail = 'plabudda@biall-net.pl');
  159. $notify->markAsSent($who, $listWhat, $when);
  160. }
  161. }
  162. }
  163. if (V::get('DBG_CRON', null, $_GET) > 0) DBG::table("reminders state - after", DB::getPDO()->fetchAll("select * from CRM_NOTIFY order by last_exec_time limit 20"), __CLASS__, __FUNCTION__, __LINE__);
  164. } catch (Exception $e) {
  165. UI::alert('danger', "#" . $e->getLine() . ":" . $e->getMessage());
  166. }
  167. echo "\n" . '</div>';// .container
  168. echo "\n.EOF\n";
  169. }
  170. public function checkInstallAction() {
  171. Lib::loadClass('Router');
  172. {
  173. ob_start();
  174. Router::getRoute('Status')->updateObjectCachePostTask();
  175. $out = ob_get_clean();
  176. echo " - Storage acl cache checked\n";
  177. }
  178. $routeToReinstallList = array();
  179. //$routeToReinstallList[] = 'Config';// Config must work before (url token)
  180. $routeToReinstallList[] = 'Msgs';
  181. $routeToReinstallList[] = 'FixProjectPath';
  182. $routeToReinstallList[] = 'FixZasobPath';
  183. $routeToReinstallList[] = 'FixCrmProcesInitIdx';
  184. $routeToReinstallList[] = 'Notify';
  185. $routeToReinstallList[] = 'UrlAction_WmsGenerate';
  186. // $routeToReinstallList[] = 'FileStorage';// reinstall in bash_install_check.php
  187. foreach ($routeToReinstallList as $routeName) {
  188. $route = Router::getRoute($routeName);
  189. $route->reinstall();
  190. echo " - {$routeName} checked\n";
  191. }
  192. echo "\n.EOF\n";
  193. }
  194. /* @usage - inside cli script with args:
  195. * $cronTaskName = 'forceTablePerms';
  196. * $keyToken = 'bash_force_table_perms';
  197. * $token = Router::getRoute('Cron')->generateCliAuthToken($keyToken, $cronTaskName, 300 * 10);
  198. * $output = Router::getRoute('Cron')->executeCurlTastByToken($cronTaskName, $keyToken, $token, [ 'idGroup' => 3, 'table' => 'CRM_PROCES' ]);
  199. */
  200. public function forceTablePermsAction() {
  201. $idGroup = V::get('idGroup', 0, $_GET, 'int');
  202. if (!$idGroup) throw new Exception("Missing idGroup");
  203. $table = V::get('table', '', $_GET, 'word');
  204. if (!$table) throw new Exception("Missing table");
  205. Lib::loadClass('UsersLdapHelper');
  206. $groupsNetwork = UsersLdapHelper::getGroupsByID($idGroup);
  207. if (empty($groupsNetwork)) throw new Exception("Group {$idGroup} not found");
  208. foreach ($groupsNetwork as $vGroup) {
  209. echo "Will try to update table {$table} set A_CLASSIFIED='{$vGroup->cn}', A_ADM_COMPANY='{$vGroup->cn}' ;" . "\n";
  210. DB::getPDO()->execSql("update `{$table}` set `A_CLASSIFIED`='{$vGroup->cn}', `A_ADM_COMPANY`='{$vGroup->cn}' ");
  211. }
  212. echo "DONE";
  213. }
  214. public function forceSyncUserAction() {
  215. $usrLogin = V::get('usrLogin', 0, $_GET, 'login');
  216. if (!$usrLogin) throw new Exception("Missing usrLogin");
  217. Lib::loadClass('Router');
  218. Lib::loadClass('UsersLdapHelper');
  219. $usrStorageDB = UserStorageFactory::getStorage('DB');
  220. $usrStorageLdap = UserStorageFactory::getStorage('MacOSX');
  221. $forceSync = 1;
  222. Router::getRoute('Users')->syncUser($usrLogin, $usrStorageDB, $usrStorageLdap, $forceSync);
  223. echo "DONE";
  224. }
  225. public function forceSyncGroupAction() {
  226. $idGroup = V::get('idGroup', 0, $_GET, 'int');
  227. if (!$idGroup) throw new Exception("Missing idGroup");
  228. Lib::loadClass('Router');
  229. Lib::loadClass('UsersLdapHelper');
  230. $usrStorageDB = UserStorageFactory::getStorage('DB');
  231. $usrStorageLdap = UserStorageFactory::getStorage('MacOSX');
  232. $forceSync = 1;
  233. Router::getRoute('Users')->syncGroup($idGroup, $usrStorageDB, $usrStorageLdap, $forceSync);
  234. echo "DONE";
  235. }
  236. public function addUserAction() {
  237. //$output = Router::getRoute('Cron')->executeCurlTastByToken($cronTaskName, $keyToken, $token, [ 'idGroup' => $groupID, 'usrLogin' => $usrLogin , 'ADM_ADMIN_LEVEL' => $ADM_ADMIN_LEVEL, 'ADM_NAME' => $ADM_NAME, 'ADM_ADMIN_DESC' => $ADM_ADMIN_DESC, 'EMPLOYEE_TYPE' => $EMPLOYEE_TYPE, 'ADM_PASSWD' => $ADM_PASSWD, 'A_ADM_COMPANY' => $A_ADM_COMPANY, 'A_CLASSIFIED' => $A_CLASSIFIED ]);
  238. $idGroup = V::get('idGroup', 0, $_GET, 'int');
  239. $usrLogin = V::get('usrLogin', 0, $_GET, 'login');
  240. $idTelboxes = V::get('idTelboxes', 0, $_GET, 'int');
  241. $ADM_ADMIN_LEVEL = V::get('ADM_ADMIN_LEVEL', 0, $_GET, 'int');
  242. $ADM_NAME = V::get('ADM_NAME', 0, $_GET, 'word');
  243. $ADM_ADMIN_DESC = V::get('ADM_ADMIN_DESC', 0, $_GET, 'word');
  244. $EMPLOYEE_TYPE = V::get('EMPLOYEE_TYPE', 0, $_GET, 'word');
  245. $ADM_PASSWD = V::get('ADM_PASSWD', 0, $_GET, 'word');
  246. $idGroup_A_ADM_COMPANY = V::get('idGroup_A_ADM_COMPANY', 0, $_GET, 'int');
  247. $idGroup_A_CLASSIFIED = V::get('idGroup_A_CLASSIFIED', 0, $_GET, 'int');
  248. $idGroup_DEFAULT_ACL_GROUP = V::get('idGroup_DEFAULT_ACL_GROUP', 0, $_GET, 'int');
  249. if (!$usrLogin) throw new Exception("Missing usrLogin");
  250. Lib::loadClass('Router');
  251. Lib::loadClass('UsersLdapHelper');
  252. $groupsNetwork = UsersLdapHelper::getGroupsByID($idGroup_A_ADM_COMPANY);
  253. if (empty($groupsNetwork)) throw new Exception("Group {$idGroup_A_ADM_COMPANY} not found");
  254. foreach ($groupsNetwork as $vGroup) {
  255. $A_ADM_COMPANY = $vGroup->cn;
  256. }
  257. $groupsNetwork = UsersLdapHelper::getGroupsByID($idGroup_A_CLASSIFIED);
  258. if (empty($groupsNetwork)) throw new Exception("Group {$idGroup_A_CLASSIFIED} not found");
  259. foreach ($groupsNetwork as $vGroup) {
  260. $A_CLASSIFIED = $vGroup->cn;
  261. }
  262. $groupsNetwork = UsersLdapHelper::getGroupsByID($idGroup_DEFAULT_ACL_GROUP);
  263. if (empty($groupsNetwork)) throw new Exception("Group {$idGroup_A_CLASSIFIED} not found");
  264. foreach ($groupsNetwork as $vGroup) {
  265. $DEFAULT_ACL_GROUP = $vGroup->cn;
  266. }
  267. Router::getRoute('Users')->addUser($usrLogin, $idGroup, $idTelboxes, $ADM_ADMIN_LEVEL, $ADM_NAME, $ADM_ADMIN_DESC, $EMPLOYEE_TYPE, $ADM_PASSWD, $A_ADM_COMPANY, $A_CLASSIFIED, $DEFAULT_ACL_GROUP);
  268. echo "DONE";
  269. }
  270. }