protected function _set_field_filter($cond) { if (isset($cond['read']) && isset($this->id)) { $cond['update_timestamp'] = get_timestamp(); } return $cond; }
/** * store nu usefullinks * returns the id */ public function save($type = 1) { $data = array('title' => $this->input->post('title'), 'title_np' => $this->input->post('title_np'), 'link' => $this->input->post('link'), 'description' => $this->input->post('description'), 'description_np' => $this->input->post('description_np'), 'created_by' => $this->ion_auth->get_user()->id, 'date_created' => get_timestamp(), 'date_published' => $this->input->post('date_published'), 'date_removed' => $this->input->post('date_removed'), 'active' => $this->input->post('active'), 'homepage' => $this->input->post('homepage')); /* echo '<pre>'; print_r($data); print_r($_POST); echo '</pre>'; */ //print_r( $this->ion_auth->get_user()->id); //update existing usefullinks if (strlen($this->input->post('id')) > 0) { $data['id'] = $this->input->post('id'); return $this->update($data); //insert new usefullinks } else { //echo '<pre>'; //print_r($data); //echo '</pre>'; if (!$this->db->insert($this->table, $data)) { return $this->db->_error_message(); } return $this->db->insert_id(); } }
/** Inserts a log entry * * @param string $str_LogLevel * @param string $str_Message * @param string $str_UserNick * @param string $str_Hostname * @return boolean */ public function log($str_LogLevel, $str_Message, $str_UserNick = NULL, $str_Hostname = 'localhost') { // Check if proposed log level is acceptable, otherwise log entry is refused if (in_array($str_LogLevel, $this->logLevelsList) && array_search($str_LogLevel, $this->logLevelsList) <= array_search($this->logLevel, $this->logLevelsList)) { $str_Timestamp = get_timestamp(); $arr_InsertValues = array(array($str_Timestamp => 's'), array($str_LogLevel => 's'), array($str_Hostname => 's'), array($str_UserNick => 's'), array($this->entity => 's'), array($this->module => 's'), array($str_Message => 's')); $str_LogPrepared = 'insert into ' . $this->logTableName . ' ( logTimestamp, logLevel, hostname, userNick, entity, module, message ) values ( ?, ?, ?, ?, ?, ?, ? )'; $this->dbHandler->beginTransaction(); $this->dbHandler->executePrepared($str_LogPrepared, $arr_InsertValues); $this->dbHandler->commit(); return TRUE; } else { return FALSE; } }
public function add($user, $file, $action = null) { $entry = get_timestamp() . " | " . basename($file) . " | " . $user . " | " . $action . "\n"; $f = fopen($this->log_file, 'a'); fwrite($f, $entry); fclose($f); }
function get_favicon($url) { if (!$url || !is_url($url)) { return false; } if (!isset($_GET['refresh']) && UNIX_TIME <= get_timestamp($url) + FAVICON_CACHE_TTL) { $cache = get_url_filename($url); return file_get_contents($cache); } else { return update_cache($url); } }
function process_form() { global $vars, $phpcdb, $phpc_cal, $phpcid, $phpc_script; if (!isset($vars['eid']) && !isset($vars['oid'])) { soft_error(__("Cannot create occurrence.")); } $start_ts = get_timestamp("start"); $end_ts = get_timestamp("end"); switch ($vars["time-type"]) { case 'normal': $time_type = 0; break; case 'full': $time_type = 1; break; case 'tba': $time_type = 2; break; default: soft_error(__("Unrecognized Time Type.")); } $duration = $end_ts - $start_ts; if ($duration < 0) { soft_error(__("An event cannot have an end earlier than its start.")); } verify_token(); if (!$phpc_cal->can_write()) { permission_error(__('You do not have permission to write to this calendar.')); } if (!isset($vars['oid'])) { $modify = false; if (!isset($vars["eid"])) { soft_error(__("EID not set.")); } $oid = $phpcdb->create_occurrence($vars["eid"], $time_type, $start_ts, $end_ts); } else { $modify = true; $oid = $vars["oid"]; $phpcdb->modify_occurrence($oid, $time_type, $start_ts, $end_ts); } if ($oid != 0) { if ($modify) { $message = __("Modified occurence: "); } else { $message = __("Created occurence: "); } return message_redirect(tag('', $message, create_event_link($oid, 'display_event', $oid)), "{$phpc_script}?action=display_event&phpcid={$phpcid}&oid={$oid}"); } else { return message_redirect(__('Error submitting occurrence.'), "{$phpc_script}?action=display_month&phpcid={$phpcid}"); } }
function search_results() { global $vars, $phpcdb, $phpcid, $sort_options, $order_options; $searchstring = $vars['searchstring']; if (!empty($vars['search-from-date']) && strlen($vars['search-from-date']) > 0) { $start = get_timestamp('search-from'); } else { $start = false; } if (!empty($vars['search-to-date']) && strlen($vars['search-to-date']) > 0) { $end = get_timestamp('search-to'); } else { $end = false; } // make sure sort is valid $sort = htmlentities($vars['sort']); if (array_search($sort, array_keys($sort_options)) === false) { soft_error(__('Invalid sort option') . ": {$sort}"); } // make sure order is valid $order = htmlentities($vars['order']); if (array_search($order, array_keys($order_options)) === false) { soft_error(__('Invalid order option') . ": {$order}"); } $keywords = explode(" ", $searchstring); $results = $phpcdb->search($phpcid, $keywords, $start, $end, $sort, $order); $tags = array(); foreach ($results as $event) { if (!$event->can_read()) { continue; } $name = $event->get_author(); $subject = $event->get_subject(); $desc = $event->get_desc(); $date = $event->get_date_string(); $time = $event->get_time_string(); $eid = $event->get_eid(); $tags[] = tag('tr', tag('td', tag('strong', create_event_link($subject, 'display_event', $eid))), tag('td', "{$date} {$time}"), tag('td', $desc)); } if (sizeof($tags) == 0) { $html = tag('div', tag('strong', __('No events matched your search criteria.'))); } else { $html = tag('table', attributes('class="phpc-main"'), tag('caption', __('Search Results')), tag('thead', tag('tr', tag('th', __('Subject')), tag('th', __('Date Time')), tag('th', __('Description'))))); foreach ($tags as $tag) { $html->add($tag); } } return $html; }
/** * save nu poll */ public function save() { $data = array('question' => $this->input->post('question'), 'question_np' => $this->input->post('question_np'), 'option1' => $this->input->post('option1'), 'option2' => $this->input->post('option2'), 'option3' => $this->input->post('option3'), 'option4' => $this->input->post('option4'), 'option1_np' => $this->input->post('option1_np'), 'option2_np' => $this->input->post('option2_np'), 'option3_np' => $this->input->post('option3_np'), 'option4_np' => $this->input->post('option4_np'), 'active' => $this->input->post('publish')); //store new poll if ($this->input->post('id') == null) { $data['created_by'] = $this->ion_auth->get_user()->id; $data['date_created'] = get_timestamp(); $this->poll_library->new_poll($data); //update existing poll } else { $data['id'] = $this->input->post('id'); $this->poll_library->update_poll($data); } redirect('admin/poll'); }
public function done_upload($category = '') { if ($this->file_name) { $dest = $this->system_upload_path . '/' . $category . '/'; if (!file_exists($dest)) { mkdir($dest, 0755, true); } $path = $this->upload_path . $this->file_name; $name = md5(get_timestamp() . $this->file_name); $path_parts = pathinfo($path); $name .= '.' . $path_parts['extension']; rename($path, $dest . $name); $this->site_path = $dest . $name; $this->relative_path = $category . '/' . $name; return true; } return false; }
/** * slider form */ public function upload() { if ($this->input->post('upload')) { //upload the file $result = $this->slider_model->upload('slider'); $result['status'] = 'image uploaded'; //get uploaded file's info. $this->data = array_merge($this->data, array('result' => $result)); redirect('admin/slider'); } //generate username, current date if creating nu slider [not editing] $this->data['date_created'] = get_timestamp(); $this->session->set_userdata('date_created', $this->data['date_created']); $this->data['created_by'] = $this->ion_auth->get_user()->username; //display $this->load->view('templates/admin_header'); $this->load->view('admin/index.php'); $this->load->view('admin/upload_slider.php', $this->data); $this->load->view('templates/admin_footer'); }
function datediff($interval, $date1, $date2) { return datediff_timestamp($interval, get_timestamp($date1), get_timestamp($date2)); }
/** * organizations form */ public function create() { $title_dropdown = $this->organizations_model->get(null, null, null, true); if (count($title_dropdown)) { $this->data['title_dropdown'] = ''; $this->data['title_dropdown'] .= '<option></option>'; foreach ($title_dropdown as $key => $val) { $this->data['title_dropdown'] .= '<option>' . $val->title . '</option>'; } } //generate username, current date if creating nu acts [not editing] if (!isset($this->data['date_created'])) { $this->data['date_created'] = get_timestamp(); $this->session->set_userdata('date_created', $this->data['date_created']); } if (!isset($this->data['created_by'])) { $this->data['created_by'] = $this->ion_auth->get_user()->username; } else { //get the username of the person who created the acts // $this->data['created_by'] = $this->ion_auth->get_user($this->data['created_by'])->username; } //print_r($this->data[0]); //array_push($this->data,$this->data[0]); //array_push($this->data,(array)$this->data[0]); //array_merge($this->data[0],$this->data); //echo '<pre>'; //print_r($this->data); //echo '</pre>'; //display $this->load->view('templates/admin_header'); $this->load->view('admin/index.php'); $this->load->view('admin/create_organizations.php', $this->data); $this->load->view('templates/admin_footer'); }
/** * networks form */ public function create() { //print_r($this->data); //generate username, current date if creating nu networks [not editing] if (!isset($this->data['date_created'])) { $this->data['date_created'] = get_timestamp(); $this->session->set_userdata('date_created', $this->data['date_created']); } if (!isset($this->data['created_by'])) { $this->data['created_by'] = $this->ion_auth->get_user()->username; // }else{ // // //get the username of the person who created the networks // $this->data['created_by'] = $this->ion_auth->get_user($this->data['created_by'])->username; } //print_r($this->data[0]); //array_push($this->data,$this->data[0]); //array_push($this->data,(array)$this->data[0]); //array_merge($this->data[0],$this->data); //echo '<pre>'; //print_r($this->data); //echo '</pre>'; //display $this->load->view('templates/admin_header'); $this->load->view('admin/index.php'); $this->load->view('admin/create_networks.php', $this->data); $this->load->view('templates/admin_footer'); }
function process_form() { global $vars, $phpcdb, $phpc_cal, $phpcid, $phpc_script, $phpc_user; // When modifying events, this is the value of the checkbox that // determines if the date should change $modify_occur = !isset($vars['eid']) || !empty($vars['phpc-modify']); if ($modify_occur) { $start_ts = get_timestamp("start"); $end_ts = get_timestamp("end"); switch ($vars["time-type"]) { case 'normal': $time_type = 0; break; case 'full': $time_type = 1; break; case 'tba': $time_type = 2; break; default: soft_error(__("Unrecognized Time Type.")); } $duration = $end_ts - $start_ts; if ($duration < 0) { message(__("An event cannot have an end earlier than its start.")); return display_form(); } } verify_token(); if (0) { permission_error(__('You do not have permission to write to this calendar.')); } if ($phpc_cal->can_create_readonly() && !empty($vars['readonly'])) { $readonly = true; } else { $readonly = false; } $catid = empty($vars['catid']) ? false : $vars['catid']; if (!isset($vars['eid'])) { $modify = false; $eid = $phpcdb->create_event($phpcid, $phpc_user->get_uid(), $vars["subject"], $vars["description"], $readonly, $catid); } else { $modify = true; $eid = $vars['eid']; $phpcdb->modify_event($eid, $vars['subject'], $vars['description'], $readonly, $catid); if ($modify_occur) { $phpcdb->delete_occurrences($eid); } } if ($modify_occur) { $oid = $phpcdb->create_occurrence($eid, $time_type, $start_ts, $end_ts); $occurrences = 1; switch ($vars["repeats"]) { case "never": break; case 'daily': if (!isset($vars["every-day"])) { soft_error(__("Required field \"every-day\" is not set.")); } $ndays = $vars["every-day"]; if ($ndays < 1) { soft_error(__("every-day must be greater than 1")); } $daily_until = get_timestamp("daily-until"); while ($occurrences <= 730) { $start_ts = add_days($start_ts, $ndays); $end_ts = add_days($end_ts, $ndays); if (days_between($start_ts, $daily_until) < 0) { break; } $phpcdb->create_occurrence($eid, $time_type, $start_ts, $end_ts); $occurrences++; } break; case 'weekly': if (!isset($vars["every-week"])) { soft_error(__("Required field \"every-week\" is not set.")); } if ($vars["every-week"] < 1) { soft_error(__("every-week must be greater than 1")); } $ndays = $vars["every-week"] * 7; $weekly_until = get_timestamp("weekly-until"); while ($occurrences <= 730) { $start_ts = add_days($start_ts, $ndays); $end_ts = add_days($end_ts, $ndays); if (days_between($start_ts, $weekly_until) < 0) { break; } $phpcdb->create_occurrence($eid, $time_type, $start_ts, $end_ts); $occurrences++; } break; case 'monthly': if (!isset($vars["every-month"])) { soft_error(__("Required field \"every-month\" is not set.")); } if ($vars["every-month"] < 1) { soft_error(__("every-month must be greater than 1")); } $nmonths = $vars["every-month"]; $monthly_until = get_timestamp("monthly-until"); while ($occurrences <= 730) { $start_ts = add_months($start_ts, $nmonths); $end_ts = add_months($end_ts, $nmonths); if (days_between($start_ts, $monthly_until) < 0) { break; } $phpcdb->create_occurrence($eid, $time_type, $start_ts, $end_ts); $occurrences++; } break; case 'yearly': if (!isset($vars["every-year"])) { soft_error(__("Required field \"every-year\" is not set.")); } if ($vars["every-year"] < 1) { soft_error(__("every-month must be greater than 1")); } $nyears = $vars["every-year"]; $yearly_until = get_timestamp("yearly-until"); while ($occurrences <= 730) { $start_ts = add_years($start_ts, $nyears); $end_ts = add_years($end_ts, $nyears); if (days_between($start_ts, $yearly_until) < 0) { break; } $phpcdb->create_occurrence($eid, $time_type, $start_ts, $end_ts); $occurrences++; } break; default: soft_error(__("Invalid event type.")); } } if ($eid != 0) { if ($modify) { $message = __("Modified event: "); } else { $message = __("Created event: "); } /* before return message_redirect(tag($eid, $message, create_event_link('', 'display_event', $eid)), */ return message_redirect(tag('', $message, create_event_link('', 'display_event', '')), "{$phpc_script}?action=display_event&phpcid={$phpcid}&oid={$oid}"); /* <-- before last paremeter was &eid=$eid instead of &oid=$oid */ } else { return message_redirect(__('Error submitting event.'), "{$phpc_script}?action=display_month&phpcid={$phpcid}"); } }
/** * pages form */ public function create() { //generate WYSIWYG editor $this->_ckeditor_conf(); $this->data['generated_editor'] = display_ckeditor($this->data['ckeditor']); $this->data['generated_editor2'] = display_ckeditor($this->data['ckeditor2']); //generate username, current date if creating nu pages [not editing] if (!isset($this->data['date_created'])) { $this->data['date_created'] = get_timestamp(); $this->session->set_userdata('date_created', $this->data['date_created']); } if (!isset($this->data['created_by'])) { $this->data['created_by'] = $this->ion_auth->get_user()->username; } else { //get the username of the person who created the pages // $this->data['created_by'] = $this->ion_auth->get_user($this->data['created_by'])->username; } if (!isset($this->data['output'])) { $this->data = array_merge($this->data, array('output' => '', 'js_files' => array(), 'css_files' => array())); } //array_push($this->data,$this->data[0]); //array_push($this->data,(array)$this->data[0]); //array_merge($this->data[0],$this->data); //echo '<pre>'; //print_r($this->data); //echo '</pre>'; //display $this->load->view('templates/admin_header'); $this->load->view('admin/index.php'); $this->load->view('admin/create_pages.php', $this->data); $this->load->view('templates/admin_footer'); }
/** * store vote count * * @param int user_id * @param int poll_id * @param int answer_id * @returns boolean */ public function vote($user_id, $answer_id) { //get the id of the active poll $poll = $this->ci->db->get($this->table, array('active', 1))->result(); //store user id & timestamp for historical purposes $this->ci->db->insert($this->history, array('question_id' => $poll[0]->id, 'user_id' => $user_id, 'date_submitted' => get_timestamp())); $data = array('count_option' . $answer_id => 'count_option' . $answer_id + 1); $this->ci->db->where('id', $poll[0]->id); $this->ci->db->update($this->table, $data); return true; }
function save_departure_details() { static $external_data = false; global $post; if (empty($external_data)) { $external_data = array('departure_blogtrip_hashtag' => 'departure_blogtrip_hashtag', 'departure_destination' => 'departure_destination', 'departure_impression' => 'departure_impression', 'departure_date_start' => 'departure_date_start', 'departure_date_end' => 'departure_date_end', 'departure_people_reach' => 'departure_people_reach', 'departure_tweets_count' => 'departure_tweets_count'); } $external_data_hidden = array('departure_destination' => array('_g_lat' => '1', '_g_long' => '2'), 'departure_blogtrip_hashtag' => array('departure_tweets_cache_data' => '', '_departure_tweet_since_id' => 0)); $hidden_fields = array('_departure_tweet_image_cache' => ''); if (is_object($post) && 'departures' == $post->post_type) { // global $wp_taxonomies; register_taxonomy_for_object_type("content_type", "departures"); $terms = get_terms("content_type", array("hide_empty" => false, "slug" => "departures")); wp_set_post_terms($post->ID, $terms[0]->term_id, 'content_type', false); if (isset($_POST['dd_y']) && isset($_POST['dd_m']) && isset($_POST['dd_d'])) { $_POST['departure_date_start'] = get_timestamp($_POST['dd_y'], $_POST['dd_m'], $_POST['dd_d']); unset($_POST['dd_y'], $_POST['dd_m'], $_POST['dd_d']); } if (isset($_POST['rd_y']) && isset($_POST['rd_m']) && isset($_POST['rd_d'])) { $_POST['departure_date_end'] = get_timestamp($_POST['rd_y'], $_POST['rd_m'], $_POST['rd_d']); unset($_POST['rd_y'], $_POST['rd_m'], $_POST['rd_d']); } foreach ($external_data as $metadata => $postkey) { $metadata_post = get_post_meta($post->ID, $metadata); if (isset($_POST[$postkey])) { if (empty($metadata_post)) { // create add_post_meta($post->ID, $metadata, $_POST[$postkey]); if (isset($external_data_hidden[$postkey])) { if ('departure_destination' == $postkey) { // get geocodes: lat and long list($external_data_hidden[$postkey]['_g_lat'], $external_data_hidden[$postkey]['_g_long']) = departure_gmap_geocode($_POST[$postkey]); } // update hidden data foreach ($external_data_hidden[$postkey] as $hiddenkey => $hiddenvalue) { $metadata_post = get_post_meta($post->ID, $hiddenkey); if (empty($metadata_post)) { // create add_post_meta($post->ID, $hiddenkey, $hiddenvalue); } else { // unset update_post_meta($post->ID, $hiddenkey, $hiddenvalue); } } } } else { if ($metadata_post != $_POST[$postkey]) { // update update_post_meta($post->ID, $metadata, $_POST[$postkey]); if (isset($external_data_hidden[$postkey])) { if ('departure_destination' == $postkey) { // get geocodes: lat and long list($external_data_hidden[$postkey]['_g_lat'], $external_data_hidden[$postkey]['_g_long']) = departure_gmap_geocode($_POST[$postkey]); } // update hidden data foreach ($external_data_hidden[$postkey] as $hiddenkey => $hiddenvalue) { $metadata_post = get_post_meta($post->ID, $hiddenkey); if (empty($metadata_post)) { // create add_post_meta($post->ID, $hiddenkey, $hiddenvalue); } else { // unset update_post_meta($post->ID, $hiddenkey, $hiddenvalue); } } } } } } } // add hiddens values foreach ($hidden_fields as $hiddens => $default) { $metadata_hiddens = get_post_meta($post->ID, $hiddens); if (empty($metadata_hiddens) && $metadata_hiddens != $default) { add_post_meta($post->ID, $hiddens, $default); } } } }
//functions from Cosm include 'PachubeAPI.php'; //self-defined functions to get the values include 'cosm_id_und_werte_f.php'; $pachube = new PachubeAPI("QgvMiPLj6wDkY3k2JSPpD3-rMAuSAKxLbVlLMVhxTURMOD0g"); //$alle contains all meta-information about all feeds with the tag 'munster' (ID,Title, see http://cosm.com/docs/v2/feed/list.html for further information) . $alle = $pachube->getFeedsList("json", 0, 100000, "summary", "munster", "munster"); //array: contains all IDs with the tag 'munster'. $ids = get_ids($alle); //echo count($ids); //array: contains the values for every ID in JSON format. $json = get_json($ids); //The following two arrays contain the coordinates. The values below are self-explaining. $lat = get_lat($json); $lon = get_lon($json); $timestamp = get_timestamp($json); $NO2 = get_NO2($json); $CO = get_CO($json); $O3 = get_O3($json); $names = get_Name($json); /* for($i=0;$i<count($ids);$i++){ echo $ids[$i]."</br>"; echo $temperature[$i]."T"."</br>"; echo $humidity[$i]."H"."</br>"; } for($i=0;$i<count($ids);$i++){ echo $ids[$i]."</br>"; echo $temperature[$i]."T"."</br>"; echo $humidity[$i]."H"."</br>"; }
protected function _pre_update($data) { //檢查權限 $this->auth->is_admin(); if (count($data) == 0) { return $data; } //檢查note_index,加入斷詞 if (isset($data['note']) && isset($this->modified_fields['note']) && $this->modified_fields['note'] == TRUE) { // 2010.11.5 因為斷詞器即時運作會影響效能,所以先關掉 // 未來改用非同步的方式來斷詞吧 /* if (is_null($data['note']) == FALSE) { $this->_load_segmentor(); $note = $data['note']; //$note = urlencode($note); //$note = strip_tags($note); //$note = addslashes($note); //$note = trim($note); $data['note_index'] = $this->segmentor->text_to_index($note); $this->modified_fields['note_index'] = TRUE; } else { $data['note_index'] = NULL; $this->modified_fields['note_index'] = TRUE; } */ } else { if (array_key_exists('note', $data) && is_null($data['note'])) { $data['note_index'] = NULL; //$data['note'] = NULL; //unset($data['note_index']); } } if (FALSE === isset($data['annotation_type_id'])) { $data['annotation_type_id'] = 1; } if (isset($this->id)) { $data['update_timestamp'] = get_timestamp(); } return $data; }
function get_week_number($start_date) { # Gets the week number of year $timestamp = get_timestamp($start_date); $week_number = date("W", $timestamp); return $week_number; }
public function create_type() { //generate WYSIWYG editor $this->_ckeditor_conf2(); $this->data['generated_editor'] = display_ckeditor($this->data['ckeditor']); $this->data['generated_editor2'] = display_ckeditor($this->data['ckeditor2']); //generate username, current date if creating nu notices [not editing] if (!isset($this->data['date_created'])) { $this->data['date_created'] = get_timestamp(); $this->session->set_userdata('date_created', $this->data['date_created']); } if (!isset($this->data['created_by'])) { $this->data['created_by'] = $this->ion_auth->get_user()->username; } else { //get the username of the person who created the notices // $this->data['created_by'] = $this->ion_auth->get_user($this->data['created_by'])->username; } //display $this->load->view('templates/admin_header'); $this->load->view('admin/index.php'); $this->load->view('admin/create_faqs_type.php', $this->data); $this->load->view('templates/admin_footer'); }
function process_xhprof_target($xhprof_target_dir, $logger) { $tmp_file = $_FILES['uploadedfile']['tmp_name']; $source_ip = getRealIpAddr(); $uploaded_file_name = basename($_FILES['uploadedfile']['name']); if (isset($_GET['shadow'])) { // rename <timestamp>.tar.bz__<ip> to <timestamp>.tar.bz__ $uploaded_file_name = str_replace("__{$source_ip}", "", $uploaded_file_name); } $timestamp = get_timestamp($uploaded_file_name, false); // $target_dir = create_directory($xhprof_target_dir, $timestamp); // if ($target_dir === null) { // $logger->log("uploader","Directory is not created",Logger::CRIT); // header("HTTP/1.1 500 Server error"); // echo "Could not create directory $xhprof_target_dir\n"; // return; // } $time_slot = (int) ($timestamp / (30 * 60)); $target_dir = sprintf($xhprof_target_dir, (string) $time_slot); $target_file = "{$target_dir}/{$uploaded_file_name}__{$source_ip}"; if (move_uploaded_file($tmp_file, $target_file)) { $logger->log("uploader", $target_file . " has been uploaded", Logger::INFO); echo "SUCCESS: {$target_file} has been uploaded<br></br>\n"; // // Write the uploaded file name to .profiles for reference to what all files has been uploaded // This will be used while processing. // file_put_contents("{$target_dir}/.profiles", "{$uploaded_file_name}__{$source_ip},", FILE_APPEND | LOCK_EX); // functions file tag is inserted in-cron touch("{$target_dir}/.slowpages", time()); touch("{$target_dir}/.apache_stats", time()); } else { $logger->log("uploader", "could not move " . $tmp_file . " to " . $target_file, Logger::ERR); $target_file = null; header("HTTP/1.1 500 Server error"); echo "FAILED: could not move {$tmp_file} to {$target_file}<br></br>\n"; } return $target_file; }
function index() { $issue = NULL; $browser = NULL; $imageData = NULL; //$receiver_email = "*****@*****.**"; $receiver_email = $this->config->item("feedback.receiver_email"); if (FALSE === isset($_POST) || FALSE === isset($_POST["data"])) { //return; } else { // 接收資料 $feedback_data = json_decode($_POST["data"]); $issue = $feedback_data[0]->Issue; $browser = $feedback_data[0]->browser; if ($feedback_data[0]->receiver_email !== NULL) { $receiver_email = $feedback_data[0]->receiver_email; } $imageData = $feedback_data[1]; } if (is_array($receiver_email)) { $receiver_email = implode(",", $receiver_email); } /** * 設定寄送訊息 */ $this->email->to($receiver_email); /** * 設定額外訊息 */ // Feedback header //$feedback_header = "KALS feedback report"; $feedback_header = $this->lang->line("feedback.heading"); $message_list[] = $feedback_header . "\n============================="; // Issue //$issue_header = "ISSUE"; $issue_header = $this->lang->line("feedback.issue"); $message_list[] = $issue_header . ": \n\n" . $issue . "\n"; //$additional_header = "Additional Information"; $additional_header = $this->lang->line("feedback.additional_information"); $message_list[] = $additional_header . "\n-----------------------------"; // ============================= // ----------------------------- // Time //$message_list[] = "Time: " . get_timestamp(); $message_list[] = $this->lang->line("feedback.report_timestamp") . ": " . get_timestamp(); // KALS Sever //$message_list[] = "KALS SERVER URL: " . get_kals_base_url(); $message_list[] = $this->lang->line("feedback.kals_server_url") . ": " . get_kals_base_url(); // URL //$message_list[] = "Referer URL: " . $this->url; $message_list[] = $this->lang->line("feedback.referer_url") . ": " . $this->url; $message_list[] = $this->lang->line("feedback.browser") . ": " . $browser; // Domain $domain_id = NULL; $domain = get_context_domain(); if (isset($domain)) { $domain_id = $domain->get_id(); } //$message_list[] = "Domain ID: " .$domain_id; $message_list[] = $this->lang->line("feedback.domain_id") . ": " . $domain_id; // Webpage $webpage_id = NULL; $webpage = get_context_webpage(); if (isset($webpage)) { $webpage_id = $webpage->get_id(); } //$message_list[] = "Webpage ID: " .$webpage_id; $message_list[] = $this->lang->line("feedback.webpage_id") . ": " . $webpage_id; // User $user_name = NULL; $user_id = NULL; $user_email = NULL; $user = get_context_user(); if (isset($user)) { $user_id = $user->get_id(); $user_name = $user->get_name(); $user_email = $user->get_email(); } //$message_list[] = "User ID: " .$user_id; $message_list[] = $this->lang->line("feedback.user_id") . ": " . $user_id; //$message_list[] = "User Name: " .$user_name; $message_list[] = $this->lang->line("feedback.user_name") . ": " . $user_name; //$message_list[] = "User E-Mail: " .$user_email; $message_list[] = $this->lang->line("feedback.user_email") . ": " . $user_email; $message = implode("\n", $message_list); $this->email->message($message); echo $message; /** * 處理郵件標頭 */ //$subject = "KALS Feedback Report"; $subject = $this->lang->line("feedback.heading"); if (isset($issue)) { $abstract_max_length = 15; $issue_text = strip_tags($issue); $issue_abstract = substr($issue_text, 0, $abstract_max_length); if (strlen($issue_text) > $abstract_max_length) { $issue_abstract = $issue_abstract . "..."; } //$subject = $subject . " by " . $user_name . "(" . $user_id . ")"; $subject = $subject . ": " . $issue_abstract; } $this->email->subject($subject); //$from_email = "*****@*****.**"; $from_email = $this->config->item("feedback.default_sender_email"); //$from_name = "Pudding Chen"; $from_name = $this->config->item("feedback.default_sender_name"); if (isset($user)) { $from_email = $user_email; $from_name = $user_name; } $this->email->from($from_email, $from_name); /** * 處理附件 */ if (FALSE === is_null($imageData)) { //$parts = explode(',', $imageData); //$encodedData = str_replace(' ','+',$parts[1]); //$data = base64_decode($encodedData); //$data = $imageData; //$png = "data:image/png;base64,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tggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwQIrL1pKgqKAAIIIIAAAggggAACCIxLgMA6rvamtggggAACCCCAAAIIIIBAbwSW7J786U1pKSgCCCCAAAIIIIAAAgjULrBk8qf2g3JABGoQILDWgMghEEAAAQQQQAABBBDoswCBtc+tN+yyE1iH3b7UDgEEEEAAAQQQQACBqACBNUrEBnMSILDOCZ7TIoAAAggggAACCCDQFQECa1dagnK4AgRW+gQCCCCAAAIIIIAAAiMXILCOvAN0uPoE1g43DkVDAAEEEEAAAQQQQKANAQJrG8qco4wAgbWMGvsggAACCCCAAAIIIDAgAQLrgBpzYFUhsA6sQakOAggggAACCCCAAAKpAgTWVDG2b0uAwNqWNOdBAAEEEEAAAQQQQKCjAgTWjjYMxcoIrHQCBBBAAAEEEEAAAQRGLkBgHXkH6HD1CawdbhyKhgACCCCAAAIIIIBAGwIE1jaUOUcZAQJrGTX2QQABBBBAAAEEEEBgQAIE1gE15sCqQmAdWINSHQQQQAABBBBAAAEEUgUIrKlibN+WAIG1LWnOgwACCCCAAAIIIIBARwUIrB1tGIrFS5foAwgg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"; $png = $imageData; $png = substr($png, strlen("data:image/png;base64,")); $png = base64_decode($png); $temp_path = tempnam(sys_get_temp_dir(), 'kals_feedback_') . ".png"; file_put_contents($temp_path, $png); $this->email->attach($temp_path); } /** * 寄出並記錄後續動作 */ if (TRUE) { //if (FALSE) { $this->email->send(); echo $this->email->print_debugger(); $action = 29; kals_log($this->db, $action, $issue); context_complete(); } //file_put_contents("log.js", json_encode($feedback_data[0]->Issue)); if (FALSE === is_null($imageData)) { unlink($temp_path); } }
function evaluate_quiz($acode, $jobid, $newattempt, $blended) { global $USER; global $CFG; mtrace("Evaluation QUIZ Processing..." . "<BR><BR>"); try { print "New Attempt is: " . $newattempt . "<BR/>"; $detected_userid = find_userid($acode, $jobid); if ($detected_userid == null or $detected_userid == '') { throw new EvaluationError(get_string('ErrorUserIDEmpty', 'blended'), EvaluationError::USERID_IS_EMPTY); } $user_reg = blended_get_user($detected_userid, $blended); if ($user_reg == null) { throw new EvaluationError(get_string('ErrorUserNotInCourse', 'blended'), EvaluationError::USER_NOT_IN_THIS_COURSE); } $userid = $user_reg->id; mtrace('Obtained USERID value: ' . $userid . " OK. <BR/>"); $quiz = get_quiz($acode); $attempts = quiz_get_user_attempts($quiz->id, $userid, 'all', true); mtrace("Searching quiz... Success." . "<BR/>"); $uniqueid = get_uniqueid($acode); mtrace('Obtained uniqueid: OK. <BR/>'); $timestamp = get_timestamp($acode); mtrace('Obtained timestamp: OK. <BR/>'); if (!get_record('quiz_attempts', 'uniqueid', $uniqueid)) { $newattempt = true; } else { $newattempt = false; mtrace("User {$userid} had opened this attempt already."); } $attemptnumber = 1; if ($newattempt == false) { mtrace('Obtaining user attempt...<BR/>'); set_attempt_unfinished($uniqueid); $attempt = quiz_get_user_attempt_unfinished($quiz->id, $userid); } elseif ($newattempt == true) { mtrace('Creating new attempt...<BR/>'); $attempt = create_new_attempt($quiz, $attemptnumber, $userid, $acode, $uniqueid, $timestamp); // Save the attempt if (!insert_record('quiz_attempts', $attempt)) { throw new EvaluationError(get_string('ErrorCouldNotCreateAttempt', 'blended'), EvaluationError::CREATE_QUIZ_ATTEMPT_ERROR); } // Actualizamos el estado de las imágenes para indicar que ya está creado un nuevo attempt update_images_status($acode, $jobid); } update_question_attempts($uniqueid); // /* mtrace('<BR>Getting questions and question options... '); $questions = get_questions($attempt, $quiz); if (!get_question_options($questions)) { error('Could not load question options'); } mtrace('Success! <BR>'); // print ("<BR>He obtenido questions: "); //print_object($questions); $lastattemptid = false; // if ($attempt->attempt > 1 and $quiz->attemptonlast and !$attempt->preview) { // Find the previous attempt // if (!$lastattemptid = get_field('quiz_attempts', 'uniqueid', 'quiz', $attempt->quiz, 'userid', $attempt->userid, 'attempt', $attempt->attempt-1)) { // error('Could not find previous attempt to build on'); // } //} //print ('He obtenido lastattemptid'); mtrace('Getting question states... '); if (!($states = get_question_states($questions, $quiz, $attempt, $lastattemptid))) { error('Could not restore question sessions'); } mtrace('Success! <BR>'); mtrace('Getting responses... <BR>'); $responses = get_responses($acode, $jobid, $attempt); //print('Estas son las responses:'); //print_object($responses); //$timestamp=time(); $event = 8; $actions = question_extract_responses($questions, $responses, $event); $questionids = get_questionids($acode); // print $questionids; $questionidarray = explode(',', $questionids); $success = true; mtrace('<BR> Processing responses and saving session... '); foreach ($questionidarray as $i) { if (!isset($actions[$i])) { $actions[$i]->responses = array('' => ''); $actions[$i]->event = QUESTION_EVENTOPEN; } $actions[$i]->timestamp = $timestamp; if (question_process_responses($questions[$i], $states[$i], $actions[$i], $quiz, $attempt)) { save_question_session($questions[$i], $states[$i]); } else { $success = false; } } mtrace('Success! <BR>'); // Set the attempt to be finished $timestamp = time(); //$attempt->timefinish = $timestamp; // Update the quiz attempt and the overall grade for the quiz mtrace('<BR> Finishing the attempt... '); // print_object ($attempt); if (set_field('quiz_attempts', 'timefinish', $timestamp, 'uniqueid', $uniqueid) == false) { throw new EvaluationError('Unable to finish the quiz attempt!', EvaluationError::FINISH_QUIZ_ATTEMPT_ERROR); } mtrace('Success! <BR>'); if ($attempt->attempt > 1 || $attempt->timefinish > 0 and !$attempt->preview) { mtrace('<BR> Saving quiz grade... '); quiz_save_best_grade($quiz, $userid); } mtrace('Success! <BR>'); // */ mtrace("Process Done. <BR><BR>"); mtrace("<center> Your quiz has been succesfully evaluated!! </center>"); } catch (EvaluationError $e) { throw $e; } return; }
/** * 接受建議。接受後回傳變更過後的標註資料 * @param boolean $accept * @return Annotation */ public function set_accept($accept = TRUE) { if ($accept == 'TRUE' or $accept == 'T') { $accept = TRUE; } $annotation = NULL; if ($accept === TRUE) { $this->set_field('accept', 'TRUE'); //刪除原有標註,並且新增標註 $recommend_by = $this->get_recommend_by(); $recommended = $this->get_recommended(); if (isset($recommend_by)) { $recommend_scope = $recommend_by->get_scopes(); $user = $recommended->get_user(); $this->_CI_load('library', 'kals_resource/Annotation', 'annotation'); $annotation = $this->CI->annotation->create_annotation($user, $recommend_scope); //把其他特徵都加進去吧 $annotation->import($recommended); //重新分數計算 $webpage = $this->get_webpage(); $calculator = $webpage->get_score_calculator(); $calculator->setup_annotation_scores($annotation); } else { //$annotation = $this->get_recommended(); $annotation = NULL; } $recommended = $this->get_recommended(); $recommended->delete(); $recommended->update(); } else { $this->set_field('accept', 'FALSE'); $annotation = $this->get_recommended(); } $this->set_field('checked_timestamp', get_timestamp()); $this->update(); $this->delete(); return $annotation; }
private function parse_image($thumb) { $this->dimensions = getimagesize($this->image['tmp_name']); if ($this->dimensions[0] > 5000 || $this->dimensions[1] > 5000) { return false; } $newname = get_timestamp(); $this->newfname = $newname[0] . '.' . $this->extension; $this->tempfile = $this->tempfolder . $this->newfname; $this->newfile = $this->folderpath . $this->newfname; $this->thumbfile = $thumb ? $this->thumbfolder . 't' . $newname[0] . '.' . $this->thumbext : ''; $this->filesize = $this->image['size']; return true; }
iRail is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. iRail is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with iRail. If not, see <http://www.gnu.org/licenses/>. http://blog.irail.be - http://irail.be source available at http://github.com/Tuinslak/iRail */ //this is the entire array of stations in Belgium //set content type in the header to XML header('Content-Type: text/xml'); include "../includes/stationlist.php"; include "../includes/coordinates.php"; //make the damn document ;-) echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; echo "<stations timestamp=\"" . get_timestamp() . "\">"; foreach ($stations as $i => $value) { echo "<station location=\"" . $coordinates[$value] . "\">"; echo $value; echo "</station>"; } echo "</stations>";
/** * contacts form */ public function create() { //print_r($this->data); //generate username, current date if creating nu contacts [not editing] if (!isset($this->data['date_created'])) { $this->data['date_created'] = get_timestamp(); $this->session->set_userdata('date_created', $this->data['date_created']); } if (!isset($this->data['created_by'])) { $this->data['created_by'] = $this->ion_auth->get_user()->username; } $this->data['link'] = explode('/', $this->data['link']); $this->data['link'] = $this->data['link'][1]; //display $this->load->view('templates/admin_header'); $this->load->view('admin/index.php'); $this->load->view('admin/create_contacts.php', $this->data); $this->load->view('templates/admin_footer'); }
clean(null, $dirUserPdf); } // Set name $str_to_replace = array(" ", ":", ".", "&", "/"); //var_dump($value["assets"]); if (preg_match("/ENTITY\\:(\\d+)/", $value["assets"], $fnd)) { $conn = $db->connect(); $e_name = Acl::get_entity_name($conn, $fnd[1]); $assets = "ENTITY: " . $e_name; $db->close($conn); } else { $assets = $value['assets']; } $pdfNameEmail = str_replace($str_to_replace, '_', $value['name_report']) . '_' . str_replace($str_to_replace, '_', $assets); $conn = $db->connect(); $run_at = get_timestamp($conn, $user, gmdate('Y-m-d H:i:s', gmdate('U'))); $user_name = $conn->GetOne("SELECT name FROM users WHERE login='******'"); $db->close(); $subject_email = _("Report") . ": " . $value["schedule_name"] . " " . $value['name_report'] . " " . _("run at") . " " . $run_at; $pdfName = $pdfNameEmail . "_" . time(); $body_email = _("Run as") . ": " . $user_name . "<br />"; $body_email .= _("Run at") . ": " . $run_at . "<br />"; if ($assets == "ALL_ASSETS") { $assets = _("All Assets"); } $body_email .= _("Assets") . ": " . $assets . "<br /><br />"; $body_email .= _("Confidential Information - Do Not Distribute") . "<br />" . _("Copyright (c) AlienVault, LLC. All rights reserved."); $text = _('Save to') . ':'; $to_text = sprintf("\n%-16s", $text); $to_text .= $dirUserPdf . $pdfName . ".pdf\n"; echo $to_text;
function rrdgraph_cmd_add_overlay_events($command, $graph_start, $graph_end, $conf_overlay_events_color_map_file, $conf_overlay_events_shade_alpha, $conf_overlay_events_tick_alpha, $conf_overlay_events_line_type, $conf_graph_colors, $nagios_events) { $debug = FALSE; // In order not to pollute the command line with all the possible VRULEs // we need to find the time range for the graph $graph_end_timestamp = get_timestamp($graph_end); $graph_start_timestamp = get_timestamp($graph_start); if ($graph_start_timestamp == NULL || $graph_end_timestamp == NULL) { error_log("process_over_events: " . "Start/end timestamp(s) are NULL"); return $command; } // Get array of events for time range $events_array = ganglia_events_get($graph_start_timestamp, $graph_end_timestamp); if (empty($events_array)) { return $command; } $event_color_json = file_get_contents($conf_overlay_events_color_map_file); if ($debug) { error_log("{$event_color_json}"); } $event_color_array = json_decode($event_color_json, TRUE); $initial_event_color_count = count($event_color_array); $event_color_map = array(); foreach ($event_color_array as $event_color_entry) { $event_color_map[$event_color_entry['summary']] = $event_color_entry['color']; if ($debug) { error_log("Adding event color to map: " . $event_color_entry['summary'] . ' ' . $event_color_entry['color']); } } // Combine the nagios_events array, if it exists if (count($nagios_events) > 0) { // World's dumbest array merge: foreach ($nagios_events as $ne) { $events_array[] = $ne; } } foreach ($events_array as $key => $row) { $start_time[$key] = $row['start_time']; } // Sort events in reverse chronological order array_multisort($start_time, SORT_DESC, $events_array); // Default to dashed line unless events_line_type is set to solid if ($conf_overlay_events_line_type == "solid") { $overlay_events_line_type = ""; } else { $overlay_events_line_type = ":dashes"; } // Preserve original rrdtool command. That's the one we'll run regex checks // against $original_command = $command; // Loop through all the events $color_count = sizeof($conf_graph_colors); $counter = 0; $legend_items = array(); foreach ($events_array as $id => $event) { $evt_start = $event['start_time']; // Make sure it's a number if (!is_numeric($evt_start)) { continue; } unset($evt_end); if (array_key_exists('end_time', $event) && is_numeric($event['end_time'])) { $evt_end = $event['end_time']; } // If event start is less than start bail out of the loop since // there is nothing more to do since events are sorted in reverse // chronological order and these events are not gonna show up in // the graph $in_graph = $evt_start >= $graph_start_timestamp && $evt_start <= $graph_end_timestamp || isset($evt_end) && $evt_end >= $graph_start_timestamp && $evt_start <= $graph_end_timestamp; if (!$in_graph) { if ($debug) { error_log("process_overlay_events: " . "Event [{$evt_start}] does not overlap with graph " . "[{$graph_start_timestamp}, {$graph_end_timestamp}]"); } continue; } // Compute the part of the event to be displayed $evt_start_in_graph_range = TRUE; if ($evt_start < $graph_start_timestamp) { $evt_start = $graph_start_timestamp; $evt_start_in_graph_range = FALSE; } $evt_end_in_graph_range = TRUE; if (isset($evt_end)) { if ($evt_end > $graph_end_timestamp) { $evt_end = $graph_end_timestamp; $evt_end_in_graph_range = FALSE; } } else { $evt_end_in_graph_range = FALSE; } if (preg_match("/" . $event["host_regex"] . "/", $original_command)) { if ($evt_start >= $graph_start_timestamp) { // Do we have the end timestamp. if (!isset($graph_end_timestamp) || $evt_start < $graph_end_timestamp) { // This is a potential vector since this gets added to the // command line_width TODO: Look over sanitize $summary = isset($event['summary']) ? sanitize($event['summary']) : ""; // We need to keep track of summaries so that if we have identical // summaries e.g. Deploy we can use the same color if (array_key_exists($summary, $event_color_map)) { $color = $event_color_map[$summary]; if ($debug) { error_log("process_overlay_events: " . "Found existing color: {$summary} {$color}"); } // Reset summary to empty string if it is already present in // the legend if (array_key_exists($summary, $legend_items)) { $summary = ""; } else { $legend_items[$summary] = TRUE; } } else { // Haven't seen this summary before. Assign it a color $color_index = count($event_color_map) % $color_count; $color = $conf_graph_colors[$color_index]; $event_color_map[$summary] = $color; $event_color_array[] = array('summary' => $summary, 'color' => $color); if ($debug) { error_log("process_overlay_events: " . "Adding new event color: {$summary} {$color}"); } } if (isset($evt_end)) { // Attempt to draw a shaded area between start and end points. // Force solid line for ranges $overlay_events_line_type = ""; $start_vrule = ''; if ($evt_start_in_graph_range) { $start_vrule = " VRULE:" . $evt_start . "#{$color}" . $conf_overlay_events_tick_alpha . ":\"" . $summary . "\"" . $overlay_events_line_type; } $end_vrule = ''; if ($evt_end_in_graph_range) { $end_vrule = " VRULE:" . $evt_end . "#{$color}" . $conf_overlay_events_tick_alpha . ':""' . $overlay_events_line_type; } // We need a dummpy DEF statement, because RRDtool is too stupid // to plot graphs without a DEF statement. // We can't count on a static name, so we have to "find" one. if (preg_match("/DEF:['\"]?(\\w+)['\"]?=/", $command, $matches)) { // stupid rrdtool limitation. $area_cdef = " CDEF:area_{$counter}={$matches['1']},POP," . "TIME,{$evt_start},GT,1,UNKN,IF,TIME,{$evt_end},LT,1,UNKN,IF,+"; $area_shade = $color . $conf_overlay_events_shade_alpha; $area = " TICK:area_{$counter}#{$area_shade}:1"; if (!$evt_start_in_graph_range) { $area .= ':"' . $summary . '"'; } $command .= "{$area_cdef} {$area} {$start_vrule} {$end_vrule}"; } else { error_log("No DEF statements found in \$command?!"); } } else { $command .= " VRULE:" . $evt_start . "#" . $color . ":\"" . $summary . "\"" . $overlay_events_line_type; } $counter++; } else { if ($debug) { error_log("process_overlay_events: " . "Event start [{$evt_start}] >= graph end " . "[{$graph_end_timestamp}]"); } } } else { if ($debug) { error_log("process_overlay_events: " . "Event start [{$evt_start}] < graph start " . "[{$graph_start_timestamp}]"); } } } else { // error_log("Doesn't match host_regex"); } } // end of foreach ( $events_array ... unset($events_array); if (count($event_color_array) > $initial_event_color_count) { $event_color_json = json_encode($event_color_array); file_put_contents($conf_overlay_events_color_map_file, $event_color_json); } return $command; }