# Copyright (c) 2010 Flowerfire, Inc. All Rights Reserved. unreal_media_server = { plugin_version = "2.1" info.1.manufacturer = "Unreal Streaming Technologies" info.1.device = "Unreal Media Server" info.1.version = "5.5" # 2007-12-17 - 1.0 - KBB - Initial creation # 2007-12-18 - 1.1 - KBB - Split User field into user and connection_id. Combine these for session_id. # 2008-01-28 - 1.2 - KBB - Changed a field name, removed connection_id database field, the access count # and the session_users report to make session reporting more clear. Made various changes to make # counts more accurate and meaningful. Because login and logout are both in the log this is trickier # than media server sessioning where each access is on one line with a duration. Currently, because # connection ids recycle pretty rapidly, there is some inaccurate repeat user info. # 2008-01-31 - 1.3 - KBB - Restored Accesses fields and renamed to Views. # 2008-02-01 - 1.3 - KBB - Added user_type field to give an easy way to filter reports. # 2008-02-01 - 2.0 - KBB - Removed session reports for now. Added numeric fields for duration and # concurrent_views. Grouped reports and added a "Maximum concurrent views by Date/Time" report. # 2008-03-03 - 2.0.1 - KBB - Renamed views to accesses and removed unnecessary step in 2.0 change. # The name of the log format log.format.format_label = "Unreal Media Server Log Format" log.miscellaneous.log_data_type = "media_server" log.miscellaneous.log_format_type = "other" # The log is in this format if any of the first ten lines match this regular expression #LogIn User: Anonymous-ID:1234; IP Address: 155.55.55.55; Delivery: TCP Unicast; Time: 16:12:09 29 November 2007; Resource: mediaroot\test.avi log.format.autodetect_regular_expression = '^(LogIn|LogOut) User: [^;]+; ([^:]+: [^;]+; )+Time: [0-9]{2}:[0-9]{2}:[0-9]{2} [0-9 ]?[0-9] [A-Za-z]+ [0-9]{4};' # All log field parsing will be done using the parsing filters log.format.parse_only_with_filters = "true" # # Don't retire the "session_id_counter" # log.format.collected_entry_lifespan = 0 # The format of dates and times in this log log.format.date_format = "auto" log.format.time_format = "auto" # Don't time out session, discard them for being long, or remove reloads # statistics.miscellaneous = { # maximum_session_duration = "0" # session_timeout = "0" # remove_reloads_from_sessions = "false" # } # statistics.miscellaneous # log.field_options = { # # sessions_page_field = "action" # sessions_visitor_id_field = "session_id" # sessions_event_field = "session_events" # # } # log.field_options # Log fields log.fields = { date = "" time = "" action = "" duration = "" concurrent_accesses = "" user = "" user_type = "" connection_id = "" session_id = "" ip_address.type = "host" delivery_protocol = "" bytes_transferred = "" resource = { type = "page" hierarchy_dividers = "\\/?" } # resource } # log.fields # log.filter_initialization = ` #int session_id_counter = 0; #` log.parsing_filters.parse = ` #LogIn User: Anonymous-ID:1234; IP Address: 155.55.55.55; Delivery: TCP Unicast; Time: 16:12:09 29 November 2007; Resource: mediaroot\test.avi #LogOut User: Anonymous-ID:1234; Time: 16:12:13 29 November 2007; KBytes transfered: 577 if (matches_regular_expression(current_log_line(), '^(LogIn|LogOut) (User: ([^;]+);.*)$')) then ( v.action = $1; v.info = $2; v.key = $3; # The mapping in the last parameter apparently happens after the automatic mapping, # and it doesn't seem to be able to handle a field name with a space in it, quoted or not. #collect_listed_fields(v.key, v.info, '; ', ': ', 'kbytes_transfered=bytes_transferred|delivery=delivery_protocol'); collect_listed_fields(v.key, v.info, '; ', ': ', 'Delivery=delivery_protocol'); set_collected_field(v.key, 'bytes_transferred', get_collected_field(v.key, 'kbytes_transfered') * 1024); if (matches_regular_expression(get_collected_field(v.key, 'time'), '^([0-9:]+) ([0-9]{2} [A-Za-z]+ [0-9]{4})')) then ( set_collected_field(v.key, 'time', $1); set_collected_field(v.key, 'date', $2); #set_collected_field(v.key, 'session_id', v.key . '_' . session_id_counter); # v.key = User field set_collected_field(v.key, 'session_id', v.key); if ((matches_regular_expression(v.key, '^([^:]+)-ID:([0-9]+)')) or (matches_regular_expression(v.key, '^([^:]+):([0-9]+)'))) then ( v.user = $1; set_collected_field(v.key, 'connection_id', $2); set_collected_field(v.key, 'user', v.user); if (matches_regular_expression(v.user, '^[aA][nN][oO][nN][yY][mM][oO][uU][sS]$')) then ( set_collected_field(v.key, 'user_type', 'anonymous'); ); else ( set_collected_field(v.key, 'user_type', 'authenticated'); ); ); if (v.action eq 'LogIn') then ( set_collected_field(v.key, 'accesses', 0); set_collected_field(v.key, 'action', 'login'); # set_collected_field(v.key, 'session_events', 1); # Save the time for the duration calculation. set_collected_field(v.key, 'start_time', get_collected_field(v.key, 'date_time')); # Keep track of concurrent accesses (viewing events) v.accesses = get_collected_field('', 'concurrent_accesses'); set_collected_field('', 'concurrent_accesses', v.accesses + 1); set_collected_field(v.key, 'concurrent_accesses', v.accesses + 1); set_collected_field(v.key, 'open', 'yes'); accept_collected_entry(v.key, true); ); else if (v.action eq 'LogOut') then ( set_collected_field(v.key, 'accesses', 1); set_collected_field(v.key, 'action', 'logout'); # set_collected_field(v.key, 'session_events', 1); # Calculate the duration int start_time_epoc = date_time_to_epoc(get_collected_field(v.key, 'start_time')); int end_time_epoc = date_time_to_epoc(get_collected_field(v.key, 'date_time')); set_collected_field(v.key, 'duration', end_time_epoc - start_time_epoc); # Don't decrement if the login did not happen within the log data. if (get_collected_field(v.key, 'open') eq 'yes') then ( set_collected_field('', 'concurrent_accesses', get_collected_field('', 'concurrent_accesses') - 1); ); set_collected_field(v.key, 'concurrent_accesses', get_collected_field('', 'concurrent_accesses')); accept_collected_entry(v.key, false); ); ); ); ` # Database fields database.fields = { date_time.suppress_bottom = "6" day_of_week = "" hour_of_day = "" action = "" user = "" user_type = "" #connection_id = "" #session_id = "" ip_address = "" location = "" delivery_protocol = "" resource = "" file_type = "" } # database.fields # Log Filters log.filters = { # mark_entry = { # label = '$lang_admin.log_filters.mark_entry_label' # comment = '$lang_admin.log_filters.mark_entry_comment' # value = 'accesses = 1;' # } # mark_entry } # log.filters database.numerical_fields = { accesses = { default = true requires_log_field = false } # accesses # session_events = { # default = true # requires_log_field = false # entries_field = true # } # session_events bytes_transferred = { type = "int" integer_bits = 64 display_format_type = "bandwidth" } # bytes_transferred duration = { type = float display_format_type = duration_compact } # duration concurrent_accesses = { default = "true" aggregation_method = "max" } # conncurrent_accesses } # database.numerical_fields create_profile_wizard_options = { # Specify the reports menu manually manual_reports_menu = true # How the reports should be grouped in the report menu report_groups = { overview.type = "overview" date_time_group = { items = { date_time = { label = "$lang_stats.miscellaneous.years_months_days" only_bottom_level_items = false } days = { label = "$lang_stats.miscellaneous.days" database_field_name = "date_time" } day_of_week = "" hour_of_day = "" } } # date_time_group users_group = { items = { user = "" user_type = "" ip_address = "" location = "" } # items } # users_group content_group = { items = { resource = "" file_type = "" delivery_protocol = "" } # items } # content_group accesses_group = { items = { maximum_concurrent_accesses = { database_field_name = "date_time" label = "$lang_stats.field_labels.maximum_concurrent_accesses" #show_header_bar = "true" columns = { 0 = { #data_type = "string" display_format_type = "date_time" field_name = "date_time" #header_label = "{=capitalize(database.fields.date_time.label)=}" main_column = "true" #type = "string" #visible = "true" } # 0 1 = { #data_type = "int" #display_format_type = "integer" field_name = "concurrent_accesses" #header_label = "{=capitalize(database.fields.concurrent_accesses.label)=}" show_bar_column = "true" show_graph = "true" #show_number_column = "true" #show_percent_column = "false" #type = "number" #visible = "true" } # 1 } # columns #disabled = "false" ending_row = "60" graphs = { bar_line_graph = { x_axis_length = "744" y_axis_height = "150" } # bar_line_graph graph_type = "line" } # graphs #omit_parenthesized_items = "true" #omit_table = "false" only_bottom_level_items = "false" show_averages_row = "false" show_header_bar = "false" show_omitted_items_row = "false" show_totals_row = "false" sort_by = "concurrent_accesses" sort_direction = "descending" #starting_row = "1" #type = "table" } # maximum_concurrent_accesses action = "" } # items } # accesses_group log_detail = true single_page_summary = true } # report_groups # final_step = ` # #include "templates.admin.profiles.setup_reports_util"; # #string profile = "profiles." . volatile.new_profile_name; #string reports = profile . ".statistics.reports"; #string menu = profile . ".statistics.reports_menu"; #string summary = profile . ".statistics.reports.single_page_summary.report_elements"; # ## Create the standard reports #add_standard_reports(profile); # ## Remove irrelevant sessions reports #delete_node(reports . ".session_users"); #delete_node(menu . ".sessions_group.items.session_users"); #delete_node(summary . ".session_users"); #delete_node(reports . ".entry_pages"); #delete_node(menu . ".sessions_group.items.entry_pages"); #delete_node(summary . ".entry_pages"); #delete_node(reports . ".exit_pages"); #delete_node(menu . ".sessions_group.items.exit_pages"); #delete_node(summary . ".exit_pages"); #delete_node(reports . ".session_pages"); #delete_node(menu . ".sessions_group.items.session_pages"); #delete_node(summary . ".session_pages"); #delete_node(reports . ".session_page_paths"); #delete_node(menu . ".sessions_group.items.session_page_paths"); #delete_node(summary . ".session_page_paths"); #delete_node(reports . ".session_paths"); #delete_node(menu . ".sessions_group.items.session_paths"); #delete_node(summary . ".session_paths"); #delete_node(reports . ".session_id"); #delete_node(summary . ".session_id"); #delete_node(menu . ".session_id"); # #echo("end of final step"); #` } # create_profile_wizard_options } # unreal_media_server