Co-Occurrence on domain level
This commit is contained in:
60
main/Requests/Analysis/VCAnalysisBar.swift
Normal file
60
main/Requests/Analysis/VCAnalysisBar.swift
Normal file
@@ -0,0 +1,60 @@
|
||||
import UIKit
|
||||
|
||||
protocol AnalysisBarDelegate {
|
||||
func analysisBarWillOpenCoOccurrence() -> (domain: String, isFQDN: Bool)
|
||||
}
|
||||
|
||||
class VCAnalysisBar: UIViewController, UITabBarDelegate {
|
||||
|
||||
@IBOutlet private var tabBar: UITabBar!
|
||||
|
||||
override func viewDidLoad() {
|
||||
if #available(iOS 10.0, *) {
|
||||
tabBar.unselectedItemTintColor = .sysLink
|
||||
}
|
||||
super.viewDidLoad()
|
||||
}
|
||||
|
||||
override func willMove(toParent parent: UIViewController?) {
|
||||
super.willMove(toParent: parent)
|
||||
let enabled = (parent as? AnalysisBarDelegate) != nil
|
||||
for item in tabBar.items! { item.isEnabled = enabled }
|
||||
}
|
||||
|
||||
// MARK: - Tab Bar Appearance
|
||||
|
||||
override func viewWillAppear(_: Bool) {
|
||||
resizeTableViewHeader()
|
||||
}
|
||||
|
||||
override func traitCollectionDidChange(_: UITraitCollection?) {
|
||||
resizeTableViewHeader()
|
||||
}
|
||||
|
||||
func resizeTableViewHeader() {
|
||||
guard let tableView = (parent as? UITableViewController)?.tableView,
|
||||
let head = tableView.tableHeaderView else { return }
|
||||
// Recalculate and apply new height. Otherwise tabBar won't compress
|
||||
tabBar.sizeToFit()
|
||||
head.frame.size.height = tabBar.frame.height
|
||||
tableView.tableHeaderView = head
|
||||
}
|
||||
|
||||
// MARK: - Tab Bar Delegate
|
||||
|
||||
func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
|
||||
tabBar.selectedItem = nil
|
||||
openCoOccurrence()
|
||||
}
|
||||
|
||||
private func openCoOccurrence() {
|
||||
guard let delegate = parent as? AnalysisBarDelegate,
|
||||
let vc = storyboard?.instantiateViewController(withIdentifier: "IBCoOccurrence") as? VCCoOccurrence else {
|
||||
return
|
||||
}
|
||||
let info = delegate.analysisBarWillOpenCoOccurrence()
|
||||
vc.domainName = info.domain
|
||||
vc.isFQDN = info.isFQDN
|
||||
present(vc, animated: true)
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
import UIKit
|
||||
|
||||
class VCCoOccurrence: UIViewController, UITableViewDataSource {
|
||||
var fqdn: String!
|
||||
var domainName: String!
|
||||
var isFQDN: Bool!
|
||||
private var dataSource: [ContextAnalysisResult] = []
|
||||
|
||||
@IBOutlet private var tableView: UITableView!
|
||||
@@ -30,14 +31,15 @@ class VCCoOccurrence: UIViewController, UITableViewDataSource {
|
||||
dataSource = [("Loading …", 0, 0, 0)]
|
||||
logMaxCount = 1
|
||||
tableView.reloadData()
|
||||
let domain = fqdn!
|
||||
let domain = domainName!
|
||||
let flag = isFQDN!
|
||||
let time = Timestamp(selectedTime)
|
||||
DispatchQueue.global().async { [weak self] in
|
||||
let temp: [ContextAnalysisResult]
|
||||
let total: Int32
|
||||
if let db = AppDB,
|
||||
let times = db.dnsLogsUniqTs(domain), times.count > 0,
|
||||
let result = db.contextAnalysis(coOccurrence: times, plusMinus: time, exclude: domain),
|
||||
let times = db.dnsLogsUniqTs(domain, isFQDN: flag), times.count > 0,
|
||||
let result = db.contextAnalysis(coOccurrence: times, plusMinus: time, exclude: domain, isFQDN: flag),
|
||||
result.count > 0
|
||||
{
|
||||
temp = result
|
||||
@@ -1,9 +1,7 @@
|
||||
import UIKit
|
||||
|
||||
class TVCHostDetails: UITableViewController, SyncUpdateDelegate, UITabBarDelegate {
|
||||
class TVCHostDetails: UITableViewController, SyncUpdateDelegate, AnalysisBarDelegate {
|
||||
|
||||
@IBOutlet private var actionsBar: UITabBar!
|
||||
|
||||
public var fullDomain: String!
|
||||
private var dataSource: [GroupedTsOccurrence] = []
|
||||
// TODO: respect date reverse sort order
|
||||
@@ -14,9 +12,19 @@ class TVCHostDetails: UITableViewController, SyncUpdateDelegate, UITabBarDelegat
|
||||
sync.addObserver(self) // calls `syncUpdate(reset:)`
|
||||
if #available(iOS 10.0, *) {
|
||||
sync.allowPullToRefresh(onTVC: self, forObserver: self)
|
||||
actionsBar.unselectedItemTintColor = .sysLink
|
||||
}
|
||||
UIDevice.orientationDidChangeNotification.observe(call: #selector(didChangeOrientation), on: self)
|
||||
}
|
||||
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if let index = tableView.indexPathForSelectedRow?.row {
|
||||
let tvc = segue.destination as? TVCOccurrenceContext
|
||||
tvc?.domain = fullDomain
|
||||
tvc?.ts = dataSource[index].ts
|
||||
}
|
||||
}
|
||||
|
||||
func analysisBarWillOpenCoOccurrence() -> (domain: String, isFQDN: Bool) {
|
||||
(fullDomain, true)
|
||||
}
|
||||
|
||||
// MARK: - Table View Data Source
|
||||
@@ -33,34 +41,6 @@ class TVCHostDetails: UITableViewController, SyncUpdateDelegate, UITabBarDelegat
|
||||
}
|
||||
}
|
||||
|
||||
// #########################
|
||||
// #
|
||||
// # MARK: - Tab Bar
|
||||
// #
|
||||
// #########################
|
||||
|
||||
extension TVCHostDetails {
|
||||
|
||||
@objc private func didChangeOrientation(_ sender: Notification) {
|
||||
tableView.sizeHeaderToFit() // otherwise TabBar won't compress
|
||||
}
|
||||
|
||||
func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
|
||||
tabBar.selectedItem = nil
|
||||
performSegue(withIdentifier: "segueAnalysisCoOccurrence", sender: nil)
|
||||
}
|
||||
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if segue.identifier == "segueAnalysisCoOccurrence" {
|
||||
(segue.destination as? VCCoOccurrence)?.fqdn = fullDomain
|
||||
} else if let index = tableView.indexPathForSelectedRow?.row {
|
||||
let tvc = segue.destination as? TVCOccurrenceContext
|
||||
tvc?.domain = fullDomain
|
||||
tvc?.ts = dataSource[index].ts
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ################################
|
||||
// #
|
||||
// # MARK: - Partial Update
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import UIKit
|
||||
|
||||
class TVCHosts: UITableViewController, GroupedDomainDataSourceDelegate {
|
||||
class TVCHosts: UITableViewController, GroupedDomainDataSourceDelegate, AnalysisBarDelegate {
|
||||
|
||||
lazy var source = GroupedDomainDataSource(withParent: parentDomain)
|
||||
|
||||
@@ -21,6 +21,10 @@ class TVCHosts: UITableViewController, GroupedDomainDataSourceDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
func analysisBarWillOpenCoOccurrence() -> (domain: String, isFQDN: Bool) {
|
||||
(parentDomain, false)
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Table View Data Source
|
||||
|
||||
|
||||
Reference in New Issue
Block a user