' . $item . ''; } return $result; } $days=range(1,31); $from_d_dropdown_options=dropdown_options($days,$from_d); $until_d_dropdown_options=dropdown_options($days,$until_d); $months=array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); $from_m_dropdown_options=dropdown_options($months,$from_m); $until_m_dropdown_options=dropdown_options($months,$until_m); // only propose years ranging from now + 3 full years back $this_year=date('Y'); $years=range($this_year-3,$this_year); $from_y_dropdown_options=dropdown_options($years,$from_y); $until_y_dropdown_options=dropdown_options($years,$until_y); $event_form = <<< EOF
 Events:
 Persons:
 Nodes:
 Sites:
 Slices:
FROM (inclusive) UNTIL (inclusive)
EOF; //////////////////////////////////////////////////////////// dates function parse_date ($day,$month,$year) { // if everything empty -> unspecified date, return 0 if ( empty($day) && empty($month) && empty($year)) { return array ("xxx",0); } else { // fill missing fields with current value if (empty($day)) $day=date('d'); if (empty($month)) $month=date('M'); if (empty($year)) $year=date('Y'); $date=sprintf("%s %s %s",$day,$month,$year); $time=strtotime($date); return array($date,$time); } } function parse_dates () { list($from_date,$from_time) = parse_date($_GET['from_d'],$_GET['from_m'],$_GET['from_y']); list($until_date,$until_time) = parse_date($_GET['until_d'],$_GET['until_m'],$_GET['until_y']); return array($from_date,$from_time,$until_date,$until_time); } function my_is_int ($x) { return (is_numeric($x) ? intval($x) == $x : false); } //////////////////////////////////////////////////////////// layout function truncate ($text,$numb,$etc = "...") { if (strlen($text) > $numb) { $text = substr($text, 0, $numb); $text = $text.$etc; } return $text; } // outline node ids and person ids with a link function e_node ($node_id) { if (! $node_id) return ""; return l_node_t($node_id,$node_id); } function e_person ($person_id) { if (! $person_id) return ""; return l_person_t($person_id,$person_id); } // xxx broken function e_event ($event_id) { if (! $event_id) return ""; return href(l_event("Event","event",$event_id),$event_id); } function e_subject ($type,$id) { $mess=$type . " " . $id; switch ($type) { case 'Node': return l_node_t ($id,$mess); case 'Site': return l_site_t ($id,$mess); case 'Person': return l_person_t ($id,$mess); case 'Slice': return l_slice_t ($id,$mess); case 'Role': case 'Key': case 'PCU': case 'Interface': case 'NodeGroup': case "Address": return "$mess"; default: return "Unknown $type" . "-" . $id; } } // synthesize links to the subject objects from types and ids function e_subjects ($param) { $types=$param['object_types']; $ids=$param['object_ids']; if ( ! $types) return ""; return plc_vertical_table(array_map ("e_subject",$types,$ids)); } function e_issuer ($param) { if ($param['node_id']) return e_subject('Node',$param['node_id']); if ($param['person_id']) return e_subject('Person',$param['person_id']); return '???'; } function e_auth ($event) { if (array_key_exists('auth_type',$event)) return $event['auth_type']; else return ""; } function e_fault ($event) { $f=$event['fault_code']; if ($f==0) return "OK"; else return $f; } //////////////////////////////////////////////////////////// // for convenience, add 1 day to the 'until' date as otherwise this corresponds to 0:00 $STEP=24*60*60; if ( ! plc_is_admin()) { plc_warning("You need admin role to see this page."); } else if (! $_GET['type']) { echo "

Select the events to focus on :

