Пример #1
0
 public function actionIndex()
 {
     $op = EnvUtil::getRequest("op");
     $id = intval(EnvUtil::getRequest("id"));
     if (EnvUtil::submitCheck("formhash")) {
         if ($op == "edit") {
             $dayNew = $_POST["weekdaynew"] != -1 ? -1 : $_POST["daynew"];
             if (strpos($_POST["minutenew"], ",") !== false) {
                 $minuteNew = explode(",", $_POST["minutenew"]);
                 foreach ($minuteNew as $key => $val) {
                     $minuteNew[$key] = $val = intval($val);
                     if ($val < 0 || 59 < $val) {
                         unset($minuteNew[$key]);
                     }
                 }
                 $minuteNew = array_slice(array_unique($minuteNew), 0, 12);
                 $minuteNew = implode("\t", $minuteNew);
             } else {
                 $minuteNew = intval($_POST["minutenew"]);
                 $minuteNew = 0 <= $minuteNew && $minuteNew < 60 ? $minuteNew : "";
             }
             $cronfile = $this->getRealCronFile($_POST["type"], $_POST["filenamenew"], $_POST["module"]);
             if (preg_match("/[\\\\\\/\\:\\*\\?\"\\<\\>\\|]+/", $_POST["filenamenew"])) {
                 $this->error(Ibos::lang("Crons filename illegal"));
             } elseif (!is_readable($cronfile)) {
                 $this->error(Ibos::lang("Crons filename invalid", "", array("{cronfile}" => $cronfile)));
             } else {
                 if ($_POST["weekdaynew"] == -1 && $dayNew == -1 && $_POST["hournew"] == -1 && $minuteNew === "") {
                     $this->error(Ibos::lang("Crons time invalid"));
                 }
             }
             $data = array("weekday" => $_POST["weekdaynew"], "day" => $dayNew, "hour" => $_POST["hournew"], "minute" => $minuteNew, "filename" => trim($_POST["filenamenew"]));
             $id && Cron::model()->modify($id, $data);
             Ibos::app()->cron->run($id);
         } elseif ($op == "delete") {
             if (!empty($_POST["delete"])) {
                 $ids = StringUtil::iImplode($_POST["delete"]);
                 Cron::model()->deleteAll(sprintf("cronid IN (%s) AND type='user'", $ids));
             }
         } else {
             if (isset($_POST["namenew"]) && !empty($_POST["namenew"])) {
                 foreach ($_POST["namenew"] as $id => $name) {
                     $newCron = array("name" => StringUtil::filterCleanHtml($_POST["namenew"][$id]), "available" => isset($_POST["availablenew"][$id]) ? 1 : 0);
                     if (isset($_POST["availablenew"][$id]) && empty($_POST["availablenew"][$id])) {
                         $newCron["nextrun"] = "0";
                     }
                     Cron::model()->modify($id, $newCron);
                 }
             }
             if (!empty($_POST["newname"])) {
                 $data = array("name" => StringUtil::ihtmlSpecialChars($_POST["newname"]), "type" => "user", "available" => "0", "weekday" => "-1", "day" => "-1", "hour" => "-1", "minute" => "", "nextrun" => TIMESTAMP);
                 Cron::model()->add($data);
             }
             $list = Cron::model()->fetchAll(array("select" => "cronid,filename,type,module"));
             foreach ($list as $cron) {
                 $cronFile = $this->getRealCronFile($cron["type"], $cron["filename"], $cron["module"]);
                 if (!file_exists($cronFile)) {
                     Cron::model()->modify($cron["cronid"], array("available" => 0, "nextrun" => 0));
                 }
             }
             CacheUtil::update("setting");
         }
         $this->success(Ibos::lang("Crons succeed"), $this->createUrl("cron/index"));
     } else {
         if ($op && in_array($op, array("edit", "run"))) {
             $cron = Cron::model()->fetchByPk($id);
             if (!$cron) {
                 $this->error("Cron not found");
             }
             $cron["filename"] = str_replace(array("..", "/", "\\"), array("", "", ""), $cron["filename"]);
             if ($op == "edit") {
                 $this->render("edit", array("cron" => $cron));
             } elseif ($op == "run") {
                 $file = $this->getRealCronFile($cron["type"], $cron["filename"], $cron["module"]);
                 if (!file_exists($file)) {
                     $this->error(Ibos::lang("Crons run invalid", "", array("{cronfile}" => $file)));
                 } else {
                     Ibos::app()->cron->run($cron["cronid"]);
                     $this->success(Ibos::lang("Crons run succeed"), $this->createUrl("cron/index"));
                 }
             }
         } else {
             $list = Cron::model()->fetchAll(array("order" => "type desc"));
             $this->handleCronList($list);
             $this->render("index", array("list" => $list));
         }
     }
 }
Пример #2
0
 private function setNextTime($cron)
 {
     if (empty($cron)) {
         return false;
     }
     $timeoffSet = Ibos::app()->setting->get("setting/timeoffset");
     list($yearNow, $monthNow, $dayNow, $weekdayNow, $hourNow, $minuteNow) = explode("-", gmdate("Y-m-d-w-H-i", TIMESTAMP + $timeoffSet * 3600));
     if ($cron["weekday"] == -1) {
         if ($cron["day"] == -1) {
             $firstDay = $dayNow;
             $secondDay = $dayNow + 1;
         } else {
             $firstDay = $cron["day"];
             $secondDay = $cron["day"] + gmdate("t", TIMESTAMP + $timeoffSet * 3600);
         }
     } else {
         $firstDay = $dayNow + ($cron["weekday"] - $weekdayNow);
         $secondDay = $firstDay + 7;
     }
     if ($firstDay < $dayNow) {
         $firstDay = $secondDay;
     }
     if ($firstDay == $dayNow) {
         $todayTime = $this->todayNextRun($cron);
         if ($todayTime["hour"] == -1 && $todayTime["minute"] == -1) {
             $cron["day"] = $secondDay;
             $nextTime = $this->todayNextRun($cron, 0, -1);
             $cron["hour"] = $nextTime["hour"];
             $cron["minute"] = $nextTime["minute"];
         } else {
             $cron["day"] = $firstDay;
             $cron["hour"] = $todayTime["hour"];
             $cron["minute"] = $todayTime["minute"];
         }
     } else {
         $cron["day"] = $firstDay;
         $nextTime = $this->todayNextRun($cron, 0, -1);
         $cron["hour"] = $nextTime["hour"];
         $cron["minute"] = $nextTime["minute"];
     }
     $nextRun = @gmmktime($cron["hour"], 0 < $cron["minute"] ? $cron["minute"] : 0, 0, $monthNow, $cron["day"], $yearNow) - $timeoffSet * 3600;
     $data = array("lastrun" => TIMESTAMP, "nextrun" => $nextRun);
     if (!TIMESTAMP < $nextRun) {
         $data["available"] = "0";
     }
     Cron::model()->modify($cron["cronid"], $data);
     return true;
 }