Many updates
This commit is contained in:
@@ -46,24 +46,51 @@ class NetworkRangesController < ApplicationController
|
||||
authorize @network_range
|
||||
|
||||
if @network_range.persisted?
|
||||
# Real network - use existing logic
|
||||
@related_events = Event.joins("JOIN network_ranges ON events.ip_address <<= network_ranges.network")
|
||||
.where("network_ranges.id = ?", @network_range.id)
|
||||
.recent
|
||||
.limit(100)
|
||||
# Real network - use direct IP containment for consistency with stats
|
||||
events_scope = Event.where("ip_address <<= ?", @network_range.cidr).recent
|
||||
else
|
||||
# Virtual network - find events by IP range containment
|
||||
@related_events = Event.where("ip_address <<= ?::inet", @network_range.to_s)
|
||||
.recent
|
||||
.limit(100)
|
||||
events_scope = Event.where("ip_address <<= ?::inet", @network_range.to_s).recent
|
||||
end
|
||||
|
||||
# Paginate events
|
||||
@events_pagy, @related_events = pagy(events_scope, items: 50)
|
||||
|
||||
@child_ranges = @network_range.child_ranges.limit(20)
|
||||
@parent_ranges = @network_range.parent_ranges.limit(10)
|
||||
@associated_rules = @network_range.persisted? ? @network_range.rules.includes(:user).order(created_at: :desc) : []
|
||||
|
||||
# Traffic analytics (if we have events)
|
||||
@traffic_stats = calculate_traffic_stats(@network_range)
|
||||
|
||||
# Check if we have IPAPI data (or if parent has it)
|
||||
@has_ipapi_data = @network_range.has_network_data_from?(:ipapi)
|
||||
@parent_with_ipapi = nil
|
||||
|
||||
unless @has_ipapi_data
|
||||
# Check if parent has IPAPI data
|
||||
parent = @network_range.parent_with_intelligence
|
||||
if parent&.has_network_data_from?(:ipapi)
|
||||
@parent_with_ipapi = parent
|
||||
@has_ipapi_data = true
|
||||
end
|
||||
end
|
||||
|
||||
# If we don't have IPAPI data anywhere and no parent has it, queue fetch job
|
||||
if @network_range.persisted? && @network_range.should_fetch_ipapi_data?
|
||||
@network_range.mark_as_fetching_api_data!(:ipapi)
|
||||
FetchIpapiDataJob.perform_later(network_range_id: @network_range.id)
|
||||
@ipapi_loading = true
|
||||
end
|
||||
|
||||
# Get IPAPI data for display
|
||||
@ipapi_data = if @parent_with_ipapi
|
||||
@parent_with_ipapi.network_data_for(:ipapi)
|
||||
elsif @network_range.has_network_data_from?(:ipapi)
|
||||
@network_range.network_data_for(:ipapi)
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
# GET /network_ranges/new
|
||||
@@ -214,18 +241,27 @@ class NetworkRangesController < ApplicationController
|
||||
if network_range.persisted?
|
||||
# Real network - use cached events_count for total requests (much more performant)
|
||||
if network_range.events_count > 0
|
||||
events = Event.joins("JOIN network_ranges ON events.ip_address <<= network_ranges.network")
|
||||
.where("network_ranges.id = ?", network_range.id)
|
||||
.limit(1000) # Limit the sample for performance
|
||||
# Base query for consistent IP containment logic
|
||||
base_query = Event.where("ip_address <<= ?", network_range.cidr)
|
||||
|
||||
# Use separate queries: one for grouping (without ordering), one for recent activity (with ordering)
|
||||
events_for_grouping = base_query.limit(1000)
|
||||
events_for_activity = base_query.recent.limit(20)
|
||||
|
||||
# Calculate counts properly - use consistent base_query for all counts
|
||||
total_requests = base_query.count
|
||||
unique_ips = base_query.except(:order).distinct.count(:ip_address)
|
||||
blocked_requests = base_query.blocked.count
|
||||
allowed_requests = base_query.allowed.count
|
||||
|
||||
{
|
||||
total_requests: network_range.events_count, # Use cached count
|
||||
unique_ips: events.distinct.count(:ip_address),
|
||||
blocked_requests: events.blocked.count,
|
||||
allowed_requests: events.allowed.count,
|
||||
top_paths: events.group(:request_path).count.sort_by { |_, count| -count }.first(10),
|
||||
top_user_agents: events.group(:user_agent).count.sort_by { |_, count| -count }.first(5),
|
||||
recent_activity: events.recent.limit(20)
|
||||
total_requests: total_requests,
|
||||
unique_ips: unique_ips,
|
||||
blocked_requests: blocked_requests,
|
||||
allowed_requests: allowed_requests,
|
||||
top_paths: events_for_grouping.group(:request_path).count.sort_by { |_, count| -count }.first(10),
|
||||
top_user_agents: events_for_grouping.group(:user_agent).count.sort_by { |_, count| -count }.first(5),
|
||||
recent_activity: events_for_activity
|
||||
}
|
||||
else
|
||||
# No events - return empty stats
|
||||
@@ -241,20 +277,35 @@ class NetworkRangesController < ApplicationController
|
||||
end
|
||||
else
|
||||
# Virtual network - calculate stats from events within range
|
||||
events = Event.where("ip_address <<= ?::inet", network_range.to_s)
|
||||
.limit(1000) # Limit the sample for performance
|
||||
base_query = Event.where("ip_address <<= ?", network_range.cidr)
|
||||
total_events = base_query.count
|
||||
|
||||
total_events = Event.where("ip_address <<= ?::inet", network_range.to_s).count
|
||||
if total_events > 0
|
||||
# Use separate queries: one for grouping (without ordering), one for recent activity (with ordering)
|
||||
events_for_grouping = base_query.limit(1000)
|
||||
events_for_activity = base_query.recent.limit(20)
|
||||
|
||||
{
|
||||
total_requests: total_events,
|
||||
unique_ips: events.distinct.count(:ip_address),
|
||||
blocked_requests: events.blocked.count,
|
||||
allowed_requests: events.allowed.count,
|
||||
top_paths: events.group(:request_path).count.sort_by { |_, count| -count }.first(10),
|
||||
top_user_agents: events.group(:user_agent).count.sort_by { |_, count| -count }.first(5),
|
||||
recent_activity: events.recent.limit(20)
|
||||
}
|
||||
{
|
||||
total_requests: total_events,
|
||||
unique_ips: base_query.except(:order).distinct.count(:ip_address),
|
||||
blocked_requests: base_query.blocked.count,
|
||||
allowed_requests: base_query.allowed.count,
|
||||
top_paths: events_for_grouping.group(:request_path).count.sort_by { |_, count| -count }.first(10),
|
||||
top_user_agents: events_for_grouping.group(:user_agent).count.sort_by { |_, count| -count }.first(5),
|
||||
recent_activity: events_for_activity
|
||||
}
|
||||
else
|
||||
# No events for virtual network
|
||||
{
|
||||
total_requests: 0,
|
||||
unique_ips: 0,
|
||||
blocked_requests: 0,
|
||||
allowed_requests: 0,
|
||||
top_paths: {},
|
||||
top_user_agents: {},
|
||||
recent_activity: []
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user