"; // print the selection frame echo $event_form; } else { $tabs=array(); $tabs['Back to events form']=l_events(); plc_tabs($tabs); // handle dates list($from_date,$from_time,$until_date,$until_time) = parse_dates (); // add one day to until_time - otherwise this corresponds to 0:0 $until_time += $STEP; if ( ($from_time != 0) && ($until_time != $STEP) && ($from_time > $until_time) ) { $messages[] = "Warning - is after "; } $filter=array(); // sort events by time is not good enough, let's use event_id $filter['-SORT']='-event_id'; if ($from_time != 0) { $filter[']time']=$from_time; } if ($until_time != $STEP) { $filter['[time']=$until_time; } //////////////////////////////////////// Events $type=$_GET['type']; if ($type == 'Event') { // and the filter applied for fetching events using GetEvent $user_desc=$_GET['event']; if ( ! empty($user_desc)) { // should parse stuff like 45-90,230-3000 - some other day $filter['event_id']=intval($user_desc); } // the filter might be void here - in python we need an empty dict but that's not what we get so if (empty($filter)) { $filter[']time']=0; } $events = $api->GetEvents($filter); $title="Events matching " . ($user_desc ? $user_desc : "everything"); if ($from_time != 0) $title .= " From " . $from_date; if ($until_time != $STEP) $title .= " Until " . $until_date; // see actual display of $title and $events below } else { switch ($type) { case 'Person': $primary_key='person_id'; $string_key='email'; $user_input=$_GET['person']; $method="GetPersons"; $object_type='Person'; break; case 'Node': $primary_key='node_id'; $string_key='hostname'; $user_input=$_GET['node']; $method="GetNodes"; $object_type='Node'; break; case 'Site': $primary_key='site_id'; $string_key='login_base'; $user_input=$_GET['site']; $method="GetSites"; $object_type='Site'; break; case 'Slice': $primary_key='slice_id'; $string_key='name'; $user_input=$_GET['slice']; $method="GetSlices"; $object_type='Slice'; break; } $object_ids=array(); $title=sprintf('Events for type %s:',$object_type); foreach ( split(",",$user_input) as $user_desc) { # numeric if (my_is_int($user_desc)) { $obj_check = call_user_func(array($api,$method),array(intval($user_desc)),array($primary_key)); if (empty ($obj_check)) { $messages[] = "No such " . $primary_key . ": " . $user_desc; } else { $object_ids[] = $obj_check[0][$primary_key]; $title .= $user_desc . ", " ; } } else { # string $new_object_ids=call_user_func (array($api,$method), array($string_key=>$user_desc),array($primary_key,$string_key)); if (empty($new_object_ids)) { $messages[] = "No " . $string_key . " matching " . $user_desc; } else { foreach ($new_object_ids as $new_obj_id) { $object_ids[] = $new_obj_id[$primary_key]; $title .= $new_obj_id[$primary_key] . ", "; } } } } $event_objs = $api->GetEventObjects(array('object_id'=>$object_ids,'object_type'=>$object_type),array('event_id')); // get set of event_ids $event_ids = array_map ( create_function ('$eo','return $eo["event_id"];') , $event_objs); $events = $api->GetEvents (array('event_id'=>$event_ids)); // see actual display of $title and $events below } drupal_set_title ($title); // Show messages if (!empty($messages)) foreach ($messages as $line) drupal_set_message($line); $headers=array("Id"=>"int", "Time"=>"EnglishDateTime", "Method"=>"string", "Message"=>"string", "Subjects"=>"string", "Issuer"=>"string", "Auth"=>"string", "R"=>"string", "D"=>"none", ); $table_options=array('notes'=>array("The R column shows the call result value, a.k.a. fault_code", "Click the button in the D(etails) column to get more details", ), 'max_pages'=>20); plc_table_start("events",$headers,"0r",$table_options); foreach ($events as $event) { // the call button $message = htmlentities($event['message'], ENT_QUOTES); $call = htmlentities($event['call'], ENT_QUOTES); $text = sprintf("message=<<%s>>\\n\\ncall=<<%s>>\\n\\nruntime=<<%f>>\\n",$message,$call,$event['runtime']); $method = "%s',$call,$method); // the message button $trunc_mess=htmlentities(truncate($event['message'],40),ENT_QUOTES); $message="%s',$message,$message); $message=truncate($event['message'],40); plc_table_row_start($event['event_id']); plc_table_cell(e_event($event['event_id'])); plc_table_cell(date('M/d/Y H:i', $event['time'])); plc_table_cell($event['call_name']); plc_table_cell($message); plc_table_cell(e_subjects($event)); plc_table_cell(e_issuer($event)); plc_table_cell(e_auth($event)); plc_table_cell(e_fault($event)); plc_table_cell($details); plc_table_row_end(); } plc_table_end("events"); } // Print footer include 'plc_footer.php'; ?>