Пример #1
0
 protected function _set_field_filter($cond)
 {
     if (isset($cond['read']) && isset($this->id)) {
         $cond['update_timestamp'] = get_timestamp();
     }
     return $cond;
 }
Пример #2
0
 /**
  * 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();
     }
 }
Пример #3
0
    /** 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;
        }
    }
Пример #4
0
 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);
 }
Пример #5
0
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);
    }
}
Пример #6
0
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}");
    }
}
Пример #7
0
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;
}
Пример #8
0
 /**
  * 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');
 }
Пример #9
0
 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;
 }
Пример #10
0
 /**
  * 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');
 }
Пример #11
0
function datediff($interval, $date1, $date2)
{
    return datediff_timestamp($interval, get_timestamp($date1), get_timestamp($date2));
}
Пример #12
0
 /**
  * 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');
 }
Пример #13
0
 /**
  * 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');
 }
Пример #14
0
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}");
    }
}
Пример #15
0
 /**
  * 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');
 }
Пример #16
0
 /**
  * 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;
 }
Пример #17
0
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);
            }
        }
    }
}
Пример #18
0
//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>";
}
Пример #19
0
 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;
 }
Пример #20
0
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;
}
Пример #21
0
 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');
 }
Пример #22
0
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;
}
Пример #23
0
 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);
     }
 }
Пример #24
0
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;
}
Пример #25
0
 /**
  * 接受建議。接受後回傳變更過後的標註資料
  * @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;
 }
Пример #26
0
 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;
 }
Пример #27
0
   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>";
Пример #28
0
 /**
  * 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');
 }
Пример #29
0
     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;
Пример #30
0
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;
}