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 Tracker is not responsible for handling the network layer. Typically, the Tracker is 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>

A database driver implementation: Sqlite3 or MySQL

Implementations§

source§

impl Tracker

source

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.

source

pub fn is_public(&self) -> bool

Returns true is the tracker is in public mode.

source

pub fn is_private(&self) -> bool

Returns true is the tracker is in private mode.

source

pub fn is_whitelisted(&self) -> bool

Returns true is the tracker is in whitelisted mode.

source

pub fn requires_authentication(&self) -> bool

Returns true if the tracker requires authentication.

source

pub async fn announce( &self, info_hash: &InfoHash, peer: &mut Peer, remote_client_ip: &IpAddr ) -> AnnounceData

It handles an announce request.

Context: Tracker

BEP 03: The BitTorrent Protocol Specification.

source

pub async fn scrape(&self, info_hashes: &Vec<InfoHash>) -> ScrapeData

It handles a scrape request.

Context: Tracker

BEP 48: Tracker Protocol Extension: Scrape.

source

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.

source

pub async fn get_all_torrent_peers(&self, info_hash: &InfoHash) -> Vec<Peer>

Context: Tracker

Get all torrent peers for a given torrent

source

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
source

pub async fn get_torrents( &self ) -> RwLockReadGuard<'_, BTreeMap<InfoHash, Entry>>

source

pub async fn get_torrents_metrics(&self) -> TorrentsMetrics

It calculates and returns the general Tracker TorrentsMetrics

Context: Tracker
source

pub async fn cleanup_torrents(&self)

Remove inactive peers and (optionally) peerless torrents

Context: Tracker
source

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
source

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.

source

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.

source

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.

source

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.

source

pub async fn authenticate_request( &self, info_hash: &InfoHash, key: &Option<Key> ) -> Result<(), Error>

👎Deprecated since 3.0.0: please use authenticate and authorize instead

It 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.

source

pub async fn authorize(&self, info_hash: &InfoHash) -> Result<(), Error>

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.

source

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.

source

pub async fn add_torrent_to_memory_whitelist( &self, info_hash: &InfoHash ) -> bool

source

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.

source

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.

source

pub async fn remove_torrent_from_memory_whitelist( &self, info_hash: &InfoHash ) -> bool

It removes a torrent from the whitelist in memory.

Context: Whitelist
source

pub async fn is_info_hash_whitelisted(&self, info_hash: &InfoHash) -> bool

It checks if a torrent is whitelisted.

Context: Whitelist
source

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.

source

pub async fn get_stats(&self) -> RwLockReadGuard<'_, Metrics>

source

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§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> Twhere Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<Choices> CoproductSubsetter<CNil, HNil> for Choices

§

type Remainder = Choices

§

fn subset( self ) -> Result<CNil, <Choices as CoproductSubsetter<CNil, HNil>>::Remainder>

Extract a subset of the possible types in a coproduct (or get the remaining possibilities) Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T, U, I> LiftInto<U, I> for Twhere U: LiftFrom<T, I>,

§

fn lift_into(self) -> U

Performs the indexed conversion.
§

impl<T> Pipe for Twhere T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,

Borrows 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,

Mutably borrows 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,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

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,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> Rwhere Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R ) -> Rwhere Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize = mem::align_of::<T>()

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
§

impl<Source> Sculptor<HNil, HNil> for Source

§

type Remainder = Source

§

fn sculpt(self) -> (HNil, <Source as Sculptor<HNil, HNil>>::Remainder)

Consumes the current HList and returns an HList with the requested shape. Read more
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,

Immutable access to the 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,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,

Immutable access to the 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,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .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,

Calls .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,

Calls .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,

Calls .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,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more