package ui import ( "fmt" tea "github.com/charmbracelet/bubbletea" "ssh-access-tui/internal/audit" ) func (m *Model) refreshAudit() { st := m.loadState() managed := map[string]bool{} for _, u := range st.Users { managed[u.Username] = true } sessions, err := audit.ListOnline(managed) if err != nil { m.err = err.Error() } m.onlineSessions = sessions events, err := audit.ReadRecent(m.cfg.AuditLog, 25) if err != nil { m.err = err.Error() } m.recentEvents = events } func (m Model) updateAudit(msg tea.Msg) (tea.Model, tea.Cmd) { if key, ok := msg.(tea.KeyMsg); ok { switch key.String() { case "esc": m.screen = scrMenu m.err, m.status = "", "" return m, nil case "r": m.refreshAudit() return m, nil } } return m, nil } func (m Model) viewAudit() string { body := "Сейчас в сети (сессии с активным sshd-процессом):\n\n" if len(m.onlineSessions) == 0 { body += " (никого)\n" } for _, s := range m.onlineSessions { body += fmt.Sprintf(" %-16s pid=%-8d в сети %s\n", s.User, s.PID, s.Elapsed) } body += "\nПоследние события (журнал подключений):\n\n" if len(m.recentEvents) == 0 { body += " (пока пусто — фоновый сборщик журнала ещё не запущен или не было событий)\n" } for i := len(m.recentEvents) - 1; i >= 0; i-- { e := m.recentEvents[i] line := fmt.Sprintf(" %s %-10s %-16s", e.Time.Local().Format("2006-01-02 15:04:05"), e.Action, e.User) if e.SrcIP != "" { line += " from " + e.SrcIP } if e.Detail != "" { line += " " + e.Detail } body += line + "\n" } body += "\n[r] обновить [esc] назад" return borderStyle.Render(body) }