Struct torrust_tracker::tracker::Tracker
source · pub struct Tracker {
pub config: Arc<Configuration>,
pub database: Box<dyn Database>,
/* private fields */
}Expand description
The domain layer tracker service.
Its main responsibility is to handle the announce and scrape requests.
But it’s also a container for the Tracker configuration, persistence,
authentication and other services.
NOTICE: the
Trackeris not responsible for handling the network layer. Typically, theTrackeris used by a higher application service that handles the network layer.
Fields§
§config: Arc<Configuration>Tracker configuration. See torrust-tracker-configuration
database: Box<dyn Database>Implementations§
source§impl Tracker
impl Tracker
sourcepub fn new(
config: Arc<Configuration>,
stats_event_sender: Option<Box<dyn EventSender>>,
stats_repository: Repo
) -> Result<Tracker, Error>
pub fn new( config: Arc<Configuration>, stats_event_sender: Option<Box<dyn EventSender>>, stats_repository: Repo ) -> Result<Tracker, Error>
Tracker constructor.
Errors
Will return a databases::error::Error if unable to connect to database. The Tracker is responsible for the persistence.
sourcepub fn is_private(&self) -> bool
pub fn is_private(&self) -> bool
Returns true is the tracker is in private mode.
sourcepub fn is_whitelisted(&self) -> bool
pub fn is_whitelisted(&self) -> bool
Returns true is the tracker is in whitelisted mode.
sourcepub fn requires_authentication(&self) -> bool
pub fn requires_authentication(&self) -> bool
Returns true if the tracker requires authentication.
sourcepub async fn announce(
&self,
info_hash: &InfoHash,
peer: &mut Peer,
remote_client_ip: &IpAddr
) -> AnnounceData
pub async fn announce( &self, info_hash: &InfoHash, peer: &mut Peer, remote_client_ip: &IpAddr ) -> AnnounceData
sourcepub async fn scrape(&self, info_hashes: &Vec<InfoHash>) -> ScrapeData
pub async fn scrape(&self, info_hashes: &Vec<InfoHash>) -> ScrapeData
sourcepub async fn load_torrents_from_database(&self) -> Result<(), Error>
pub async fn load_torrents_from_database(&self) -> Result<(), Error>
It loads the torrents from database into memory. It only loads the torrent entry list with the number of seeders for each torrent. Peers data is not persisted.
Context: Tracker
Errors
Will return a database::Error if unable to load the list of persistent_torrents from the database.
sourcepub async fn get_all_torrent_peers(&self, info_hash: &InfoHash) -> Vec<Peer>
pub async fn get_all_torrent_peers(&self, info_hash: &InfoHash) -> Vec<Peer>
Context: Tracker
Get all torrent peers for a given torrent
sourcepub async fn update_torrent_with_peer_and_get_stats(
&self,
info_hash: &InfoHash,
peer: &Peer
) -> SwarmStats
pub async fn update_torrent_with_peer_and_get_stats( &self, info_hash: &InfoHash, peer: &Peer ) -> SwarmStats
It updates the torrent entry in memory, it also stores in the database
the torrent info data which is persistent, and finally return the data
needed for a announce request response.
Context: Tracker
pub async fn get_torrents( &self ) -> RwLockReadGuard<'_, BTreeMap<InfoHash, Entry>>
sourcepub async fn get_torrents_metrics(&self) -> TorrentsMetrics
pub async fn get_torrents_metrics(&self) -> TorrentsMetrics
It calculates and returns the general Tracker
TorrentsMetrics
Context: Tracker
sourcepub async fn cleanup_torrents(&self)
pub async fn cleanup_torrents(&self)
Remove inactive peers and (optionally) peerless torrents
Context: Tracker
sourcepub async fn authenticate(&self, key: &Key) -> Result<(), Error>
pub async fn authenticate(&self, key: &Key) -> Result<(), Error>
It authenticates the peer key against the Tracker authentication
key list.
Errors
Will return an error if the the authentication key cannot be verified.
Context: Authentication
sourcepub async fn generate_auth_key(
&self,
lifetime: Duration
) -> Result<ExpiringKey, Error>
pub async fn generate_auth_key( &self, lifetime: Duration ) -> Result<ExpiringKey, Error>
It generates a new expiring authentication key.
lifetime param is the duration in seconds for the new key.
The key will be no longer valid after lifetime seconds.
Authentication keys are used by HTTP trackers.
Context: Authentication
Errors
Will return a database::Error if unable to add the auth_key to the database.
sourcepub async fn remove_auth_key(&self, key: &Key) -> Result<(), Error>
pub async fn remove_auth_key(&self, key: &Key) -> Result<(), Error>
It removes an authentication key.
Context: Authentication
Errors
Will return a database::Error if unable to remove the key to the database.
Panics
Will panic if key cannot be converted into a valid Key.
sourcepub async fn verify_auth_key(&self, key: &Key) -> Result<(), Error>
pub async fn verify_auth_key(&self, key: &Key) -> Result<(), Error>
It verifies an authentication key.
Context: Authentication
Errors
Will return a key::Error if unable to get any auth_key.
sourcepub async fn load_keys_from_database(&self) -> Result<(), Error>
pub async fn load_keys_from_database(&self) -> Result<(), Error>
The Tracker stores the authentication keys in memory and in the database.
In case you need to restart the Tracker you can load the keys from the database
into memory with this function. Keys are automatically stored in the database when they
are generated.
Context: Authentication
Errors
Will return a database::Error if unable to load_keys from the database.
sourcepub async fn authenticate_request(
&self,
info_hash: &InfoHash,
key: &Option<Key>
) -> Result<(), Error>
👎Deprecated since 3.0.0: please use authenticate and authorize instead
pub async fn authenticate_request( &self, info_hash: &InfoHash, key: &Option<Key> ) -> Result<(), Error>
authenticate and authorize insteadIt authenticates and authorizes a UDP tracker request.
Context: Authentication and Authorization
Errors
Will return a torrent::Error::PeerKeyNotValid if the key is not valid.
Will return a torrent::Error::PeerNotAuthenticated if the key is None.
Will return a torrent::Error::TorrentNotWhitelisted if the the Tracker is in listed mode and the info_hash is not whitelisted.
Right now, there is only authorization when the Tracker runs in
listed or private_listed modes.
Context: Authorization
Errors
Will return an error if the tracker is running in listed mode
and the infohash is not whitelisted.
sourcepub async fn add_torrent_to_whitelist(
&self,
info_hash: &InfoHash
) -> Result<(), Error>
pub async fn add_torrent_to_whitelist( &self, info_hash: &InfoHash ) -> Result<(), Error>
It adds a torrent to the whitelist. Adding torrents is not relevant to public trackers.
Context: Whitelist
Errors
Will return a database::Error if unable to add the info_hash into the whitelist database.
pub async fn add_torrent_to_memory_whitelist( &self, info_hash: &InfoHash ) -> bool
sourcepub async fn remove_torrent_from_whitelist(
&self,
info_hash: &InfoHash
) -> Result<(), Error>
pub async fn remove_torrent_from_whitelist( &self, info_hash: &InfoHash ) -> Result<(), Error>
It removes a torrent from the whitelist. Removing torrents is not relevant to public trackers.
Context: Whitelist
Errors
Will return a database::Error if unable to remove the info_hash from the whitelist database.
sourcepub async fn remove_torrent_from_database_whitelist(
&self,
info_hash: &InfoHash
) -> Result<(), Error>
pub async fn remove_torrent_from_database_whitelist( &self, info_hash: &InfoHash ) -> Result<(), Error>
It removes a torrent from the whitelist in the database.
Context: Whitelist
Errors
Will return a database::Error if unable to remove the info_hash from the whitelist database.
sourcepub async fn remove_torrent_from_memory_whitelist(
&self,
info_hash: &InfoHash
) -> bool
pub async fn remove_torrent_from_memory_whitelist( &self, info_hash: &InfoHash ) -> bool
It removes a torrent from the whitelist in memory.
Context: Whitelist
sourcepub async fn is_info_hash_whitelisted(&self, info_hash: &InfoHash) -> bool
pub async fn is_info_hash_whitelisted(&self, info_hash: &InfoHash) -> bool
It checks if a torrent is whitelisted.
Context: Whitelist
sourcepub async fn load_whitelist_from_database(&self) -> Result<(), Error>
pub async fn load_whitelist_from_database(&self) -> Result<(), Error>
It loads the whitelist from the database.
Context: Whitelist
Errors
Will return a database::Error if unable to load the list whitelisted info_hashs from the database.
sourcepub async fn get_stats(&self) -> RwLockReadGuard<'_, Metrics>
pub async fn get_stats(&self) -> RwLockReadGuard<'_, Metrics>
It return the Tracker statistics::Metrics.
Context: Statistics
sourcepub async fn send_stats_event(
&self,
event: Event
) -> Option<Result<(), SendError<Event>>>
pub async fn send_stats_event( &self, event: Event ) -> Option<Result<(), SendError<Event>>>
It allows to send a statistic events which eventually will be used to update statistics::Metrics.
Context: Statistics
Auto Trait Implementations§
impl !RefUnwindSafe for Tracker
impl Send for Tracker
impl Sync for Tracker
impl Unpin for Tracker
impl !UnwindSafe for Tracker
Blanket Implementations§
§impl<T> Conv for T
impl<T> Conv for T
§impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T, U, I> LiftInto<U, I> for Twhere
U: LiftFrom<T, I>,
impl<T, U, I> LiftInto<U, I> for Twhere U: LiftFrom<T, I>,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,
self, then passes self.as_mut() into the pipe
function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<Source> Sculptor<HNil, HNil> for Source
impl<Source> Sculptor<HNil, HNil> for Source
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
.tap_ref_mut() only in debug builds, and is erased in release
builds.