diff --git a/stable b/stable index 0ed8fbb..63f192e 120000 --- a/stable +++ b/stable @@ -1 +1 @@ -04f20f2 \ No newline at end of file +v0.12.1 \ No newline at end of file diff --git a/v0.12.1/404.html b/v0.12.1/404.html new file mode 100644 index 0000000..2957596 --- /dev/null +++ b/v0.12.1/404.html @@ -0,0 +1,933 @@ + + + +
+ + + + + + + + + + + + + + + + + + +Default values for eos_downloader.
+This module contains default configuration values used by the eos_downloader package.
+ + +Attributes:
+Name | +Type | +Description | +
---|---|---|
DEFAULT_REQUEST_HEADERS |
+
+ dict
+ |
+
+
+
+ Default HTTP headers used for API requests. Contains Content-Type and User-Agent headers. + |
+
DEFAULT_SOFTWARE_FOLDER_TREE |
+
+ str
+ |
+
+
+
+ API endpoint URL for retrieving the EOS software folder structure. + |
+
DEFAULT_DOWNLOAD_URL |
+
+ str
+ |
+
+
+
+ API endpoint URL for getting download links for EOS images. + |
+
DEFAULT_SERVER_SESSION |
+
+ str
+ |
+
+
+
+ API endpoint URL for obtaining session codes from Arista’s servers. + |
+
EVE_QEMU_FOLDER_PATH |
+
+ str
+ |
+
+
+
+ Path to the folder where the downloaded EOS images will be stored on an EVE-NG server. + |
+
A module for managing file downloads with progress tracking in the console.
+This module provides functionality for downloading files with visual progress indicators +using the Rich library. It includes a signal handler for graceful interruption and +a DownloadProgressBar class for concurrent file downloads with progress tracking.
+ + +Classes:
+Name | +Description | +
---|---|
DownloadProgressBar: A class that provides visual progress tracking for file downloads. |
+
+
+
+
+ |
+
Functions:
+Name | +Description | +
---|---|
handle_sigint: Signal handler for SIGINT |
+
+
+
+ console (Console): Rich Console instance for output rendering. +done_event (Event): Threading Event used for signaling download interruption. + |
+
DownloadProgressBar()
+
A progress bar for downloading files.
+This class provides a visual progress indicator for file downloads using the Rich library. +It supports downloading multiple files concurrently with a progress bar showing download +speed, completion percentage, and elapsed time.
+ + +Attributes:
+Name | +Type | +Description | +
---|---|---|
progress |
+
+ Progress
+ |
+
+
+
+ A Rich Progress instance configured with custom columns for displaying download information. + |
+
Examples:
+>>> downloader = DownloadProgressBar()
+>>> urls = ['http://example.com/file1.zip', 'http://example.com/file2.zip']
+>>> downloader.download(urls, '/path/to/destination')
+
eos_downloader/helpers/__init__.py
92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 |
|
download(urls: Iterable[str], dest_dir: str) -> None
+
Download files from URLs concurrently to a destination directory.
+This method downloads files from the provided URLs in parallel using a thread pool, +displaying progress for each download in the console.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ urls
+ |
+
+ Iterable[str]
+ |
+
+
+
+ An iterable of URLs to download files from. + |
+ + required + | +
+ dest_dir
+ |
+
+ str
+ |
+
+
+
+ The destination directory where files will be saved. + |
+ + required + | +
Returns:
+Type | +Description | +
---|---|
+ None
+ |
+
+
+
+
+ |
+
Examples:
+>>> downloader = DownloadProgressBar()
+>>> urls = ["http://example.com/file1.txt", "http://example.com/file2.txt"]
+>>> downloader.download(urls, "/path/to/destination")
+
eos_downloader/helpers/__init__.py
161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 |
|
handle_sigint(signum: Any, frame: Any) -> None
+
Signal handler for SIGINT (Ctrl+C).
+This function sets the done_event flag when SIGINT is received, +allowing for graceful termination of the program.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ signum
+ |
+
+ Any
+ |
+
+
+
+ Signal number. + |
+ + required + | +
+ frame
+ |
+
+ Any
+ |
+
+
+
+ Current stack frame object. + |
+ + required + | +
Returns:
+Type | +Description | +
---|---|
+ None
+ |
+
+
+
+
+ |
+
eos_downloader/helpers/__init__.py
49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 |
|
Server module for handling interactions with Arista software download portal.
+This module provides the AristaServer class which manages authentication and +file retrieval operations with the Arista software download portal. It handles +session management, XML data retrieval, and download URL generation.
+ + +Classes:
+Name | +Description | +
---|---|
AristaServer |
+
+
+
+ Main class for interacting with the Arista software portal. + |
+
>>> from eos_downloader.logics.server import AristaServer
+>>> server = AristaServer(token='my_auth_token')
+>>> server.authenticate()
+>>> xml_data = server.get_xml_data()
+>>> download_url = server.get_url('/path/to/file')
+
The module requires valid authentication credentials to interact with the Arista portal. +All server interactions are performed over HTTPS and follow Arista’s API specifications.
+AristaServer(
+ token: Union[str, None] = None,
+ timeout: int = 5,
+ session_server: str = eos_downloader.defaults.DEFAULT_SERVER_SESSION,
+ headers: Dict[
+ str, Any
+ ] = eos_downloader.defaults.DEFAULT_REQUEST_HEADERS,
+ xml_url: str = eos_downloader.defaults.DEFAULT_SOFTWARE_FOLDER_TREE,
+ download_server: str = eos_downloader.defaults.DEFAULT_DOWNLOAD_URL,
+)
+
AristaServer class to handle authentication and interactions with Arista software download portal.
+This class provides methods to authenticate with the Arista software portal, +retrieve XML data containing available software packages, and generate download URLs +for specific files.
+ + +Attributes:
+Name | +Type | +Description | +
---|---|---|
token |
+
+ (str, optional)
+ |
+
+
+
+ Authentication token for Arista portal access + |
+
timeout |
+
+ int, default=5
+ |
+
+
+
+ Timeout in seconds for HTTP requests + |
+
session_server |
+
+ str
+ |
+
+
+
+ URL of the authentication server + |
+
headers |
+
+ Dict[str, any]
+ |
+
+
+
+ HTTP headers to use in requests + |
+
xml_url |
+
+ str
+ |
+
+
+
+ URL to retrieve software package XML data + |
+
download_server |
+
+ str
+ |
+
+
+
+ Base URL for file downloads + |
+
_session_id |
+
+ str
+ |
+
+
+
+ Session ID obtained after authentication + |
+
Methods:
+Name | +Description | +
---|---|
authenticate |
+
+
+
+ Authenticates with the Arista portal using provided or stored token + |
+
get_xml_data |
+
+
+
+ Retrieves XML data containing available software packages + |
+
get_url |
+
+
+
+ Generates download URL for a specific file path + |
+
Raises:
+Type | +Description | +
---|---|
+ AuthenticationError
+ |
+
+
+
+ When authentication fails due to invalid or expired token + |
+
Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ token
+ |
+
+ Union[str, None]
+ |
+
+
+
+ Authentication token. Defaults to None. + |
+
+ None
+ |
+
+ timeout
+ |
+
+ int
+ |
+
+
+
+ Request timeout in seconds. Defaults to 5. + |
+
+ 5
+ |
+
+ session_server
+ |
+
+ str
+ |
+
+
+
+ URL of the session server. Defaults to DEFAULT_SERVER_SESSION. + |
+
+ DEFAULT_SERVER_SESSION
+ |
+
+ headers
+ |
+
+ Dict[str, any]
+ |
+
+
+
+ HTTP headers for requests. Defaults to DEFAULT_REQUEST_HEADERS. + |
+
+ DEFAULT_REQUEST_HEADERS
+ |
+
+ xml_url
+ |
+
+ str
+ |
+
+
+
+ URL of the software folder tree XML. Defaults to DEFAULT_SOFTWARE_FOLDER_TREE. + |
+
+ DEFAULT_SOFTWARE_FOLDER_TREE
+ |
+
+ download_server
+ |
+
+ str
+ |
+
+
+
+ Base URL for downloads. Defaults to DEFAULT_DOWNLOAD_URL. + |
+
+ DEFAULT_DOWNLOAD_URL
+ |
+
Returns:
+Type | +Description | +
---|---|
+ None
+ |
+
+
+
+
+ |
+
eos_downloader/logics/arista_server.py
93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 |
|
authenticate(token: Union[str, None] = None) -> bool
+
Authenticate to the API server using access token.
+The token is encoded in base64 and sent to the server for authentication. +A session ID is retrieved from the server response if authentication is successful.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ token
+ |
+
+ Union[str, None]
+ |
+
+
+
+ Access token for authentication. If None, uses existing token stored in instance. Defaults to None. + |
+
+ None
+ |
+
Returns:
+Type | +Description | +
---|---|
+ bool
+ |
+
+
+
+ True if authentication successful, False otherwise + |
+
Raises:
+Type | +Description | +
---|---|
+ AuthenticationError
+ |
+
+
+
+ If access token is invalid or expired + |
+
eos_downloader/logics/arista_server.py
133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 |
|
get_url(remote_file_path: str) -> Union[str, None]
+
Get download URL for a remote file from server.
+This method retrieves the download URL for a specified remote file by making a POST request +to the server. If not authenticated, it will first authenticate before making the request.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ remote_file_path
+ |
+
+ str
+ |
+
+
+
+ Path to the remote file on server to get download URL for + |
+ + required + | +
Returns:
+Type | +Description | +
---|---|
+ Union[str, None]
+ |
+
+
+
+ The download URL if successful, None if request fails or URL not found in response + |
+
Raises:
+Type | +Description | +
---|---|
+ RequestException
+ |
+
+
+
+ If the request to server fails + |
+
+ JSONDecodeError
+ |
+
+
+
+ If server response is not valid JSON + |
+
+ Timeout
+ |
+
+
+
+ If server request times out + |
+
eos_downloader/logics/arista_server.py
230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 |
|
get_xml_data() -> Union[ET.ElementTree, None]
+
Retrieves XML data from the server.
+This method fetches XML data by making a POST request to the server’s XML endpoint. +If not already authenticated, it will initiate the authentication process first.
+ + +Returns:
+Type | +Description | +
---|---|
+ ElementTree
+ |
+
+
+
+ An ElementTree object containing the parsed XML data from the server response. + |
+
Raises:
+Type | +Description | +
---|---|
+ KeyError
+ |
+
+
+
+ If the server response doesn’t contain the expected data structure. + |
+
The method requires a valid session ID which is obtained through authentication. +The XML data is expected to be in the response JSON under data.xml path.
+eos_downloader/logics/arista_server.py
189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 |
|
This module provides classes for managing and querying Arista XML data.
+Classes: + AristaXmlBase: Base class for Arista XML data management. + AristaXmlQuerier: Class to query Arista XML data for Software versions. + AristaXmlObject: Base class for Arista XML data management with specific software and version. + EosXmlObject: Class to query Arista XML data for EOS versions.
+ + + + + + + + +AristaXmlBase(
+ token: Union[str, None] = None,
+ xml_path: Union[str, None] = None,
+)
+
Base class for Arista XML data management.
+ + + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ token
+ |
+
+ Union[str, None]
+ |
+
+
+
+ Authentication token. Defaults to None. + |
+
+ None
+ |
+
+ xml_path
+ |
+
+ Union[str, None]
+ |
+
+
+
+ Path to the XML file. Defaults to None. + |
+
+ None
+ |
+
Returns:
+Type | +Description | +
---|---|
+ None
+ |
+
+
+
+
+ |
+
eos_downloader/logics/arista_xml_server.py
32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 |
|
AristaXmlObject(
+ searched_version: str,
+ image_type: str,
+ token: Union[str, None] = None,
+ xml_path: Union[str, None] = None,
+)
+
+ Bases: AristaXmlBase
Base class for Arista XML data management.
+ + + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ searched_version
+ |
+
+ str
+ |
+
+
+
+ The version of the software to search for. + |
+ + required + | +
+ image_type
+ |
+
+ str
+ |
+
+
+
+ The type of image to download. + |
+ + required + | +
+ token
+ |
+
+ Union[str, None]
+ |
+
+
+
+ Authentication token. Defaults to None. + |
+
+ None
+ |
+
+ xml_path
+ |
+
+ Union[str, None]
+ |
+
+
+
+ Path to the XML file. Defaults to None. + |
+
+ None
+ |
+
Returns:
+Type | +Description | +
---|---|
+ None
+ |
+
+
+
+
+ |
+
eos_downloader/logics/arista_xml_server.py
271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 |
|
property
+
+
+¶filename: Union[str, None]
+
property
+
+
+¶urls: Dict[str, Union[str, None]]
+
Get URLs to download files from Arista server for given software and version.
+This method will return a dictionary with file type as key and URL as value. +It returns URL for the following items: ‘image’, ‘md5sum’, and ‘sha512sum’.
+ + +Returns:
+Type | +Description | +
---|---|
+ Dict[str, Union[str, None]]
+ |
+
+
+
+ Dictionary with file type as key and URL as value. + |
+
Raises:
+Type | +Description | +
---|---|
+ ValueError
+ |
+
+
+
+ If filename or hash file is not found. + |
+
hash_filename() -> Union[str, None]
+
Helper to build filename for checksum to search on arista.com.
+ + +Returns:
+Type | +Description | +
---|---|
+ Union[str, None]
+ |
+
+
+
+ Filename to search for on Arista.com. + |
+
eos_downloader/logics/arista_xml_server.py
322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 |
|
path_from_xml(search_file: str) -> Union[str, None]
+
Parse XML to find path for a given file.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ search_file
+ |
+
+ str
+ |
+
+
+
+ File to search for. + |
+ + required + | +
Returns:
+Type | +Description | +
---|---|
+ Union[str, None]
+ |
+
+
+
+ Path from XML if found, None otherwise. + |
+
eos_downloader/logics/arista_xml_server.py
338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 |
|
AristaXmlQuerier(
+ token: Union[str, None] = None,
+ xml_path: Union[str, None] = None,
+)
+
+ Bases: AristaXmlBase
Class to query Arista XML data for Software versions.
+ + + + + + +eos_downloader/logics/arista_xml_server.py
32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 |
|
available_public_versions(
+ branch: Union[str, None] = None,
+ rtype: Union[str, None] = None,
+ package: AristaPackage = "eos",
+) -> List[AristaVersions]
+
Get list of available public EOS versions from Arista website.
+This method parses XML data to extract available EOS or CVP versions based on specified criteria.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ branch
+ |
+
+ Union[str, None]
+ |
+
+
+
+ Branch number to filter versions (e.g. “4.29”). Defaults to None. + |
+
+ None
+ |
+
+ rtype
+ |
+
+ Union[str, None]
+ |
+
+
+
+ Release type to filter versions. Must be one of the valid release types defined in RTYPES. Defaults to None. + |
+
+ None
+ |
+
+ package
+ |
+
+ AristaPackage
+ |
+
+
+
+ Type of package to look for - either ‘eos’ or ‘cvp’. Defaults to ‘eos’. + |
+
+ 'eos'
+ |
+
Returns:
+Type | +Description | +
---|---|
+ List[AristaVersions]
+ |
+
+
+
+ List of version objects (EosVersion or CvpVersion) matching the criteria. + |
+
Raises:
+Type | +Description | +
---|---|
+ ValueError
+ |
+
+
+
+ If provided rtype is not in the list of valid release types. + |
+
Examples:
+>>> server.available_public_eos_version(branch="4.29", rtype="INT", package="eos")
+[EosVersion('4.29.0F-INT'), EosVersion('4.29.1F-INT'), ...]
+
eos_downloader/logics/arista_xml_server.py
87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 |
|
branches(
+ package: eos_downloader.models.types.AristaPackage = "eos",
+ latest: bool = False,
+) -> List[str]
+
Returns a list of valid EOS version branches.
+The branches are determined based on the available public EOS versions. +When latest=True, only the most recent branch is returned.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ package
+ |
+
+ AristaPackage
+ |
+
+
+
+ Type of package to look for - either ‘eos’ or ‘cvp’. Defaults to ‘eos’. + |
+
+ 'eos'
+ |
+
+ latest
+ |
+
+ bool
+ |
+
+
+
+ If True, returns only the latest branch version. Defaults to False. + |
+
+ False
+ |
+
Returns:
+Type | +Description | +
---|---|
+ List[str]
+ |
+
+
+
+ A list of branch version strings. Contains single latest version if latest=True, +otherwise all available versions sorted descendingly. + |
+
eos_downloader/logics/arista_xml_server.py
205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 |
|
latest(
+ package: eos_downloader.models.types.AristaPackage = "eos",
+ branch: Union[str, None] = None,
+ rtype: Union[
+ eos_downloader.models.types.ReleaseType, None
+ ] = None,
+) -> AristaVersions
+
Get latest branch from semver standpoint.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ package
+ |
+
+ AristaPackage
+ |
+
+
+
+ Type of package to look for - either ‘eos’ or ‘cvp’. Defaults to ‘eos’. + |
+
+ 'eos'
+ |
+
+ branch
+ |
+
+ Union[str, None]
+ |
+
+
+
+ Branch to search for. Defaults to None. + |
+
+ None
+ |
+
+ rtype
+ |
+
+ Union[ReleaseType, None]
+ |
+
+
+
+ Release type to search for. Defaults to None. + |
+
+ None
+ |
+
Returns:
+Type | +Description | +
---|---|
+ AristaVersions
+ |
+
+
+
+ Latest version found. + |
+
Raises:
+Type | +Description | +
---|---|
+ ValueError
+ |
+
+
+
+ If no versions are found to run the max() function. + |
+
eos_downloader/logics/arista_xml_server.py
164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 |
|
CvpXmlObject(
+ searched_version: str,
+ image_type: str,
+ token: Union[str, None] = None,
+ xml_path: Union[str, None] = None,
+)
+
+ Bases: AristaXmlObject
Class to query Arista XML data for CVP versions.
+ + + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ searched_version
+ |
+
+ str
+ |
+
+
+
+ The version of the software to search for. + |
+ + required + | +
+ image_type
+ |
+
+ str
+ |
+
+
+
+ The type of image to download. + |
+ + required + | +
+ token
+ |
+
+ Union[str, None]
+ |
+
+
+
+ The authentication token. Defaults to None. + |
+
+ None
+ |
+
+ xml_path
+ |
+
+ Union[str, None]
+ |
+
+
+
+ The path to the XML file. Defaults to None. + |
+
+ None
+ |
+
Returns:
+Type | +Description | +
---|---|
+ None
+ |
+
+
+
+
+ |
+
eos_downloader/logics/arista_xml_server.py
495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 |
|
EosXmlObject(
+ searched_version: str,
+ image_type: str,
+ token: Union[str, None] = None,
+ xml_path: Union[str, None] = None,
+)
+
+ Bases: AristaXmlObject
Class to query Arista XML data for EOS versions.
+ + + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ searched_version
+ |
+
+ str
+ |
+
+
+
+ The version of the software to search for. + |
+ + required + | +
+ image_type
+ |
+
+ str
+ |
+
+
+
+ The type of image to download. + |
+ + required + | +
+ token
+ |
+
+ Union[str, None]
+ |
+
+
+
+ The authentication token. Defaults to None. + |
+
+ None
+ |
+
+ xml_path
+ |
+
+ Union[str, None]
+ |
+
+
+
+ The path to the XML file. Defaults to None. + |
+
+ None
+ |
+
Returns:
+Type | +Description | +
---|---|
+ None
+ |
+
+
+
+
+ |
+
eos_downloader/logics/arista_xml_server.py
441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 |
|
ObjectDownloader class to manage file downloads with an option to use rich interface.
+This class provides methods to download files from URLs with progress tracking using either +tqdm or rich interface. It supports both raw downloads and enhanced visual feedback during +the download process.
+ + +Functions:
+Name | +Description | +
---|---|
download_file |
+
+
+
+ Downloads a file from the given URL to the specified path with optional rich interface. + |
+
_download_file_raw |
+
+
+
+ Static method that performs the actual file download with tqdm progress bar. + |
+
Attributes:
+Name | +Type | +Description | +
---|---|---|
None |
+ + | +
+
+
+
+ |
+
>>> downloader = ObjectDownloader()
+>>> result = downloader.download_file(
+... url='http://example.com/file.zip',
+... file_path='/downloads',
+... filename='file.zip',
+... rich_interface=True
+... )
+
SoftManager(dry_run: bool = False)
+
SoftManager helps to download files from a remote location.
+This class provides methods to download files using either a simple progress bar +or a rich interface with enhanced visual feedback.
+ + +Examples:
+>>> downloader = SoftManager()
+>>> downloader.download_file(
+... url="http://example.com/file.txt",
+... file_path="/tmp",
+... filename="file.txt"
+... )
+'/tmp/file.txt'
+
eos_downloader/logics/download.py
65 +66 +67 +68 +69 +70 +71 |
|
checksum(
+ check_type: Literal["md5sum", "sha512sum", "md5"],
+) -> bool
+
Verifies the integrity of a downloaded file using a specified checksum algorithm.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ check_type
+ |
+
+ Literal['md5sum', 'sha512sum', 'md5']
+ |
+
+
+
+ The type of checksum to perform. Currently supports ‘md5sum’ or ‘sha512sum’. + |
+ + required + | +
Returns:
+Type | +Description | +
---|---|
+ bool
+ |
+
+
+
+ True if the checksum verification passes. + |
+
Raises:
+Type | +Description | +
---|---|
+ ValueError
+ |
+
+
+
+ If the calculated checksum does not match the expected checksum. + |
+
+ FileNotFoundError
+ |
+
+
+
+ If either the checksum file or the target file cannot be found. + |
+
Examples:
+>>> client.checksum('sha512sum') # Returns True if checksum matches
+
eos_downloader/logics/download.py
161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 |
|
download_file(
+ url: str,
+ file_path: str,
+ filename: str,
+ rich_interface: bool = True,
+) -> Union[None, str]
+
Downloads a file from a given URL to a specified location.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ url
+ |
+
+ str
+ |
+
+
+
+ The URL from which to download the file. + |
+ + required + | +
+ file_path
+ |
+
+ str
+ |
+
+
+
+ The directory path where the file should be saved. + |
+ + required + | +
+ filename
+ |
+
+ str
+ |
+
+
+
+ The name to be given to the downloaded file. + |
+ + required + | +
+ rich_interface
+ |
+
+ bool
+ |
+
+
+
+ Whether to use rich progress bar interface. Defaults to True. + |
+
+ True
+ |
+
Returns:
+Type | +Description | +
---|---|
+ Union[None, str]
+ |
+
+
+
+ The full path to the downloaded file if successful, None if download fails. + |
+
eos_downloader/logics/download.py
246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 |
|
downloads(
+ object_arista: eos_downloader.logics.arista_xml_server.AristaXmlObjects,
+ file_path: str,
+ rich_interface: bool = True,
+) -> Union[None, str]
+
Downloads files from Arista EOS server.
+Downloads the EOS image and optional md5/sha512 files based on the provided EOS XML object. +Each file is downloaded to the specified path with appropriate filenames.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ object_arista
+ |
+
+ AristaXmlObjects
+ |
+
+
+
+ Object containing EOS image and hash file URLs. + |
+ + required + | +
+ file_path
+ |
+
+ str
+ |
+
+
+
+ Directory path where files should be downloaded. + |
+ + required + | +
+ rich_interface
+ |
+
+ bool
+ |
+
+
+
+ Whether to use rich console output. Defaults to True. + |
+
+ True
+ |
+
Returns:
+Type | +Description | +
---|---|
+ Union[None, str]
+ |
+
+
+
+ The file path where files were downloaded, or None if download failed. + |
+
Examples:
+>>> client.downloads(eos_obj, "/tmp/downloads")
+'/tmp/downloads'
+
eos_downloader/logics/download.py
285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 |
|
import_docker(
+ local_file_path: str,
+ docker_name: str = "arista/ceos",
+ docker_tag: str = "latest",
+) -> None
+
Import a local file into a Docker image.
+This method imports a local file into Docker with a specified image name and tag. +It checks for the existence of both the local file and docker binary before proceeding.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ local_file_path
+ |
+
+ str
+ |
+
+
+
+ Path to the local file to import. + |
+ + required + | +
+ docker_name
+ |
+
+ str
+ |
+
+
+
+ Name for the Docker image. Defaults to ‘arista/ceos’. + |
+
+ 'arista/ceos'
+ |
+
+ docker_tag
+ |
+
+ str
+ |
+
+
+
+ Tag for the Docker image. Defaults to ‘latest’. + |
+
+ 'latest'
+ |
+
Raises:
+Type | +Description | +
---|---|
+ FileNotFoundError
+ |
+
+
+
+ If the local file doesn’t exist or docker binary is not found. + |
+
+ Exception
+ |
+
+
+
+ If the docker import operation fails. + |
+
Returns:
+Type | +Description | +
---|---|
+ None
+ |
+
+
+
+
+ |
+
eos_downloader/logics/download.py
348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 |
|
provision_eve(
+ object_arista: eos_downloader.logics.arista_xml_server.EosXmlObject,
+ noztp: bool = False,
+) -> None
+
Provisions EVE-NG with the specified Arista EOS object.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ object_arista
+ |
+
+ EosXmlObject
+ |
+
+
+
+ The Arista EOS object containing version, filename, and URLs. + |
+ + required + | +
+ noztp
+ |
+
+ bool
+ |
+
+
+
+ If True, disables ZTP (Zero Touch Provisioning). Defaults to False. + |
+
+ False
+ |
+
Raises:
+Type | +Description | +
---|---|
+ ValueError
+ |
+
+
+
+ If no URLs are found for download or if a URL or filename is None. + |
+
Returns:
+Type | +Description | +
---|---|
+ None
+ |
+
+
+
+
+ |
+
eos_downloader/logics/download.py
402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 |
|
This module defines type aliases and literals used in the eos_downloader project.
+ + +Attributes:
+Name | +Type | +Description | +
---|---|---|
AristaPackage |
+
+ Literal
+ |
+
+
+
+ Literal type for Arista package types. Can be either “eos” or “cvp”. + |
+
AristaMapping |
+
+ Literal
+ |
+
+
+
+ Literal type for Arista mapping types. Can be either “CloudVision” or “EOS”. + |
+
AristaVersions |
+
+ Union
+ |
+
+
+
+ Union type for supported SemVer object types. Can be either EosVersion or CvpVersion. + |
+
ReleaseType |
+
+ Literal
+ |
+
+
+
+ Literal type for release types. Can be either “M” (maintenance) or “F” (feature). + |
+
Examples:
+# Example usage of AristaPackage
+def get_package_type(package: AristaPackage):
+ if package == "eos":
+ return "Arista EOS package"
+ elif package == "cvp":
+ return "CloudVision Portal package"
+
+# Example usage of AristaVersions
+def print_version(version: AristaVersions):
+ print(f"Version: {version}")
+
+# Example usage of ReleaseType
+def is_feature_release(release: ReleaseType) -> bool:
+ return release == "F"
+
module-attribute
+
+
+¶software_mapping = DataMapping(
+ CloudVision={
+ "ova": {"extension": ".ova", "prepend": "cvp"},
+ "rpm": {
+ "extension": "",
+ "prepend": "cvp-rpm-installer",
+ },
+ "kvm": {"extension": "-kvm.tgz", "prepend": "cvp"},
+ "upgrade": {
+ "extension": ".tgz",
+ "prepend": "cvp-upgrade",
+ },
+ },
+ EOS={
+ "64": {"extension": ".swi", "prepend": "EOS64"},
+ "INT": {"extension": "-INT.swi", "prepend": "EOS"},
+ "2GB-INT": {
+ "extension": "-INT.swi",
+ "prepend": "EOS-2GB",
+ },
+ "cEOS": {
+ "extension": ".tar.xz",
+ "prepend": "cEOS-lab",
+ },
+ "cEOS64": {
+ "extension": ".tar.xz",
+ "prepend": "cEOS64-lab",
+ },
+ "vEOS": {"extension": ".vmdk", "prepend": "vEOS"},
+ "vEOS-lab": {
+ "extension": ".vmdk",
+ "prepend": "vEOS-lab",
+ },
+ "EOS-2GB": {
+ "extension": ".swi",
+ "prepend": "EOS-2GB",
+ },
+ "RN": {"extension": "-", "prepend": "RN"},
+ "SOURCE": {
+ "extension": "-source.tar",
+ "prepend": "EOS",
+ },
+ "default": {"extension": ".swi", "prepend": "EOS"},
+ },
+)
+
This module defines data models and mappings for image types of CloudVision and EOS on Arista.com.
+ + +Classes:
+Name | +Description | +
---|---|
ImageInfo: |
+
+
+
+ A Pydantic model representing image information for a specific image type. + |
+
DataMapping: |
+
+
+
+ A Pydantic model representing data mapping for image types of CloudVision and EOS on Arista.com. + |
+
Functions:
+Name | +Description | +
---|---|
DataMapping.filename |
+
+
+
+ Generates a filename based on the provided software, image type, and version. + |
+
+ Bases: BaseModel
Data mapping for image types of CloudVision and EOS on Arista.com.
+ + +Attributes:
+Name | +Type | +Description | +
---|---|---|
CloudVision |
+
+ Dict[str, ImageInfo]
+ |
+
+
+
+ Mapping of image types to their information for CloudVision. + |
+
EOS |
+
+ Dict[str, ImageInfo]
+ |
+
+
+
+ Mapping of image types to their information for EOS. + |
+
Methods:
+Name | +Description | +
---|---|
filename |
+
+
+
+ Generates a filename based on the provided software, image type, and version. + |
+
filename(
+ software: AristaMapping, image_type: str, version: str
+) -> str
+
Generates a filename based on the provided software, image type, and version.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ software
+ |
+
+ AristaMapping
+ |
+
+
+
+ The name of the software for which the filename is being generated. + |
+ + required + | +
+ image_type
+ |
+
+ str
+ |
+
+
+
+ The type of image for which the filename is being generated. + |
+ + required + | +
+ version
+ |
+
+ str
+ |
+
+
+
+ The version of the software or image. + |
+ + required + | +
Returns:
+Type | +Description | +
---|---|
+ str
+ |
+
+
+
+ The generated filename. + |
+
Raises:
+Type | +Description | +
---|---|
+ ValueError
+ |
+
+
+
+ If the software does not have a corresponding mapping. + |
+
+ ValueError
+ |
+
+
+
+ If no configuration is found for the given image type and no default configuration is available. + |
+
eos_downloader/models/data.py
73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 |
|
+ Bases: BaseModel
Image information for a specific image type.
+ + +Attributes:
+Name | +Type | +Description | +
---|---|---|
extension |
+
+ str
+ |
+
+
+
+ The file extension for the image type. + |
+
prepend |
+
+ str
+ |
+
+
+
+ The prefix to prepend to the filename. + |
+
The module implements version management following semantic versioning principles with custom adaptations for +Arista EOS and CloudVision Portal (CVP) software versioning schemes.
+ + +Classes:
+Name | +Description | +
---|---|
SemVer: |
+
+
+
+ Base class implementing semantic versioning with comparison and matching capabilities. + |
+
EosVersion: |
+
+
+
+ Specialized version handling for Arista EOS software releases. + |
+
CvpVersion: |
+
+
+
+ Specialized version handling for CloudVision Portal releases. + |
+
Attributes:
+Name | +Type | +Description | +
---|---|---|
major |
+
+ int
+ |
+
+
+
+ Major version number. + |
+
minor |
+
+ int
+ |
+
+
+
+ Minor version number. + |
+
patch |
+
+ int
+ |
+
+
+
+ Patch version number. + |
+
rtype |
+
+ Optional[str]
+ |
+
+
+
+ Release type (e.g., ‘M’ for maintenance, ‘F’ for feature). + |
+
other |
+
+ Any
+ |
+
+
+
+ Additional version information. + |
+
regex_version |
+
+ ClassVar[Pattern[str]]
+ |
+
+
+
+ Regular expression to extract version information. + |
+
regex_branch |
+
+ ClassVar[Pattern[str]]
+ |
+
+
+
+ Regular expression to extract branch information. + |
+
description |
+
+ str
+ |
+
+
+
+ A basic description of this class. + |
+
Examples:
+# Basic SemVer usage:
+>>> version = SemVer(major=4, minor=23, patch=3)
+'4.23.3'
+
+# EOS version handling:
+>>> eos = EosVersion.from_str('4.23.3M')
+>>> eos.branch
+'4.23'
+
+# CVP version handling:
+>>> cvp = CvpVersion.from_str('2024.1.0')
+>>> str(cvp)
+
The module enforces version format validation through regular expressions and provides +comprehensive comparison operations (==, !=, <, <=, >, >=) between versions.
+ + +
+ Bases: SemVer
A CloudVision Portal Version class that inherits from SemVer.
+This class implements version management for CloudVision Portal (CVP) versions +following a modified semantic versioning pattern where: +- major version represents the year (e.g. 2024) +- minor version represents feature releases +- patch version represents bug fixes
+ + +Examples:
+>>> version = CvpVersion(2024, 1, 0)
+>>> str(version)
+'2024.1.0'
+
Attributes:
+Name | +Type | +Description | +
---|---|---|
major |
+
+ int
+ |
+
+
+
+ The year component of the version (e.g. 2024). + |
+
minor |
+
+ int
+ |
+
+
+
+ The minor version number. + |
+
patch |
+
+ int
+ |
+
+
+
+ The patch version number. + |
+
rtype |
+
+ Optional[str]
+ |
+
+
+
+ Release type if any. + |
+
other |
+
+ Any
+ |
+
+
+
+ Additional version information if any. + |
+
regex_version |
+
+ ClassVar[Pattern[str]]
+ |
+
+
+
+ Regular expression to parse version strings. + |
+
regex_branch |
+
+ ClassVar[Pattern[str]]
+ |
+
+
+
+ Regular expression to parse branch version strings. + |
+
description |
+
+ str
+ |
+
+
+
+ Brief description of the class purpose. + |
+
+ Bases: SemVer
EosVersion object to play with version management in code.
+Since EOS is not using strictly semver approach, this class mimics some functions from the semver library for Arista EOS versions. +It is based on Pydantic and provides helpers for comparison.
+ + +Examples:
+>>> version = EosVersion(major=4, minor=21, patch=1, rtype="M")
+>>> print(version)
+EosVersion(major=4, minor=21, patch=1, rtype='M', other=None)
+>>> version = EosVersion.from_str('4.32.1F')
+>>> print(version)
+EosVersion(major=4, minor=32, patch=1, rtype='F', other=None)
+
Attributes:
+Name | +Type | +Description | +
---|---|---|
major |
+
+ int
+ |
+
+
+
+ Major version number, default is 4. + |
+
minor |
+
+ int
+ |
+
+
+
+ Minor version number, default is 0. + |
+
patch |
+
+ int
+ |
+
+
+
+ Patch version number, default is 0. + |
+
rtype |
+
+ Optional[str]
+ |
+
+
+
+ Release type, default is “F”. + |
+
other |
+
+ Any
+ |
+
+
+
+ Any other version information. + |
+
regex_version |
+
+ ClassVar[Pattern[str]]
+ |
+
+
+
+ Regular expression to extract version information. + |
+
regex_branch |
+
+ ClassVar[Pattern[str]]
+ |
+
+
+
+ Regular expression to extract branch information. + |
+
description |
+
+ str
+ |
+
+
+
+ A basic description of this class, default is “A Generic SemVer implementation”. + |
+
+ Bases: BaseModel
A class to represent a Semantic Version (SemVer) based on pydanntic.
+This class provides methods to parse, compare, and manipulate semantic versions. +It supports standard semantic versioning with optional release type and additional version information.
+ + +Examples:
+>>> version = SemVer(major=4, minor=23, patch=3, rtype="M")
+>>> str(version)
+'4.23.3M'
+
>>> version2 = SemVer.from_str('4.24.1F')
+>>> version2.branch
+'4.24'
+
>>> version < version2
+True
+
>>> version.match("<=4.24.0")
+True
+
>>> version.is_in_branch("4.23")
+True
+
Attributes:
+Name | +Type | +Description | +
---|---|---|
major |
+
+ int
+ |
+
+
+
+ Major version number. + |
+
minor |
+
+ int
+ |
+
+
+
+ Minor version number. + |
+
patch |
+
+ int
+ |
+
+
+
+ Patch version number. + |
+
rtype |
+
+ Optional[str]
+ |
+
+
+
+ Release type (e.g., ‘M’ for maintenance, ‘F’ for feature). + |
+
other |
+
+ Any
+ |
+
+
+
+ Additional version information. + |
+
regex_version |
+
+ ClassVar[Pattern[str]]
+ |
+
+
+
+ Regular expression to extract version information. + |
+
regex_branch |
+
+ ClassVar[Pattern[str]]
+ |
+
+
+
+ Regular expression to extract branch information. + |
+
description |
+
+ str
+ |
+
+
+
+ A basic description of this class. + |
+
property
+
+
+¶branch: str
+
Extract branch of version.
+ + +Returns:
+Type | +Description | +
---|---|
+ str
+ |
+
+
+
+ Branch from version. + |
+
__eq__(other)
+
Implement eq function (==)
+ +eos_downloader/models/version.py
257 +258 +259 +260 |
|
__ge__(other)
+
Implement ge function (>=)
+ +eos_downloader/models/version.py
286 +287 +288 +289 +290 |
|
__gt__(other)
+
Implement gt function (>)
+ +eos_downloader/models/version.py
280 +281 +282 +283 +284 |
|
__le__(other)
+
Implement le function (<=)
+ +eos_downloader/models/version.py
274 +275 +276 +277 +278 |
|
__lt__(other)
+
Implement lt function (<)
+ +eos_downloader/models/version.py
268 +269 +270 +271 +272 |
|
__ne__(other)
+
Implement nw function (!=)
+ +eos_downloader/models/version.py
262 +263 +264 +265 +266 |
|
__str__() -> str
+
Standard str representation.
+Return string for EOS version like 4.23.3M.
+ + +Returns:
+Type | +Description | +
---|---|
+ str
+ |
+
+
+
+ A standard EOS version string representing |
+
eos_downloader/models/version.py
190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 |
|
classmethod
+
+
+¶from_str(semver: str) -> SemVer
+
Parse a string into a SemVer object.
+This method parses a semantic version string or branch name into a SemVer object. +It supports both standard semver format (x.y.z) and branch format.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ semver
+ |
+
+ str
+ |
+
+
+
+ The version string to parse. Can be either a semantic version +string (e.g., “1.2.3”) or a branch format. + |
+ + required + | +
Returns:
+Type | +Description | +
---|---|
+ SemVer
+ |
+
+
+
+ A SemVer object representing the parsed version. +Returns an empty SemVer object if parsing fails. + |
+
Examples:
+>>> SemVer.from_str("1.2.3")
+SemVer(major=1, minor=2, patch=3)
+>>> SemVer.from_str("branch-1.2.3")
+SemVer(major=1, minor=2, patch=3)
+
eos_downloader/models/version.py
134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 |
|
is_in_branch(branch_str: str) -> bool
+
Check if current version is part of a branch version.
+Comparison is done across MAJOR and MINOR.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ branch_str
+ |
+
+ str
+ |
+
+
+
+ A string for EOS branch. It supports following formats 4.23 or 4.23.0. + |
+ + required + | +
Returns:
+Type | +Description | +
---|---|
+ bool
+ |
+
+
+
+ True if current version is in provided branch, otherwise False. + |
+
eos_downloader/models/version.py
353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 |
|
match(match_expr: str) -> bool
+
Compare self to match a match expression.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ match_expr
+ |
+
+ str
+ |
+
+
+
+ Optional operator and version; valid operators are:
+ |
+ + required + | +
Raises:
+Type | +Description | +
---|---|
+ ValueError
+ |
+
+
+
+ If input has no match_expr nor match_ver. + |
+
Returns:
+Type | +Description | +
---|---|
+ bool
+ |
+
+
+
+ True if the expression matches the version, otherwise False. + |
+
Examples:
+>>> eos_version.match("<=4.23.3M")
+True
+>>> eos_version.match("==4.23.3M")
+False
+
eos_downloader/models/version.py
292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 |
|