File: 1.07.0a/server/web/api.php (View as HTML)

  1: <?php
  2: /* -------------------------------------------------------------
  3: This file is part of FreeNATS
  4: 
  5: FreeNATS is (C) Copyright 2008 PurplePixie Systems
  6: 
  7: FreeNATS is free software: you can redistribute it and/or modify
  8: it under the terms of the GNU General Public License as published by
  9: the Free Software Foundation, either version 3 of the License, or
 10: (at your option) any later version.
 11: 
 12: FreeNATS is distributed in the hope that it will be useful,
 13: but WITHOUT ANY WARRANTY; without even the implied warranty of
 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 15: GNU General Public License for more details.
 16: 
 17: You should have received a copy of the GNU General Public License
 18: along with FreeNATS.  If not, see www.gnu.org/licenses
 19: 
 20: For more information see www.purplepixie.org/freenats
 21: -------------------------------------------------------------- */
 22: 
 23: ob_start();
 24: require("include.php");
 25: $NATS->Start();
 26: $session=true;
 27: if (!$NATS_Session->Check($NATS->DB))
 28: 	{
 29: 	$session=false;
 30: 	}
 31: 
 32: $abs=GetAbsolute();
 33: 	
 34: if (isset($_REQUEST['mode'])) $mode=$_REQUEST['mode'];
 35: else $mode="xml";
 36: 
 37: // api.public - is available without session auth
 38: // api.key - usage key used if public and no session (if set)
 39: 
 40: if ($NATS->Cfg->Get("api.public",0)!=1) // NOT public
 41: 	{
 42: 	if (!$session)
 43: 		{
 44: 		echo "Error: Public API Access Disabled";
 45: 		exit();
 46: 		}
 47: 	}
 48: else if (!$session) // IS PUBLIC and not logged in
 49: 	{
 50: 	$key=$NATS->Cfg->Get("api.key","");
 51: 	if ($key!="") // require a key
 52: 		{
 53: 		if ( (!isset($_REQUEST['apikey'])) || ($_REQUEST['apikey'] != $key) )
 54: 			{
 55: 			// No key or doesn't match
 56: 			echo "Error: Public API Key Mismatch";
 57: 			exit();
 58: 			}
 59: 		}
 60: 	}
 61: 	
 62: // Got this far so it must be a winner (either public or no key or correct key)
 63: 
 64: 
 65: 
 66: function lo($text) // line out
 67: {
 68: echo $text."\n";
 69: }
 70: 
 71: // Header
 72: ob_clean();
 73: switch($mode)
 74: 	{
 75: 	case "xml": 
 76: 		header("Content-type: text/xml");
 77: 		lo("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
 78: 		lo("<freenats-data>");
 79: 	break;
 80: 	
 81: 	case "js":
 82: 	if (isset($_REQUEST['dataid'])) $dataid=$_REQUEST['dataid'];
 83: 	else
 84: 		{
 85: 		$allow="abcdef0123456789";
 86: 		$allow_len=strlen($allow);
 87: 		mt_srand(microtime()*1000000);
 88: 		$id_len=10;
 89: 		$dataid="fnd_";
 90: 		for ($a=0; $a<$id_len; $a++)
 91: 			{
 92: 			$dataid.=$allow[mt_rand(0,$allow_len-1)];
 93: 			}
 94: 		}
 95: 	lo("var ".$dataid."=new Array();");
 96: 	break;
 97: 	
 98: 	
 99: 	}
100: ob_end_flush();
101: 	
102: // Queries
103: $query_count=count($_REQUEST['query']);
104: for ($a=0; $a<$query_count; $a++)
105: 	{
106: 	switch($_REQUEST['query'][$a])
107: 		{
108: 		case "nodelist":
109: 		$q="SELECT nodeid FROM fnnode";
110: 		if ((!isset($_REQUEST['param'][$a])) || ($_REQUEST['param'][$a]!=1)) $q.=" WHERE nodeenabled=1";
111: 		$q.=" ORDER BY weight ASC";
112: 		$r=$NATS->DB->Query($q);
113: 		if ($mode=="js")
114: 			{
115: 			lo($dataid."[".$a."]=new Array();");
116: 			}
117: 		else if ($mode=="xml") lo("<nodelist count=\"".$NATS->DB->Num_Rows($r)."\" query=\"".$a."\">");
118: 		$ctr=0;
119: 		while ($row=$NATS->DB->Fetch_Array($r))
120: 			{
121: 			$nodealert=$NATS->NodeAlertLevel($row['nodeid']);
122: 			if ($mode=="xml") lo("<node nodeid=\"".$row['nodeid']."\" alertlevel=\"".$nodealert."\">".$row['nodeid']."</node>");
123: 			else if ($mode=="js")
124: 				{
125: 				lo($dataid."[".$a."][".$ctr."]=new Array();");
126: 				lo($dataid."[".$a."][".$ctr."][0]='".$row['nodeid']."';");
127: 				lo($dataid."[".$a."][".$ctr."][1]='".$nodealert."';");
128: 				}
129: 			$ctr++;
130: 			}
131: 		if ($mode=="xml") lo("</nodelist>");
132: 		$NATS->DB->Free($r);
133: 		break;
134: 			
135: 			
136: 		case "node":
137: 		$nodedata=$NATS->GetNode($_REQUEST['param'][$a]);
138: 		if ($nodedata) // got a valid response
139: 			{
140: 			if ($mode=="js")
141: 				{
142: 				lo($dataid."[".$a."]=new Array();");
143: 				}
144: 			else if ($mode=="xml") lo("<node nodeid=\"".$nodedata['nodeid']."\" query=\"".$a."\">");
145: 			$ctr=0;
146: 			foreach($nodedata as $key => $val)
147: 				{
148: 				if (!is_numeric($key)) // pesky double-arrays avoided
149: 					{
150: 					if ($mode=="xml") lo(" <".$key.">".$val."</".$key.">");
151: 					else if ($mode=="js")
152: 						{
153: 						lo($dataid."[".$a."][".$ctr."]=new Array;");
154: 						lo($dataid."[".$a."][".$ctr."][0]='".$key."';");
155: 						lo($dataid."[".$a."][".$ctr."][1]='".$val."';");
156: 						}
157: 					$ctr++;
158: 					}
159: 				}
160: 			if ($mode=="xml") lo("</node>");
161: 			}
162: 		break;
163: 		
164: 		case "group":
165: 		$groupdata=$NATS->GetGroup($_REQUEST['param'][$a]);
166: 		if ($groupdata) // got a valid response
167: 			{
168: 			if ($mode=="js")
169: 				{
170: 				lo($dataid."[".$a."]=new Array();");
171: 				}
172: 			else if ($mode=="xml") lo("<group groupid=\"".$groupdata['groupid']."\" query=\"".$a."\">");
173: 			$ctr=0;
174: 			foreach($groupdata as $key => $val)
175: 				{
176: 				if (!is_numeric($key)) // pesky double-arrays avoided
177: 					{
178: 					if ($mode=="xml") lo(" <".$key.">".$val."</".$key.">");
179: 					else if ($mode=="js")
180: 						{
181: 						lo($dataid."[".$a."][".$ctr."]=new Array;");
182: 						lo($dataid."[".$a."][".$ctr."][0]='".$key."';");
183: 						lo($dataid."[".$a."][".$ctr."][1]='".$val."';");
184: 						}
185: 					$ctr++;
186: 					}
187: 				}
188: 			if ($mode=="xml") lo("</group>");
189: 			}
190: 		break;
191: 		
192: 		
193: 		case "test":
194: 		$testdata=$NATS->GetTest($_REQUEST['param'][$a],true);
195: 		if ($testdata) // got a valid response
196: 			{
197: 			
198: 			if ( (isset($_REQUEST['param1'][$a])) && (isset($_REQUEST['param2'][$a])) )
199: 				{ // get data
200: 				$testdata['period.startx']=0;
201: 				$testdata['period.finishx']=0;
202: 				$testdata['period.tested']=0;
203: 				$testdata['period.passed']=0;
204: 				$testdata['period.warning']=0;
205: 				$testdata['period.failed']=0;
206: 				$testdata['period.untested']=0;
207: 				$testdata['period.average']=0;
208: 				
209: 				if (($testdata['testrecord']==1)||($testdata['testtype']=="ICMP"))
210: 					{
211: 					$sx=smartx($_REQUEST['param1'][$a]);
212: 					$fx=smartx($_REQUEST['param2'][$a]);
213: 					$testdata['period.startx']=$sx;
214: 					$testdata['period.finishx']=$fx;
215: 					
216: 					$q="SELECT alertlevel,COUNT(recordid) AS counter FROM fnrecord WHERE testid=\"".ss($testdata['testid'])."\" AND ";
217: 					$q.="recordx>=".ss($sx)." AND recordx<=".ss($fx)." GROUP BY alertlevel";
218: 					//echo $q;
219: 					$r=$NATS->DB->Query($q);
220: 					while ($row=$NATS->DB->Fetch_Array($r))
221: 						{
222: 						switch ($row['alertlevel'])
223: 							{
224: 							case -1: $testdata['period.untested']+=$row['counter'];
225: 								break;
226: 							case 0: $testdata['period.passed']+=$row['counter'];
227: 								break;
228: 							case 1: $testdata['period.warning']+=$row['counter'];
229: 								break;
230: 							case 2: $testdata['period.failed']+=$row['counter'];
231: 								break;
232: 							}
233: 						$testdata['period.tested']+=$row['counter'];
234: 						}
235: 					$NATS->DB->Free($r);
236: 					
237: 					$q="SELECT AVG(testvalue) FROM fnrecord WHERE testid=\"".ss($testdata['testid'])."\" AND ";
238: 					$q.="recordx>=".ss($sx)." AND recordx<=".ss($fx); //." AND alertlevel IN (0,1)"; // warnings and passes only
239: 					
240: 					$r=$NATS->DB->Query($q);
241: 					
242: 					if ($row=$NATS->DB->Fetch_Array($r))
243: 						{
244: 						$testdata['period.average']=round($row['AVG(testvalue)'],4);
245: 						}
246: 						
247: 					$NATS->DB->Free($r);
248: 					
249: 					}
250: 				}
251: 				
252: 				
253: 			// header
254: 				
255: 			if ($mode=="js")
256: 				{
257: 				lo($dataid."[".$a."]=new Array();");
258: 				lo($dataid."[".$a."][0]=new Array();"); // Keys
259: 				lo($dataid."[".$a."][1]=new Array();"); // Values
260: 				}
261: 			else if ($mode=="xml") lo("<test testid=\"".$testdata['testid']."\" nodeid=\"".$testdata['nodeid']."\" query=\"".$a."\">");
262: 			$ctr=0;
263: 			foreach($testdata as $key => $val)
264: 				{
265: 				if (!is_numeric($key)) // pesky double-arrays avoided
266: 					{
267: 					if ($mode=="xml") lo(" <".$key.">".$val."</".$key.">");
268: 					else if ($mode=="js")
269: 						{
270: 						lo($dataid."[".$a."][0][".$ctr."]='".$key."';");
271: 						lo($dataid."[".$a."][1][".$ctr."]='".$val."';");
272: 						}
273: 					$ctr++;
274: 					}
275: 				}
276: 			if ($mode=="xml") lo("</test>");
277: 			}
278: 		break;
279: 		
280: 		case "alerts":
281: 		$alerts=$NATS->GetAlerts();
282: 		
283: 		$count=count($alerts);
284: 		if ($alerts===false) $count=0; // as showing a 1 in count otherwise
285: 		if ($mode=="xml") lo("<alerts count=\"".$count."\" query=\"".$a."\">");
286: 		else if ($mode=="js") lo($dataid."[".$a."]=new Array();");
287: 		
288: 		if ($alerts) // some were returned
289: 			{
290: 			// nodeid alertlevel	
291: 			for ($alctr=0; $alctr<$count; $alctr++)
292: 				{
293: 				if ($mode=="xml") lo(" <node nodeid=\"".$alerts[$alctr]['nodeid']."\" alertlevel=\"".$alerts[$alctr]['alertlevel']."\">".$alerts[$alctr]['nodeid']."</node>");
294: 				else if ($mode=="js") lo($dataid."[".$a."][".$alctr."]='".$alerts[$alctr]['nodeid']."';");
295: 				}
296: 			}		
297: 			
298: 		if ($mode=="xml") lo("</alerts>");
299: 			
300: 		break;
301: 		
302: 		
303: 		case "testdata":
304: 		// param = testid
305: 		// param1 = startx
306: 		// param2 = finishx
307: 		
308: 		$q="SELECT recordx,testvalue,alertlevel FROM fnrecord WHERE testid=\"".ss($_REQUEST['param'][$a])."\" AND ";
309: 		$sx=smartx($_REQUEST['param1'][$a]);
310: 		$fx=smartx($_REQUEST['param2'][$a]);
311: 		$q.="recordx>=".ss($sx)." AND recordx<=".ss($fx)." ORDER BY recordx ASC";
312: 		
313: 		$r=$NATS->DB->Query($q);
314: 		$count=$NATS->DB->Num_Rows($r);
315: 		
316: 		if ($mode=="xml") lo("<testdata testid=\"".$_REQUEST['param'][$a]."\" counter=\"".$count."\" query=\"".$a."\">");
317: 		else if ($mode=="js")
318: 			{
319: 			lo($dataid."[".$a."]=new Array();");
320: 			}
321: 			
322: 		$ctr=0;
323: 		while ($row=$NATS->DB->Fetch_Array($r))
324: 			{
325: 			if ($mode=="xml")
326: 				{
327: 				lo(" <record recordx=\"".$row['recordx']."\" alertlevel=\"".$row['alertlevel']."\">".$row['testvalue']."</record>");
328: 				}
329: 			else
330: 				{
331: 				lo($dataid."[".$a."][".$ctr."]=new Array();");
332: 				lo($dataid."[".$a."][".$ctr."][0]=".$row['recordx'].";");
333: 				lo($dataid."[".$a."][".$ctr."][1]=".$row['testvalue'].";");
334: 				lo($dataid."[".$a."][".$ctr."][2]=".$row['alertlevel'].";");
335: 				}
336: 			$ctr++;
337: 			}
338: 		$NATS->DB->Free($r);
339: 		
340: 		if ($mode=="xml") lo("</testdata>");
341: 		
342: 		break;
343: 		
344: 		}
345: 	}
346: 	
347: // Footer and Finish
348: 
349: if ($mode=="xml") lo("</freenats-data>");
350: else if ($mode=="js")
351: 	{
352: 	if(isset($_REQUEST['callback']))
353: 		{
354: 		lo($_REQUEST['callback']."(".$dataid.");");
355: 		}
356: 	}
357: 	
358: ?>