// registerWithTrackers runs every trackerUpdateFrequency seconds to update the server's tracker entry on all configured
// trackers.
func (s *Server) registerWithTrackers(ctx context.Context) {
- ticker := time.NewTicker(trackerUpdateFrequency * time.Second)
- defer ticker.Stop()
-
for {
- select {
- case <-ctx.Done():
- return
- case <-ticker.C:
- if s.Config.EnableTrackerRegistration {
+ if s.Config.EnableTrackerRegistration {
+ for _, t := range s.Config.Trackers {
tr := &TrackerRegistration{
UserCount: len(s.ClientMgr.List()),
PassID: s.TrackerPassID,
}
binary.BigEndian.PutUint16(tr.Port[:], uint16(s.Port))
- for _, t := range s.Config.Trackers {
- if err := register(&RealDialer{}, t, tr); err != nil {
- s.Logger.Error(fmt.Sprintf("Unable to register with tracker %v", t), "error", err)
- }
+ // Check the tracker string for a password. This is janky but avoids a breaking change to the Config
+ // Trackers field.
+ splitAddr := strings.Split(":", t)
+ if len(splitAddr) == 3 {
+ tr.Password = splitAddr[2]
+ }
+
+ if err := register(&RealDialer{}, t, tr); err != nil {
+ s.Logger.Error(fmt.Sprintf("Unable to register with tracker %v", t), "error", err)
}
}
}
+ // Using time.Ticker with for/select would be more idiomatic, but it's super annoying that it doesn't tick on
+ // first pass. Revist, maybe.
+ // https://github.com/golang/go/issues/17601
+ time.Sleep(trackerUpdateFrequency * time.Second)
}
-
}
const (
"Name", string(fileTransfer.ClientConn.UserName),
)
- fullPath, err := ReadPath(s.Config.FileRoot, fileTransfer.FilePath, fileTransfer.FileName)
+ fullPath, err := ReadPath(fileTransfer.FileRoot, fileTransfer.FilePath, fileTransfer.FileName)
if err != nil {
return err
}
switch fileTransfer.Type {
case BannerDownload:
if _, err := io.Copy(rwc, bytes.NewBuffer(s.Banner)); err != nil {
- return fmt.Errorf("error sending Banner: %w", err)
+ return fmt.Errorf("banner download: %w", err)
}
case FileDownload:
s.Stats.Increment(StatDownloadCounter, StatDownloadsInProgress)
err = UploadHandler(rwc, fullPath, fileTransfer, s.FS, rLogger, s.Config.PreserveResourceForks)
if err != nil {
- return fmt.Errorf("file upload error: %w", err)
+ return fmt.Errorf("file upload: %w", err)
}
case FolderDownload:
err = DownloadFolderHandler(rwc, fullPath, fileTransfer, s.FS, rLogger, s.Config.PreserveResourceForks)
if err != nil {
- return fmt.Errorf("file upload error: %w", err)
+ return fmt.Errorf("folder download: %w", err)
}
case FolderUpload:
err = UploadFolderHandler(rwc, fullPath, fileTransfer, s.FS, rLogger, s.Config.PreserveResourceForks)
if err != nil {
- return fmt.Errorf("file upload error: %w", err)
+ return fmt.Errorf("folder upload: %w", err)
}
}
return nil