Работа с датами. Вперед-назад, проверка ограничений.
[squid-reports.git] / web / api.php
1 <?
2
3   require_once("config.php");
4   
5   header("Access-Control-Allow-Orgin: *");
6   header("Access-Control-Allow-Methods: *");
7   header("Content-Type: application/json");
8
9   $requestUri = explode('/', trim($_SERVER['REQUEST_URI'],'/'));
10   $requestParams = $_REQUEST;
11
12   $method = $_SERVER['REQUEST_METHOD'];  
13
14   function requestStatus($code) {
15     $status = array(
16         200 => 'OK',
17         404 => 'Not Found',
18         405 => 'Method Not Allowed',
19         500 => 'Internal Server Error',
20       );
21     return ($status[$code])?$status[$code]:$status[500];
22   } 
23   
24   function response($data, $status = 500) {
25     header("HTTP/1.1 " . $status . " " . requestStatus($status));
26     print json_encode($data);
27   }
28
29   function connect_db() {
30   
31     global $db,$mysql_host,$mysql_port,$mysql_schema,$mysql_user,$mysql_pwd;
32   
33     if (! ($db = new PDO("mysql:host=$mysql_host;port=$mysql_port;dbname=$mysql_schema",$mysql_user,$mysql_pwd,array( PDO::ATTR_PERSISTENT => false)))) {
34       die($err);
35     }  
36     $db -> exec('SET CHARACTER SET utf8');
37
38     return $db;
39
40   }
41
42   function exec_query($sql) {
43
44     global $db;
45
46     $q = $db -> prepare( $sql );
47     $q -> bindParam(':s',$auth_token,PDO::PARAM_INT);
48     $q -> execute();
49
50     return $q -> fetchall(PDO::FETCH_ASSOC);
51
52   }
53
54   $api = $requestParams["method"];
55
56   $data = Array();
57   $code = 200;
58   switch ($api) {
59     case "get-base-config":
60
61       $data["site-header"] = $site_header;
62       
63       connect_db();   
64       
65       $cats = exec_query("select mnemo,name,description from rep_cat");
66
67       foreach ($cats as $cat => $value) {
68         
69         $cmnemo = $cats[$cat]["mnemo"];
70         $reps = exec_query("select mnemo,name,description,graph_x,graph_y,graph_series from rep where cat_mnemo='$cmnemo'");
71         $cats[$cat]["reps"] = $reps;
72       
73       }
74       
75       $data["cats"] = $cats;
76       $data["templates"] = exec_query("select mnemo,body from web_templates");
77       $data["columns"] = exec_query("select * from column_names");
78       $users = exec_query("select id,username as name,alias from users");
79       $hosts = exec_query("select id,hostname as name,alias from hosts");
80       $data["dictionaries"] = Array( "user_id" => $users, "host_id" => $hosts);
81       $data["online_refresh"] = $online_refresh;
82       $data["online_history"] = $online_history;
83
84       break;
85
86     case "report":
87     
88       $mnemo = $requestParams["mnemo"];
89       
90       connect_db();    
91       
92       $rec = exec_query("select has_total,query from rep where mnemo='$mnemo'")[0];
93       $sql = $rec["query"];
94       $data["has_total"] = $rec["has_total"];
95
96       $filter_str = "";
97       $filter = Array();
98       
99       foreach ($requestParams as $name => $value) {
100       
101         if (($name == "mnemo") || ($name == "method")) { continue; }
102         if ($name == "date_from") { $filter_str = $filter_str." and access_date>='$value'"; }
103         elseif ($name == "date_to") { $filter_str = $filter_str." and access_date<date_add('$value',interval 1 day)"; }
104         else { $filter_str = $filter_str." and $name = '$value'"; $filter[$name] = $value; }
105       }
106
107       if ($filter_str) {
108         $sql = preg_replace('/\$FILTER;/',$filter_str,$sql);
109       }
110
111       if ($filter) {
112         $data["filter"] = $filter;
113       }
114       $result = exec_query($sql);
115       if ($result) {
116         $data["dictionary"] = array_keys($result[0]);
117         $data["data"] = $result;
118       } else {
119         $data["sql"] = $sql;
120       }
121     
122       break;
123
124     case "online":
125     
126       if($squid_passwd != "") { $pwd.="cachemgr:$cachemgr_passwd@"; } else { $pwd = ""; }
127       $url = "http://".$pwd.$squid_host.":".$squid_port."/squid-internal-mgr/active_requests";
128
129       $ch = curl_init($url);
130   
131       $options = array(
132         CURLOPT_RETURNTRANSFER => true,   // return web page
133         CURLOPT_HEADER         => false,  // don't return headers
134         CURLOPT_FOLLOWLOCATION => false,   // follow redirects
135         CURLOPT_MAXREDIRS      => 0,     // stop after 10 redirects
136         CURLOPT_ENCODING       => "",     // handle compressed
137         CURLOPT_USERAGENT      => "web", // name of client
138         CURLOPT_AUTOREFERER    => true,   // set referrer on redirect
139         CURLOPT_CONNECTTIMEOUT => 3,    // time-out on connect
140         CURLOPT_TIMEOUT        => 5,    // time-out on response
141       );
142
143       curl_setopt_array($ch, $options);
144
145       $reply = curl_exec($ch);
146       $retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
147
148       // 400 means not found, 200 means found.
149       curl_close($ch);
150
151       if($retcode == 200) {
152
153         $data["active"] = Array();
154         
155         if(preg_match("/HTTP/1.0 200 OK/",$ptmp)){
156           $code = 500;
157           $data=Array("error" => "No connection to Squid");
158         } else {
159           preg_match_all("/username(.+)/",$reply,$user);
160           preg_match_all("/(peer|remote):(.+)/",$reply,$remote);
161           preg_match_all("/uri(.+)/",$reply,$uri);
162           preg_match_all("/out\.size(.+)/",$reply,$size);
163           preg_match_all("/\((.+)seconds/",$reply,$sec);
164           $sess = Array();
165           for ($i=0; $i< count($user[1]); $i++) {
166             $ip=trim($remote[2][$i]);
167             $reversedParts = explode(':', strrev($ip), 2);
168             $ip = strrev($reversedParts[1]);
169             $port = strrev($reversedParts[0]);
170             if (preg_match('/\[(.*)\]/',$ip,$matches)) {
171               $ip = $matches[1];
172             }
173             $host = gethostbyaddr($ip);
174             if (!$host) { $host = $ip; } 
175             $username=trim($user[1][$i]);
176             $site=trim($uri[1][$i]);
177             $datasize=trim($size[1][$i]);
178             $seconds = trim($sec[1][$i]);
179             $record = Array("_user" => $username, "_ip" => $ip, "_port"=> $port, "host" => $host, "uri" => $site, "bytes" => $datasize, "seconds" => $seconds);
180             $sess[] = $record;
181           }
182           $data["data"] = $sess;
183           $data["dictionary"] = Array("_user","_ip","_port","host","uri","bytes","seconds");
184         } 
185       
186       }
187     
188       break;
189
190     default: 
191       $data["error"] = "Method not found";
192       $data["method"] = $api;
193       $code = 404;
194   }
195   
196   response($data,$code);
197    
198 ?>