#!/usr/bin/php-cgi
<?php
/*
JOB SCHEDULER
=============
WRITTEN BY JOSE MARI REYES

MACROS INTERFACE FOR CRON JOBS

HISTORY:

	02/06/2020	INITIAL SET OF MACROS.  
	
	
	
	
USAGE:
========
SYNOPSIS
========

	Semicolon Delimited		  
	
	GENERAL SYNTAX
	---------------
	
	<MACROS>|<Command>
	
	Example:
	
	!15|/bin/ls -l;@07|/etc/smsg/test.php
	
	- Execute daily every 15 minutes the command
	
		  


MACROS LIST
==============


GENERAL SCHED JOB
------------------


![mm]		Everyday every X mins

			!15  -  Everyday every 15 minutes




@[hh]		Everyday every X Hour

			@06  - run everyday evert 6 hours
			




#[hh][mm]  Every day every [XX] hour  [XX] minutes

			#0130  every 1 hour and 30 minutes





DAYS OF THE WEEK SCHED
------------------------
			
$[D]:[hh][mm]  Run every day of the week.  the day specified by D  delimiter by :  ON HOUR and mm field

 			  day of week (0 - 7) (Sunday=0 or 7)

			  $1:0730    every monday  at 7:30am
			  
			  $135:2200	 every monday wednesday friday at 22 hour
			  
			  30 7 * * 1,3,5





%[D]:[hh][mm]  Run every day of the week.  the day specified by D  delimiter by :  AT EVERY HOUR and mm field

 			  day of week (0 - 7) (Sunday=0 or 7)

			  $1:0030    every monday  a every 30 mins
			  
			  %135:0059	 every monday wednesday friday a every 1 hour
			  
			  		  

EMPTY PARAMETER -  THIS WILL DELETE ALL JOB CREATED BY THIS API		  
==================================================================		  
		  
                
*/



define ("MACRO_DAILY_MINUTE", '!');
define ("MACRO_DAILY_HOUR", '@');
define ("MACRO_DAILY_HHMM", '#');
define ("MACRO_DAY_OF_WEEK_ON_HHMM_A", '$'); 
define ("MACRO_DAY_OF_WEEK_ON_HHMM_B", '^'); 
define("CRONFILE", "/etc/crontabs/root");


echo "<pre>";
/*
$command = "!05|/bin/ls -l;@6|/etc/smsg/test.php;#0130|/etc/firewall.d/fire;";

$command .= "$135:0059|ls -l;";

$command .= "$135:0059|/usr/bin/ls -l;^15:0100|/usr/bin/test;";

echo "COMMAND: $command\n\n";
*/


macros_process($command);




function macros_process($command)
{
	if (strlen($command) < 1) 
	{
		save_to_cron("");
		return 0;
	}
	
	$command = rtrim($command, ";");
	$cmd = explode(";", $command);
	$cron = "";
	
	print_r($cmd);
	
	
	for ($i = 0; $i < count($cmd); $i++)
	{
		echo "\n[$i:]" . $cmd[$i];

		$macro = $cmd[$i];
		$exec = explode("|", $macro);
		
		if ($macro[0] == MACRO_DAILY_MINUTE)  
		{
			$mins = intval( $macro[1] . $macro[2] );
			$cron .= "*/$mins * * * * " . $exec[1] . "\n";
			
		}
		
		if ($macro[0] == MACRO_DAILY_HOUR)  
		{
			$hour = intval( $macro[1] . $macro[2] );
			$cron .= "0 */$hour * * * " . $exec[1] ."\n";
			
		}
		
		if ($macro[0] == MACRO_DAILY_HHMM)
		{
			$hour = intval( $macro[1] . $macro[2] );
			$mins = intval( $macro[3] . $macro[4] );
			$cron .= "$mins */$hour * * * " . $exec[1] ."\n";
			
		}
		
		
		if ($macro[0] == MACRO_DAY_OF_WEEK_ON_HHMM_A)
		{
			//get the day(s)
			$var = explode(":", $macro);
			$days = substr($var[0], 1);
			
			if (strlen($days) > 1) 
			{
			
				$c = strlen($days);
				$tmp = "";
				for ($idx = 0; $idx < $c; $idx++)  
				{
					$tmp .= $days[$idx] . ",";
				}
				
				$days = trim($tmp, ",");
			}
			
			//echo "\ndays:$days";
			
			//get time
			$dt = $var[1];
			$hour = intval($dt[0] . $dt[1]);
			$mins = intval($dt[2] . $dt[3]);
			
			$cron .= "$mins $hour * * $days " . $exec[1] ."\n";
			
			//echo $cron;
			
		}
	
	
		if ($macro[0] == MACRO_DAY_OF_WEEK_ON_HHMM_B)
		{
			//get the day(s)
			$var = explode(":", $macro);
			$days = substr($var[0], 1);
			
			if (strlen($days) > 1) 
			{
			
				$c = strlen($days);
				$tmp = "";
				for ($idx = 0; $idx < $c; $idx++)  
				{
					$tmp .= $days[$idx] . ",";
				}
				
				$days = trim($tmp, ",");
			}
			
			//echo "\ndays:$days";
			
			//get time
			$dt = $var[1];
			$hour = intval($dt[0] . $dt[1]);
			$mins = intval($dt[2] . $dt[3]);
			
			$cron .= "$mins /$hour * * $days " . $exec[1] ."\n";
			
			//echo $cron;
			
		}
		
		
	}


   echo "\n\n=====================\n$cron";
   
   save_to_cron($cron);
   
}








function save_to_cron($cmd)
{

	$marker = "#========== GENERATED BY CREWCOMM CRON API ==========";
	
	$buf = file_get_contents(CRONFILE);

	$v = explode("\n", $buf);
	
	print_r($v);
	
	echo "\n";
	$buffer = "";
    for ($i = 0; $i < count ($v); $i++)
	{
		echo "[$i]" . $v[$i] . "\n";
		$buffer .= $v[$i] . "\n";
		 
		if (strpos($v[$i], $marker) !== false)
		{
			echo "MARKER FOUND!1";
			$buffer .= "\n" . $cmd;
			file_put_contents (CRONFILE, $buffer);
			return 0;
		}
	}
	
	//append to the last. if no marker yet
	$marker .= "\n" . $cmd;
	file_put_contents(CRONFILE, $marker, FILE_APPEND);

}








?>