mirror of
https://github.com/netbirdio/netbird.git
synced 2026-07-16 03:29:57 +00:00
- **Wails v3 application** (`client/ui`) with a React + TypeScript + Tailwind frontend replacing the Fyne UI: main connection view, exit-node switcher, networks/peers browser with detail panels, profile management, settings (general, network, SSH, security, troubleshooting, appearance), debug-bundle creation, and a first-run welcome flow. - **Internationalization**: go-i18n bundle with 9 locales (en, de, es, fr, hu, it, pt, ru, zh-CN) shared between the tray and the frontend. - **New system tray** implementation with per-platform theme-aware icons, including a native XEmbed host for Linux (`xembed_tray_linux.c`) and a Linux theme watcher. - **Session handling**: auth session watcher (`client/internal/auth/sessionwatch`), pending login flow, session-expiration dialog and tray notifications, and `netbird login` improvements. - **Daemon API extensions** (`daemon.proto`): status stream subscription, event stream, networks/exit-node selection endpoints, and richer full status — with probe throttling on the daemon side to protect against UI-driven request storms. - **UI preferences store** persisted per profile, autostart management via the daemon (single source of truth in HKCU on Windows). - **Build system**: Taskfile-based builds per platform (macOS, Linux, Windows), Docker cross-compilation images, MSIX/NSIS/nfpm/AppImage packaging, and a new `frontend-ui` CI workflow. Co-authored-by: Zoltan Papp <zoltan.pmail@gmail.com> Co-authored-by: Eduard Gert <kontakt@eduardgert.de> Co-authored-by: braginini <bangvalo@gmail.com> Co-authored-by: Pascal Fischer <32096965+pascal-fischer@users.noreply.github.com> Co-authored-by: riccardom <riccardomanfrin@gmail.com>
63 lines
2.0 KiB
Go
63 lines
2.0 KiB
Go
package server
|
|
|
|
import (
|
|
"github.com/google/uuid"
|
|
log "github.com/sirupsen/logrus"
|
|
"google.golang.org/protobuf/types/known/timestamppb"
|
|
|
|
"github.com/netbirdio/netbird/client/proto"
|
|
)
|
|
|
|
func (s *Server) SubscribeEvents(req *proto.SubscribeRequest, stream proto.DaemonService_SubscribeEventsServer) error {
|
|
subscription := s.statusRecorder.SubscribeToEvents()
|
|
defer func() {
|
|
s.statusRecorder.UnsubscribeFromEvents(subscription)
|
|
log.Debug("client unsubscribed from events")
|
|
}()
|
|
|
|
log.Debug("client subscribed to events")
|
|
s.startUpdateManagerForGUI()
|
|
|
|
// Replay the current log level to this subscriber so a freshly-connected UI
|
|
// learns it even when the daemon was already started with --log-level debug
|
|
// (the change-driven publishLogLevelChanged only fires on SetLogLevel). Sent
|
|
// directly on this stream rather than via PublishEvent so it reaches only
|
|
// the new subscriber, not every connected client.
|
|
if err := s.sendCurrentLogLevel(stream); err != nil {
|
|
return err
|
|
}
|
|
|
|
for {
|
|
select {
|
|
case event := <-subscription.Events():
|
|
if err := stream.Send(event); err != nil {
|
|
log.Warnf("error sending event to %v: %v", req, err)
|
|
return err
|
|
}
|
|
case <-stream.Context().Done():
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
// sendCurrentLogLevel sends a marked log-level-changed SystemEvent carrying the
|
|
// daemon's current level directly to one subscriber. Mirrors the shape
|
|
// publishLogLevelChanged emits so the UI's dispatchSystemEvent handles both the
|
|
// same way.
|
|
func (s *Server) sendCurrentLogLevel(stream proto.DaemonService_SubscribeEventsServer) error {
|
|
level := log.GetLevel().String()
|
|
event := &proto.SystemEvent{
|
|
Id: uuid.New().String(),
|
|
Severity: proto.SystemEvent_INFO,
|
|
Category: proto.SystemEvent_SYSTEM,
|
|
Message: "Log level changed",
|
|
Metadata: map[string]string{proto.MetadataKindKey: proto.MetadataKindLogLevelChanged, proto.MetadataLevelKey: level},
|
|
Timestamp: timestamppb.Now(),
|
|
}
|
|
if err := stream.Send(event); err != nil {
|
|
log.Warnf("error sending initial log level event: %v", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|