diff --git a/bin/oglivecli b/bin/oglivecli index b2e6e24..903a432 100755 --- a/bin/oglivecli +++ b/bin/oglivecli @@ -6,7 +6,6 @@ #@usage oglivecli Command [Options ...] #@param Command: #@param help show this help -#@param version show script version #@param config [Parameter] show configuration parameters #@param disk_usage show disk usage information #@param list_installed_oglives list installed ogLive clients @@ -21,14 +20,15 @@ #@warning This script needs "jq" command. #@version 3.0.0 - Updated with to adapt to Ogboot. #@author Ramón M. Gómez - ETSII Univ. Sevilla -#@author Ramón M. Gómez - Qindel formacion y servicios SL +#@author Qindel formacion y servicios SL #@date 2024-08-06 #*/ ## # Global constants definition. PROG=$(basename "$(realpath "$0")") # Program name. -OPENGNSYS=/opt/ogboot # OpenGnsys main directory. +PROGDIR=$(dirname "$(realpath "$0")") # Dir where program is +OPENGNSYS=$(realpath $PROGDIR/../) # ogboot main directory. DOWNLOADDIR=$OPENGNSYS/lib # Directory to store ogLive images. DOWNLOADURL="https://ognproject.evlt.uma.es/trac/downloads" # Download URL. TFTPDIR=$OPENGNSYS/tftpboot/ # TFTP directory. @@ -297,14 +297,19 @@ function install() { [ ! -r "$OGINITRD" ] && OGINITRD="$TFTPDIR/$DEFOGLIVE/oginitrd.img" if [ -r "$OGINITRD" ]; then COMPRESS=$(file -b "$OGINITRD" | awk '{print tolower($1);}') - SAMBAPASS=$($COMPRESS -dc "$OGINITRD" | \ + if [[ z$COMPRESS == zascii ]]; then + COMPRESS=cat + else + COMPRESS="$COMPRESS -dc" + fi + SAMBAPASS=$($COMPRESS "$OGINITRD" | \ cpio -i --to-stdout scripts/ogfunctions 2>/dev/null | \ sed -n '/^[ \t].*OPTIONS=/s/.*pass=\(\w*\).*/\1/p') fi rm -fr "${OGLIVEDIR}.old" 2>/dev/null mv -f "$OGLIVEDIR" "${OGLIVEDIR}.old" 2>/dev/null - TMPDIR=/tmp/$DOWNLOADDIR/ogLive + TMPDIR=$OPENGNSYS/mnt TMPDIR_SQUASHFS=/tmp/ogclient_mount mv -f "$OGLIVEFILE" "$DOWNLOADDIR/oglive.iso" 2>/dev/null || { echo "{\"error\": \"RENAME_FAILED\", \"message\": \"Cannot rename $OGLIVEFILE to oglive.iso.\"}"; exit 500; } OGLIVEFILE="$DOWNLOADDIR/oglive.iso" @@ -314,7 +319,7 @@ function install() { [ ! -d "$TMPDIR" ] && { echo "{\"error\": \"DIR_CREATION_FAILED\", \"message\": \"Failed to create/access directory $TMPDIR.\"}"; exit 500; } [ ! -d "$TMPDIR_SQUASHFS" ] && { echo "{\"error\": \"DIR_CREATION_FAILED\", \"message\": \"Failed to create/access directory $TMPDIR_SQUASHFS.\"}"; exit 500; } - trap "umount $TMPDIR; rm -fr $TMPDIR" 1 2 3 6 9 15 + trap "umount $TMPDIR" 1 2 3 6 9 15 mount "$OGLIVEFILE" >/dev/null 2>&1 || { echo "{\"error\": \"MOUNT_FAILED\", \"message\": \"Failed to mount ISO file.\"}"; exit 500; } cp -va "$TMPDIR/ogclient/"* "$OGLIVEDIR" >/dev/null 2>&1 || { echo "{\"error\": \"COPY_FAILED\", \"message\": \"Cannot copy files to $OGLIVEDIR.\"}"; exit 500; } @@ -713,7 +718,7 @@ which sponge &>/dev/null || raiseError notfound "Need to install \"moreutils\"." # Commands control. shopt -s extglob -CMDS='+(help|version|disk_usage|list_installed_oglives|check_services_status|download|install|uninstall|get_default|set_default|get_info)' +CMDS='+(help|disk_usage|list_installed_oglives|check_services_status|download|install|uninstall|get_default|set_default|get_info)' case "$1" in $CMDS) COMMAND="${1/-/}"; shift; $COMMAND "$@" ;; diff --git a/composer.lock b/composer.lock new file mode 100755 index 0000000..9147dcb --- /dev/null +++ b/composer.lock @@ -0,0 +1,9901 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "900e2adf541077af7796b30b4046589c", + "packages": [ + { + "name": "doctrine/annotations", + "version": "1.14.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/253dca476f70808a5aeed3a47cc2cc88c5cab915", + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1 || ^2", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "~1.4.10 || ^1.10.28", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.14.4" + }, + "time": "2024-09-05T10:15:52+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/collections", + "version": "2.2.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "ext-json": "*", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.2.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", + "type": "tidelift" + } + ], + "time": "2024-04-18T06:56:21+00:00" + }, + { + "name": "doctrine/common", + "version": "3.4.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "6c8fef961f67b8bc802ce3e32e3ebd1022907286" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/6c8fef961f67b8bc802ce3e32e3ebd1022907286", + "reference": "6c8fef961f67b8bc802ce3e32e3ebd1022907286", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^2.0 || ^3.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0 || ^10.0", + "doctrine/collections": "^1", + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^6.1", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/3.4.5" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2024-10-08T15:53:43+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.9.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/61446f07fcb522414d6cfd8b1c3e5f9e18c579ba", + "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.12.6", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "9.6.20", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0", + "vimeo/psalm": "4.30.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.9.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2024-10-10T17:56:43+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.13.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca59d84b8e63143ce1aed90cdb333ba329d71563", + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/dbal": "^3.7.0 || ^4.0", + "doctrine/persistence": "^2.2 || ^3", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.4 || ^8.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" + }, + "conflict": { + "doctrine/annotations": ">=3.0", + "doctrine/orm": "<2.17 || >=4.0", + "twig/twig": "<1.34 || >=2.0 <2.4" + }, + "require-dev": { + "doctrine/annotations": "^1 || ^2", + "doctrine/coding-standard": "^12", + "doctrine/deprecations": "^1.0", + "doctrine/orm": "^2.17 || ^3.0", + "friendsofphp/proxy-manager-lts": "^1.0", + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^5", + "psr/log": "^1.1.4 || ^2.0 || ^3.0", + "symfony/phpunit-bridge": "^6.1 || ^7.0", + "symfony/property-info": "^5.4 || ^6.0 || ^7.0", + "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/string": "^5.4 || ^6.0 || ^7.0", + "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", + "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "twig/twig": "^1.34 || ^2.12 || ^3.0", + "vimeo/psalm": "^5.15" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2024-09-01T09:46:40+00:00" + }, + { + "name": "doctrine/doctrine-migrations-bundle", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", + "reference": "715b62c31a5894afcb2b2cdbbc6607d7dd0580c0", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "^2.4", + "doctrine/migrations": "^3.2", + "php": "^7.2|^8.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "composer/semver": "^3.0", + "doctrine/coding-standard": "^12", + "doctrine/orm": "^2.6 || ^3", + "doctrine/persistence": "^2.0 || ^3 ", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.5|^9.5", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^3 || ^5", + "symfony/phpunit-bridge": "^6.3 || ^7", + "symfony/var-exporter": "^5.4 || ^6 || ^7", + "vimeo/psalm": "^4.30 || ^5.15" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\MigrationsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineMigrationsBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "dbal", + "migrations", + "schema" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-migrations-bundle", + "type": "tidelift" + } + ], + "time": "2024-05-14T20:32:18+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3 || ^1", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.8", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:51:15+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.30 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:15:36+00:00" + }, + { + "name": "doctrine/lexer", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/2.1.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:35:39+00:00" + }, + { + "name": "doctrine/migrations", + "version": "3.8.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "5007eb1168691225ac305fe16856755c20860842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/5007eb1168691225ac305fe16856755c20860842", + "reference": "5007eb1168691225ac305fe16856755c20860842", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/dbal": "^3.6 || ^4", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2.0", + "php": "^8.1", + "psr/log": "^1.1.3 || ^2 || ^3", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^6.2 || ^7.0" + }, + "conflict": { + "doctrine/orm": "<2.12 || >=4" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "doctrine/orm": "^2.13 || ^3", + "doctrine/persistence": "^2 || ^3", + "doctrine/sql-formatter": "^1.0", + "ext-pdo_sqlite": "*", + "fig/log-test": "^1", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-deprecation-rules": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.4", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^10.3", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." + }, + "bin": [ + "bin/doctrine-migrations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Migrations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" + } + ], + "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "dbal", + "migrations" + ], + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/3.8.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2024-10-10T21:35:27+00:00" + }, + { + "name": "doctrine/orm", + "version": "2.20.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "8ed6c2234aba019f9737a6bcc9516438e62da27c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/8ed6c2234aba019f9737a6bcc9516438e62da27c", + "reference": "8ed6c2234aba019f9737a6bcc9516438e62da27c", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.12.1 || ^2.1.1", + "doctrine/collections": "^1.5 || ^2.1", + "doctrine/common": "^3.0.3", + "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2", + "doctrine/inflector": "^1.4 || ^2.0", + "doctrine/instantiator": "^1.3 || ^2", + "doctrine/lexer": "^2 || ^3", + "doctrine/persistence": "^2.4 || ^3", + "ext-ctype": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0", + "symfony/polyfill-php72": "^1.23", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.13 || >= 3.0" + }, + "require-dev": { + "doctrine/annotations": "^1.13 || ^2", + "doctrine/coding-standard": "^9.0.2 || ^12.0", + "phpbench/phpbench": "^0.16.10 || ^1.0", + "phpstan/extension-installer": "~1.1.0 || ^1.4", + "phpstan/phpstan": "~1.4.10 || 1.12.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psr/log": "^1 || ^2 || ^3", + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "vimeo/psalm": "4.30.0 || 5.24.0" + }, + "suggest": { + "ext-dom": "Provides support for XSD validation for XML mapping files", + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/2.20.0" + }, + "time": "2024-10-11T11:47:24+00:00" + }, + { + "name": "doctrine/persistence", + "version": "3.3.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "b337726451f5d530df338fc7f68dee8781b49779" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/b337726451f5d530df338fc7f68dee8781b49779", + "reference": "b337726451f5d530df338fc7f68dee8781b49779", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^1 || ^2", + "php": "^7.2 || ^8.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "doctrine/common": "<2.10" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "doctrine/common": "^3.0", + "phpstan/phpstan": "1.11.1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", + "vimeo/psalm": "4.30.0 || 5.24.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Persistence\\": "src/Persistence" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/3.3.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2024-06-20T10:14:30+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "16ca9e39877369d664f06dacde468548298bdc40" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/16ca9e39877369d664f06dacde468548298bdc40", + "reference": "16ca9e39877369d664f06dacde468548298bdc40", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "ergebnis/phpunit-slow-test-detector": "^2.14", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "https://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.0" + }, + "time": "2024-09-11T07:29:40+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.9.3", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/a30bfe2e142720dfa990d0a7e573997f5d884215", + "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.38 || ^9.6.19", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.9.3" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-04-12T20:52:51+00:00" + }, + { + "name": "nelmio/api-doc-bundle", + "version": "v4.32.2", + "source": { + "type": "git", + "url": "https://github.com/nelmio/NelmioApiDocBundle.git", + "reference": "9587aa743bb71314e9648c6ae92eab5296ba6ef2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/9587aa743bb71314e9648c6ae92eab5296ba6ef2", + "reference": "9587aa743bb71314e9648c6ae92eab5296ba6ef2", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.4", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0", + "phpdocumentor/type-resolver": "^1.8.2", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "psr/container": "^1.0 || ^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/config": "^5.4 || ^6.4 || ^7.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.4 || ^7.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/framework-bundle": "^5.4.24 || ^6.4 || ^7.0", + "symfony/http-foundation": "^5.4 || ^6.4 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.4 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", + "symfony/property-info": "^5.4.10 || ^6.4 || ^7.0", + "symfony/routing": "^5.4 || ^6.4 || ^7.0", + "zircote/swagger-php": "^4.6.1" + }, + "conflict": { + "zircote/swagger-php": "4.8.7" + }, + "require-dev": { + "api-platform/core": "^2.7.0 || ^3", + "composer/package-versions-deprecated": "1.11.99.1", + "doctrine/annotations": "^2.0", + "friendsofphp/php-cs-fixer": "^3.52", + "friendsofsymfony/rest-bundle": "^2.8 || ^3.0", + "jms/serializer": "^1.14 || ^3.0", + "jms/serializer-bundle": "^2.3 || ^3.0 || ^4.0 || ^5.0", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.5", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^9.6 || ^10.5", + "symfony/asset": "^5.4 || ^6.4 || ^7.0", + "symfony/browser-kit": "^5.4 || ^6.4 || ^7.0", + "symfony/cache": "^5.4 || ^6.4 || ^7.0", + "symfony/dom-crawler": "^5.4 || ^6.4 || ^7.0", + "symfony/expression-language": "^5.4 || ^6.4 || ^7.0", + "symfony/form": "^5.4 || ^6.4 || ^7.0", + "symfony/phpunit-bridge": "^6.4", + "symfony/property-access": "^5.4 || ^6.4 || ^7.0", + "symfony/security-csrf": "^5.4 || ^6.4 || ^7.0", + "symfony/serializer": "^5.4 || ^6.4 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0", + "symfony/templating": "^5.4 || ^6.4 || ^7.0", + "symfony/twig-bundle": "^5.4 || ^6.4 || ^7.0", + "symfony/uid": "^5.4 || ^6.4 || ^7.0", + "symfony/validator": "^5.4 || ^6.4 || ^7.0", + "willdurand/hateoas-bundle": "^1.0 || ^2.0" + }, + "suggest": { + "api-platform/core": "For using an API oriented framework.", + "doctrine/annotations": "For using doctrine annotations", + "friendsofsymfony/rest-bundle": "For using the parameters annotations.", + "jms/serializer-bundle": "For describing your models.", + "symfony/asset": "For using the Swagger UI.", + "symfony/cache": "For using a PSR-6 compatible cache implementation with the API doc generator.", + "symfony/form": "For describing your form type models.", + "symfony/monolog-bundle": "For using a PSR-3 compatible logger implementation with the API PHP describer.", + "symfony/security-csrf": "For using csrf protection tokens in forms.", + "symfony/serializer": "For describing your models.", + "symfony/twig-bundle": "For using the Swagger UI.", + "symfony/validator": "For describing the validation constraints in your models.", + "willdurand/hateoas-bundle": "For extracting HATEOAS metadata." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Nelmio\\ApiDocBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://github.com/nelmio/NelmioApiDocBundle/contributors" + } + ], + "description": "Generates documentation for your REST API from annotations and attributes", + "keywords": [ + "api", + "doc", + "documentation", + "rest" + ], + "support": { + "issues": "https://github.com/nelmio/NelmioApiDocBundle/issues", + "source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.32.2" + }, + "funding": [ + { + "url": "https://github.com/DjordyKoert", + "type": "github" + } + ], + "time": "2024-10-17T22:14:28+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1" + }, + "time": "2024-05-21T05:55:05+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "153ae662783729388a584b4361f2545e4d841e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" + }, + "time": "2024-02-23T11:10:43+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.33.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0" + }, + "time": "2024-10-13T11:25:22+00:00" + }, + { + "name": "psr/cache", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/2.0.0" + }, + "time": "2021-02-03T23:23:37+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/link", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/link.git", + "reference": "846c25f58a1f02b93a00f2404e3626b6bf9b7807" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/link/zipball/846c25f58a1f02b93a00f2404e3626b6bf9b7807", + "reference": "846c25f58a1f02b93a00f2404e3626b6bf9b7807", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Link\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for HTTP links", + "homepage": "https://github.com/php-fig/link", + "keywords": [ + "http", + "http-link", + "link", + "psr", + "psr-13", + "rest" + ], + "support": { + "source": "https://github.com/php-fig/link/tree/1.1.1" + }, + "time": "2021-03-11T22:59:13+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "symfony/amqp-messenger", + "version": "v5.4.41", + "source": { + "type": "git", + "url": "https://github.com/symfony/amqp-messenger.git", + "reference": "ccadd8d21b34751f253c88cfc1ac3ae2c6d5ebae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/ccadd8d21b34751f253c88cfc1ac3ae2c6d5ebae", + "reference": "ccadd8d21b34751f253c88cfc1ac3ae2c6d5ebae", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/messenger": "^5.3|^6.0" + }, + "require-dev": { + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "type": "symfony-messenger-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\Bridge\\Amqp\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony AMQP extension Messenger Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.41" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-16T20:56:25+00:00" + }, + { + "name": "symfony/asset", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/asset.git", + "reference": "e5aa241b4914257164b39c3c2678b2c41b7671e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/asset/zipball/e5aa241b4914257164b39c3c2678b2c41b7671e3", + "reference": "e5aa241b4914257164b39c3c2678b2c41b7671e3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/http-foundation": "<5.3" + }, + "require-dev": { + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/http-foundation": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Asset\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/asset/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/cache", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "4b3e7bf157b8b5a010865701d9106b5f0a9c99a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/4b3e7bf157b8b5a010865701d9106b5f0a9c99a8", + "reference": "4b3e7bf157b8b5a010865701d9106b5f0a9c99a8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0|2.0", + "symfony/cache-implementation": "1.0|2.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6|^2.0", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-13T16:57:39+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v2.5.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "fee6db04d913094e2fb55ff8e7db5685a8134463" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/fee6db04d913094e2fb55ff8e7db5685a8134463", + "reference": "fee6db04d913094e2fb55ff8e7db5685a8134463", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/config", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/d4e1db78421163b98dd9971d247fd0df4a57ee5e", + "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22" + }, + "conflict": { + "symfony/finder": "<4.4" + }, + "require-dev": { + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "5b5a0aa66e3296e303e22490f90f521551835a83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/5b5a0aa66e3296e303e22490f90f521551835a83", + "reference": "5b5a0aa66e3296e303e22490f90f521551835a83", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T07:56:40+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "23eb9f3803a931aef16a65f362a9aeb0640a1374" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/23eb9f3803a931aef16a65f362a9aeb0640a1374", + "reference": "23eb9f3803a931aef16a65f362a9aeb0640a1374", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<5.3", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4.26" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0|2.0" + }, + "require-dev": { + "symfony/config": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4.26|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-12T20:01:35+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "259e525841c55193dfd9278f856c79c8f20155eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/259e525841c55193dfd9278f856c79c8f20155eb", + "reference": "259e525841c55193dfd9278f856c79c8f20155eb", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "~1.0", + "doctrine/persistence": "^2|^3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "doctrine/lexer": "<1.1", + "doctrine/orm": "<2.7.4", + "symfony/cache": "<5.4", + "symfony/dependency-injection": "<4.4", + "symfony/form": "<5.4.38|>=6,<6.4.6", + "symfony/http-kernel": "<5", + "symfony/messenger": "<4.4", + "symfony/property-info": "<5", + "symfony/proxy-manager-bridge": "<4.4.19", + "symfony/security-bundle": "<5", + "symfony/security-core": "<5.3", + "symfony/validator": "<5.4.25|>=6,<6.2.12|>=6.3,<6.3.1" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "doctrine/collections": "^1.0|^2.0", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/orm": "^2.7.4|^3", + "psr/log": "^1|^2|^3", + "symfony/cache": "^5.4|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/doctrine-messenger": "^5.1|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/form": "^5.4.38|^6.4.6", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.0|^6.0", + "symfony/property-info": "^5.0|^6.0", + "symfony/proxy-manager-bridge": "^4.4|^5.0|^6.0", + "symfony/security-core": "^5.3|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "symfony/validator": "^5.4.25|~6.2.12|^6.3.1", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Doctrine with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-08T09:19:02+00:00" + }, + { + "name": "symfony/doctrine-messenger", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-messenger.git", + "reference": "5c3570b01e6d413daf858da52f3f6478ded3f8cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/5c3570b01e6d413daf858da52f3f6478ded3f8cf", + "reference": "5c3570b01e6d413daf858da52f3f6478ded3f8cf", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/messenger": "^5.1|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "doctrine/dbal": "<2.13", + "doctrine/persistence": "<1.3" + }, + "require-dev": { + "doctrine/dbal": "^2.13|^3|^4", + "doctrine/persistence": "^1.3|^2|^3", + "symfony/property-access": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "type": "symfony-messenger-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Messenger Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T07:56:40+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "bb4fef2bf035a50170fd95e5b146152834126008" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/bb4fef2bf035a50170fd95e5b146152834126008", + "reference": "bb4fef2bf035a50170fd95e5b146152834126008", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "source": "https://github.com/symfony/dotenv/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-16T09:39:25+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.4.42", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "db15ba0fd50890156ed40087ccedc7851a1f5b76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/db15ba0fd50890156ed40087ccedc7851a1f5b76", + "reference": "db15ba0fd50890156ed40087ccedc7851a1f5b76", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.4.42" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-23T12:34:05+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a54e2a8a114065f31020d6a89ede83e34c3b27a4", + "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "9d23f7bfd1d602fddc6d6520decedc99739497dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/9d23f7bfd1d602fddc6d6520decedc99739497dd", + "reference": "9d23f7bfd1d602fddc6d6520decedc99739497dd", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an engine that can compile and evaluate expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/expression-language/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-09T07:10:35+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/76c3818964e9d32be3862c9318ae3ba9aa280ddc", + "reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/process": "^5.4|^6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-16T14:52:48+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "ae25a9145a900764158d439653d5630191155ca0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/ae25a9145a900764158d439653d5630191155ca0", + "reference": "ae25a9145a900764158d439653d5630191155ca0", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-13T14:03:51+00:00" + }, + { + "name": "symfony/flex", + "version": "v1.21.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/flex.git", + "reference": "bda5f869ac51c8e985a6fe9f964c4cb78228a369" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/flex/zipball/bda5f869ac51c8e985a6fe9f964c4cb78228a369", + "reference": "bda5f869ac51c8e985a6fe9f964c4cb78228a369", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": ">=7.1" + }, + "conflict": { + "composer/semver": "<1.7.2" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "symfony/dotenv": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/phpunit-bridge": "^4.4.12|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Flex\\Flex" + }, + "autoload": { + "psr-4": { + "Symfony\\Flex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "Composer plugin for Symfony", + "support": { + "issues": "https://github.com/symfony/flex/issues", + "source": "https://github.com/symfony/flex/tree/v1.21.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-07T08:51:39+00:00" + }, + { + "name": "symfony/form", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/form.git", + "reference": "4f3d91f8a7626e3cab9e3d2952321df10013a6eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/form/zipball/4f3d91f8a7626e3cab9e3d2952321df10013a6eb", + "reference": "4f3d91f8a7626e3cab9e3d2952321df10013a6eb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/options-resolver": "^5.1|^6.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.23", + "symfony/property-access": "^5.0.8|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/dependency-injection": "<4.4", + "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7", + "symfony/error-handler": "<4.4.5", + "symfony/framework-bundle": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3", + "symfony/translation-contracts": "<1.1.7", + "symfony/twig-bridge": "<5.4.21|>=6,<6.2.7" + }, + "require-dev": { + "doctrine/collections": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/security-csrf": "^4.4|^5.0|^6.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3", + "symfony/uid": "^5.1|^6.0", + "symfony/validator": "^4.4.17|^5.1.9|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/security-csrf": "For protecting forms against CSRF attacks.", + "symfony/twig-bridge": "For templating with Twig.", + "symfony/validator": "For form validation." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Form\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows to easily create, process and reuse HTML forms", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/form/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T07:56:40+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "9ae1957fb817c0fec6d171931f675895a434d988" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/9ae1957fb817c0fec6d171931f675895a434d988", + "reference": "9ae1957fb817c0fec6d171931f675895a434d988", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/cache": "^5.2|^6.0", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^5.4.44|^6.0.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4.1|^5.0.1|^6.0", + "symfony/event-dispatcher": "^5.1|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^5.4.24|^6.2.11", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/routing": "^5.3|^6.0" + }, + "conflict": { + "doctrine/annotations": "<1.13.1", + "doctrine/cache": "<1.11", + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/asset": "<5.3", + "symfony/console": "<5.2.5|>=7.0", + "symfony/dom-crawler": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/form": "<5.2", + "symfony/http-client": "<4.4", + "symfony/lock": "<4.4", + "symfony/mailer": "<5.2", + "symfony/messenger": "<5.4", + "symfony/mime": "<4.4", + "symfony/property-access": "<5.3", + "symfony/property-info": "<4.4", + "symfony/security-csrf": "<5.3", + "symfony/serializer": "<5.2", + "symfony/service-contracts": ">=3.0", + "symfony/stopwatch": "<4.4", + "symfony/translation": "<5.3", + "symfony/twig-bridge": "<4.4", + "symfony/twig-bundle": "<4.4", + "symfony/validator": "<5.3.11", + "symfony/web-profiler-bundle": "<4.4", + "symfony/workflow": "<5.2" + }, + "require-dev": { + "doctrine/annotations": "^1.13.1|^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/persistence": "^1.3|^2|^3", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^5.3|^6.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/console": "^5.4.9|^6.0.9", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dom-crawler": "^4.4.30|^5.3.7|^6.0", + "symfony/dotenv": "^5.1|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/form": "^5.2|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/mailer": "^5.2|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/notifier": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/property-info": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0", + "symfony/security-bundle": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/string": "^5.0|^6.0", + "symfony/translation": "^5.3|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "symfony/validator": "^5.3.11|^6.0", + "symfony/web-link": "^4.4|^5.0|^6.0", + "symfony/workflow": "^5.2|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^2.10|^3.0.4" + }, + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T08:11:35+00:00" + }, + { + "name": "symfony/http-client", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "58d3dc6bfa5fb37137e32d52ddc202ba4d1cea04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/58d3dc6bfa5fb37137e32d52ddc202ba4d1cea04", + "reference": "58d3dc6bfa5fb37137e32d52ddc202ba4d1cea04", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-client-contracts": "^2.5.3", + "symfony/polyfill-php73": "^1.11", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.0|^2|^3" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "2.4" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4.13|^5.1.5|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-16T14:04:28+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.5.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1", + "reference": "e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-26T19:42:53+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "ae0d217e5932aa0b70ddb4cf7822cc76d48aee53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ae0d217e5932aa0b70ddb4cf7822cc76d48aee53", + "reference": "ae0d217e5932aa0b70ddb4cf7822cc76d48aee53", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "^1.0|^2.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-15T07:55:06+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "788dcf72d9af7432a886aa3b0c5904d68087ba13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/788dcf72d9af7432a886aa3b0c5904d68087ba13", + "reference": "788dcf72d9af7432a886aa3b0c5904d68087ba13", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^5.0|^6.0", + "symfony/http-foundation": "^5.4.21|^6.2.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/var-dumper": "^4.4.31|^5.4", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-21T05:47:58+00:00" + }, + { + "name": "symfony/intl", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "e4171a01aaa3789f351b5d58f9567b0fb81a0918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/e4171a01aaa3789f351b5d58f9567b0fb81a0918", + "reference": "e4171a01aaa3789f351b5d58f9567b0fb81a0918", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/", + "/Resources/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a PHP replacement layer for the C intl extension that includes additional data from the ICU library", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "support": { + "source": "https://github.com/symfony/intl/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T07:56:40+00:00" + }, + { + "name": "symfony/mailer", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "2a5e44d984872cb161b24fc4dedba7fd7632185f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/2a5e44d984872cb161b24fc4dedba7fd7632185f", + "reference": "2a5e44d984872cb161b24fc4dedba7fd7632185f", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=7.2.5", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/mime": "^5.2.6|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<4.4" + }, + "require-dev": { + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-08T09:19:02+00:00" + }, + { + "name": "symfony/messenger", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/messenger.git", + "reference": "e37c51b0740300f3a36f98ffb7125389f1e278c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/messenger/zipball/e37c51b0740300f3a36f98ffb7125389f1e278c1", + "reference": "e37c51b0740300f3a36f98ffb7125389f1e278c1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/amqp-messenger": "^5.1|^6.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/doctrine-messenger": "^5.1|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/redis-messenger": "^5.1|^6.0" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4", + "symfony/framework-bundle": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/serializer": "<5.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/serializer": "^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/validator": "^4.4|^5.0|^6.0" + }, + "suggest": { + "enqueue/messenger-adapter": "For using the php-enqueue library as a transport." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Roze", + "email": "samuel.roze@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps applications send and receive messages to/from other applications or via message queues", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/messenger/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-08T09:19:02+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "a02711d6ce461edada8c0f8641aa536709b99b47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/a02711d6ce461edada8c0f8641aa536709b99b47", + "reference": "a02711d6ce461edada8c0f8641aa536709b99b47", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-13T10:38:38+00:00" + }, + { + "name": "symfony/monolog-bridge", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bridge.git", + "reference": "ac6e0bf2a275e017c1dedd54dd0f1fbf252a9351" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/ac6e0bf2a275e017c1dedd54dd0f1fbf252a9351", + "reference": "ac6e0bf2a275e017c1dedd54dd0f1fbf252a9351", + "shasum": "" + }, + "require": { + "monolog/monolog": "^1.25.1|^2", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^5.3|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/http-foundation": "<5.3" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/mailer": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/security-core": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", + "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", + "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Monolog\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Monolog with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/monolog-bridge/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/monolog-bundle", + "version": "v3.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bundle.git", + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181", + "shasum": "" + }, + "require": { + "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0", + "php": ">=7.2.5", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", + "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^6.3 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MonologBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony MonologBundle", + "homepage": "https://symfony.com", + "keywords": [ + "log", + "logging" + ], + "support": { + "issues": "https://github.com/symfony/monolog-bundle/issues", + "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-06T17:08:13+00:00" + }, + { + "name": "symfony/notifier", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/notifier.git", + "reference": "1507e437c76a72211c341d9b1838c771964e1981" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/notifier/zipball/1507e437c76a72211c341d9b1838c771964e1981", + "reference": "1507e437c76a72211c341d9b1838c771964e1981", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/discord-notifier": "<5.3", + "symfony/esendex-notifier": "<5.3", + "symfony/firebase-notifier": "<5.3", + "symfony/free-mobile-notifier": "<5.3", + "symfony/google-chat-notifier": "<5.3", + "symfony/http-kernel": "<4.4", + "symfony/infobip-notifier": "<5.3", + "symfony/linked-in-notifier": "<5.3", + "symfony/mattermost-notifier": "<5.3", + "symfony/mobyt-notifier": "<5.3", + "symfony/nexmo-notifier": "<5.3", + "symfony/ovh-cloud-notifier": "<5.3", + "symfony/rocket-chat-notifier": "<5.3", + "symfony/sendinblue-notifier": "<5.3", + "symfony/sinch-notifier": "<5.3", + "symfony/slack-notifier": "<5.3", + "symfony/sms77-notifier": "<5.3", + "symfony/smsapi-notifier": "<5.3", + "symfony/telegram-notifier": "<5.3", + "symfony/twilio-notifier": "<5.3", + "symfony/zulip-notifier": "<5.3" + }, + "require-dev": { + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/http-client-contracts": "^2|^3", + "symfony/messenger": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Notifier\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Sends notifications via one or more channels (email, SMS, ...)", + "homepage": "https://symfony.com", + "keywords": [ + "notification", + "notifier" + ], + "support": { + "source": "https://github.com/symfony/notifier/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-08T09:19:02+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/bd1afbde6613a8d6b956115e0e14b196191fd0c4", + "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/password-hasher", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "21b98178ab2024e6c7d8ab72cca9ba16015c6093" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/21b98178ab2024e6c7d8ab72cca9ba16015c6093", + "reference": "21b98178ab2024e6c7d8ab72cca9ba16015c6093", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/security-core": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0", + "symfony/security-core": "^5.3|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance and support of other locales than \"en\"" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Icu\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "1b9fa82b5c62cd49da8c9e3952dd8531ada65096" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/1b9fa82b5c62cd49da8c9e3952dd8531ada65096", + "reference": "1b9fa82b5c62cd49da8c9e3952dd8531ada65096", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-17T12:46:43+00:00" + }, + { + "name": "symfony/property-access", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "2d751866b976a02e22743359733edc55cd20e9fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/2d751866b976a02e22743359733edc55cd20e9fd", + "reference": "2d751866b976a02e22743359733edc55cd20e9fd", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/property-info": "^5.2|^6.0" + }, + "require-dev": { + "symfony/cache": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-29T08:50:14+00:00" + }, + { + "name": "symfony/property-info", + "version": "v5.4.42", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "825aa937f6e8cd63dcc118d0af84d7d4979cddf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/825aa937f6e8cd63dcc118d0af84d7d4979cddf4", + "reference": "825aa937f6e8cd63dcc118d0af84d7d4979cddf4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v5.4.42" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-22T18:03:36+00:00" + }, + { + "name": "symfony/redis-messenger", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/redis-messenger.git", + "reference": "df48a300cc4537c0e152551651e72da59b03f7d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/df48a300cc4537c0e152551651e72da59b03f7d5", + "reference": "df48a300cc4537c0e152551651e72da59b03f7d5", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/messenger": "^5.1|^6.0" + }, + "require-dev": { + "symfony/property-access": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "type": "symfony-messenger-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\Bridge\\Redis\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Redis extension Messenger Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/redis-messenger/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-13T14:35:43+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "b6f71780bbdd5e93e1c5638671cf0ba42aa8c6d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/b6f71780bbdd5e93e1c5638671cf0ba42aa8c6d8", + "reference": "b6f71780bbdd5e93e1c5638671cf0ba42aa8c6d8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-27T06:36:52+00:00" + }, + { + "name": "symfony/runtime", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/runtime.git", + "reference": "50096d4ebebb4f9c41b87695868a6e34bdbf7cde" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/runtime/zipball/50096d4ebebb4f9c41b87695868a6e34bdbf7cde", + "reference": "50096d4ebebb4f9c41b87695868a6e34bdbf7cde", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/dotenv": "<5.1" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "symfony/console": "^4.4.30|^5.4.9|^6.0.9", + "symfony/dotenv": "^5.1|^6.0", + "symfony/http-foundation": "^4.4.30|^5.3.7|^6.0", + "symfony/http-kernel": "^4.4.30|^5.3.7|^6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin" + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Runtime\\": "", + "Symfony\\Runtime\\Symfony\\Component\\": "Internal/" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Enables decoupling PHP applications from global state", + "homepage": "https://symfony.com", + "keywords": [ + "runtime" + ], + "support": { + "source": "https://github.com/symfony/runtime/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/security-bundle", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-bundle.git", + "reference": "f14a15c6c7bb37879d59c129d96c4c07c7d5db32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/f14a15c6c7bb37879d59c129d96c4c07c7d5db32", + "reference": "f14a15c6c7bb37879d59c129d96c4c07c7d5db32", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4.43|^6.4.11", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher": "^5.1|^6.0", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/http-kernel": "^5.3|^6.0", + "symfony/password-hasher": "^5.3|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/security-core": "^5.4|^6.0", + "symfony/security-csrf": "^4.4|^5.0|^6.0", + "symfony/security-guard": "^5.3", + "symfony/security-http": "^5.4.30|^6.3.6", + "symfony/service-contracts": "^1.10|^2|^3" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/console": "<4.4", + "symfony/framework-bundle": "<4.4", + "symfony/ldap": "<5.1", + "symfony/twig-bundle": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "symfony/asset": "^4.4|^5.0|^6.0", + "symfony/browser-kit": "^4.4|^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/form": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^5.3|^6.0", + "symfony/ldap": "^5.3|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/twig-bridge": "^4.4|^5.0|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "symfony/validator": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-bundle/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-19T09:13:19+00:00" + }, + { + "name": "symfony/security-core", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "8089509e8c92e884fa27af56596576320c3b310d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/8089509e8c92e884fa27af56596576320c3b310d", + "reference": "8089509e8c92e884fa27af56596576320c3b310d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^1.1|^2|^3", + "symfony/password-hasher": "^5.3|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1.6|^2|^3" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4", + "symfony/http-foundation": "<5.3", + "symfony/ldap": "<4.4", + "symfony/security-guard": "<4.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3", + "symfony/validator": "<5.2" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "psr/container": "^1.0|^2.0", + "psr/log": "^1|^2|^3", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/ldap": "^4.4|^5.0|^6.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3", + "symfony/validator": "^5.2|^6.0" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-01T10:41:54+00:00" + }, + { + "name": "symfony/security-csrf", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-csrf.git", + "reference": "9058d522c1c33d7ba13f4b3c79555cc2c4c16028" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/9058d522c1c33d7ba13f4b3c79555cc2c4c16028", + "reference": "9058d522c1c33d7ba13f4b3c79555cc2c4c16028", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/security-core": "^4.4|^5.0|^6.0" + }, + "conflict": { + "symfony/http-foundation": "<5.3" + }, + "require-dev": { + "symfony/http-foundation": "^5.3|^6.0" + }, + "suggest": { + "symfony/http-foundation": "For using the class SessionTokenStorage." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - CSRF Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-csrf/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/security-guard", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-guard.git", + "reference": "d930fd327c290f451c9d8dd7889169195d4484e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-guard/zipball/d930fd327c290f451c9d8dd7889169195d4484e9", + "reference": "d930fd327c290f451c9d8dd7889169195d4484e9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.15", + "symfony/security-core": "^5.0", + "symfony/security-http": "^5.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Guard\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Guard", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-guard/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/security-http", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-http.git", + "reference": "c0f81598425c170807f19b9a5413ad05323f317b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-http/zipball/c0f81598425c170807f19b9a5413ad05323f317b", + "reference": "c0f81598425c170807f19b9a5413ad05323f317b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/http-kernel": "^5.3|^6.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/property-access": "^4.4|^5.0|^6.0", + "symfony/security-core": "^5.4.19|~6.0.19|~6.1.11|^6.2.5", + "symfony/service-contracts": "^1.10|^2|^3" + }, + "conflict": { + "symfony/event-dispatcher": "<4.3", + "symfony/security-bundle": "<5.3", + "symfony/security-csrf": "<4.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/security-csrf": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", + "symfony/security-csrf": "For using tokens to protect authentication/logout attempts" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Http\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - HTTP Integration", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-http/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-11T06:50:28+00:00" + }, + { + "name": "symfony/serializer", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "0f100dfa5b3bc8b052d15940d1168e5fa1e1a59a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/0f100dfa5b3bc8b052d15940d1168e5fa1e1a59a", + "reference": "0f100dfa5b3bc8b052d15940d1168e5fa1e1a59a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4.24|>=6,<6.2.11", + "symfony/uid": "<5.3", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/form": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/property-access": "^5.4.26|^6.3", + "symfony/property-info": "^5.4.24|^6.2.11", + "symfony/uid": "^5.3|^6.0", + "symfony/validator": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0", + "symfony/var-exporter": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/cache-implementation": "For using the metadata cache.", + "symfony/config": "For using the XML mapping loader.", + "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", + "symfony/property-access": "For using the ObjectNormalizer.", + "symfony/property-info": "To deserialize relations.", + "symfony/var-exporter": "For using the metadata compiler.", + "symfony/yaml": "For using the default YAML mapping loader." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T07:56:40+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3", + "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-21T15:04:16+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0e9daf3b7c805c747638b2cc48f1649e594f9625", + "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "832caa16b6d9aac6bf11747315225f5aba384c24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/832caa16b6d9aac6bf11747315225f5aba384c24", + "reference": "832caa16b6d9aac6bf11747315225f5aba384c24", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T07:56:40+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "6fed3a20b5b87ee9cdd9dacf545922b8fd475921" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/6fed3a20b5b87ee9cdd9dacf545922b8fd475921", + "reference": "6fed3a20b5b87ee9cdd9dacf545922b8fd475921", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/console": "<5.3", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-15T08:12:35+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.5.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b0073a77ac0b7ea55131020e87b1e3af540f4664" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b0073a77ac0b7ea55131020e87b1e3af540f4664", + "reference": "b0073a77ac0b7ea55131020e87b1e3af540f4664", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/twig-bridge", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "d049fbe0e5ba0ad758f647fa8f99e840bca43f6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d049fbe0e5ba0ad758f647fa8f99e840bca43f6f", + "reference": "d049fbe0e5ba0ad758f647fa8f99e840bca43f6f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^1.1|^2|^3", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/console": "<5.3", + "symfony/form": "<5.4.21|>=6,<6.2.7", + "symfony/http-foundation": "<5.3", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.2", + "symfony/workflow": "<5.2" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "egulias/email-validator": "^2.1.10|^3|^4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^4.4|^5.0|^6.0", + "symfony/console": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/form": "^5.4.21|^6.2.7", + "symfony/http-foundation": "^5.3|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/mime": "^5.2|^6.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^4.4|^5.0|^6.0", + "symfony/security-csrf": "^4.4|^5.0|^6.0", + "symfony/security-http": "^4.4|^5.0|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^5.2|^6.0", + "symfony/web-link": "^4.4|^5.0|^6.0", + "symfony/workflow": "^5.2|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/cssinliner-extra": "^2.12|^3", + "twig/inky-extra": "^2.12|^3", + "twig/markdown-extra": "^2.12|^3" + }, + "suggest": { + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Twig with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-11T13:27:43+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "b94414b3b9e0c523677c0bf31e8975231b55f18a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/b94414b3b9e0c523677c0bf31e8975231b55f18a", + "reference": "b94414b3b9e0c523677c0bf31e8975231b55f18a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/twig-bridge": "^5.3|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "symfony/dependency-injection": "<5.3", + "symfony/framework-bundle": "<5.0", + "symfony/service-contracts": ">=3.0", + "symfony/translation": "<5.0" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "doctrine/cache": "^1.0|^2.0", + "symfony/asset": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/form": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^5.0|^6.0", + "symfony/web-link": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of Twig into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-07T13:25:07+00:00" + }, + { + "name": "symfony/validator", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "5b061420daf15b58e1599cd2191b0780ddcd2157" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/5b061420daf15b58e1599cd2191b0780ddcd2157", + "reference": "5b061420daf15b58e1599cd2191b0780ddcd2157", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/translation-contracts": "^1.1|^2|^3" + }, + "conflict": { + "doctrine/annotations": "<1.13", + "doctrine/cache": "<1.11", + "doctrine/lexer": "<1.1", + "symfony/dependency-injection": "<4.4", + "symfony/expression-language": "<5.1", + "symfony/http-kernel": "<4.4", + "symfony/intl": "<4.4", + "symfony/property-info": "<5.3", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.13|^2", + "doctrine/cache": "^1.11|^2.0", + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^5.1|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.3|^6.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "egulias/email-validator": "Strict (RFC compliant) email validation", + "psr/cache-implementation": "For using the mapping cache.", + "symfony/config": "", + "symfony/expression-language": "For using the Expression validator and the ExpressionLanguageSyntax constraints", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For accessing properties within comparison constraints", + "symfony/property-info": "To automatically add NotNull and Type constraints", + "symfony/translation": "For translating validation errors.", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/bin/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to validate values", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/validator/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-19T08:27:53+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "6be6a6a8af4818564e3726fc65cf936f34743cef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6be6a6a8af4818564e3726fc65cf936f34743cef", + "reference": "6be6a6a8af4818564e3726fc65cf936f34743cef", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-30T16:01:46+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-24T15:53:56+00:00" + }, + { + "name": "symfony/web-link", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-link.git", + "reference": "2615fe9ec22e210f06826d8ef4c32249ff9bfc01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-link/zipball/2615fe9ec22e210f06826d8ef4c32249ff9bfc01", + "reference": "2615fe9ec22e210f06826d8ef4c32249ff9bfc01", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/link": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/http-kernel": "<5.3" + }, + "provide": { + "psr/link-implementation": "1.0" + }, + "require-dev": { + "symfony/http-kernel": "^5.3|^6.0" + }, + "suggest": { + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\WebLink\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Manages links between resources", + "homepage": "https://symfony.com", + "keywords": [ + "dns-prefetch", + "http", + "http2", + "link", + "performance", + "prefetch", + "preload", + "prerender", + "psr13", + "push" + ], + "support": { + "source": "https://github.com/symfony/web-link/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "7025b964f123bbf1896d7563db6ec7f1f63e918a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/7025b964f123bbf1896d7563db6ec7f1f63e918a", + "reference": "7025b964f123bbf1896d7563db6ec7f1f63e918a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-16T14:36:56+00:00" + }, + { + "name": "twig/extra-bundle", + "version": "v3.13.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "21a9a7aa9f79d4493bb6fed4eb2794339f9551f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/21a9a7aa9f79d4493bb6fed4eb2794339f9551f5", + "reference": "21a9a7aa9f79d4493bb6fed4eb2794339f9551f5", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/framework-bundle": "^5.4|^6.4|^7.0", + "symfony/twig-bundle": "^5.4|^6.4|^7.0", + "twig/twig": "^3.0|^4.0" + }, + "require-dev": { + "league/commonmark": "^1.0|^2.0", + "symfony/phpunit-bridge": "^6.4|^7.0", + "twig/cache-extra": "^3.0", + "twig/cssinliner-extra": "^3.0", + "twig/html-extra": "^3.0", + "twig/inky-extra": "^3.0", + "twig/intl-extra": "^3.0", + "twig/markdown-extra": "^3.0", + "twig/string-extra": "^3.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.13.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2024-09-01T20:39:12+00:00" + }, + { + "name": "twig/twig", + "version": "v3.14.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php81": "^1.29" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.14.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2024-09-09T17:55:12+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "zircote/swagger-php", + "version": "4.11.1", + "source": { + "type": "git", + "url": "https://github.com/zircote/swagger-php.git", + "reference": "7df10e8ec47db07c031db317a25bef962b4e5de1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/7df10e8ec47db07c031db317a25bef962b4e5de1", + "reference": "7df10e8ec47db07c031db317a25bef962b4e5de1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.2", + "psr/log": "^1.1 || ^2.0 || ^3.0", + "symfony/deprecation-contracts": "^2 || ^3", + "symfony/finder": ">=2.2", + "symfony/yaml": ">=3.3" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11", + "doctrine/annotations": "^1.7 || ^2.0", + "friendsofphp/php-cs-fixer": "^2.17 || 3.62.0", + "phpstan/phpstan": "^1.6", + "phpunit/phpunit": ">=8", + "vimeo/psalm": "^4.23" + }, + "suggest": { + "doctrine/annotations": "^1.7 || ^2.0" + }, + "bin": [ + "bin/openapi" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "OpenApi\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Robert Allen", + "email": "zircote@gmail.com" + }, + { + "name": "Bob Fanger", + "email": "bfanger@gmail.com", + "homepage": "https://bfanger.nl" + }, + { + "name": "Martin Rademacher", + "email": "mano@radebatz.net", + "homepage": "https://radebatz.net" + } + ], + "description": "swagger-php - Generate interactive documentation for your RESTful API using phpdoc annotations", + "homepage": "https://github.com/zircote/swagger-php/", + "keywords": [ + "api", + "json", + "rest", + "service discovery" + ], + "support": { + "issues": "https://github.com/zircote/swagger-php/issues", + "source": "https://github.com/zircote/swagger-php/tree/4.11.1" + }, + "time": "2024-10-15T19:20:02+00:00" + } + ], + "packages-dev": [ + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.19.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.1" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4" + }, + "time": "2024-09-29T15:01:53+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "7.0.17", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/40a4ed114a4aea5afd6df8d0f0c9cd3033097f66", + "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": ">=7.2", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.1.3 || ^4.0", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^4.2.2", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.2.2" + }, + "suggest": { + "ext-xdebug": "^2.7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.17" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:09:37+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "69deeb8664f611f156a924154985fbd4911eb36b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/69deeb8664f611f156a924154985fbd4911eb36b", + "reference": "69deeb8664f611f156a924154985fbd4911eb36b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-01T13:39:50+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + }, + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a691211e94ff39a34811abd521c31bd5b305b0bb", + "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-01T13:42:41+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", + "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "abandoned": true, + "time": "2020-08-04T08:28:15+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "8.5.40", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "48ed828b72c35b38cdddcd9059339734cb06b3a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/48ed828b72c35b38cdddcd9059339734cb06b3a7", + "reference": "48ed828b72c35b38cdddcd9059339734cb06b3a7", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.2", + "phpunit/php-code-coverage": "^7.0.17", + "phpunit/php-file-iterator": "^2.0.6", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1.4", + "sebastian/comparator": "^3.0.5", + "sebastian/diff": "^3.0.6", + "sebastian/environment": "^4.2.5", + "sebastian/exporter": "^3.1.6", + "sebastian/global-state": "^3.0.5", + "sebastian/object-enumerator": "^3.0.5", + "sebastian/resource-operations": "^2.0.3", + "sebastian/type": "^1.1.5", + "sebastian/version": "^2.0.1" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage", + "phpunit/php-invoker": "To allow enforcing time limits" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.40" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-09-19T10:47:04+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", + "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-01T13:45:45+00:00" + }, + { + "name": "sebastian/comparator", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc7ceb4a24aede938c7af2a9ed1de09609ca770", + "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:31:48+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/98ff311ca519c3aa73ccd3de053bdb377171d7b6", + "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:16:36+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.2.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "56932f6049a0482853056ffd617c91ffcc754205" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/56932f6049a0482853056ffd617c91ffcc754205", + "reference": "56932f6049a0482853056ffd617c91ffcc754205", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/4.2.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-01T13:49:59+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "1939bc8fd1d39adcfa88c5b35335910869214c56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/1939bc8fd1d39adcfa88c5b35335910869214c56", + "reference": "1939bc8fd1d39adcfa88c5b35335910869214c56", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:21:38+00:00" + }, + { + "name": "sebastian/global-state", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "91c7c47047a971f02de57ed6f040087ef110c5d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/91c7c47047a971f02de57ed6f040087ef110c5d9", + "reference": "91c7c47047a971f02de57ed6f040087ef110c5d9", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:13:16+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "ac5b293dba925751b808e02923399fb44ff0d541" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/ac5b293dba925751b808e02923399fb44ff0d541", + "reference": "ac5b293dba925751b808e02923399fb44ff0d541", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-01T13:54:02+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "1d439c229e61f244ff1f211e5c99737f90c67def" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d439c229e61f244ff1f211e5c99737f90c67def", + "reference": "1d439c229e61f244ff1f211e5c99737f90c67def", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-01T13:56:04+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "9bfd3c6f1f08c026f542032dfb42813544f7d64c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/9bfd3c6f1f08c026f542032dfb42813544f7d64c", + "reference": "9bfd3c6f1f08c026f542032dfb42813544f7d64c", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-01T14:07:30+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/72a7f7674d053d548003b16ff5a106e7e0e06eee", + "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-01T13:59:09+00:00" + }, + { + "name": "sebastian/type", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/18f071c3a29892b037d35e6b20ddf3ea39b42874", + "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/1.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-01T14:04:07+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "92c8ba1e5ee12d07120744c90898516132b4e58b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/92c8ba1e5ee12d07120744c90898516132b4e58b", + "reference": "92c8ba1e5ee12d07120744c90898516132b4e58b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/browser-kit/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "ea43887e9afd2029509662d4f95e8b5ef6fc9bbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ea43887e9afd2029509662d4f95e8b5ef6fc9bbb", + "reference": "ea43887e9afd2029509662d4f95e8b5ef6fc9bbb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/debug-bundle", + "version": "v5.4.40", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug-bundle.git", + "reference": "177f79296705823eee0d7dd79773f3a9df884fe0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/177f79296705823eee0d7dd79773f3a9df884fe0", + "reference": "177f79296705823eee0d7dd79773f3a9df884fe0", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/twig-bridge": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.2" + }, + "require-dev": { + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/web-profiler-bundle": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "For service container configuration", + "symfony/dependency-injection": "For using as a service from the container" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\DebugBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug-bundle/tree/v5.4.40" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:33:22+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v5.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "4c76e4176a5472c5afe504194d7bbef5cfdd1703" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4c76e4176a5472c5afe504194d7bbef5cfdd1703", + "reference": "4c76e4176a5472c5afe504194d7bbef5cfdd1703", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "masterminds/html5": "<2.6" + }, + "require-dev": { + "masterminds/html5": "^2.6", + "symfony/css-selector": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v5.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-11T06:50:28+00:00" + }, + { + "name": "symfony/maker-bundle", + "version": "v1.50.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/maker-bundle.git", + "reference": "a1733f849b999460c308e66f6392fb09b621fa86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a1733f849b999460c308e66f6392fb09b621fa86", + "reference": "a1733f849b999460c308e66f6392fb09b621fa86", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "nikic/php-parser": "^4.11", + "php": ">=8.0", + "symfony/config": "^5.4.7|^6.0", + "symfony/console": "^5.4.7|^6.0", + "symfony/dependency-injection": "^5.4.7|^6.0", + "symfony/deprecation-contracts": "^2.2|^3", + "symfony/filesystem": "^5.4.7|^6.0", + "symfony/finder": "^5.4.3|^6.0", + "symfony/framework-bundle": "^5.4.7|^6.0", + "symfony/http-kernel": "^5.4.7|^6.0", + "symfony/process": "^5.4.7|^6.0" + }, + "conflict": { + "doctrine/doctrine-bundle": "<2.4", + "doctrine/orm": "<2.10", + "symfony/doctrine-bridge": "<5.4" + }, + "require-dev": { + "composer/semver": "^3.0", + "doctrine/doctrine-bundle": "^2.4", + "doctrine/orm": "^2.10.0", + "symfony/http-client": "^5.4.7|^6.0", + "symfony/phpunit-bridge": "^5.4.17|^6.0", + "symfony/polyfill-php80": "^1.16.0", + "symfony/security-core": "^5.4.7|^6.0", + "symfony/yaml": "^5.4.3|^6.0", + "twig/twig": "^2.0|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MakerBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", + "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", + "keywords": [ + "code generator", + "dev", + "generator", + "scaffold", + "scaffolding" + ], + "support": { + "issues": "https://github.com/symfony/maker-bundle/issues", + "source": "https://github.com/symfony/maker-bundle/tree/v1.50.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-10T18:21:57+00:00" + }, + { + "name": "symfony/phpunit-bridge", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "047a8afc81d0cfee9799734ed5e2d32ea6079ddb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/047a8afc81d0cfee9799734ed5e2d32ea6079ddb", + "reference": "047a8afc81d0cfee9799734ed5e2d32ea6079ddb", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", + "extra": { + "thanks": { + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/bin/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides utilities for PHPUnit, especially user deprecation notices management", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-13T13:55:12+00:00" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v5.4.43", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "8f1628f1361e4623a6c2b373c3594845d6aacb79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/8f1628f1361e4623a6c2b373c3594845d6aacb79", + "reference": "8f1628f1361e4623a6c2b373c3594845d6aacb79", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^5.3|^6.0,<6.4", + "symfony/http-kernel": "^5.3|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "conflict": { + "symfony/dependency-injection": "<5.2", + "symfony/form": "<4.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<4.4" + }, + "require-dev": { + "symfony/browser-kit": "^4.4|^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a development tool that gives detailed information about the execution of any request", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.43" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-08T09:11:47+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=8.1", + "ext-ctype": "*", + "ext-iconv": "*" + }, + "platform-dev": {}, + "platform-overrides": { + "php": "8.1" + }, + "plugin-api-version": "2.6.0" +} diff --git a/etc/nginxServer.conf.tmpl b/etc/nginxServer.conf.tmpl index 1f1c458..3e6d75d 100644 --- a/etc/nginxServer.conf.tmpl +++ b/etc/nginxServer.conf.tmpl @@ -3,7 +3,7 @@ server { server_name __SERVERIP__ localhost; # IP del servidor # Raíz del documento para el proyecto Symfony - root /opt/ogboot/public; + root __ROOT__/public; # Bloque para manejar las solicitudes a /ogboot location /ogboot { diff --git a/installer/config.json b/installer/config.json index 4994d18..ad52b3d 100644 --- a/installer/config.json +++ b/installer/config.json @@ -1,5 +1,6 @@ { "ogCore_ServerIP": "172.17.8.82", + "ogBoot_Dir": "/opt/opengnsys/ogboot", "ogBootSambaUser": "opengnsys", "ogBootSambaPass": "og" } diff --git a/installer/ogboot_installer.py b/installer/ogboot_installer.py index c6f8d0a..02196ba 100755 --- a/installer/ogboot_installer.py +++ b/installer/ogboot_installer.py @@ -8,8 +8,13 @@ import platform, os, sys, subprocess, datetime, shutil, pwd, glob, logging, distro, re, json +ipxe_repo_url = "https://github.com/ipxe/ipxe.git" +oglive_iso_url = "https://ognproject.evlt.uma.es/trac/downloads/ogLive-focal-5.13.0-27-beta-amd64-r20210706.5b4bf5f.iso" +SAMBACFGDIR = "/etc/samba" + PROGRAM = os.path.splitext(os.path.basename(sys.argv[0]))[0] PROGRAM_DIR = os.path.dirname(os.path.realpath(sys.argv[0])) +REPO_DIR = os.path.realpath (os.path.join (os.path.dirname (sys.argv[0]), '..')) PROGRAM_NAME = os.path.basename(sys.argv[0]) config_file = os.path.join(PROGRAM_DIR, 'config.json') @@ -17,18 +22,10 @@ with open(config_file, 'r') as f: config = json.load(f) OGCORE_IP = config["ogCore_ServerIP"] -INSTALL_OPENGNSYS_TARGET = "/opt/opengnsys" -INSTALL_OGBOOT_TARGET = "/opt/ogboot" -INSTALL_TARGET = "/opt/ogboot" -GIT_REPO = "ssh://git@ognproject.evlt.uma.es:21987/opengnsys/ogboot.git" +INSTALL_OGBOOT_TARGET = config["ogBoot_Dir"] OPENGNSYS_CLIENT_USER = config["ogBootSambaUser"] OPENGNSYS_CLIENT_PASSWD = config["ogBootSambaPass"] - - -OSDISTRIB = "" -OSVERSION = "" IPXE_DIR = "/tmp/ogboot_ipxe" -WORKDIR ="/tmp/ogboot_installer" DEFAULTDEV = "" PACKAGES_TO_INSTALL = ["htop"] @@ -44,15 +41,10 @@ INETDSERV = "xinetd" UBUNTU_OS_VERSION = "24" PYTHON_VERSION = 3 -if os.path.isdir(f"{PROGRAM_DIR}/../installer"): - REMOTE = 0 -else: - REMOTE = 1 - log_file = f'/var/log/{PROGRAM}.log' os.makedirs(os.path.dirname(log_file), exist_ok=True) -subprocess.run(['sudo', 'touch', log_file]) -subprocess.run(['sudo', 'chmod', '775', log_file]) +subprocess.run(['touch', log_file]) +subprocess.run(['chmod', '775', log_file]) #Configure the log logging.basicConfig(level=logging.DEBUG, @@ -97,19 +89,6 @@ def check_distribution(): logger.error("Leaving the installation.") exit() - -def downloadCode(url): - if len(url) != 1: - logger.error("Invalid number of parameters") - exit(1) - subprocess.run(["GIT_SSH_COMMAND=ssh -o StrictHostKeyChecking=accept-new git archive --remote=" + url + " --format zip --output opengnsys.zip --prefix=opengnsys/ " + BRANCH + " && unzip opengnsys.zip"], shell=True) - if subprocess.returncode != 0: - logger.error("Error getting OpenGnsys code from " + url) - return 1 - subprocess.run(["rm -f opengnsys.zip"], shell=True) - logger.info("downloadCog_boot_create_dirsode(): code was downloaded") - return 0 - ############################################################################### ###:::::::::::::::::::::::::::::: INSTALL ::::::::::::::::::::::::::::::::::### ############################################################################### @@ -167,7 +146,8 @@ def get_missing_packages(): logger.info(f"Package to install: {package}...") return faltantes -def install_packages(missing, log_packages_file="/tmp/installed_packages.log"): +def install_packages(log_packages_file="/tmp/installed_packages.log"): + missing = get_missing_packages() if not missing: logger.info("All packages are already installed.") return @@ -177,9 +157,9 @@ def install_packages(missing, log_packages_file="/tmp/installed_packages.log"): try: os.environ['DEBIAN_FRONTEND'] = 'noninteractive' - subprocess.run(["sudo", "apt-get", "update"], check=True) + subprocess.run(["apt-get", "update"], check=True) subprocess.run( - ["sudo", "apt-get", "install", "--allow-change-held-packages", "-y", "--no-install-recommends"] + missing, + ["apt-get", "install", "--allow-change-held-packages", "-y", "--no-install-recommends"] + missing + ['apache2-'], check=True ) @@ -193,9 +173,9 @@ def install_packages(missing, log_packages_file="/tmp/installed_packages.log"): # Check PHP version and install corresponding php-fpm package php_version = subprocess.check_output(["php", "-v"]).decode("utf-8") if "PHP 8.1" in php_version: - subprocess.run(["sudo", "apt-get", "install", "-y", "php8.1-fpm"], check=True) + subprocess.run(["apt-get", "install", "-y", "php8.1-fpm"], check=True) elif "PHP 8.3" in php_version: - subprocess.run(["sudo", "apt-get", "install", "-y", "php8.3-fpm"], check=True) + subprocess.run(["apt-get", "install", "-y", "php8.3-fpm"], check=True) else: logger.warning("PHP version not supported.") @@ -205,41 +185,29 @@ def install_packages(missing, log_packages_file="/tmp/installed_packages.log"): else: del os.environ['DEBIAN_FRONTEND'] -def autoConfigure(): - global OSDISTRIB, OSVERSION - #distribution = platform.linux_distribution() - #distribution = distro.linux_distribution() - #OSDISTRIB = distribution[0] - OSDISTRIB = distro.name() - OSVERSION = distro.version() - #OSVERSION = distribution[1] - logger.info(f"OSDISTRIB: {OSDISTRIB}") - logger.info(f"OSVERSION: {OSVERSION}") - # Configuración según la distribución OSDISTRIB - def add_sudoers_permissions(): sudoers_entry = """ ogboot ALL=(ALL) NOPASSWD: /opt/bin/oglivecli ogboot ALL=(root) NOPASSWD: /usr/bin/mount, /usr/bin/umount, /usr/bin/cp, /usr/bin/chmod, /usr/bin/chown, /usr/bin/md5sum, /usr/bin/smbpasswd, /usr/bin/cat, /usr/bin/tee, /usr/bin/sed, /usr/bin/gzip, /usr/bin/lz4, /usr/bin/cpio, /usr/bin/find, /bin/tee, /usr/bin/dd, /usr/bin/mkfs.ext4, /usr/bin/rsync -ogboot ALL=(root) NOPASSWD: /opt/ogboot/lib/*.iso /mnt +ogboot ALL=(root) NOPASSWD: __OGBOOT_TARGET__/lib/*.iso /mnt """ sudoers_file = '/etc/sudoers.d/ogboot' try: with open(sudoers_file, 'w') as file: - file.write(sudoers_entry) + file.write(sudoers_entry.replace ('__OGBOOT_TARGET__', INSTALL_OGBOOT_TARGET)) print("Sudoers permissions for 'ogboot' added successfully.") except IOError as e: print(f"Failed to write to {sudoers_file}: {e}") -def og_core_create_user(OPENGNSYS_CLIENT_USER): +def og_core_create_user(u): try: - pwd.getpwnam(OPENGNSYS_CLIENT_USER) - logger.warning(f"User {OPENGNSYS_CLIENT_USER} already exists") + pwd.getpwnam(u) + logger.warning(f"User {u} already exists") except KeyError: - subprocess.run(["sudo", "useradd", "-m", OPENGNSYS_CLIENT_USER]) - logger.info(f"User {OPENGNSYS_CLIENT_USER} created successfully.") + subprocess.run(["useradd", "--create-home", u, "--shell", "/bin/bash"]) + logger.info(f"User {u} created successfully.") def og_boot_create_dirs(): global INSTALL_OGBOOT_TARGET @@ -253,9 +221,6 @@ def og_boot_create_dirs(): # Crear los directorios necesarios os.makedirs(INSTALL_OGBOOT_TARGET, mode=0o775, exist_ok=True) os.makedirs(os.path.join(INSTALL_OGBOOT_TARGET, "client"), mode=0o775, exist_ok=True) - # os.makedirs("/opt/ogboot/tftpboot/", mode=0o750, exist_ok=True) - # os.makedirs("/opt/ogboot/tftpboot/ipxe_scripts", mode=0o750, exist_ok=True) - # os.makedirs("/opt/ogboot/tftpboot/ipxe_scripts/templates", mode=0o750, exist_ok=True) # Cambiar el propietario de los directorios subprocess.run(["chown", "-R", "ogboot:ogboot", INSTALL_OGBOOT_TARGET]) @@ -267,15 +232,15 @@ def og_boot_create_dirs(): exit(1) def og_boot_symfony_install(): - global WORKDIR, INSTALL_OGBOOT_TARGET, OGCORE_IP + global INSTALL_OGBOOT_TARGET logger.info("Creating Symfony application skeleton...") try: # Copiar los archivos .env y composer.json primero - env_src = os.path.join(f"{WORKDIR}", "ogboot/.env") - composer_src = os.path.join(f"{WORKDIR}", "ogboot/composer.json") - env_dest = os.path.join(f"{INSTALL_OGBOOT_TARGET}", ".env") - composer_dest = os.path.join(f"{INSTALL_OGBOOT_TARGET}", "composer.json") + env_src = os.path.join(f"{REPO_DIR}", ".env") + composer_src = os.path.join(f"{REPO_DIR}", "composer.json") + env_dest = os.path.join(f"{INSTALL_OGBOOT_TARGET}", ".env") + composer_dest = os.path.join(f"{INSTALL_OGBOOT_TARGET}", "composer.json") shutil.copy(env_src, env_dest) shutil.copy(composer_src, composer_dest) @@ -302,21 +267,20 @@ def og_boot_symfony_install(): def og_boot_copy_files(): - global INSTALL_TARGET, WORKDIR - bin_source = os.path.join(WORKDIR, "ogboot/bin") + bin_source = os.path.join(REPO_DIR, "bin") bin_dest = os.path.join(INSTALL_OGBOOT_TARGET, "bin") - src_source = os.path.join(WORKDIR, "ogboot/src") + src_source = os.path.join(REPO_DIR, "src") src_dest = os.path.join(INSTALL_OGBOOT_TARGET, "src") - config_source = os.path.join(WORKDIR, "ogboot/config") + config_source = os.path.join(REPO_DIR, "config") config_dest = os.path.join(INSTALL_OGBOOT_TARGET, "config") - lib_source = os.path.join(WORKDIR, "ogboot/lib") + lib_source = os.path.join(REPO_DIR, "lib") lib_dest = os.path.join(INSTALL_OGBOOT_TARGET, "lib") - os.makedirs("/tmp/opt", exist_ok=True) + #os.makedirs("/tmp/opt", exist_ok=True) - subprocess.run(["chown", "-R", "ogboot:ogboot", "/tmp/opt"]) + #subprocess.run(["chown", "-R", "ogboot:ogboot", "/tmp/opt"]) if os.path.exists(bin_dest): shutil.rmtree(bin_dest) @@ -334,9 +298,9 @@ def og_boot_copy_files(): shutil.rmtree(lib_dest) shutil.copytree(lib_source, lib_dest) - os.makedirs(os.path.join(INSTALL_TARGET, "etc"), mode=0o775, exist_ok=True) - os.makedirs(os.path.join(INSTALL_TARGET, "client"), mode=0o775, exist_ok=True) - os.makedirs(os.path.join(INSTALL_TARGET, "public"), mode=0o775, exist_ok=True) + os.makedirs(os.path.join(INSTALL_OGBOOT_TARGET, "etc"), mode=0o775, exist_ok=True) + os.makedirs(os.path.join(INSTALL_OGBOOT_TARGET, "client"), mode=0o775, exist_ok=True) + os.makedirs(os.path.join(INSTALL_OGBOOT_TARGET, "public"), mode=0o775, exist_ok=True) subprocess.run(["chmod", "-R", "775", INSTALL_OGBOOT_TARGET]) subprocess.run(["chown", "-R", "ogboot:ogboot", INSTALL_OGBOOT_TARGET]) @@ -349,30 +313,14 @@ def og_boot_composer_install(): return # Ejecutar Composer como el usuario 'ogboot' para actualizar el paquete doctrine/dbal - result = subprocess.run(["sudo", "-u", "ogboot", "/opt/ogboot/bin/composer.phar", "update", "doctrine/dbal", "--working-dir", INSTALL_OGBOOT_TARGET]) + result = subprocess.run(["sudo", "-u", "ogboot", INSTALL_OGBOOT_TARGET+"/bin/composer.phar", "update", "doctrine/dbal", "--working-dir", INSTALL_OGBOOT_TARGET]) if result.returncode != 0: logger.error("Error updating doctrine/dbal package using Composer") return - # Eliminar composer.lock si existe - composer_lock_path = os.path.join(INSTALL_OGBOOT_TARGET, "composer.lock") - if os.path.exists(composer_lock_path): - os.remove(composer_lock_path) subprocess.call(["chown", "-R", "ogboot:ogboot", f"{INSTALL_OGBOOT_TARGET}/public"]) - logger.info("Application skeleton created and composer.lock file removed.") - -#def createDirs(INSTALL_TARGET): -# if not os.path.exists(INSTALL_TARGET): -# try: -# os.makedirs(INSTALL_TARGET) -# os.makedirs(os.path.join(INSTALL_TARGET, "client")) -# logger.info(f"{INSTALL_TARGET} directory created successfully.") -# except OSError: -# logger.error("Error while creating directory paths!") -# exit(1) -# else: -# logger.info(f"Directory {INSTALL_TARGET} already exists.") + logger.info("Application skeleton created.") ############################################################################### ###:::::::::::::::::::::::::::: CONFIGURE ::::::::::::::::::::::::::::::::::### @@ -404,7 +352,7 @@ def get_ogboot_uid_gid(): def add_fstab_entries(uid, gid): try: fstab_entries = [ - f'/opt/ogboot/lib/oglive.iso /tmp/opt/ogboot/lib/ogLive iso9660 loop,ro,users,uid={uid},gid={gid},noauto 0 0\n', + f'{INSTALL_OGBOOT_TARGET}/lib/oglive.iso {INSTALL_OGBOOT_TARGET}/mnt iso9660 loop,ro,users,uid={uid},gid={gid},noauto 0 0\n', f'/var/lib/tftpboot/ogLive/ogclient.sqfs /tmp/ogclient_mount squashfs loop,ro,user,noauto 0 0\n' ] @@ -435,47 +383,39 @@ def tftpConfigure(): TFTPCFGDIR = "/var/lib/tftpboot" logger.info("Configuring tftpd-hpa...") - tftpd_config = """ - # /etc/default/tftpd-hpa + tftpd_config = """# /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/var/lib/tftpboot" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure" - """ +""" with open("/tmp/tftpd-hpa", "w") as config_file: config_file.write(tftpd_config) shutil.move("/tmp/tftpd-hpa", "/etc/default/tftpd-hpa") logger.info("\t2-Creating and setting permissions for the TFTP directory...") - os.makedirs("/var/lib/tftpboot", exist_ok=True) - - subprocess.run("chown -R tftp:tftp /var/lib/tftpboot", shell=True, text=True, capture_output=True) - subprocess.run("chmod -R 775 /var/lib/tftpboot", shell=True, text=True, capture_output=True) + os.makedirs(TFTPCFGDIR, exist_ok=True) logger.info("\t3-Setting permissions for /var/lib/tftpboot directory...") - subprocess.run("systemctl restart tftpd-hpa", shell=True, text=True, capture_output=True) - logger.info("Checking tftpd-hpa service status...") - subprocess.run("systemctl status tftpd-hpa", shell=True, text=True, capture_output=True) + subprocess.run(f"chown -R tftp:ogboot {TFTPCFGDIR}", shell=True, text=True, capture_output=True) + subprocess.run(f"chmod -R 775 {TFTPCFGDIR}", shell=True, text=True, capture_output=True) + + subprocess.run("systemctl restart tftpd-hpa", shell=True, text=True, capture_output=True) - if os.path.exists(TFTPCFGDIR): - subprocess.run(["chown", "-R", "tftp:ogboot", TFTPCFGDIR]) - logger.info(f"{TFTPCFGDIR} directory permissions modified correctly.") - else: - logger.warning(f"\t1-{TFTPCFGDIR} directory not exist.") symlink_target = f"{INSTALL_OGBOOT_TARGET}/tftpboot" logger.info(f"Creating symbolic link from {TFTPCFGDIR} to {symlink_target}") if not os.path.exists(symlink_target): os.symlink(TFTPCFGDIR, symlink_target) - os.lchown(symlink_target, pwd.getpwnam("tftp").pw_uid, pwd.getpwnam("ogboot").pw_gid) + #os.lchown(symlink_target, pwd.getpwnam("tftp").pw_uid, pwd.getpwnam("ogboot").pw_gid) else: logger.warning(f"The symbolic link already exists: {symlink_target}") + logger.info("Downloading oglive...") - iso_url = "https://ognproject.evlt.uma.es/trac/downloads/ogLive-focal-5.13.0-27-beta-amd64-r20210706.5b4bf5f.iso" try: result = subprocess.run( - ["/opt/ogboot/bin/oglivecli", "download", iso_url], + [INSTALL_OGBOOT_TARGET+"/bin/oglivecli", "download", oglive_iso_url], check=True, capture_output=True, text=True @@ -507,45 +447,27 @@ TFTP_OPTIONS="--secure" logger.error(f"Subprocess failed: {e}") logger.error("Continuing with the installation...") -def servicesCompilation(): - global WORKDIR - hayErrores = 0 - process = subprocess.run(["make"], cwd=f"{WORKDIR}/ogboot/sources/clients/ogAdmClient") - shutil.copy2(f"{WORKDIR}/ogboot/sources/clients/ogAdmClient/ogAdmClient", f"{WORKDIR}/ogboot/client/shared/bin") - if process.returncode != 0: - logger.info(f"{servicesCompilation.__name__}(): error while compiling OpenGnsys Admin Client") - hayErrores = 1 - return hayErrores - def copyInterfaceAdm(): - global WORKDIR, INSTALL_TARGET hayErrores = 0 - cp_process = subprocess.run(["cp", "-ar", f"{WORKDIR}/ogboot/sources/interface", f"{INSTALL_TARGET}/client/interfaceAdm"]) + cp_process = subprocess.run(["cp", "-ar", f"{REPO_DIR}/sources/interface", f"{INSTALL_OGBOOT_TARGET}/client/interfaceAdm"]) if cp_process.returncode != 0: logger.error(f"Error while copying Administration Interface Folder") hayErrores = 1 return hayErrores def copyClientFiles(): - global WORKDIR, INSTALL_TARGET errstatus = 0 logger.info(f"Copying OpenGnsys Client files.") - source_files = glob.glob(f"{WORKDIR}/ogboot/client/shared/*") - # Copy each file individually - for file in source_files: - cp_process = subprocess.run(["cp", "-a", file, f"{INSTALL_TARGET}/client"]) - if cp_process.returncode != 0: - logger.error(f"Error while copying client structure: {file}") - errstatus = 1 + if 0 != subprocess.run (['rsync', '-aH', f'{REPO_DIR}/client/shared/', f'{INSTALL_OGBOOT_TARGET}/client/']).returncode: + logger.error(f"Error while copying client structure") + errstatus = 1 + logger.info(f"Copying OpenGnsys Cloning Engine files.") - os.makedirs(f"{INSTALL_TARGET}/client/lib/engine/bin", mode=0o775, exist_ok=True) - engine_files = glob.glob(f"{WORKDIR}/ogboot/client/engine/*.lib*") - # Copiar cada archivo individualmente - for file in engine_files: - cp_engine_process = subprocess.run(["cp", "-a", file, f"{INSTALL_TARGET}/client/lib/engine/bin"]) - if cp_engine_process.returncode != 0: - logger.error(f"Error while copying engine files: {file}") - errstatus = 1 + os.makedirs(f"{INSTALL_OGBOOT_TARGET}/client/lib/engine/bin", mode=0o775, exist_ok=True) + if 0 != subprocess.run (['rsync', '-aH', f'{REPO_DIR}/client/engine/', f'{INSTALL_OGBOOT_TARGET}/client/lib/engine/bin/']).returncode: + logger.error(f"Error while copying engine files") + errstatus = 1 + if errstatus == 0: logger.info(f"Client copy files success.") else: @@ -568,62 +490,44 @@ def get_first_network_interface_with_traffic(): -def openGnsysConfigure(): - global DEFAULTDEV, INSTALL_TARGET, OGCORE_IP, WORKDIR - i = 0 - dev = "" - CONSOLEURL = "" - CONSOLEURL = f"https://{OGCORE_IP}/opengnsys" - with open(f"{WORKDIR}/ogboot/etc/ogAdmClient.cfg") as file: - content = file.read() - content = content.replace("SERVERIP", OGCORE_IP) - content = content.replace("OPENGNSYSURL", CONSOLEURL) - with open(f"{INSTALL_TARGET}/client/etc/ogAdmClient-{DEFAULTDEV}.cfg", "w") as outfile: - outfile.write(content) - if os.path.islink(f"{INSTALL_TARGET}/client/etc/ogAdmClient.cfg"): - logger.warning(f"Link {INSTALL_TARGET}/client/etc/ogAdmClient.cfg exists.") - else: - try: - os.symlink(f"{INSTALL_TARGET}/client/etc/ogAdmClient-{DEFAULTDEV}.cfg", f"{INSTALL_TARGET}/client/etc/ogAdmClient.cfg") - logger.info (f"Symbolic link created: {INSTALL_TARGET}/client/etc/ogAdmClient-{DEFAULTDEV}.cfg -> {INSTALL_TARGET}/client/etc/ogAdmClient.cfg") - except OSError as e: - logger.error(f"Error creating symbolic link: {e}") - TZ = subprocess.check_output(["timedatectl", "status"]).decode().split("\n")[2].split(":")[1].strip() - with open(f"{INSTALL_TARGET}/client/etc/engine.cfg", "a") as file: - file.write(f"# OpenGnsys Server timezone.\nTZ=\"{TZ.replace(' ', '')}\"\n") - logger.info(f"OpenGnsys config files created.") +def tzConfigure(): + tdctl = subprocess.run (['timedatectl', 'show'], capture_output=True, text=True) + lines = tdctl.stdout.split ('\n') + TZ = list (filter (lambda elem: 'Timezone' in elem, lines))[0] + _, TZ = TZ.split ('=') -def mount_NFS(): + if TZ: + with open(f"{INSTALL_OGBOOT_TARGET}/client/etc/engine.cfg", "a") as file: + file.write(f"# OpenGnsys Server timezone.\nTZ=\"{TZ}\"\n") + +def install_ipxe(): global IPXE_DIR, INSTALL_OGBOOT_TARGET - repo_url = "https://github.com/ipxe/ipxe.git" clone_dir = "/tmp/ogboot_ipxe" - # Clonar el repositorio desde Gitea - if os.path.exists(clone_dir): - logger.info(f"Eliminando el directorio {clone_dir} existente") - subprocess.call(["rm", "-rf", clone_dir]) + if os.path.exists (f"{INSTALL_OGBOOT_TARGET}/tftpboot/undionly.kpxe"): + logger.info ('iPXE already present--not compiling again') + return - logger.info(f"Clonando el repositorio {repo_url}") - if subprocess.call(["git", "-c", "http.sslVerify=false", "clone", repo_url, clone_dir]) == 0: + # Clonar el repositorio desde Gitea + logger.info(f"Clonando el repositorio {ipxe_repo_url}") + if subprocess.call(["git", "-c", "http.sslVerify=false", "clone", ipxe_repo_url, clone_dir]) == 0: logger.info("Repositorio clonado correctamente.") else: - logger.error(f"ERROR\tNo se pudo clonar el repositorio {repo_url}.") + logger.error(f"ERROR\tNo se pudo clonar el repositorio {ipxe_repo_url}.") exit(1) # Ejecutar el comando make en el directorio src - logger.info(f"Ejecutando make en {IPXE_DIR}/src") + #logger.info(f"Ejecutando make en {IPXE_DIR}/src") os.chdir(f"{IPXE_DIR}/src") - if subprocess.call(["make", "-s", "-j", "4"]) == 0: - logger.info(f"Directorio {IPXE_DIR}/src correctamente compilado.") - else: - logger.error(f"ERROR\tNo se pudo compilar el directorio {IPXE_DIR}/src.") - exit(1) + #if subprocess.run(["make", "-s", "-j", "4"], capture_output=True).returncode == 0: + # logger.info(f"Directorio {IPXE_DIR}/src correctamente compilado.") + #else: + # logger.error(f"ERROR\tNo se pudo compilar el directorio {IPXE_DIR}/src.") + # exit(1) - if not os.path.exists("/opt/opengnsys"): - os.symlink("/opt/ogboot/", "/opt/opengnsys") - logger.info("Symbolic link created successfully.") - if subprocess.call(["make", "-s", "bin/undionly.kpxe", f"EMBED={INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/dhcp_boot.ipxe"]) == 0: + logger.info("Generando make de undionly.kpxe:") + if subprocess.run(["make", "-s", "bin/undionly.kpxe", f"EMBED={INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/dhcp_boot.ipxe"], capture_output=True).returncode == 0: logger.info("Boot file mounted correctly.") else: logger.error("Failed to mount boot file.") @@ -631,19 +535,23 @@ def mount_NFS(): logger.info("Copiando undionly.kpxe con usuario ogboot:") subprocess.call(["cp", "bin/undionly.kpxe", f"{INSTALL_OGBOOT_TARGET}/tftpboot"]) subprocess.call(["chown", "ogboot:ogboot", f"{INSTALL_OGBOOT_TARGET}/tftpboot"]) + logger.info("Generando make de ipxe.efi:") - if subprocess.call(["make", "-s", "bin-x86_64-efi/ipxe.efi", f"EMBED={INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/dhcp_boot.ipxe"]) == 0: + if subprocess.run(["make", "-s", "bin-x86_64-efi/ipxe.efi", f"EMBED={INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/dhcp_boot.ipxe"], capture_output=True).returncode == 0: logger.info("Properly constructed EFI file.") else: logger.error("Could not build EFI file.") exit(1) - subprocess.call(["sudo", "cp", "bin-x86_64-efi/ipxe.efi", f"{INSTALL_OGBOOT_TARGET}/tftpboot"]) - subprocess.call(["sudo", "chown", "-R", "tftp:ogboot", f"{INSTALL_OGBOOT_TARGET}/tftpboot/"]) - subprocess.run(["sudo", "chmod", "-R", "775", f"{INSTALL_OGBOOT_TARGET}/tftpboot/"]) + subprocess.call(["cp", "bin-x86_64-efi/ipxe.efi", f"{INSTALL_OGBOOT_TARGET}/tftpboot"]) + subprocess.call(["chown", "-R", "tftp:ogboot", f"{INSTALL_OGBOOT_TARGET}/tftpboot/"]) + + subprocess.run(["chmod", "-R", "775", f"{INSTALL_OGBOOT_TARGET}/tftpboot/"]) os.makedirs(f"{INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/templates", exist_ok=True) - subprocess.call(["sudo", "chown", "-R", "tftp:ogboot", f"{INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/templates"]) - subprocess.call(["sudo", "chmod", "-R", "775", f"{INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/templates"]) - subprocess.call(["sudo", "cp", f"{WORKDIR}/ogboot/tftpboot/ipxe_scripts/templates/pxe_default", f"{INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/templates"]) + subprocess.call(["chown", "-R", "tftp:ogboot", f"{INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/templates"]) + subprocess.call(["chmod", "-R", "775", f"{INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/templates"]) + subprocess.call(["cp", f"{REPO_DIR}/tftpboot/ipxe_scripts/templates/pxe_default", f"{INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/templates"]) + + subprocess.call(["rm", "-rf", clone_dir]) def get_ip_address(interface): @@ -658,25 +566,20 @@ def get_ip_address(interface): return None def generate_ipxe_script(): - global DEFAULTDEV, INSTALL_OGBOOT_TARGET, WORKDIR - #ip_address_server = subprocess.check_output(["ifconfig", DEFAULTDEV]).decode().split("\n")[1].split()[1] + global DEFAULTDEV, INSTALL_OGBOOT_TARGET + ip_address_server = get_ip_address(DEFAULTDEV) - template = os.path.join(WORKDIR, "ogboot/etc/dhcp_boot.ipxe.tmpl") + template = os.path.join(REPO_DIR, "etc/dhcp_boot.ipxe.tmpl") ipxe_output = f"{INSTALL_OGBOOT_TARGET}/tftpboot/ipxe_scripts/dhcp_boot.ipxe" os.makedirs(os.path.dirname(ipxe_output), mode=0o775, exist_ok=True) - shutil.copy(template, ipxe_output) - with open(ipxe_output, "r") as ipxe_file: + #shutil.copy(template, ipxe_output) + with open(template, "r") as ipxe_file: ipxe_content = ipxe_file.read() ipxe_content = ipxe_content.replace("__SERVERIP__", ip_address_server) with open(ipxe_output, "w") as ipxe_file: ipxe_file.write(ipxe_content) -# Reemplazar SERVERIP con la dirección IP en la plantilla y guardarla en el archivo de salida -# with open(template, "r") as tmpl_file: -# template_content = tmpl_file.read() -# ipxe_content = template_content.replace("SERVERIP", ip_address_server) -# with open(ipxe_output, "w") as ipxe_file: -# ipxe_file.write(ipxe_content) - template_default = os.path.join(WORKDIR, "ogboot/tftpboot/ipxe_scripts/default.ipxe") + + template_default = os.path.join(REPO_DIR, "tftpboot/ipxe_scripts/default.ipxe") default_output = os.path.join(INSTALL_OGBOOT_TARGET, "tftpboot/ipxe_scripts/default.ipxe") with open(template_default, "r") as default_tmpl_file: default_template_content = default_tmpl_file.read() @@ -687,7 +590,7 @@ def generate_ipxe_script(): def user_exists(user): try: - result = subprocess.run(["sudo", "pdbedit", "-L", "-u", user], capture_output=True, text=True) + result = subprocess.run(["pdbedit", "-L", "-u", user], capture_output=True, text=True) return user in result.stdout except subprocess.CalledProcessError as e: logger.error(f"Error checking if user exists: {e}") @@ -695,13 +598,11 @@ def user_exists(user): def smbConfigure(): global OPENGNSYS_CLIENT_PASSWD, OPENGNSYS_CLIENT_USER, PYTHON_VERSION - SAMBACFGDIR = "/etc/samba" - #logger.info(f"{smbConfigure.__name__}(): Configuring Samba service.") backupFile(f"{SAMBACFGDIR}/smb.conf") # Copiar plantilla de recursos para OpenGnsys - with open(os.path.join(WORKDIR, 'ogboot/etc/smb-ogboot.conf.tmpl'), 'r') as tmpl_file: + with open(os.path.join(REPO_DIR, 'etc/smb-ogboot.conf.tmpl'), 'r') as tmpl_file: template = tmpl_file.read() - replaced_template = template.replace('__OGBOOTDIR__', INSTALL_OPENGNSYS_TARGET) + replaced_template = template.replace('__OGBOOTDIR__', INSTALL_OGBOOT_TARGET) with open(os.path.join(SAMBACFGDIR, 'smb-ogboot.conf'), 'w') as conf_file: conf_file.write(replaced_template) # Configurar y recargar Samba" @@ -724,52 +625,38 @@ def smbConfigure(): try: if user_exists(OPENGNSYS_CLIENT_USER): logger.info(f"{OPENGNSYS_CLIENT_USER} user exists. Changing password...") - subprocess.run( - ["sudo", "smbpasswd", OPENGNSYS_CLIENT_USER], - input=f"{OPENGNSYS_CLIENT_PASSWD}\n{OPENGNSYS_CLIENT_PASSWD}\n", - text=True, - check=True - ) + extra_params = [] else: logger.info(f"{OPENGNSYS_CLIENT_USER} user does not exist. Registering user...") - subprocess.run( - ["sudo", "smbpasswd", "-a", OPENGNSYS_CLIENT_USER], - input=f"{OPENGNSYS_CLIENT_PASSWD}\n{OPENGNSYS_CLIENT_PASSWD}\n", - text=True, - check=True - ) + extra_params = ['-a'] + + subprocess.run( + ["smbpasswd"] + extra_params + [OPENGNSYS_CLIENT_USER], + input=f"{OPENGNSYS_CLIENT_PASSWD}\n{OPENGNSYS_CLIENT_PASSWD}\n", + text=True, + capture_output=True, + check=True + ) logger.info("Add/Modify user: Operation completed successfully.") except subprocess.CalledProcessError as e: logger.error(f"Error adding/modifying user: {e}") return 0 -''' - try: - process_add = subprocess.run( - ["sudo", "smbpasswd", "-a", OPENGNSYS_CLIENT_USER], - input=f"{OPENGNSYS_CLIENT_PASSWD}\n{OPENGNSYS_CLIENT_PASSWD}\n", - text=True, - check=True - ) - logger.info(f"The password for the user {OPENGNSYS_CLIENT_USER} has been set correctly.") - except subprocess.CalledProcessError as e: - logger.error(f"Error setting password: {e}") -''' def setup_nginx(): - global DEFAULTDEV, WORKDIR + global DEFAULTDEV try: # Obtener la IP del servidor - #ip_address_server = subprocess.check_output(["ifconfig", DEFAULTDEV]).decode().split("\n")[1].split()[1] ip_address_server = get_ip_address(DEFAULTDEV) php_version = get_php_fpm_version() # Leer y modificar la plantilla de configuración de nginx - template_path = os.path.join(WORKDIR, "ogboot/etc/nginxServer.conf.tmpl") + template_path = os.path.join(REPO_DIR, "etc/nginxServer.conf.tmpl") with open(template_path, 'r') as nginx_file: nginx_content = nginx_file.read() nginx_content = nginx_content.replace("__SERVERIP__", ip_address_server) nginx_content = nginx_content.replace("__PHPVERSION__", php_version) + nginx_content = nginx_content.replace("__ROOT__", INSTALL_OGBOOT_TARGET) # Ruta de destino para la configuración de nginx nginx_output = "/etc/nginx/sites-available/ogboot.conf" @@ -779,12 +666,10 @@ def setup_nginx(): logger.info("Nginx configuration file created successfully.") # Crear el enlace simbólico en sites-enabled - subprocess.run(["sudo", "ln", "-sf", nginx_output, "/etc/nginx/sites-enabled/ogboot.conf"]) + subprocess.run(["ln", "-sf", nginx_output, "/etc/nginx/sites-enabled/ogboot.conf"]) logger.info("Symbolic link for nginx configuration created successfully.") - logger.info("Samba service restarted successfully.") - # Modificar el archivo de configuración de nginx para ejecutarse como ogboot nginx_conf_path = "/etc/nginx/nginx.conf" with open(nginx_conf_path, 'r') as nginx_conf_file: @@ -798,7 +683,7 @@ def setup_nginx(): logger.info("Nginx configuration file modified to run as ogboot.") # Reiniciar el servicio de samba - subprocess.run(["sudo", "systemctl", "restart", "nginx.service"]) + subprocess.run(["systemctl", "restart", "nginx.service"]) except subprocess.CalledProcessError as e: logger.error(f"Subprocess error: {e}") @@ -823,14 +708,14 @@ def get_php_fpm_version(): exit(1) def modify_php_fpm_config(): - php_version = get_php_fpm_version() # Establecemos la versión de PHP a 8.2 + php_version = get_php_fpm_version() php_fpm_conf_path = f"/etc/php/{php_version}/fpm/pool.d/www.conf" new_fpm_conf_path = f"/etc/php/{php_version}/fpm/pool.d/ogboot.conf" socket_path = f"/run/php/php{php_version}-fpm-ogboot.sock" try: # Copiar www.conf a ogboot.conf - subprocess.run(["sudo", "cp", php_fpm_conf_path, new_fpm_conf_path], check=True) + subprocess.run(["cp", php_fpm_conf_path, new_fpm_conf_path], check=True) logger.info(f"Archivo {php_fpm_conf_path} copiado a {new_fpm_conf_path}") # Leer el archivo copiado ogboot.conf @@ -858,7 +743,7 @@ def modify_php_fpm_config(): logger.info(f"Archivo {new_fpm_conf_path} modificado correctamente.") # Reiniciar el servicio PHP-FPM - subprocess.run(["sudo", "systemctl", "restart", f"php{php_version}-fpm"], check=True) + subprocess.run(["systemctl", "restart", f"php{php_version}-fpm"], check=True) logger.info("Servicio PHP-FPM reiniciado correctamente.") # Verificar que el socket se ha creado @@ -880,15 +765,13 @@ logger.info(f":::::::::::::::::::::::: Starting ogBoot installation :::::::::::: logger.info("environment variables") logger.info(f"OGCORE_IP:{OGCORE_IP}") -logger.info(f"INSTALL_TARGET:{INSTALL_TARGET}") logger.info(f"INSTALL_OGBOOT_TARGET:{INSTALL_OGBOOT_TARGET}") -logger.info(f"INSTALL_OPENGNSYS_TARGET:{INSTALL_OPENGNSYS_TARGET}") -logger.info(f"GIT_REPO:{GIT_REPO}") if os.geteuid() != 0: logger.error("This program must be run with root privileges..") exit(1) +## doc no existe nunca if os.path.exists(os.path.join(INSTALL_OGBOOT_TARGET, "/doc/")): logger.warning(f"ogBoot is already installed. Run {INSTALL_OGBOOT_TARGET}/lib/ogboot_devel_update.py with root privileges to update..") exit(2) @@ -901,17 +784,9 @@ except Exception as e: logger.error(f"Error verifying Python distribution or version: {e}") exit(1) -try: - logger.info("Checking the operating system.") - autoConfigure() -except Exception as e: - logger.error(f"Error checking the operating system: {e}") - exit(1) - try: logger.info("Installing necessary packages.") - Missing = get_missing_packages() - install_packages(Missing) + install_packages() except Exception as e: logger.error(f"Error installing necessary packages: {e}") exit(1) @@ -924,23 +799,6 @@ except Exception as e: logger.error(f"Error obtaining network configuration: {e}") exit(1) -try: - logger.info("Configuring package repositories.") - if REMOTE == 1: - downloadCode(GIT_REPO) - else: - if os.path.exists(f"{WORKDIR}/ogboot"): - os.remove(f"{WORKDIR}/ogboot") - logger.info(f"Existing symbolic link to ogBoot directory removed.") - if not os.path.exists(WORKDIR): - os.makedirs(WORKDIR, mode=0o775, exist_ok=True) - logger.info(f"{WORKDIR}/ogboot directory created") - logger.info(f"Creating a symbolic link to the code directory") - os.symlink(os.path.dirname(PROGRAM_DIR), f"{WORKDIR}/ogboot") -except Exception as e: - logger.error(f"Error configuring package repositories: {e}") - exit(1) - try: add_sudoers_permissions() except Exception as e: @@ -1012,19 +870,12 @@ except Exception as e: exit(1) try: - logger.info("Setting up NFS system") - mount_NFS() + logger.info("Installing iPXE") + install_ipxe() except Exception as e: logger.error(f"Error setting up NFS system: {e}") exit(1) -try: - logger.info("Compiling OpenGnsys services source code") - servicesCompilation() -except Exception as e: - logger.error(f"Error compiling OpenGnsys services: {e}") - exit(1) - try: logger.info("Copy folder Interface between administration and cloning engine") copyInterfaceAdm() @@ -1055,7 +906,7 @@ except Exception as e: try: logger.info("Configuring ogCore") - openGnsysConfigure() + tzConfigure() except Exception as e: logger.error(f"Error configuring ogCore: {e}") exit(1) diff --git a/sources/clients/README.es.txt b/sources/clients/README.es.txt deleted file mode 100644 index 56900d8..0000000 --- a/sources/clients/README.es.txt +++ /dev/null @@ -1,9 +0,0 @@ -OpenGnsys Services for Clients README -======================================= - - -Este directorio contiene el código fuente de los servicios OpenGnsys específicos para clientes. - -- ogAdmClient servicio para cliente ogLive que atiende peticiones de OpenGnsys Server -- ogagent OGAgent: agente modular para sistemas operativos con API REST - diff --git a/sources/clients/ogAdmClient/Makefile b/sources/clients/ogAdmClient/Makefile deleted file mode 100644 index d3628c9..0000000 --- a/sources/clients/ogAdmClient/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# makefile - -# Nombre del proyecto -PROYECTO := ogAdmClient - -# Directorios y librerias -DIRS := -LIBS := -static - -# Opciones de compilacion -OPCS := -m32 -O0 -g -Wall # Depuracion -#OPCS := -m32 -O3 -Wall # Optimizacion - -# Ficheros objetos -OBJS := sources/ogAdmClient.o - -all: $(PROYECTO) - -$(PROYECTO): $(OBJS) - gcc $(OPCS) $(DIRS) $(LIBS) $(OBJS) -o $(PROYECTO) -# strip $(PROYECTO) # Optimizacion - -clean: - rm -f $(PROYECTO) $(OBJS) - -sources/%.o: sources/%.c - gcc $(OPCS) -I ../../Includes -c -o"$@" "$<" - - - - diff --git a/sources/clients/ogAdmClient/ogAdmClient.cfg b/sources/clients/ogAdmClient/ogAdmClient.cfg deleted file mode 100644 index e49d360..0000000 --- a/sources/clients/ogAdmClient/ogAdmClient.cfg +++ /dev/null @@ -1,5 +0,0 @@ -ServidorAdm=172.17.8.67 -PUERTO=2008 -PATHINTERFACE=/opt/opengnsys/interfaceAdm -UrlMenu=https:/172.17.8.67/opengnsys/varios/menubrowser.php -UrlMsg=http://localhost/cgi-bin/httpd-log.sh diff --git a/sources/clients/ogAdmClient/sources/ogAdmClient.c b/sources/clients/ogAdmClient/sources/ogAdmClient.c deleted file mode 100644 index 6f87cc4..0000000 --- a/sources/clients/ogAdmClient/sources/ogAdmClient.c +++ /dev/null @@ -1,2331 +0,0 @@ -// ******************************************************************************************************** -// Cliernte: ogAdmClient -// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla -// Fecha Creación: Marzo-2010 -// Fecha Última modificación: Abril-2010 -// Nombre del fichero: ogAdmClient.c -// Descripción :Este fichero implementa el cliente general del sistema -// ******************************************************************************************************** - -#include "ogAdmClient.h" -#include "ogAdmLib.c" -//________________________________________________________________________________________________________ -// Función: tomaConfiguracion -// -// Descripción: -// Lee el fichero de configuración del servicio -// Parámetros: -// filecfg : Ruta completa al fichero de configuración -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//________________________________________________________________________________________________________ -BOOLEAN tomaConfiguracion(char* filecfg) -{ - char modulo[] = "tomaConfiguracion()"; - - if (filecfg == NULL || strlen(filecfg) == 0) { - errorLog(modulo, 1, FALSE); // Fichero de configuración del cliente vacío - return (FALSE); - } - FILE *fcfg; - int lSize; - char * buffer, *lineas[MAXPRM], *dualparametro[2]; - int i, numlin, resul; - - fcfg = fopen(filecfg, "rt"); - if (fcfg == NULL) { - errorLog(modulo, 2, FALSE); // No existe fichero de configuración del cliente - return (FALSE); - } - - fseek(fcfg, 0, SEEK_END); - lSize = ftell(fcfg); // Obtiene tamaño del fichero. - rewind(fcfg); - buffer = (char*) reservaMemoria(lSize+1); // Toma memoria para el buffer de lectura. - if (buffer == NULL) { // No hay memoria suficiente para el buffer - errorLog(modulo, 3, FALSE); - return (FALSE); - } - lSize=fread(buffer, 1, lSize, fcfg); // Lee contenido del fichero - buffer[lSize]=CHARNULL; - fclose(fcfg); - - /* Inicializar variables globales */ - servidoradm[0]=CHARNULL; - puerto[0] = CHARNULL; - pathinterface[0]=CHARNULL; - urlmenu[0]=CHARNULL; - urlmsg[0]=CHARNULL; - - numlin = splitCadena(lineas, buffer, '\n'); - for (i = 0; i < numlin; i++) { - splitCadena(dualparametro, lineas[i], '='); - - resul = strcmp(StrToUpper(dualparametro[0]), "SERVIDORADM"); - if (resul == 0) - strcpy(servidoradm, dualparametro[1]); - - resul = strcmp(StrToUpper(dualparametro[0]), "PUERTO"); - if (resul == 0) - strcpy(puerto, dualparametro[1]); - - resul = strcmp(StrToUpper(dualparametro[0]), "PATHINTERFACE"); - if (resul == 0) - strcpy(pathinterface, dualparametro[1]); - - resul = strcmp(StrToUpper(dualparametro[0]), "URLMENU"); - if (resul == 0) - strcpy(urlmenu, dualparametro[1]); - - resul = strcmp(StrToUpper(dualparametro[0]), "URLMSG"); - if (resul == 0) - strcpy(urlmsg, dualparametro[1]); - } - - if (servidoradm[0] == CHARNULL) { - liberaMemoria(buffer); - errorLog(modulo,4, FALSE); // Falta parámetro SERVIDORADM - return (FALSE); - } - - if (puerto[0] == CHARNULL) { - liberaMemoria(buffer); - errorLog(modulo,5, FALSE); // Falta parámetro PUERTO - return (FALSE); - } - if (pathinterface[0] == CHARNULL) { - liberaMemoria(buffer); - errorLog(modulo,56, FALSE); // Falta parámetro PATHINTERFACE - return (FALSE); - } - - if (urlmenu[0] == CHARNULL) { - liberaMemoria(buffer); - errorLog(modulo,89, FALSE); // Falta parámetro URLMENU - return (FALSE); - } - if (urlmsg[0] == CHARNULL) { - liberaMemoria(buffer); - errorLog(modulo,90, FALSE); // Falta parámetro URLMSG - return (FALSE); - } - liberaMemoria(buffer); - return (TRUE); -} -//______________________________________________________________________________________________________ -// Función: FinterfaceAdmin -// -// Descripción: -// Esta función es la puerta de comunicación entre el módulo de administración y el motor de clonación. -// La Aplicación de administración utiliza una interface para ejecutar funciones del motor de clonación; -// esta interface llamará a la API del motor con lo que cambiando el comportamiento de esta interface -// podremos hacer llamadas a otras API de clonación y de esta manera probar distintos motores. -// -// Parámetros: -// - script: Nombre del módulo,función o script de la interface -// - parametros: Parámetros que se le pasarán a la interface -// - salida: Recoge la salida que genera la llamada a la interface - -// Devuelve: -// Código de error de la ejecución al módulo , función o script de la interface -// -// Especificaciones: -// El parámetro salida recoge la salida desde un fichero que se genera en la ejecución del script siempre que -// sea distinto de NULL, esto es, si al llamar a la función este parámetro es NULL no se recogerá dicha salida. -// Este fichero tiene una ubicación fija: /tmp/_retinterface -//______________________________________________________________________________________________________ - -int FinterfaceAdmin( char *script,char* parametros,char* salida) -{ - FILE *f; - int lSize,nargs,i,resul; - char msglog[LONSTD],*argumentos[MAXARGS]; - char modulo[] = "FinterfaceAdmin()"; - - - if (ndebug>= DEBUG_MEDIO) { - sprintf(msglog, "%s:%s", tbMensajes[8], script); - infoDebug(msglog); - } - - /* Crea matriz de los argumentos */ - nargs=splitCadena(argumentos,parametros,32); - for(i=nargs;i= DEBUG_ALTO) { - sprintf(msglog, "%s: #%d-%s", tbMensajes[9],i+1,argumentos[i]); - infoDebug(msglog); - } - } - /* Elimina fichero de retorno */ - if(salida!=(char*)NULL){ - f = fopen("/tmp/_retinterface_","w" ); - if (f==NULL){ // Error de eliminación - scriptLog(modulo,10); - resul=8; - scriptLog(modulo,resul); - return(resul); - } - fclose(f); - } - /* Compone linea de comando */ - if(parametros){ - strcat(script," "); - strcat(script,parametros); - } - /* LLamada función interface */ - resul=system(script); - if(resul){ - scriptLog(modulo,10); - scriptLog(modulo,resul); - return(resul); - } - /* Lee fichero de retorno */ - if(salida!=(char*)NULL){ - f = fopen("/tmp/_retinterface_","rb" ); - if (f==NULL){ // Error de apertura - scriptLog(modulo,10); - resul=9; - scriptLog(modulo,resul); - return(resul); - } - else{ - fseek (f ,0,SEEK_END); // Obtiene tamaño del fichero. - lSize = ftell (f); - rewind (f); - if(lSize>LONGITUD_SCRIPTSALIDA){ - scriptLog(modulo,10); - resul=11; - scriptLog(modulo,resul); - return(resul); - } - fread (salida,1,lSize,f); // Lee contenido del fichero - rTrim(salida); - fclose(f); - } - } - /* Muestra información de retorno */ - if(salida!=(char*)NULL){ - if(ndebug>2){ - sprintf(msglog,"Información devuelta %s",salida); - infoDebug(msglog); - } - } - return(resul); -} -//______________________________________________________________________________________________________ -// Función: interfaceAdmin -// -// Descripción: -// Esta función es la puerta de comunicación entre el módulo de administración y el motor de clonación. -// La Aplicación de administración utiliza una interface para ejecutar funciones del motor de clonación; -// esta interface llamará a la API del motor con lo que cambiando el comportamiento de esta interface -// podremos hacer llamadas a otras API de clonación y de esta manera probar distintos motores. -// -// Parámetros: -// - script: Nombre del módulo,función o script de la interface -// - parametros: Parámetros que se le pasarán a la interface -// - salida: Recoge la salida que genera la llamada a la interface - -// Devuelve: -// Código de error de la ejecución al módulo , función o script de la interface -// -// Especificaciones: -// El parámetro salida recoge la salida desde el procedimiento hijo que se genera en la ejecución de éste -// siempre que sea distinto de NULL, esto es, si al llamar a la función este parámetro es NULL no se -// recogerá dicha salida. -//______________________________________________________________________________________________________ - -int interfaceAdmin( char *script,char* parametros,char* salida) -{ - int descr[2]; /* Descriptores de E y S de la turbería */ - int bytesleidos; /* Bytes leidos en el mensaje */ - int estado; - pid_t pid; - char buffer[LONBLK]; // Buffer de lectura de fichero - pipe (descr); - int i,nargs,resul; - int lon; // Longitud de cadena - char msglog[LONSUC]; // Mensaje de registro de sucesos - char *argumentos[MAXARGS]; - char modulo[] = "interfaceAdmin()"; - if (ndebug>= DEBUG_MEDIO) { - sprintf(msglog, "%s:%s", tbMensajes[8], script); - infoDebug(msglog); - } - - /* Crea matriz de los argumentos */ - nargs=splitCadena(argumentos,parametros,32); - for(i=nargs;i= DEBUG_ALTO) { - // Truncar la cadena si es mayor que el tamaño de la línea de log. - sprintf(msglog, "%s: #%d-", tbMensajes[9], i+1); - lon = strlen (msglog); - if (lon + strlen (argumentos[i]) < LONSUC) { - strcat (msglog, argumentos[i]); - } - else - { - strncat (msglog, argumentos[i], LONSUC - lon - 4); - strcat (msglog, "..."); - } - infoDebug(msglog); - } - } - - if((pid=fork())==0) - { - //_______________________________________________________________ - - /* Proceso hijo que ejecuta la función de interface */ - - close (descr[LEER]); - dup2 (descr[ESCRIBIR], 1); - close (descr[ESCRIBIR]); - resul=execv(script,argumentos); - //resul=execlp (script, script, argumentos[0],argumentos[1],NULL); - exit(resul); - - /* Fin de proceso hijo */ - //_______________________________________________________________ - } - else - { - //_______________________________________________________________ - - /* Proceso padre que espera la ejecución del hijo */ - - if (pid ==-1){ // Error en la creación del proceso hijo - scriptLog(modulo,10); - resul=13; - scriptLog(modulo,resul); - return(resul); - } - close (descr[ESCRIBIR]); - bytesleidos = read (descr[LEER], buffer, LONBLK-1); - while(bytesleidos>0){ - if(salida!=(char*)NULL){ // Si se solicita retorno de información... - buffer[bytesleidos]='\0'; - // Error si se supera el tamaño máximo de cadena de salida. - if(strlen(buffer)+strlen(salida)>LONGITUD_SCRIPTSALIDA){ - scriptLog(modulo,10); - resul=11; - scriptLog(modulo,resul); - return(resul); - } - rTrim(buffer); - strcat(salida,buffer); - } - bytesleidos = read (descr[LEER], buffer, LONBLK-1); - } - close (descr[LEER]); - //kill(pid,SIGQUIT); - waitpid(pid,&estado,0); - resul=WEXITSTATUS(estado); - if(resul){ - scriptLog(modulo,10); - scriptLog(modulo,resul); - return(resul); - } - /* Fin de proceso padre */ - //_______________________________________________________________ - } - - /* Muestra información de retorno */ - if(salida!=(char*)NULL){ - if(ndebug>2){ - // Truncar la cadena si es mayor que el tamaño de la línea de log. - strcpy(msglog,"Informacion devuelta "); - lon = strlen (msglog); - if (lon + strlen (salida) < LONSUC) { - strcat (msglog, salida); - } - else - { - strncat (msglog, salida, LONSUC-lon-4); - strcat (msglog, "..."); - } - infoDebug(msglog); - } - } - return(resul); -} -//______________________________________________________________________________________________________ -// Función: scriptLog -// -// Descripción: -// Registra los sucesos de errores de scripts en el fichero de log -// Parametros: -// - modulo: Módulo donde se produjo el error -// - coderr : Código del mensaje de error del script -//______________________________________________________________________________________________________ -void scriptLog(const char *modulo,int coderr) -{ - char msglog[LONSUC]; - - if(coderr>>>>>>>>>>>>>>>>>>>>>>>>> - char msglog[LONSTD]; - char modulo[] = "cuestionCache()"; - - sprintf(interface,"%s/%s",pathinterface,"procesaCache"); - sprintf(parametros,"%s %s","procesaCache",tam); - - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s",tbErrores[88]); - errorInfo(modulo,msglog); - return(FALSE); - } - - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: cargaPaginaWeb -// -// Descripción: -// Muestra una pégina web usando el browser -// Parámetros: -// urp: Dirección url de la página -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -int cargaPaginaWeb(char *url) -{ - pid_t pidbrowser; // Identificador del proceso que se crea para mostrar una página web con el browser - int resul=0; - char* argumentos[4]; - char modulo[] = "cargaPaginaWeb()"; - - // Destruye los procesos del Browser y lanza uno nuevo. - system("pkill -9 browser"); - - sprintf(interface,"/opt/opengnsys/bin/browser"); - sprintf(parametros,"browser -qws %s",url); - - splitCadena(argumentos,parametros,' '); // Crea matriz de los argumentos del scripts - argumentos[3]=NULL; - if((pidbrowser=fork())==0){ - /* Proceso hijo que ejecuta el script */ - resul=execv(interface,argumentos); - exit(resul); - } - else { - if (pidbrowser ==-1){ - scriptLog(modulo,10); - resul=13; - scriptLog(modulo,resul); - return(resul); - } - } - return(resul); -} -//________________________________________________________________________________________________________ -// Función: muestraMenu -// -// Descripción: -// Muestra el menu inicial del cliente -// Parámetros: -// Ninguno -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//________________________________________________________________________________________________________ -void muestraMenu() -{ - cargaPaginaWeb(urlmenu); -} -//______________________________________________________________________________________________________ -// Función: muestraMensaje -// -// Descripción: -// Muestra un mensaje en pantalla -// Parámetros: -// - idx: Indice del mensaje -// - msg: Descripción Mensaje -// ________________________________________________________________________________________________________ -void muestraMensaje(int idx,char*msg) -{ - char *msgpan,url[250]; - - if(msg){ - msgpan=URLEncode(msg); - sprintf(url,"%s?msg=%s",urlmsg,msgpan); // Url de la página de mensajes - liberaMemoria(msgpan); - } - else - sprintf(url,"%s?idx=%d",urlmsg,idx); // Url de la página de mensajes - cargaPaginaWeb(url); -} -//______________________________________________________________________________________________________ -// Función: InclusionCliente -// Descripción: -// Abre una sesión en el servidor de administración y registra al cliente en el sistema -// Parámetros: -// Ninguno -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN inclusionCliente(TRAMA* ptrTrama) -{ - int lon; // Longitud de cadena - char msglog[LONSUC]; // Mensaje de registro de sucesos - char *cfg; // Datos de configuración - SOCKET socket_c; - char modulo[] = "inclusionCliente()"; - - cfg=LeeConfiguracion(); - - if(!cfg){ // No se puede recuperar la configuración del cliente - errorLog(modulo,36,FALSE); - errorLog(modulo,37,FALSE); - return(FALSE); - } - if (ndebug>= DEBUG_ALTO) { - // Truncar la cadena si es mayor que el tamaño de la línea de log. - sprintf(msglog, "%s", tbMensajes[14]); - lon = strlen (msglog); - if (lon + strlen (cfg) < LONSUC) { - strcat (msglog, cfg); - } - else - { - strncat (msglog, cfg, LONSUC - lon - 4); - strcat (msglog, "..."); - } - infoDebug(msglog); - } - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=InclusionCliente\r"); // Nombre de la función a ejecutar en el servidor - lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuración de los Sistemas Operativos del cliente - liberaMemoria(cfg); - - if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){ - errorLog(modulo,37,FALSE); - return(FALSE); - } - ptrTrama=recibeMensaje(&socket_c); - if(!ptrTrama){ - errorLog(modulo,45,FALSE); - return(FALSE); - } - - close(socket_c); - - if(!gestionaTrama(ptrTrama)){ // Análisis de la trama - errorLog(modulo,39,FALSE); - return(FALSE); - } - - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: RESPUESTA_InclusionCliente -// -// Descripción: -// Respuesta del servidor de administración a la petición de inicio -// enviando los datos identificativos del cliente y otras configuraciones -// Parámetros: -// - ptrTrama: Trama recibida por el servidor con el contenido y los parámetros -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN RESPUESTA_InclusionCliente(TRAMA* ptrTrama) -{ - char* res; - char modulo[] = "RESPUESTA_InclusionCliente()"; - - res=copiaParametro("res",ptrTrama); // Resultado del proceso de inclusión - if(atoi(res)==0){ // Error en el proceso de inclusión - liberaMemoria(res); - errorLog(modulo,41,FALSE); - return (FALSE); - } - liberaMemoria(res); - - idordenador=copiaParametro("ido",ptrTrama); // Identificador del ordenador - nombreordenador=copiaParametro("npc",ptrTrama); // Nombre del ordenador - cache=copiaParametro("che",ptrTrama); // Tamaño de la caché reservada al cliente - idproautoexec=copiaParametro("exe",ptrTrama); // Procedimento de inicio (Autoexec) - idcentro=copiaParametro("idc",ptrTrama); // Identificador de la Unidad Organizativa - idaula=copiaParametro("ida",ptrTrama); // Identificador del aula - - if(idordenador==NULL || nombreordenador==NULL){ - errorLog(modulo,40,FALSE); - return (FALSE); - } - return(TRUE); -} -//______________________________________________________________________________________________________ -// -// Función: LeeConfiguracion -// Descripción: -// Abre una sesión en el servidor de administración y registra al cliente en el sistema -// Parámetros: -// Ninguno -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ - -char* LeeConfiguracion() -{ - char* parametroscfg; - char modulo[] = "LeeConfiguracion()"; - int herrorcfg; - - // Reservar memoria para los datos de cofiguración. - parametroscfg=(char*)reservaMemoria(LONGITUD_SCRIPTSALIDA); - if(!parametroscfg){ - errorLog(modulo,3,FALSE); - return(NULL); - } - // Ejecutar script y obtener datos. - sprintf(interface,"%s/%s",pathinterface,"getConfiguration"); - herrorcfg=interfaceAdmin(interface,NULL,parametroscfg); - - if(herrorcfg){ // No se puede recuperar la configuración del cliente - liberaMemoria(parametroscfg); - errorLog(modulo,36,FALSE); - return(NULL); - } - return(parametroscfg); -} -//________________________________________________________________________________________________________ -// Función: autoexecCliente -// -// Descripción: -// Solicita procedimiento de autoexec para el cliebnte -// Parámetros: -// Ninguno -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//________________________________________________________________________________________________________ -BOOLEAN autoexecCliente(TRAMA* ptrTrama) -{ - SOCKET socket_c; - char modulo[] = "autoexecCliente()"; - - initParametros(ptrTrama,0); - sprintf(ptrTrama->parametros,"nfn=AutoexecCliente\rexe=%s\r",idproautoexec); - - if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){ - errorLog(modulo,42,FALSE); - return(FALSE); - } - ptrTrama=recibeMensaje(&socket_c); - if(!ptrTrama){ - errorLog(modulo,45,FALSE); - return(FALSE); - } - - close(socket_c); - - if(!gestionaTrama(ptrTrama)){ // Análisis de la trama - errorLog(modulo,39,FALSE); - return(FALSE); - } - - return(TRUE); -} -//________________________________________________________________________________________________________ -// Función: autoexecCliente -// -// Descripción: -// Ejecuta un script de autoexec personalizado en todos los inicios para el cliente -// Parámetros: -// Ninguno -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//________________________________________________________________________________________________________ -BOOLEAN RESPUESTA_AutoexecCliente(TRAMA* ptrTrama) -{ - SOCKET socket_c; - char *res,*nfl; - char modulo[] = "RESPUESTA_AutoexecCliente()"; - - res=copiaParametro("res",ptrTrama); - if(atoi(res)==0){ // Error en el proceso de autoexec - liberaMemoria(res); - return (FALSE); - } - liberaMemoria(res); - - nfl=copiaParametro("nfl",ptrTrama); - initParametros(ptrTrama,0); - sprintf(ptrTrama->parametros,"nfn=enviaArchivo\rnfl=%s\r",nfl); - liberaMemoria(nfl); - - /* Envía petición */ - if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){ - errorLog(modulo,42,FALSE); - return(FALSE); - } - /* Nombre del archivo destino (local)*/ - char fileautoexec[LONPRM]; - sprintf(fileautoexec,"/tmp/_autoexec_%s",IPlocal); - - /* Recibe archivo */ - if(!recArchivo(&socket_c,fileautoexec)){ - errorLog(modulo,58, FALSE); - close(socket_c); - return(FALSE); - } - - close(socket_c); - - /* Ejecuta archivo */ - ejecutaArchivo(fileautoexec,ptrTrama); - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: comandosPendientes -// -// Descripción: -// Búsqueda de acciones pendientes en el servidor de administración -// Parámetros: -// Ninguno -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN comandosPendientes(TRAMA* ptrTrama) -{ - SOCKET socket_c; - char modulo[] = "comandosPendientes()"; - - CMDPTES=TRUE; - initParametros(ptrTrama,0); - - while(CMDPTES){ - sprintf(ptrTrama->parametros,"nfn=ComandosPendientes\r"); - if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_PETICION)){ - errorLog(modulo,42,FALSE); - return(FALSE); - } - ptrTrama=recibeMensaje(&socket_c); - if(!ptrTrama){ - errorLog(modulo,45,FALSE); - return(FALSE); - } - - close(socket_c); - - if(!gestionaTrama(ptrTrama)){ // Análisis de la trama - errorLog(modulo,39,FALSE); - return(FALSE); - } - } - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: NoComandosPtes -// -// Descripción: -// Conmuta el switch de los comandos pendientes y lo pone a false -// Parámetros: -// - ptrTrama: contenido del mensaje -// Devuelve: -// TRUE siempre -// Especificaciones: -// Cuando se ejecuta esta función se sale del bucle que recupera los comandos pendientes en el -// servidor y el cliente pasa a a estar disponible para recibir comandos desde el éste. -//______________________________________________________________________________________________________ -BOOLEAN NoComandosPtes(TRAMA* ptrTrama) -{ - CMDPTES=FALSE; // Corta el bucle de comandos pendientes - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: ProcesaComandos -// -// Descripción: -// Espera comando desde el Servidor de Administración para ejecutarlos -// Parámetros: -// Ninguno -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -void procesaComandos(TRAMA* ptrTrama) -{ - int lon; - SOCKET socket_c; - char modulo[] = "procesaComandos()"; - - initParametros(ptrTrama,0); - while(TRUE){ - lon=sprintf(ptrTrama->parametros,"nfn=DisponibilidadComandos\r"); - lon+=sprintf(ptrTrama->parametros+lon,"tpc=%s\r",CLIENTE_OPENGNSYS); // Activar disponibilidad - if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_INFORMACION)){ - errorLog(modulo,43,FALSE); - return; - } - infoLog(19); // Disponibilidad de cliente activada - ptrTrama=recibeMensaje(&socket_c); - if(!ptrTrama){ - errorLog(modulo,46,FALSE); - return; - } - - close(socket_c); - - if(!gestionaTrama(ptrTrama)){ // Análisis de la trama - errorLog(modulo,39,FALSE); - return; - } - if(!comandosPendientes(ptrTrama)){ - errorLog(modulo,42,FALSE); - } - } -} -//______________________________________________________________________________________________________ -// Función: Actualizar -// -// Descripción: -// Actualiza los datos de un ordenador como si volviera a solicitar la entrada -// en el sistema al servidor de administración -// Parámetros: -// ptrTrama: contenido del mensajede -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN Actualizar(TRAMA* ptrTrama) -{ - char msglog[LONSTD]; // Mensaje de log - char *cfg; // Cadena de datos de configuración - int lon; // Longitud de cadena - char modulo[] = "Actualizar()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - muestraMensaje(1,NULL); - if(!comandosPendientes(ptrTrama)){ - errorLog(modulo,84,FALSE); - return(FALSE); - } - - cfg=LeeConfiguracion(); - herror=0; - if(!cfg){ // No se puede recuperar la configuración del cliente - errorLog(modulo,36,FALSE); - herror=3; - } - // Envia Configuracion al servidor - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Configurar"); - lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuración de los Sistemas Operativos del cliente - respuestaEjecucionComando(ptrTrama,herror,0); - - muestraMenu(); - - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: Purgar -// -// Descripción: -// Detiene la ejecución del browser -// Parámetros: -// ptrTrama: contenido del mensajede -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -int Purgar(TRAMA* ptrTrama) -{ - - exit(EXIT_SUCCESS); -} -//______________________________________________________________________________________________________ -// Función: Sondeo -// -// Descripción: -// Envía al servidor una confirmación de que está dentro del sistema -// Parámetros: -// ptrTrama: contenido del mensajede -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN Sondeo(TRAMA* ptrTrama) -{ - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: ConsolaRemota -// -// Descripción: -// Ejecuta un comando de la Shell y envia el eco al servidor (Consola remota) -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN ConsolaRemota(TRAMA* ptrTrama) -{ - SOCKET socket_c; - char *nfn,*scp,*aux,ecosrc[LONPRM],ecodst[LONPRM],msglog[LONSTD];; - char modulo[] = "ConsolaRemota()"; - - /* Nombre del archivo de script */ - char filescript[LONPRM]; - sprintf(filescript,"/tmp/_script_%s",IPlocal); - - aux=copiaParametro("scp",ptrTrama); - scp=URLDecode(aux); - escribeArchivo(filescript,scp); - liberaMemoria(aux); - liberaMemoria(scp); - - nfn=copiaParametro("nfn",ptrTrama); - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(ecosrc,"/tmp/_econsola_%s",IPlocal); - sprintf(parametros,"%s %s %s",nfn,filescript,ecosrc); - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - } - else{ - /* Envía fichero de inventario al servidor */ - sprintf(ecodst,"/tmp/_Seconsola_%s",IPlocal); // Nombre que tendra el archivo en el Servidor - initParametros(ptrTrama,0); - sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",ecodst); - if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){ - errorLog(modulo,42,FALSE); - return(FALSE); - } - /* Espera señal para comenzar el envío */ - liberaMemoria(ptrTrama); - recibeFlag(&socket_c,ptrTrama); - /* Envía archivo */ - if(!sendArchivo(&socket_c,ecosrc)){ - errorLog(modulo,57, FALSE); - herror=12; // Error de envío de fichero por la red - } - close(socket_c); - } - liberaMemoria(nfn); - return(TRUE); -} -//_____________________________________________________________________________________________________ -// Función: Comando -// -// Descripción: -// COmando personalizado enviado desde el servidor -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//_____________________________________________________________________________________________________ -BOOLEAN Comando(TRAMA* ptrTrama) -{ - char *ids,*nfn,msglog[LONSTD]; - char modulo[] = "Comando()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - - sprintf(interface,"%s/%s",pathinterface,nfn); - herror=interfaceAdmin(interface,NULL,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - } - /* Envia respuesta de ejecucución del comando */ - initParametros(ptrTrama,0); - sprintf(ptrTrama->parametros,"nfn=RESPUESTA_%s\r",nfn); - respuestaEjecucionComando(ptrTrama,herror,ids); - liberaMemoria(nfn); - liberaMemoria(ids); - return(TRUE); -} -//_____________________________________________________________________________________________________ -// Función: Arrancar -// -// Descripción: -// Responde a un comando de encendido por la red -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//_____________________________________________________________________________________________________ -BOOLEAN Arrancar(TRAMA* ptrTrama) -{ - int lon; - char *ids,msglog[LONSTD]; - char modulo[] = "Arrancar()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - - ids=copiaParametro("ids",ptrTrama); - - /* Envia respuesta de ejecucución del script */ - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Arrancar"); - lon+=sprintf(ptrTrama->parametros+lon,"tpc=%s\r",CLIENTE_OPENGNSYS); - respuestaEjecucionComando(ptrTrama,0,ids); - liberaMemoria(ids); - return(TRUE); -} -//_____________________________________________________________________________________________________ -// Función: Apagar -// -// Descripción: -// Apaga el cliente -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//_____________________________________________________________________________________________________ -BOOLEAN Apagar(TRAMA* ptrTrama) -{ - char *ids,*nfn,msglog[LONSTD]; - char modulo[] = "Apagar()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - - initParametros(ptrTrama,0); - sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Apagar"); - respuestaEjecucionComando(ptrTrama,0,ids); - - sprintf(interface,"%s/%s",pathinterface,nfn); - herror=interfaceAdmin(interface,NULL,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - liberaMemoria(nfn); - liberaMemoria(ids); - errorInfo(modulo,msglog); - return(FALSE); - } - liberaMemoria(nfn); - liberaMemoria(ids); - return(TRUE); -} -//_____________________________________________________________________________________________________ -// Función: Reiniciar -// -// Descripción: -// Apaga el cliente -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//_____________________________________________________________________________________________________ -BOOLEAN Reiniciar(TRAMA* ptrTrama) -{ - char *nfn,*ids,msglog[LONSTD]; - char modulo[] = "Reiniciar()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - - initParametros(ptrTrama,0); - sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Reiniciar"); - respuestaEjecucionComando(ptrTrama,0,ids); - - sprintf(interface,"%s/%s",pathinterface,nfn); - herror=interfaceAdmin(interface,NULL,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - liberaMemoria(nfn); - liberaMemoria(ids); - errorInfo(modulo,msglog); - return(FALSE); - } - liberaMemoria(nfn); - liberaMemoria(ids); - return(TRUE); -} -//_____________________________________________________________________________________________________ -// Función: IniciarSesion -// -// Descripción: -// Inicia sesión en el Sistema Operativo de una de las particiones -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//_____________________________________________________________________________________________________ -BOOLEAN IniciarSesion(TRAMA* ptrTrama) -{ - char *nfn,*ids,*disk,*par,msglog[LONSTD]; - char modulo[] = "IniciarSesion()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - disk=copiaParametro("dsk",ptrTrama); - par=copiaParametro("par",ptrTrama); - - initParametros(ptrTrama,0); - sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_IniciarSesion"); - respuestaEjecucionComando(ptrTrama,0,ids); - liberaMemoria(ids); - - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(parametros,"%s %s %s",nfn,disk,par); - liberaMemoria(par); - - herror=interfaceAdmin(interface,parametros,NULL); - - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - liberaMemoria(nfn); - errorInfo(modulo,msglog); - return(FALSE); - } - liberaMemoria(nfn); - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: CrearImagen -// -// Descripción: -// Crea una imagen de una partición -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN CrearImagen(TRAMA* ptrTrama) -{ - int lon; - char *nfn,*dsk,*par,*cpt,*idi,*ipr,*nci,*ids,msglog[LONSTD]; - char modulo[] = "CrearImagen()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - - dsk=copiaParametro("dsk",ptrTrama); // Disco - par=copiaParametro("par",ptrTrama); // Número de partición - cpt=copiaParametro("cpt",ptrTrama); // Código de la partición - idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen - nci=copiaParametro("nci",ptrTrama); // Nombre canónico de la imagen - ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio - - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - muestraMensaje(7,NULL); - - if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente - muestraMensaje(2,NULL); - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(parametros,"%s %s %s %s %s",nfn,dsk,par,nci,ipr); - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - muestraMensaje(10,NULL); - } - else - muestraMensaje(9,NULL); - } - else{ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - } - - /* Envia respuesta de ejecución de la función de interface */ - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearImagen"); - lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen - lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Número de disco - lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición de donde se creó - lon+=sprintf(ptrTrama->parametros+lon,"cpt=%s\r",cpt); // Tipo o código de partición - lon+=sprintf(ptrTrama->parametros+lon,"ipr=%s\r",ipr); // Ip del repositorio donde se alojó - respuestaEjecucionComando(ptrTrama,herror,ids); - - liberaMemoria(dsk); - liberaMemoria(par); - liberaMemoria(cpt); - liberaMemoria(idi); - liberaMemoria(nci); - liberaMemoria(ipr); - liberaMemoria(nfn); - liberaMemoria(ids); - - muestraMenu(); - - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: CrearImagenBasica -// -// Descripción: -// Crea una imagen básica a travers dela sincronización -// Parámetros: -// ptrTrama: contenido del mensaje -// -// FDevuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN CrearImagenBasica(TRAMA* ptrTrama) -{ - int lon; - char *nfn,*dsk,*par,*cpt,*idi,*nci,*rti,*ipr,*msy,*whl,*eli,*cmp,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD]; - char modulo[] = "CrearImagenBasica()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - nfn=copiaParametro("nfn",ptrTrama); - dsk=copiaParametro("dsk",ptrTrama); // Disco - par=copiaParametro("par",ptrTrama); // Número de partición - cpt=copiaParametro("cpt",ptrTrama); // Tipo de partición - idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen - nci=copiaParametro("nci",ptrTrama); // Nombre canónico de la imagen - rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen - ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio - - msy=copiaParametro("msy",ptrTrama); // Método de sincronización - - whl=copiaParametro("whl",ptrTrama); // Envío del fichero completo si hay diferencias - eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estén en origen - cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar - - bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla - cpc=copiaParametro("cpc",ptrTrama); // Copiar también imagen a la cache - bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella - nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino - - muestraMensaje(7,NULL); // Creando Inventario Software - if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente - muestraMensaje(30,NULL);// Creando Imagen Básica, por favor espere... - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(parametros,"%s %s %s %s %s %s%s%s %s%s%s%s %s %s",nfn,dsk,par,nci,ipr,whl,eli,cmp,bpi,cpc,bpc,nba,msy,rti); - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - muestraMensaje(29,NULL);// Ha habido algún error en el proceso de creación de imagen básica - } - else - muestraMensaje(28,NULL);// El proceso de creación de imagen básica ha terminado correctamente - } - else{ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - } - - ids=copiaParametro("ids",ptrTrama); // Identificador de la sesión - - /* Envia respuesta de ejecución de la función de interface */ - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearImagenBasica"); - lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen - lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Número de disco - lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición de donde se creó - lon+=sprintf(ptrTrama->parametros+lon,"cpt=%s\r",cpt); // Tipo o código de partición - lon+=sprintf(ptrTrama->parametros+lon,"ipr=%s\r",ipr); // Ip del repositorio donde se alojó - respuestaEjecucionComando(ptrTrama,herror,ids); - - liberaMemoria(nfn); - liberaMemoria(dsk); - liberaMemoria(par); - liberaMemoria(cpt); - liberaMemoria(idi); - liberaMemoria(nci); - liberaMemoria(rti); - liberaMemoria(ipr); - - liberaMemoria(msy); - - liberaMemoria(whl); - liberaMemoria(eli); - liberaMemoria(cmp); - - liberaMemoria(bpi); - liberaMemoria(cpc); - liberaMemoria(bpc); - liberaMemoria(nba); - liberaMemoria(ids); - - muestraMenu(); - - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: CrearSoftIncremental -// -// Descripción: -// Crea una software incremental comparando una partición con una imagen básica -// Parámetros: -// ptrTrama: contenido del mensaje -// -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN CrearSoftIncremental(TRAMA* ptrTrama) -{ - int lon; - char *nfn,*dsk,*par,*idi,*idf,*ipr,*nci,*rti,*ncf,*msy,*whl,*eli,*cmp,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD]; - char modulo[] = "CrearSoftIncremental()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - nfn=copiaParametro("nfn",ptrTrama); - - dsk=copiaParametro("dsk",ptrTrama); // Disco - par=copiaParametro("par",ptrTrama); // Número de partición - idi=copiaParametro("idi",ptrTrama); // Identificador de la imagen - nci=copiaParametro("nci",ptrTrama); // Nombre canónico de la imagen - rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen - ipr=copiaParametro("ipr",ptrTrama); // Ip del repositorio - idf=copiaParametro("idf",ptrTrama); // Identificador de la imagen diferencial - ncf=copiaParametro("ncf",ptrTrama); // Nombre canónico de la imagen diferencial - - msy=copiaParametro("msy",ptrTrama); // Método de sincronización - - whl=copiaParametro("whl",ptrTrama); // Envío del fichero completo si hay diferencias - eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estén en origen - cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar - - bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla - cpc=copiaParametro("cpc",ptrTrama); // Copiar también imagen a la cache - bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella - nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino - - muestraMensaje(7,NULL); // Creando Inventario Software - if(InventariandoSoftware(ptrTrama,FALSE,"InventarioSoftware")){ // Crea inventario Software previamente - muestraMensaje(25,NULL);// Creando Imagen Incremental, por favor espere... - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(parametros,"%s %s %s %s %s %s %s%s%s %s%s%s%s %s %s",nfn,dsk,par,nci,ipr,ncf,whl,eli,cmp,bpi,cpc,bpc,nba,msy,rti); - - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - muestraMensaje(27,NULL);// Ha habido algún error en el proceso de creación de imagen básica - } - else - muestraMensaje(26,NULL);// El proceso de creación de imagen incremental ha terminado correctamente - } - else{ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - } - - ids=copiaParametro("ids",ptrTrama); // Identificador de la sesión - - /* Envia respuesta de ejecución de la función de interface */ - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearSoftIncremental"); - lon+=sprintf(ptrTrama->parametros+lon,"idf=%s\r",idf); // Identificador de la imagen incremental - lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Número de disco - lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición - respuestaEjecucionComando(ptrTrama,herror,ids); - - liberaMemoria(nfn); - liberaMemoria(dsk); - liberaMemoria(par); - liberaMemoria(idi); - liberaMemoria(nci); - liberaMemoria(rti); - liberaMemoria(ipr); - liberaMemoria(idf); - liberaMemoria(ncf); - liberaMemoria(msy); - liberaMemoria(whl); - liberaMemoria(eli); - liberaMemoria(cmp); - liberaMemoria(bpi); - liberaMemoria(cpc); - liberaMemoria(bpc); - liberaMemoria(nba); - liberaMemoria(ids); - - muestraMenu(); - - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: RestaurarImagen -// -// Descripción: -// Restaura una imagen en una partición -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En bpccaso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN RestaurarImagen(TRAMA* ptrTrama) -{ - int lon; - char *nfn,*dsk,*par,*idi,*ipr,*ifs,*cfg,*nci,*ids,*ptc,msglog[LONSTD]; - char modulo[] = "RestaurarImagen()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - - dsk=copiaParametro("dsk",ptrTrama); - par=copiaParametro("par",ptrTrama); - idi=copiaParametro("idi",ptrTrama); - ipr=copiaParametro("ipr",ptrTrama); - nci=copiaParametro("nci",ptrTrama); - ifs=copiaParametro("ifs",ptrTrama); - ptc=copiaParametro("ptc",ptrTrama); - - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - muestraMensaje(3,NULL); - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(parametros,"%s %s %s %s %s %s",nfn,dsk,par,nci,ipr,ptc); - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - muestraMensaje(12,NULL); - } - else - muestraMensaje(11,NULL); - - /* Obtener nueva configuración */ - cfg=LeeConfiguracion(); - if(!cfg){ // No se puede recuperar la configuración del cliente - errorLog(modulo,36,FALSE); - } - - /* Envia respuesta de ejecución de la función de interface */ - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarImagen"); - lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen - lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Número de disco - lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición - lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software - lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuración de discos - respuestaEjecucionComando(ptrTrama,herror,ids); - - liberaMemoria(nfn); - liberaMemoria(dsk); - liberaMemoria(par); - liberaMemoria(idi); - liberaMemoria(nci); - liberaMemoria(ipr); - liberaMemoria(ifs); - liberaMemoria(cfg); - liberaMemoria(ptc); - liberaMemoria(ids); - - muestraMenu(); - - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: RestaurarImagenBasica -// -// Descripción: -// Restaura una imagen básica en una partición -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN RestaurarImagenBasica(TRAMA* ptrTrama) -{ - int lon; - char *nfn,*dsk,*par,*idi,*ipr,*met,*nci,*rti,*ifs,*cfg,*msy,*whl,*eli,*cmp,*tpt,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD]; - char modulo[] = "RestaurarImagenBasica()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - dsk=copiaParametro("dsk",ptrTrama); - par=copiaParametro("par",ptrTrama); - idi=copiaParametro("idi",ptrTrama); - ipr=copiaParametro("ipr",ptrTrama); - met=copiaParametro("met",ptrTrama); // Método de clonación 0= desde caché 1= desde repositorio - nci=copiaParametro("nci",ptrTrama); - rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen - ifs=copiaParametro("ifs",ptrTrama); - - tpt=copiaParametro("tpt",ptrTrama); // Tipo de trasnmisión unicast o multicast - msy=copiaParametro("msy",ptrTrama); // Metodo de sincronizacion - - whl=copiaParametro("whl",ptrTrama); // Envío del fichero completo si hay diferencias - eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estén en origen - cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar - - bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla - cpc=copiaParametro("cpc",ptrTrama); // Copiar también imagen a la cache - bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella - nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino - - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - muestraMensaje(31,NULL); - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(parametros,"%s %s %s %s %s %s %s%s%s %s%s%s%s %s %s %s",nfn,dsk,par,nci,ipr,tpt,whl,eli,cmp,bpi,cpc,bpc,nba,met,msy,rti); - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - muestraMensaje(33,NULL); - } - else - muestraMensaje(32,NULL); - - /* Obtener nueva configuración */ - cfg=LeeConfiguracion(); - if(!cfg){ // No se puede recuperar la configuración del cliente - errorLog(modulo,36,FALSE); - } - - /* Envia respuesta de ejecución de la función de interface */ - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarImagenBasica"); - lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen - lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Número de disco - lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición - lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software - lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuración de discos - respuestaEjecucionComando(ptrTrama,herror,ids); - - liberaMemoria(nfn); - liberaMemoria(dsk); - liberaMemoria(par); - liberaMemoria(idi); - liberaMemoria(nci); - liberaMemoria(rti); - liberaMemoria(ifs); - liberaMemoria(cfg); - liberaMemoria(ipr); - liberaMemoria(met); - - liberaMemoria(tpt); - liberaMemoria(msy); - - liberaMemoria(whl); - liberaMemoria(eli); - liberaMemoria(cmp); - - liberaMemoria(bpi); - liberaMemoria(cpc); - liberaMemoria(bpc); - liberaMemoria(nba); - liberaMemoria(ids); - - muestraMenu(); - - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: RestaurarSoftIncremental -// -// Descripción: -// Restaura software incremental en una partición -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN RestaurarSoftIncremental(TRAMA* ptrTrama) -{ - int lon; - char *nfn,*dsk,*par,*idi,*ipr,*met,*ifs,*nci,*rti,*idf,*ncf,*msy,*whl,*eli,*cmp,*tpt,*bpi,*cpc,*bpc,*nba,*ids,msglog[LONSTD]; - char modulo[] = "RestaurarSoftIncremental()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - dsk=copiaParametro("dsk",ptrTrama); - par=copiaParametro("par",ptrTrama); - idi=copiaParametro("idi",ptrTrama); - idf=copiaParametro("idf",ptrTrama); - ipr=copiaParametro("ipr",ptrTrama); - met=copiaParametro("met",ptrTrama); // Método de clonación 0= desde caché 1= desde repositorio - ifs=copiaParametro("ifs",ptrTrama); - nci=copiaParametro("nci",ptrTrama); - rti=copiaParametro("rti",ptrTrama); // Ruta de origen de la imagen - ncf=copiaParametro("ncf",ptrTrama); - - tpt=copiaParametro("tpt",ptrTrama); // Tipo de trasnmisión unicast o multicast - msy=copiaParametro("msy",ptrTrama); // Metodo de sincronizacion - - whl=copiaParametro("whl",ptrTrama); // Envío del fichero completo si hay diferencias - eli=copiaParametro("eli",ptrTrama); // Elimiar archivos en destino que no estén en origen - cmp=copiaParametro("cmp",ptrTrama); // Comprimir antes de enviar - - bpi=copiaParametro("bpi",ptrTrama); // Borrar la imagen antes de crearla - cpc=copiaParametro("cpc",ptrTrama); // Copiar también imagen a la cache - bpc=copiaParametro("bpc",ptrTrama); // Borrarla de la cache antes de copiarla en ella - nba=copiaParametro("nba",ptrTrama); // No borrar archivos en destino - - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - muestraMensaje(31,NULL); - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(parametros,"%s %s %s %s %s %s %s %s%s%s %s%s%s%s %s %s %s",nfn,dsk,par,nci,ipr,ncf,tpt,whl,eli,cmp,bpi,cpc,bpc,nba,met,msy,rti); - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - muestraMensaje(35,NULL); - } - else - muestraMensaje(34,NULL); - - /* Envia respuesta de ejecución de la función de interface */ - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarSoftIncremental"); - lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idf); // Identificador de la imagen incremental (Forzada a idi) - lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Número de disco - lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Número de partición - lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software - - respuestaEjecucionComando(ptrTrama,herror,ids); - - liberaMemoria(nfn); - liberaMemoria(dsk); - liberaMemoria(par); - liberaMemoria(idi); - liberaMemoria(idf); - liberaMemoria(nci); - liberaMemoria(rti); - liberaMemoria(ncf); - liberaMemoria(ifs); - liberaMemoria(ipr); - liberaMemoria(met); - - liberaMemoria(tpt); - liberaMemoria(msy); - - liberaMemoria(whl); - liberaMemoria(eli); - liberaMemoria(cmp); - - liberaMemoria(bpi); - liberaMemoria(cpc); - liberaMemoria(bpc); - liberaMemoria(nba); - liberaMemoria(ids); - - muestraMenu(); - - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: Configurar -// -// Descripción: -// Configura la tabla de particiones y formatea -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN Configurar(TRAMA* ptrTrama) -{ - int lon; - char *nfn,*dsk,*cfg,*ids,msglog[LONSTD]; - char modulo[] = "Configurar()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - - dsk=copiaParametro("dsk",ptrTrama); - cfg=copiaParametro("cfg",ptrTrama); - /* Sustituir caracteres */ - sustituir(cfg,'\n','$'); - sustituir(cfg,'\t','#'); - - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - muestraMensaje(4,NULL); - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(parametros,"%s %s %s",nfn,dsk,cfg); - - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - muestraMensaje(13,NULL); - } - else - muestraMensaje(14,NULL); - - cfg=LeeConfiguracion(); - if(!cfg){ // No se puede recuperar la configuración del cliente - errorLog(modulo,36,FALSE); - return(FALSE); - } - - /* Envia respuesta de ejecución del comando*/ - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_Configurar"); - lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuración de los Sistemas Operativos del cliente - respuestaEjecucionComando(ptrTrama,herror,ids); - - liberaMemoria(dsk); - liberaMemoria(cfg); - liberaMemoria(nfn); - liberaMemoria(ids); - - muestraMenu(); - - return(TRUE); -} -// ________________________________________________________________________________________________________ -// Función: InventarioHardware -// -// Descripción: -// Envia al servidor el nombre del archivo de inventario de su hardware para posteriormente -// esperar que éste lo solicite y enviarlo por la red. -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN InventarioHardware(TRAMA* ptrTrama) -{ - int lon; - SOCKET socket_c; - char *nfn,*ids,msglog[LONSTD],hrdsrc[LONPRM],hrddst[LONPRM]; - char modulo[] = "InventarioHardware()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - muestraMensaje(6,NULL); - - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(hrdsrc,"/tmp/Chrd-%s",IPlocal); // Nombre que tendra el archivo de inventario - sprintf(parametros,"%s %s",nfn,hrdsrc); - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - muestraMensaje(18,NULL); - } - else{ - /* Envía fichero de inventario al servidor */ - sprintf(hrddst,"/tmp/Shrd-%s",IPlocal); // Nombre que tendra el archivo en el Servidor - initParametros(ptrTrama,0); - sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",hrddst); - if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){ - liberaMemoria(nfn); - liberaMemoria(ids); - errorLog(modulo,42,FALSE); - return(FALSE); - } - /* Espera señal para comenzar el envío */ - liberaMemoria(ptrTrama); - recibeFlag(&socket_c,ptrTrama); - /* Envía archivo */ - if(!sendArchivo(&socket_c,hrdsrc)){ - errorLog(modulo,57, FALSE); - herror=12; // Error de envío de fichero por la red - } - close(socket_c); - muestraMensaje(17,NULL); - } - - /* Envia respuesta de ejecución de la función de interface */ - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_InventarioHardware"); - lon+=sprintf(ptrTrama->parametros+lon,"hrd=%s\r",hrddst); - respuestaEjecucionComando(ptrTrama,herror,ids); - liberaMemoria(nfn); - liberaMemoria(ids); - - muestraMenu(); - - return(TRUE); -} -// ________________________________________________________________________________________________________ -// Función: InventarioSoftware -// -// Descripción: -// Crea el inventario software de un sistema operativo instalado en una partición. -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN InventarioSoftware(TRAMA* ptrTrama) -{ - char *nfn,*ids,msglog[LONSTD]; - char modulo[] = "InventarioSoftware()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - nfn=copiaParametro("nfn",ptrTrama); - ids=copiaParametro("ids",ptrTrama); - muestraMensaje(7,NULL); - InventariandoSoftware(ptrTrama,TRUE,nfn); - respuestaEjecucionComando(ptrTrama,herror,ids); - liberaMemoria(nfn); - liberaMemoria(ids); - muestraMenu(); - return(TRUE); -} -// ________________________________________________________________________________________________________ -// -// Función: InventariandoSoftware -// -// Descripción: -// Envia al servidor el nombre del archivo de inventario de su software para posteriormente -// esperar que éste lo solicite y enviarlo por la red. -// Parámetros: -// ptrTrama: contenido del mensaje -// sw: switch que indica si la función es llamada por el comando InventarioSoftware(true) o CrearImagen(false) -// nfn: Nombre de la función del Interface que implementa el comando -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN InventariandoSoftware(TRAMA* ptrTrama,BOOLEAN sw,char *nfn) -{ - int lon; - SOCKET socket_c; - char *dsk,*par,msglog[LONSTD],sftsrc[LONPRM],sftdst[LONPRM]; - char modulo[] = "InventariandoSoftware()"; - - dsk=copiaParametro("dsk",ptrTrama); // Disco - par=copiaParametro("par",ptrTrama); - - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(sftsrc,"/tmp/CSft-%s-%s",IPlocal,par); // Nombre que tendra el archivo de inventario - sprintf(parametros,"%s %s %s %s",nfn,dsk,par,sftsrc); - - herror=interfaceAdmin(interface,parametros,NULL); - herror=0; - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - muestraMensaje(20,NULL); - } - else{ - /* Envía fichero de inventario al servidor */ - sprintf(sftdst,"/tmp/Ssft-%s-%s",IPlocal,par); // Nombre que tendra el archivo en el Servidor - initParametros(ptrTrama,0); - - sprintf(ptrTrama->parametros,"nfn=recibeArchivo\rnfl=%s\r",sftdst); - if(!enviaMensajeServidor(&socket_c,ptrTrama,MSG_COMANDO)){ - errorLog(modulo,42,FALSE); - liberaMemoria(dsk); - liberaMemoria(par); - return(FALSE); - } - /* Espera señal para comenzar el envío */ - liberaMemoria(ptrTrama); - if(!recibeFlag(&socket_c,ptrTrama)){ - errorLog(modulo,17,FALSE); - } - /* Envía archivo */ - if(!sendArchivo(&socket_c,sftsrc)){ - errorLog(modulo,57, FALSE); - herror=12; // Error de envío de fichero por la red - } - close(socket_c); - muestraMensaje(19,NULL); - } - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_InventarioSoftware"); - lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); - lon+=sprintf(ptrTrama->parametros+lon,"sft=%s\r",sftdst); - if(!sw) - respuestaEjecucionComando(ptrTrama,herror,"0"); - - liberaMemoria(dsk); - liberaMemoria(par); - return(TRUE); -} -// ________________________________________________________________________________________________________ -// Función: EjecutarScript -// -// Descripción: -// Ejecuta código de script -// Parámetros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//______________________________________________________________________________________________________ -BOOLEAN EjecutarScript(TRAMA* ptrTrama) -{ - int lon; - char *nfn,*aux,*ids,*scp,*cfg,msglog[LONSTD]; - char modulo[] = "EjecutarScript()"; - - if (ndebug>=DEBUG_MAXIMO) { - sprintf(msglog, "%s:%s",tbMensajes[21],modulo); - infoDebug(msglog); - } - aux=copiaParametro("scp",ptrTrama); - scp=URLDecode(aux); - - - muestraMensaje(8,NULL); - /* Nombre del archivo de script */ - char filescript[LONPRM]; - sprintf(filescript,"/tmp/_script_%s",IPlocal); - escribeArchivo(filescript,scp); - nfn=copiaParametro("nfn",ptrTrama); - sprintf(interface,"%s/%s",pathinterface,nfn); - sprintf(parametros,"%s %s",nfn,filescript); - herror=interfaceAdmin(interface,parametros,NULL); - if(herror){ - sprintf(msglog,"%s:%s",tbErrores[86],nfn); - errorInfo(modulo,msglog); - muestraMensaje(21,NULL); - } - else - muestraMensaje(22,NULL); - - // Toma configuración de particiones - cfg=LeeConfiguracion(); - if(!cfg){ // No se puede recuperar la configuración del cliente - errorLog(modulo,36,FALSE); - herror=36; - } - - ids=copiaParametro("ids",ptrTrama); - - //herror=ejecutarCodigoBash(scp); - initParametros(ptrTrama,0); - lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_EjecutarScript"); - lon+=sprintf(ptrTrama->parametros+lon,"cfg=%s\r",cfg); // Configuración de los Sistemas Operativos del cliente - respuestaEjecucionComando(ptrTrama,herror,ids); - - liberaMemoria(nfn); - liberaMemoria(ids); - liberaMemoria(aux); - liberaMemoria(scp); - liberaMemoria(cfg); - - muestraMenu(); - - return(TRUE); -} -//______________________________________________________________________________________________________ -// Función: respuestaEjecucionComando -// -// Descripción: -// Envia una respuesta a una ejecucion de comando al servidor de Administración -// Parámetros: -// - ptrTrama: contenido del mensaje -// - res: Resultado de la ejecución (Código de error devuelto por el script ejecutado) -// - ids: Identificador de la sesion (En caso de no haber seguimiento es NULO) -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -BOOLEAN respuestaEjecucionComando(TRAMA* ptrTrama,int res,char *ids) -{ - int lon; - SOCKET socket_c; - char modulo[] = "respuestaEjecucionComando()"; - - lon=strlen(ptrTrama->parametros); - if(ids){ // Existe seguimiento - lon+=sprintf(ptrTrama->parametros+lon,"ids=%s\r",ids); // Añade identificador de la sesión - } - if (res==0){ // Resultado satisfactorio - lon+=sprintf(ptrTrama->parametros+lon,"res=%s\r","1"); - lon+=sprintf(ptrTrama->parametros+lon,"der=%s\r",""); - } - else{ // Algún error - lon+=sprintf(ptrTrama->parametros+lon,"res=%s\r","2"); - if(res>MAXERRORSCRIPT) - lon+=sprintf(ptrTrama->parametros+lon,"der=%s (Error de script:%d)\r",tbErroresScripts[0],res);// Descripción del error - else - lon+=sprintf(ptrTrama->parametros+lon,"der=%s\r",tbErroresScripts[res]);// Descripción del error - } - if(!(enviaMensajeServidor(&socket_c,ptrTrama,MSG_NOTIFICACION))){ - errorLog(modulo,44,FALSE); - return(FALSE); - } - - close(socket_c); - return(TRUE); -} -// ________________________________________________________________________________________________________ -// Función: gestionaTrama -// -// Descripción: -// Procesa las tramas recibidas. -// Parametros: -// ptrTrama: contenido del mensaje -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -BOOLEAN gestionaTrama(TRAMA *ptrTrama) -{ - int i, res; - char *nfn; - char modulo[] = "gestionaTrama()"; - - INTROaFINCAD(ptrTrama); - nfn = copiaParametro("nfn", ptrTrama); // Toma nombre de función - for (i = 0; i < MAXIMAS_FUNCIONES; i++) { // Recorre funciones que procesan las tramas - res = strcmp(tbfuncionesClient[i].nf, nfn); - if (res == 0) { // Encontrada la función que procesa el mensaje - liberaMemoria(nfn); - return(tbfuncionesClient[i].fptr(ptrTrama)); // Invoca la función - } - } - - liberaMemoria(nfn); - - /* Sólo puede ser un comando personalizado - if (ptrTrama->tipo==MSG_COMANDO) - return(Comando(ptrTrama)); - */ - errorLog(modulo, 18, FALSE); - return (FALSE); -} -//________________________________________________________________________________________________________ -// Función: ejecutaArchivo -// -// Descripción: -// Ejecuta los comando contenido en un archivo (cada comando y sus parametros separados por un -// salto de linea. -// Parámetros: -// filecmd: Nombre del archivo de comandos -// ptrTrama: Puntero a una estructura TRAMA usada en las comunicaciones por red (No debe ser NULL) -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -//________________________________________________________________________________________________________ -BOOLEAN ejecutaArchivo(char* filecmd,TRAMA *ptrTrama) -{ - char* buffer,*lineas[MAXIMAS_LINEAS]; - int i,numlin; - char modulo[] = "ejecutaArchivo()"; - - buffer=leeArchivo(filecmd); - if(buffer){ - numlin = splitCadena(lineas, buffer, '@'); - initParametros(ptrTrama,0); - for (i = 0; i < numlin; i++) { - if(strlen(lineas[i])>0){ - strcpy(ptrTrama->parametros,lineas[i]); - //strcat(ptrTrama->parametros,"\rMCDJ@"); // Fin de trama - if(!gestionaTrama(ptrTrama)){ // Análisis de la trama - errorLog(modulo,39,FALSE); - //return(FALSE); - } - } - } - } - liberaMemoria(buffer); - return(TRUE); -} - -BOOLEAN EjecutaComandosPendientes(TRAMA* ptrTrama) -{ - return(TRUE); -} - -//______________________________________________________________________________________________________ -// Función: enviaMensajeServidor -// -// Descripción: -// Envia un mensaje al servidor de Administración -// Parámetros: -// - socket_c: (Salida) Socket utilizado para el envío -// - ptrTrama: contenido del mensaje -// - tipo: Tipo de mensaje -// C=Comando, N=Respuesta a un comando, P=Peticion,R=Respuesta a una petición, I=Informacion -// Devuelve: -// TRUE: Si el proceso es correcto -// FALSE: En caso de ocurrir algún error -// ________________________________________________________________________________________________________ -BOOLEAN enviaMensajeServidor(SOCKET *socket_c,TRAMA *ptrTrama,char tipo) -{ - int lon; - char modulo[] = "enviaMensajeServidor()"; - - *socket_c=abreConexion(); - if(*socket_c==INVALID_SOCKET){ - errorLog(modulo,38,FALSE); // Error de conexión con el servidor - return(FALSE); - } - ptrTrama->arroba='@'; // Cabecera de la trama - strncpy(ptrTrama->identificador,"JMMLCAMDJ_MCDJ",14); // identificador de la trama - ptrTrama->tipo=tipo; // Tipo de mensaje - lon=strlen(ptrTrama->parametros); // Compone la trama - lon+=sprintf(ptrTrama->parametros+lon,"iph=%s\r",IPlocal); // Ip del ordenador - lon+=sprintf(ptrTrama->parametros+lon,"ido=%s\r",idordenador); // Identificador del ordenador - lon+=sprintf(ptrTrama->parametros+lon,"npc=%s\r",nombreordenador); // Nombre del ordenador - lon+=sprintf(ptrTrama->parametros+lon,"idc=%s\r",idcentro); // Identificador del centro - lon+=sprintf(ptrTrama->parametros+lon,"ida=%s\r",idaula); // Identificador del aula - - if (!mandaTrama(socket_c,ptrTrama)) { - errorLog(modulo,26,FALSE); - return (FALSE); - } - return(TRUE); -} -// ******************************************************************************************************** -// PROGRAMA PRINCIPAL (CLIENTE) -// ******************************************************************************************************** -int main(int argc, char *argv[]) -{ - TRAMA *ptrTrama; - char modulo[] = "main()"; - - ptrTrama=(TRAMA *)reservaMemoria(sizeof(TRAMA)); - if (ptrTrama == NULL) { // No hay memoria suficiente para el bufer de las tramas - errorLog(modulo, 3, FALSE); - exit(EXIT_FAILURE); - } - /*-------------------------------------------------------------------------------------------------------- - Validación de parámetros de ejecución y fichero de configuración - ---------------------------------------------------------------------------------------------------------*/ - if (!validacionParametros(argc, argv,3)) // Valida parámetros de ejecución - exit(EXIT_FAILURE); - - if (!tomaConfiguracion(szPathFileCfg)) // Toma parametros de configuración - exit(EXIT_FAILURE); - /*-------------------------------------------------------------------------------------------------------- - Carga catálogo de funciones que procesan las tramas - ---------------------------------------------------------------------------------------------------------*/ - int cf = 0; - - strcpy(tbfuncionesClient[cf].nf, "RESPUESTA_AutoexecCliente"); - tbfuncionesClient[cf++].fptr = &RESPUESTA_AutoexecCliente; - - strcpy(tbfuncionesClient[cf].nf, "RESPUESTA_InclusionCliente"); - tbfuncionesClient[cf++].fptr = &RESPUESTA_InclusionCliente; - - strcpy(tbfuncionesClient[cf].nf, "NoComandosPtes"); - tbfuncionesClient[cf++].fptr = &NoComandosPtes; - - strcpy(tbfuncionesClient[cf].nf, "Actualizar"); - tbfuncionesClient[cf++].fptr = &Actualizar; - - strcpy(tbfuncionesClient[cf].nf, "Purgar"); - tbfuncionesClient[cf++].fptr = &Purgar; - - strcpy(tbfuncionesClient[cf].nf, "ConsolaRemota"); - tbfuncionesClient[cf++].fptr = &ConsolaRemota; - - strcpy(tbfuncionesClient[cf].nf, "Sondeo"); - tbfuncionesClient[cf++].fptr = &Sondeo; - - strcpy(tbfuncionesClient[cf].nf, "Arrancar"); - tbfuncionesClient[cf++].fptr = &Arrancar; - - strcpy(tbfuncionesClient[cf].nf, "Apagar"); - tbfuncionesClient[cf++].fptr = &Apagar; - - strcpy(tbfuncionesClient[cf].nf, "Reiniciar"); - tbfuncionesClient[cf++].fptr = &Reiniciar; - - strcpy(tbfuncionesClient[cf].nf, "IniciarSesion"); - tbfuncionesClient[cf++].fptr = &IniciarSesion; - - strcpy(tbfuncionesClient[cf].nf, "CrearImagen"); - tbfuncionesClient[cf++].fptr = &CrearImagen; - - strcpy(tbfuncionesClient[cf].nf, "CrearImagenBasica"); - tbfuncionesClient[cf++].fptr = &CrearImagenBasica; - - strcpy(tbfuncionesClient[cf].nf, "CrearSoftIncremental"); - tbfuncionesClient[cf++].fptr = &CrearSoftIncremental; - - strcpy(tbfuncionesClient[cf].nf, "RestaurarImagen"); - tbfuncionesClient[cf++].fptr = &RestaurarImagen; - - strcpy(tbfuncionesClient[cf].nf, "RestaurarImagenBasica"); - tbfuncionesClient[cf++].fptr = &RestaurarImagenBasica; - - strcpy(tbfuncionesClient[cf].nf, "RestaurarSoftIncremental"); - tbfuncionesClient[cf++].fptr = &RestaurarSoftIncremental; - - - strcpy(tbfuncionesClient[cf].nf, "Configurar"); - tbfuncionesClient[cf++].fptr = &Configurar; - - strcpy(tbfuncionesClient[cf].nf, "EjecutarScript"); - tbfuncionesClient[cf++].fptr = &EjecutarScript; - - strcpy(tbfuncionesClient[cf].nf, "InventarioHardware"); - tbfuncionesClient[cf++].fptr = &InventarioHardware; - - strcpy(tbfuncionesClient[cf].nf, "InventarioSoftware"); - tbfuncionesClient[cf++].fptr = &InventarioSoftware; - - strcpy(tbfuncionesClient[cf].nf, "EjecutaComandosPendientes"); - tbfuncionesClient[cf++].fptr = &EjecutaComandosPendientes; - - /*-------------------------------------------------------------------------------------------------------- - Toma dirección IP del cliente - ---------------------------------------------------------------------------------------------------------*/ - if(!tomaIPlocal()){ // Error al recuperar la IP local - errorLog(modulo,0,FALSE); - exit(EXIT_FAILURE); - } - /*-------------------------------------------------------------------------------------------------------- - Inicio de sesión - ---------------------------------------------------------------------------------------------------------*/ - infoLog(1); // Inicio de sesión - infoLog(3); // Abriendo sesión en el servidor de Administración; - /*-------------------------------------------------------------------------------------------------------- - Inclusión del cliente en el sistema - ---------------------------------------------------------------------------------------------------------*/ - if(!inclusionCliente(ptrTrama)){ // Ha habido algún problema al abrir sesión - errorLog(modulo,0,FALSE); - exit(EXIT_FAILURE); - } - infoLog(4); // Cliente iniciado - - /*-------------------------------------------------------------------------------------------------------- - Procesamiento de la cache - ---------------------------------------------------------------------------------------------------------*/ - infoLog(23); // Abriendo sesión en el servidor de Administración; - if(!cuestionCache(cache)){ - errorLog(modulo,0,FALSE); - exit(EXIT_FAILURE); - } - /*-------------------------------------------------------------------------------------------------------- - Ejecución del autoexec - ---------------------------------------------------------------------------------------------------------*/ - if(atoi(idproautoexec)>0){ // Ejecución de procedimiento Autoexec - infoLog(5); - if(!autoexecCliente(ptrTrama)){ // Ejecución fichero autoexec - errorLog(modulo,0,FALSE); - exit(EXIT_FAILURE); - } - } - /*-------------------------------------------------------------------------------------------------------- - Comandos pendientes - ---------------------------------------------------------------------------------------------------------*/ - infoLog(6); // Procesa comandos pendientes - if(!comandosPendientes(ptrTrama)){ // Ejecución de acciones pendientes - errorLog(modulo,0,FALSE); - exit(EXIT_FAILURE); - } - infoLog(7); // Acciones pendientes procesadas - /*-------------------------------------------------------------------------------------------------------- - Bucle de recepción de comandos - ---------------------------------------------------------------------------------------------------------*/ - muestraMenu(); - procesaComandos(ptrTrama); // Bucle para procesar comandos interactivos - /*-------------------------------------------------------------------------------------------------------- - Fin de la sesión - ---------------------------------------------------------------------------------------------------------*/ - exit(EXIT_SUCCESS); -} diff --git a/sources/clients/ogAdmClient/sources/ogAdmClient.h b/sources/clients/ogAdmClient/sources/ogAdmClient.h deleted file mode 100644 index da0a5c3..0000000 --- a/sources/clients/ogAdmClient/sources/ogAdmClient.h +++ /dev/null @@ -1,183 +0,0 @@ -// ******************************************************************************************************** -// Cliernte: ogAdmClient -// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla -// Fecha Creación: Marzo-2010 -// Fecha Última modificación: Marzo-2010 -// Nombre del fichero: ogAdmClient.h -// Descripción :Este fichero implementa el cliente general del sistema -// ******************************************************************************************************** -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "ogAdmLib.h" -// ________________________________________________________________________________________________________ -// Variables globales -// ________________________________________________________________________________________________________ -char *idordenador; // Identificador del ordenador -char *nombreordenador; // Nombre del ordenador -char *cache; // Tamaño de la caché -char *idproautoexec; // Identificador del procedimiento de autoexec -char *idcentro; // Identificador de la Unidad Organizativa -char *idaula; // Identificador del aula -char IPlocal[LONIP]; // Ip local - -char servidoradm[LONPRM]; // Dirección IP del servidor de administración -char puerto[LONPRM]; // Puerto de comunicación -char pathinterface[LONPRM]; // Path donde está la interface entre la administración y el módulo de clonación - -char interface[LONFUN]; // Nombre del módulo,función o script de la interface con el módulo de administración -char parametros[LONSTD]; // Parámetros para la llamada -int herror; - -BOOLEAN CMDPTES; // Para bucle de comandos pendientes - - -char urlmenu[MAXLONURL]; // Url de la pagina de menu para el browser -char urlmsg[MAXLONURL]; // Url de la página de mensajed para el browser - - -typedef struct{ // Estructura usada para referenciar las funciones que procesan las tramas - char nf[LONFUN]; // Nombre de la función - BOOLEAN (*fptr)(TRAMA*); // Puntero a la función que procesa la trama -}MSGFUN; -MSGFUN tbfuncionesClient[MAXIMAS_FUNCIONES]; -// ________________________________________________________________________________________________________ -// Tabla de errores de la ejecución de los scripts -// ________________________________________________________________________________________________________ -char* tbErroresScripts[]={"Se han generado errores desconocidos. No se puede continuar la ejecución de este módulo",\ - "001-Formato de ejecución incorrecto.",\ - "002-Fichero o dispositivo no encontrado",\ - "003-Error en partición de disco",\ - "004-Partición o fichero bloqueado",\ - "005-Error al crear o restaurar una imagen",\ - "006-Sin sistema operativo",\ - "007-Programa o función BOOLEAN no ejecutable",\ - "008-Error en la creación del archivo de eco para consola remota",\ - "009-Error en la lectura del archivo temporal de intercambio",\ - "010-Error al ejecutar la llamada a la interface de administración",\ - "011-La información retornada por la interface de administración excede de la longitud permitida",\ - "012-Error en el envío de fichero por la red",\ - "013-Error en la creación del proceso hijo",\ - "014-Error de escritura en destino",\ - "015-Sin Cache en el Cliente",\ - "016-No hay espacio en la cache para almacenar fichero-imagen",\ - "017-Error al Reducir el Sistema Archivos",\ - "018-Error al Expandir el Sistema Archivos",\ - "019-Valor fuera de rango o no válido.",\ - "020-Sistema de archivos desconocido o no se puede montar",\ - "021-Error en partición de caché local",\ - "022-El disco indicado no contiene una particion GPT",\ - "023-Error no definido",\ - "024-Error no definido",\ - "025-Error no definido",\ - "026-Error no definido",\ - "027-Error no definido",\ - "028-Error no definido",\ - "029-Error no definido",\ - "030-Error al restaurar imagen - Imagen mas grande que particion",\ - "031-Error al realizar el comando updateCache",\ - "032-Error al formatear",\ - "033-Archivo de imagen corrupto o de otra versión de partclone",\ - "034-Error no definido",\ - "035-Error no definido",\ - "036-Error no definido",\ - "037-Error no definido",\ - "038-Error no definido",\ - "039-Error no definido",\ - "040-Error imprevisto no definido",\ - "041-Error no definido",\ - "042-Error no definido",\ - "043-Error no definido",\ - "044-Error no definido",\ - "045-Error no definido",\ - "046-Error no definido",\ - "047-Error no definido",\ - "048-Error no definido",\ - "049-Error no definido",\ - "050-Error en la generación de sintaxis de transferenica unicast",\ - "051-Error en envio UNICAST de una particion",\ - "052-Error en envio UNICAST de un fichero",\ - "053-Error en la recepcion UNICAST de una particion",\ - "054-Error en la recepcion UNICAST de un fichero",\ - "055-Error en la generacion de sintaxis de transferenica Multicast",\ - "056-Error en envio MULTICAST de un fichero",\ - "057-Error en la recepcion MULTICAST de un fichero",\ - "058-Error en envio MULTICAST de una particion",\ - "059-Error en la recepcion MULTICAST de una particion",\ - "060-Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER",\ - "061-Error no definido",\ - "062-Error no definido",\ - "063-Error no definido",\ - "064-Error no definido",\ - "065-Error no definido",\ - "066-Error no definido",\ - "067-Error no definido",\ - "068-Error no definido",\ - "069-Error no definido",\ - "070-Error al montar una imagen sincronizada.",\ - "071-Imagen no sincronizable (es monolitica).",\ - "072-Error al desmontar la imagen.",\ - "073-No se detectan diferencias entre la imagen basica y la particion.",\ - "074-Error al sincronizar, puede afectar la creacion/restauracion de la imagen.",\ - "Error desconocido " - }; - #define MAXERRORSCRIPT 74 // Error máximo cometido -// ________________________________________________________________________________________________________ -// Prototipo de funciones -// ________________________________________________________________________________________________________ -BOOLEAN autoexecCliente(TRAMA*); -BOOLEAN RESPUESTA_AutoexecCliente(TRAMA*); -void procesaComandos(TRAMA*); - -BOOLEAN tomaConfiguracion(char*); -BOOLEAN tomaIPlocal(void); -void scriptLog(const char *,int ); - -BOOLEAN gestionaTrama(TRAMA *); -BOOLEAN inclusionCliente(); -char* LeeConfiguracion(); -BOOLEAN RESPUESTA_InclusionCliente(TRAMA *); - -BOOLEAN comandosPendientes(TRAMA*); -BOOLEAN NoComandosPtes(TRAMA *); - -BOOLEAN respuestaEjecucionComando(TRAMA *,int,char*); -BOOLEAN Sondeo(TRAMA *); -BOOLEAN Actualizar(TRAMA *); -int Purgar(TRAMA* ); - -BOOLEAN ConsolaRemota(TRAMA*); - -BOOLEAN Arrancar(TRAMA *); -BOOLEAN Apagar(TRAMA *); -BOOLEAN Reiniciar(TRAMA *); -BOOLEAN IniciarSesion(TRAMA *); -BOOLEAN CrearImagen(TRAMA *); -BOOLEAN CrearImagenBasica(TRAMA *); -BOOLEAN CrearSoftIncremental(TRAMA*); - -BOOLEAN InventarioHardware(TRAMA *); -BOOLEAN InventariandoSoftware(TRAMA *,BOOLEAN,char*); -BOOLEAN EjecutarScript(TRAMA *); -BOOLEAN ejecutaArchivo(char*,TRAMA*); - -BOOLEAN cuestionCache(char*); -int cargaPaginaWeb(char *); -void muestraMenu(void); -void muestraMensaje(int idx,char*); - -BOOLEAN enviaMensajeServidor(SOCKET *,TRAMA *,char); - - - - diff --git a/sources/clients/ogAdmClient/sources/ogAdmClient.o b/sources/clients/ogAdmClient/sources/ogAdmClient.o deleted file mode 100644 index e8bec64..0000000 Binary files a/sources/clients/ogAdmClient/sources/ogAdmClient.o and /dev/null differ