39 lines
36 KiB
JSON
39 lines
36 KiB
JSON
{
|
|
"schema_version": 1,
|
|
"channel": "homelab-runtime",
|
|
"command_id": "SUPPORT-260909-GRAM-XF-PROCESSING-NARROW-066",
|
|
"status": "OK",
|
|
"rc": 0,
|
|
"host": "pve01",
|
|
"mode": "read-only",
|
|
"component": "gram-support-processing-narrow",
|
|
"started_at_utc": "2026-09-09T12:52:31Z",
|
|
"finished_at_utc": "2026-09-09T12:52:33Z",
|
|
"reference_register_checked": true,
|
|
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
|
|
"error_register_checked": true,
|
|
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
|
|
"command_sha256": "b3716049942ceaea06095b5ef78a11b817e642afcc6903f53a48e9f209af6efa",
|
|
"duplicate_failed_command_blocked": false,
|
|
"block_reason": null,
|
|
"execution_started": true,
|
|
"change_declared": false,
|
|
"result_contract_valid": true,
|
|
"result_contract_status": null,
|
|
"result_contract_error": null,
|
|
"command_rc": 0,
|
|
"changes_made": false,
|
|
"rollback_started": false,
|
|
"rollback_restored": null,
|
|
"mutation_outcome": "NO_MUTATION",
|
|
"sanitized": true,
|
|
"secrets_included": false,
|
|
"private_addresses_included": false,
|
|
"raw_evidence_retained_locally": true,
|
|
"raw_evidence_sha256": "f3bacd113632355b0404ed76453af3e803d539bb8c332baf6b14b126f66f47ee",
|
|
"sanitized_output_sha256": "f3bacd113632355b0404ed76453af3e803d539bb8c332baf6b14b126f66f47ee",
|
|
"output_truncated_in_json": false,
|
|
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
|
|
"output": "SUPPORT066_BEGIN\nERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nSUPPORT066_QGA_STATE={\"exitcode\":0,\"state\":\"COMPLETE\"}\nSUPPORT066_VM211={\"command_id\":\"SUPPORT-260909-GRAM-XF-PROCESSING-NARROW-066\",\"decision\":\"NARROW_PROCESSING_STATE_CAPTURED\",\"guest\":\"newfi-staging\",\"holds\":[],\"identity_ok\":true,\"probe\":{\"rc\":0,\"stderr_sha256\":\"\"},\"probe_after\":{\"rc\":0,\"stderr_sha256\":\"\"},\"scope\":\"READ_ONLY_NO_MUTATION\",\"source_evidence\":[{\"file\":\"src/XF/Cli/Command/AddOn/AbstractSetupStep.php\",\"matches\":[{\"line\":42,\"text\":\"\\t{\"},{\"line\":43,\"text\":\"\\t\\t$id = $input->getArgument('id');\"},{\"line\":44,\"text\":\"\"},{\"line\":45,\"text\":\"\\t\\t$addOn = $this->checkEditableAddOn($id, $error);\"},{\"line\":46,\"text\":\"\\t\\tif (!$addOn)\"},{\"line\":47,\"text\":\"\\t\\t{\"},{\"line\":48,\"text\":\"\\t\\t\\t$output->writeln('<error>' . $error . '</error>');\"},{\"line\":49,\"text\":\"\\t\\t\\treturn 1;\"},{\"line\":50,\"text\":\"\\t\\t}\"},{\"line\":51,\"text\":\"\"},{\"line\":52,\"text\":\"\\t\\t$setup = $addOn->getSetup();\"},{\"line\":53,\"text\":\"\"},{\"line\":54,\"text\":\"\\t\\tif (!$setup)\"},{\"line\":55,\"text\":\"\\t\\t{\"},{\"line\":56,\"text\":\"\\t\\t\\t$output->writeln(\\\"<error>Setup class for add-on could not be found.</error>\\\");\"},{\"line\":57,\"text\":\"\\t\\t\\treturn 1;\"},{\"line\":58,\"text\":\"\\t\\t}\"},{\"line\":59,\"text\":\"\"},{\"line\":60,\"text\":\"\\t\\t$step = $input->getArgument('step');\"},{\"line\":61,\"text\":\"\\t\\t$version = null;\"},{\"line\":62,\"text\":\"\\t\\t$params = [];\"},{\"line\":63,\"text\":\"\"},{\"line\":64,\"text\":\"\\t\\t$stepType = $this->getStepType();\"},{\"line\":65,\"text\":\"\\t\\tif ($stepType == 'upgrade')\"},{\"line\":66,\"text\":\"\\t\\t{\"},{\"line\":67,\"text\":\"\\t\\t\\t$version = $input->getArgument('version');\"},{\"line\":68,\"text\":\"\\t\\t}\"},{\"line\":69,\"text\":\"\"},{\"line\":70,\"text\":\"\\t\\t$setup->prepareForAction($stepType);\"},{\"line\":71,\"text\":\"\"},{\"line\":72,\"text\":\"\\t\\tdo\"},{\"line\":73,\"text\":\"\\t\\t{\"},{\"line\":74,\"text\":\"\\t\\t\\t$result = $this->runStep($setup, $output, $stepType, $step, $version, $params);\"},{\"line\":75,\"text\":\"\\t\\t\\tif (!($result instanceof StepResult))\"},{\"line\":76,\"text\":\"\\t\\t\\t{\"},{\"line\":77,\"text\":\"\\t\\t\\t\\t$this->clearStatus($output, \\\"<error>Must return a StepResult object.</error>\\\");\"},{\"line\":78,\"text\":\"\\t\\t\\t\\treturn 1;\"},{\"line\":79,\"text\":\"\\t\\t\\t}\"},{\"line\":80,\"text\":\"\\t\\t\\telse\"},{\"line\":81,\"text\":\"\\t\\t\\t{\"},{\"line\":82,\"text\":\"\\t\\t\\t\\tif ($result->complete)\"},{\"line\":83,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":84,\"text\":\"\\t\\t\\t\\t\\t$loop = false;\"},{\"line\":85,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":86,\"text\":\"\\t\\t\\t\\telse if (is_int($result))\"},{\"line\":87,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":88,\"text\":\"\\t\\t\\t\\t\\t$loop = false;\"},{\"line\":89,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":90,\"text\":\"\\t\\t\\t\\telse\"},{\"line\":91,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":92,\"text\":\"\\t\\t\\t\\t\\t$params = $result->params;\"},{\"line\":93,\"text\":\"\\t\\t\\t\\t\\t$loop = true;\"},{\"line\":104,\"text\":\"\\tprotected function runStep(AbstractSetup $setup, OutputInterface $output, $stepType, $step, $version = null, array $params = [])\"},{\"line\":105,\"text\":\"\\t{\"},{\"line\":106,\"text\":\"\\t\\t$method = $stepType;\"},{\"line\":107,\"text\":\"\"},{\"line\":108,\"text\":\"\\t\\tswitch ($method)\"},{\"line\":109,\"text\":\"\\t\\t{\"},{\"line\":110,\"text\":\"\\t\\t\\tcase 'install':\"},{\"line\":111,\"text\":\"\\t\\t\\tcase 'uninstall':\"},{\"line\":112,\"text\":\"\\t\\t\\t\\tif ($step)\"},{\"line\":113,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":114,\"text\":\"\\t\\t\\t\\t\\t$method .= 'Step' . $step;\"},{\"line\":115,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":116,\"text\":\"\\t\\t\\t\\tbreak;\"},{\"line\":117,\"text\":\"\"},{\"line\":118,\"text\":\"\\t\\t\\tcase 'upgrade':\"},{\"line\":119,\"text\":\"\\t\\t\\t\\tif ($version && $step)\"},{\"line\":120,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":121,\"text\":\"\\t\\t\\t\\t\\t$method .= $version . 'Step' . $step;\"},{\"line\":122,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":123,\"text\":\"\\t\\t\\t\\tbreak;\"},{\"line\":124,\"text\":\"\\t\\t}\"},{\"line\":125,\"text\":\"\"},{\"line\":126,\"text\":\"\\t\\tif (!method_exists($setup, $method))\"}],\"sha256\":\"86ac6e9eda2202a75f3566a6bf20b14b5cc5171a823e0a23de0e66d0e8c0a8b7\"},{\"file\":\"src/XF/Cli/Command/AddOn/Create.php\",\"matches\":[{\"line\":40,\"text\":\"\\t\\tif ($devOutput->isAddOnSkipped($addOnId))\"},{\"line\":41,\"text\":\"\\t\\t{\"},{\"line\":42,\"text\":\"\\t\\t\\t$output->writeln(\\\"<error>Development output for this add-on ID has been disabled. Cannot continue.</error>\\\");\"},{\"line\":43,\"text\":\"\\t\\t\\tif (strtolower(substr($addOnId, 0, 2)) == 'xf')\"},{\"line\":44,\"text\":\"\\t\\t\\t{\"},{\"line\":45,\"text\":\"\\t\\t\\t\\t$output->writeln(\\\"Note: use of add-on IDs starting with 'xf' is strongly discouraged.\\\");\"},{\"line\":46,\"text\":\"\\t\\t\\t}\"},{\"line\":47,\"text\":\"\\t\\t\\treturn 1;\"},{\"line\":48,\"text\":\"\\t\\t}\"},{\"line\":49,\"text\":\"\"},{\"line\":50,\"text\":\"\\t\\t$checkPath = \\\\XF::getAddOnDirectory();\"},{\"line\":51,\"text\":\"\"},{\"line\":52,\"text\":\"\\t\\t$addOnManager = \\\\XF::app()->addOnManager();\"},{\"line\":53,\"text\":\"\\t\\tforeach ($addOnManager->getAllAddOns() AS $existingAddOnId => $existingAddOn)\"},{\"line\":54,\"text\":\"\\t\\t{\"},{\"line\":55,\"text\":\"\\t\\t\\tif ($existingAddOnId !== $addOnId && strcasecmp($existingAddOnId, $addOnId) === 0)\"},{\"line\":56,\"text\":\"\\t\\t\\t{\"},{\"line\":57,\"text\":\"\\t\\t\\t\\t$output->writeln(\\\"<error>Add-on ID '{$addOnId}' conflicts with existing add-on '{$existingAddOnId}' (case mismatch).</error>\\\");\"},{\"line\":58,\"text\":\"\\t\\t\\t\\treturn 1;\"},{\"line\":59,\"text\":\"\\t\\t\\t}\"},{\"line\":60,\"text\":\"\\t\\t}\"},{\"line\":61,\"text\":\"\"},{\"line\":62,\"text\":\"\\t\\tif (strpos($addOnId, '/') !== false)\"},{\"line\":63,\"text\":\"\\t\\t{\"},{\"line\":64,\"text\":\"\\t\\t\\t$addOnIdParts = explode('/', $addOnId);\"},{\"line\":65,\"text\":\"\\t\\t\\t$vendor = reset($addOnIdParts);\"},{\"line\":66,\"text\":\"\"},{\"line\":67,\"text\":\"\\t\\t\\tif (file_exists(\\\\XF::getAddOnDirectory() . \\\\XF::$DS . $vendor))\"},{\"line\":68,\"text\":\"\\t\\t\\t{\"},{\"line\":69,\"text\":\"\\t\\t\\t\\t$checkPath = \\\\XF::getAddOnDirectory() . \\\\XF::$DS . $vendor;\"},{\"line\":70,\"text\":\"\\t\\t\\t}\"},{\"line\":71,\"text\":\"\"},{\"line\":72,\"text\":\"\\t\\t\\tif ($addOnDir = opendir(\\\\XF::getAddOnDirectory()))\"},{\"line\":73,\"text\":\"\\t\\t\\t{\"},{\"line\":74,\"text\":\"\\t\\t\\t\\twhile (($dir = readdir($addOnDir)) !== false)\"},{\"line\":75,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":76,\"text\":\"\\t\\t\\t\\t\\tif (strcasecmp($dir, $vendor) == 0 && $dir != $vendor)\"},{\"line\":77,\"text\":\"\\t\\t\\t\\t\\t{\"},{\"line\":78,\"text\":\"\\t\\t\\t\\t\\t\\t$output->writeln(\\\"<error>The '{$checkPath}' directory conflicts with an existing directory with the same name but a different case.</error>\\\");\"},{\"line\":79,\"text\":\"\\t\\t\\t\\t\\t\\treturn 1;\"},{\"line\":80,\"text\":\"\\t\\t\\t\\t\\t}\"},{\"line\":81,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":82,\"text\":\"\\t\\t\\t\\tclosedir($addOnDir);\"},{\"line\":83,\"text\":\"\\t\\t\\t}\"},{\"line\":84,\"text\":\"\\t\\t}\"},{\"line\":85,\"text\":\"\"},{\"line\":86,\"text\":\"\\t\\tif (!is_writable($checkPath))\"},{\"line\":87,\"text\":\"\\t\\t{\"},{\"line\":88,\"text\":\"\\t\\t\\t$checkPathPrintable = str_replace(\\\\XF::getRootDirectory() . \\\\XF::$DS, '', $checkPath);\"},{\"line\":89,\"text\":\"\\t\\t\\t$output->writeln(\\\"<error>The '{$checkPathPrintable}' directory is not writable.</error>\\\");\"},{\"line\":90,\"text\":\"\\t\\t\\treturn 1;\"},{\"line\":91,\"text\":\"\\t\\t}\"},{\"line\":92,\"text\":\"\"},{\"line\":93,\"text\":\"\\t\\t$addOnObj = new AddOn($addOnId, \\\\XF::app()->addOnManager());\"},{\"line\":94,\"text\":\"\"},{\"line\":95,\"text\":\"\\t\\t$jsonPath = $addOnObj->getJsonPath();\"},{\"line\":96,\"text\":\"\"},{\"line\":97,\"text\":\"\\t\\tif (file_exists($jsonPath))\"},{\"line\":98,\"text\":\"\\t\\t{\"},{\"line\":99,\"text\":\"\\t\\t\\t$output->writeln(\\\"<error>The addon.json file already exists at {$jsonPath}. You can create the add-on by installing it from the Admin CP.</error>\\\");\"},{\"line\":100,\"text\":\"\\t\\t\\treturn 1;\"},{\"line\":101,\"text\":\"\\t\\t}\"},{\"line\":102,\"text\":\"\"},{\"line\":103,\"text\":\"\\t\\t$question = new Question(\\\"<question>Enter a title:</question> \\\");\"},{\"line\":104,\"text\":\"\\t\\t$question->setValidator($this->getAddOnQuestionFieldValidator('title'));\"},{\"line\":105,\"text\":\"\\t\\t$title = $helper->ask($input, $output, $question);\"},{\"line\":106,\"text\":\"\\t\\t$output->writeln(\\\"\\\");\"},{\"line\":107,\"text\":\"\"},{\"line\":108,\"text\":\"\\t\\t$question = new Question(\\\"<question>Enter a version ID.</question><info> This integer will be used for internal version comparisons. Each release of your add-on should increase this number: </info> \\\");\"},{\"line\":109,\"text\":\"\\t\\t$question->setValidator(function ($value)\"},{\"line\":110,\"text\":\"\\t\\t{\"},{\"line\":111,\"text\":\"\\t\\t\\tif (!preg_match('/^[0-9]+$/', $value))\"},{\"line\":112,\"text\":\"\\t\\t\\t{\"},{\"line\":113,\"text\":\"\\t\\t\\t\\tthrow new \\\\InvalidArgumentException(\\\"The version ID should contain numeric values only.\\\");\"},{\"line\":114,\"text\":\"\\t\\t\\t}\"},{\"line\":115,\"text\":\"\\t\\t\\treturn $value;\"},{\"line\":170,\"text\":\"\"},{\"line\":171,\"text\":\"\\t\\t$output->writeln(\\\"\\\");\"},{\"line\":172,\"text\":\"\"},{\"line\":173,\"text\":\"\\t\\t$addOn->preSave();\"},{\"line\":174,\"text\":\"\\t\\tif ($errors = $addOn->getErrors())\"},{\"line\":175,\"text\":\"\\t\\t{\"},{\"line\":176,\"text\":\"\\t\\t\\t$output->writeln(\\\"<error>An unexpected error occurred while saving the add-on: \\\" . reset($errors) . \\\"</error>\\\");\"},{\"line\":177,\"text\":\"\\t\\t\\treturn 1;\"},{\"line\":178,\"text\":\"\\t\\t}\"},{\"line\":179,\"text\":\"\"},{\"line\":180,\"text\":\"\\t\\t$addOn->save();\"},{\"line\":181,\"text\":\"\"},{\"line\":182,\"text\":\"\\t\\tFile::createDirectory($addOnObj->getAddOnDirectory(), false);\"},{\"line\":183,\"text\":\"\"},{\"line\":184,\"text\":\"\\t\\t$json = [\"},{\"line\":185,\"text\":\"\\t\\t\\t'title' => $addOn->title,\"},{\"line\":186,\"text\":\"\\t\\t\\t'version_string' => $addOn->version_string,\"},{\"line\":187,\"text\":\"\\t\\t\\t'version_id' => intval($addOn->version_id),\"},{\"line\":188,\"text\":\"\\t\\t];\"},{\"line\":189,\"text\":\"\\t\\tif ($legacyAddOnId)\"},{\"line\":190,\"text\":\"\\t\\t{\"},{\"line\":191,\"text\":\"\\t\\t\\t$json['legacy_addon_id'] = $legacyAddOnId;\"},{\"line\":192,\"text\":\"\\t\\t}\"},{\"line\":220,\"text\":\"\\t\\t\\t\\t$setupContent = <<< SETUP\"}],\"sha256\":\"4ff8f77caa12327158b9a6ba6ed2ffe85b959011279be5a70a8b3e77f75204f5\"},{\"file\":\"src/XF/Cli/Command/AddOn/UninstallStep.php\",\"matches\":[{\"line\":1,\"text\":\"<?php\"},{\"line\":2,\"text\":\"\"},{\"line\":3,\"text\":\"namespace XF\\\\Cli\\\\Command\\\\AddOn;\"},{\"line\":4,\"text\":\"\"},{\"line\":5,\"text\":\"use Symfony\\\\Component\\\\Console\\\\Input\\\\InputArgument;\"},{\"line\":6,\"text\":\"\"},{\"line\":7,\"text\":\"class UninstallStep extends AbstractSetupStep\"},{\"line\":8,\"text\":\"{\"},{\"line\":9,\"text\":\"\\tprotected function getStepType()\"},{\"line\":10,\"text\":\"\\t{\"},{\"line\":11,\"text\":\"\\t\\treturn 'uninstall';\"},{\"line\":12,\"text\":\"\\t}\"},{\"line\":13,\"text\":\"\"},{\"line\":14,\"text\":\"\\tprotected function getCommandArguments()\"},{\"line\":15,\"text\":\"\\t{\"},{\"line\":16,\"text\":\"\\t\\t$this->addArgument(\"},{\"line\":17,\"text\":\"\\t\\t\\t'step',\"},{\"line\":18,\"text\":\"\\t\\t\\tInputArgument::REQUIRED,\"},{\"line\":19,\"text\":\"\\t\\t\\t'The step number to run.'\"},{\"line\":20,\"text\":\"\\t\\t);\"},{\"line\":21,\"text\":\"\\t}\"},{\"line\":22,\"text\":\"}\"}],\"sha256\":\"d69b287acd3ea5c02bf23492e1bdef465fb75f22f00b45acdb4ffafe547260e5\"},{\"file\":\"src/XF/AddOn/AbstractSetup.php\",\"matches\":[{\"line\":32,\"text\":\"\\tabstract public function upgrade(array $stepParams = []);\"},{\"line\":33,\"text\":\"\"},{\"line\":34,\"text\":\"\\t/**\"},{\"line\":35,\"text\":\"\\t * @param array $stepParams\"},{\"line\":36,\"text\":\"\\t *\"},{\"line\":37,\"text\":\"\\t * @return null|StepResult\"},{\"line\":38,\"text\":\"\\t */\"},{\"line\":39,\"text\":\"\\tabstract public function uninstall(array $stepParams = []);\"},{\"line\":40,\"text\":\"\"},{\"line\":41,\"text\":\"\\tpublic function __construct(AddOn $addOn, App $app)\"},{\"line\":42,\"text\":\"\\t{\"},{\"line\":43,\"text\":\"\\t\\t$this->addOn = $addOn;\"},{\"line\":44,\"text\":\"\\t\\t$this->app = $app;\"},{\"line\":45,\"text\":\"\\t}\"},{\"line\":46,\"text\":\"\"},{\"line\":47,\"text\":\"\\t/**\"},{\"line\":48,\"text\":\"\\t * Perform additional requirement checks.\"},{\"line\":49,\"text\":\"\\t *\"},{\"line\":50,\"text\":\"\\t * @param list<string|\\\\Stringable> $errors Errors will block the setup from continuing\"},{\"line\":51,\"text\":\"\\t * @param list<string|\\\\Stringable> $warnings Warnings will be displayed but allow the user to continue setup\"},{\"line\":52,\"text\":\"\\t *\"},{\"line\":53,\"text\":\"\\t * @return void\"},{\"line\":54,\"text\":\"\\t */\"},{\"line\":86,\"text\":\"\\t\\t$this->app->jobManager()->enqueueUnique($uniqueId, FileCleanUp::class, [\"},{\"line\":87,\"text\":\"\\t\\t\\t'addon_id' => $addOn->addon_id,\"},{\"line\":88,\"text\":\"\\t\\t], false);\"},{\"line\":89,\"text\":\"\\t}\"},{\"line\":90,\"text\":\"\"},{\"line\":91,\"text\":\"\\tpublic function prepareForAction($action)\"},{\"line\":92,\"text\":\"\\t{\"},{\"line\":93,\"text\":\"\\t\\tif ($action == 'uninstall')\"},{\"line\":94,\"text\":\"\\t\\t{\"},{\"line\":95,\"text\":\"\\t\\t\\t\\\\XF::db()->ignoreLegacyTableWriteError(true);\"},{\"line\":96,\"text\":\"\\t\\t}\"},{\"line\":97,\"text\":\"\\t}\"},{\"line\":98,\"text\":\"\"},{\"line\":99,\"text\":\"\\t/**\"},{\"line\":100,\"text\":\"\\t * @param $sql\"},{\"line\":101,\"text\":\"\\t * @param array $bind\"},{\"line\":102,\"text\":\"\\t * @param bool $suppressAll\"},{\"line\":103,\"text\":\"\\t *\"},{\"line\":104,\"text\":\"\\t * @return bool|AbstractStatement\"},{\"line\":105,\"text\":\"\\t * @throws Exception\"},{\"line\":106,\"text\":\"\\t */\"},{\"line\":107,\"text\":\"\\tprotected function query($sql, $bind = [], $suppressAll = false)\"},{\"line\":108,\"text\":\"\\t{\"}],\"sha256\":\"6bdd3fe834e15b963a52c9357f54262f2d12f3c7c3686fc31333b549cddf2d88\"},{\"file\":\"src/XF/AddOn/AddOn.php\",\"matches\":[{\"line\":332,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":333,\"text\":\"\\t\\t\\t}\"},{\"line\":334,\"text\":\"\\t\\t}\"},{\"line\":335,\"text\":\"\"},{\"line\":336,\"text\":\"\\t\\treturn $this->setup;\"},{\"line\":337,\"text\":\"\\t}\"},{\"line\":338,\"text\":\"\"},{\"line\":339,\"text\":\"\\tpublic function isInstalled()\"},{\"line\":340,\"text\":\"\\t{\"},{\"line\":341,\"text\":\"\\t\\tif ($this->installedAddOn === null)\"},{\"line\":342,\"text\":\"\\t\\t{\"},{\"line\":343,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":344,\"text\":\"\\t\\t}\"},{\"line\":345,\"text\":\"\"},{\"line\":346,\"text\":\"\\t\\t$lastAction = $this->installedAddOn->getLastActionStep('install');\"},{\"line\":347,\"text\":\"\\t\\tif ($lastAction !== null)\"},{\"line\":348,\"text\":\"\\t\\t{\"},{\"line\":349,\"text\":\"\\t\\t\\t// we haven't completed the install steps yet, don't consider as installed\"},{\"line\":350,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":351,\"text\":\"\\t\\t}\"},{\"line\":352,\"text\":\"\"},{\"line\":353,\"text\":\"\\t\\treturn true;\"},{\"line\":354,\"text\":\"\\t}\"},{\"line\":355,\"text\":\"\"},{\"line\":356,\"text\":\"\\tpublic function isActive()\"},{\"line\":357,\"text\":\"\\t{\"},{\"line\":358,\"text\":\"\\t\\treturn $this->isInstalled()\"},{\"line\":359,\"text\":\"\\t\\t\\t&& $this->installedAddOn->active;\"},{\"line\":360,\"text\":\"\\t}\"},{\"line\":361,\"text\":\"\"},{\"line\":362,\"text\":\"\\tpublic function isLegacy()\"},{\"line\":363,\"text\":\"\\t{\"},{\"line\":364,\"text\":\"\\t\\treturn $this->isInstalled()\"},{\"line\":365,\"text\":\"\\t\\t\\t&& $this->installedAddOn->is_legacy;\"},{\"line\":366,\"text\":\"\\t}\"},{\"line\":367,\"text\":\"\"},{\"line\":368,\"text\":\"\\tpublic function isDevOutputAvailable()\"},{\"line\":369,\"text\":\"\\t{\"},{\"line\":370,\"text\":\"\\t\\treturn \\\\XF::app()->developmentOutput()->isAddOnOutputAvailable($this->getAddOnId());\"},{\"line\":371,\"text\":\"\\t}\"},{\"line\":372,\"text\":\"\"},{\"line\":373,\"text\":\"\\tpublic function hasMissingFiles()\"},{\"line\":374,\"text\":\"\\t{\"},{\"line\":375,\"text\":\"\\t\\treturn count($this->missingFiles) > 0;\"},{\"line\":376,\"text\":\"\\t}\"},{\"line\":377,\"text\":\"\"},{\"line\":378,\"text\":\"\\tpublic function hasPendingChanges()\"},{\"line\":379,\"text\":\"\\t{\"},{\"line\":380,\"text\":\"\\t\\treturn $this->isInstalled()\"},{\"line\":381,\"text\":\"\\t\\t\\t&& !$this->isLegacy()\"},{\"line\":382,\"text\":\"\\t\\t\\t&& (\"},{\"line\":383,\"text\":\"\\t\\t\\t\\t!$this->isFileVersionValid()\"},{\"line\":384,\"text\":\"\\t\\t\\t\\t|| $this->isJsonHashChanged()\"},{\"line\":385,\"text\":\"\\t\\t\\t);\"},{\"line\":386,\"text\":\"\\t}\"},{\"line\":387,\"text\":\"\"},{\"line\":388,\"text\":\"\\tpublic function hasFaIcon()\"},{\"line\":389,\"text\":\"\\t{\"},{\"line\":390,\"text\":\"\\t\\treturn (\"},{\"line\":391,\"text\":\"\\t\\t\\t$this->icon\"},{\"line\":392,\"text\":\"\\t\\t\\t&& !$this->hasIcon()\"},{\"line\":393,\"text\":\"\\t\\t\\t&& preg_match('#^(fa-|fa[a-z] )#', $this->icon)\"},{\"line\":394,\"text\":\"\\t\\t);\"},{\"line\":395,\"text\":\"\\t}\"},{\"line\":431,\"text\":\"\\tpublic function isAvailable()\"},{\"line\":432,\"text\":\"\\t{\"},{\"line\":433,\"text\":\"\\t\\treturn count($this->missingFiles) == 0;\"},{\"line\":434,\"text\":\"\\t}\"},{\"line\":435,\"text\":\"\"},{\"line\":436,\"text\":\"\\tpublic function isFileVersionValid()\"},{\"line\":437,\"text\":\"\\t{\"},{\"line\":438,\"text\":\"\\t\\treturn $this->isInstalled()\"},{\"line\":439,\"text\":\"\\t\\t\\t&& $this->isAvailable()\"},{\"line\":440,\"text\":\"\\t\\t\\t&& $this->installedAddOn->version_id == $this->json['version_id'];\"},{\"line\":441,\"text\":\"\\t}\"},{\"line\":442,\"text\":\"\"},{\"line\":443,\"text\":\"\\tpublic function isJsonHashChanged()\"},{\"line\":444,\"text\":\"\\t{\"},{\"line\":445,\"text\":\"\\t\\treturn (\"},{\"line\":446,\"text\":\"\\t\\t\\t$this->isAvailable()\"},{\"line\":447,\"text\":\"\\t\\t\\t&& $this->getJsonHash() !== $this->installedAddOn->json_hash\"},{\"line\":448,\"text\":\"\\t\\t);\"},{\"line\":449,\"text\":\"\\t}\"},{\"line\":450,\"text\":\"\"},{\"line\":451,\"text\":\"\\tpublic function isJsonVersionNewer()\"},{\"line\":452,\"text\":\"\\t{\"},{\"line\":453,\"text\":\"\\t\\treturn ($this->json['version_id'] > $this->installedAddOn->version_id);\"},{\"line\":459,\"text\":\"\\t\\t\\t'version_id' => $this->json['version_id'],\"},{\"line\":460,\"text\":\"\\t\\t\\t'version_string' => $this->json['version_string'],\"},{\"line\":461,\"text\":\"\\t\\t];\"},{\"line\":462,\"text\":\"\\t}\"},{\"line\":463,\"text\":\"\"},{\"line\":464,\"text\":\"\\tpublic function canUpgrade()\"},{\"line\":465,\"text\":\"\\t{\"},{\"line\":466,\"text\":\"\\t\\treturn $this->isInstalled()\"},{\"line\":467,\"text\":\"\\t\\t\\t&& $this->isJsonHashChanged()\"},{\"line\":468,\"text\":\"\\t\\t\\t&& $this->isJsonVersionNewer()\"},{\"line\":469,\"text\":\"\\t\\t\\t&& $this->canEdit();\"},{\"line\":470,\"text\":\"\\t}\"},{\"line\":471,\"text\":\"\"}],\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"},{\"file\":\"src/XF/AddOn/DataManager.php\",\"matches\":[{\"line\":28,\"text\":\"use XF\\\\AddOn\\\\DataType\\\\StylePropertyGroup;\"},{\"line\":29,\"text\":\"use XF\\\\AddOn\\\\DataType\\\\Template;\"},{\"line\":30,\"text\":\"use XF\\\\AddOn\\\\DataType\\\\TemplateModification;\"},{\"line\":31,\"text\":\"use XF\\\\AddOn\\\\DataType\\\\WidgetDefinition;\"},{\"line\":32,\"text\":\"use XF\\\\AddOn\\\\DataType\\\\WidgetPosition;\"},{\"line\":33,\"text\":\"use XF\\\\Finder\\\\AddOnFinder;\"},{\"line\":34,\"text\":\"use XF\\\\Job\\\\AddOnData;\"},{\"line\":35,\"text\":\"use XF\\\\Job\\\\AddOnUninstallData;\"},{\"line\":36,\"text\":\"use XF\\\\Job\\\\Atomic;\"},{\"line\":37,\"text\":\"use XF\\\\Mvc\\\\Entity\\\\Manager;\"},{\"line\":38,\"text\":\"use XF\\\\Repository\\\\ClassExtensionRepository;\"},{\"line\":39,\"text\":\"use XF\\\\Repository\\\\CodeEventListenerRepository;\"},{\"line\":40,\"text\":\"use XF\\\\Repository\\\\ForumTypeRepository;\"},{\"line\":41,\"text\":\"use XF\\\\Repository\\\\PaymentRepository;\"},{\"line\":42,\"text\":\"use XF\\\\Repository\\\\RouteRepository;\"},{\"line\":43,\"text\":\"use XF\\\\Repository\\\\ThreadTypeRepository;\"},{\"line\":44,\"text\":\"use XF\\\\Util\\\\File;\"},{\"line\":45,\"text\":\"\"},{\"line\":46,\"text\":\"class DataManager\"},{\"line\":47,\"text\":\"{\"},{\"line\":48,\"text\":\"\\t/**\"},{\"line\":49,\"text\":\"\\t * @var Manager\"},{\"line\":50,\"text\":\"\\t */\"},{\"line\":132,\"text\":\"\\t\\t$addOnManager = \\\\XF::app()->addOnManager();\"},{\"line\":133,\"text\":\"\"},{\"line\":134,\"text\":\"\\t\\t$addOns = $this->em->getFinder(AddOnFinder::class)->where('active', 1)->fetch();\"},{\"line\":135,\"text\":\"\\t\\tforeach ($addOns AS $addOn)\"},{\"line\":136,\"text\":\"\\t\\t{\"},{\"line\":137,\"text\":\"\\t\\t\\t$activeAddOns[$addOn->addon_id] = $addOn->version_id;\"},{\"line\":138,\"text\":\"\"},{\"line\":139,\"text\":\"\\t\\t\\t$addOnClass = $addOnManager->getById($addOn->addon_id);\"},{\"line\":140,\"text\":\"\\t\\t\\tif ($addOnClass)\"},{\"line\":141,\"text\":\"\\t\\t\\t{\"},{\"line\":142,\"text\":\"\\t\\t\\t\\t$addOnId = $addOn->addon_id;\"},{\"line\":143,\"text\":\"\\t\\t\\t\\t$autoloadPath = $addOnClass->composer_autoload;\"},{\"line\":144,\"text\":\"\"},{\"line\":145,\"text\":\"\\t\\t\\t\\tif (!$autoloadPath)\"},{\"line\":146,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":147,\"text\":\"\\t\\t\\t\\t\\tcontinue;\"},{\"line\":148,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":149,\"text\":\"\"},{\"line\":150,\"text\":\"\\t\\t\\t\\t$addOnAutoload = $addOnManager->getAddOnPath($addOnId) . \\\\XF::$DS . $autoloadPath;\"},{\"line\":151,\"text\":\"\"},{\"line\":152,\"text\":\"\\t\\t\\t\\tif (!$this->checkComposerAutoloadPath('installed.json', $addOnAutoload))\"},{\"line\":153,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":154,\"text\":\"\\t\\t\\t\\t\\tcontinue;\"},{\"line\":266,\"text\":\"\\t\\t}\"},{\"line\":267,\"text\":\"\"},{\"line\":268,\"text\":\"\\t\\t$db->commit();\"},{\"line\":269,\"text\":\"\\t}\"},{\"line\":270,\"text\":\"\"},{\"line\":271,\"text\":\"\\tpublic function enqueueRemoveAddOnData($id)\"},{\"line\":272,\"text\":\"\\t{\"},{\"line\":273,\"text\":\"\\t\\treturn \\\\XF::app()->jobManager()->enqueueUnique($id . 'AddOnUnInstall', AddOnUninstallData::class, [\"},{\"line\":274,\"text\":\"\\t\\t\\t'addon_id' => $id,\"},{\"line\":275,\"text\":\"\\t\\t]);\"},{\"line\":276,\"text\":\"\\t}\"},{\"line\":277,\"text\":\"\"},{\"line\":278,\"text\":\"\\tpublic function finalizeRemoveAddOnData($addOnId)\"},{\"line\":279,\"text\":\"\\t{\"},{\"line\":280,\"text\":\"\\t\\t$simpleCache = \\\\XF::app()->simpleCache();\"},{\"line\":281,\"text\":\"\\t\\t$simpleCache->deleteSet($addOnId);\"},{\"line\":282,\"text\":\"\"},{\"line\":283,\"text\":\"\\t\\t$this->rebuildActiveAddOnCache();\"},{\"line\":284,\"text\":\"\\t}\"},{\"line\":285,\"text\":\"\"},{\"line\":286,\"text\":\"\\t/**\"},{\"line\":287,\"text\":\"\\t * @template T of AbstractDataType\"},{\"line\":288,\"text\":\"\\t *\"}],\"sha256\":\"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0\"},{\"file\":\"src/XF/AddOn/StepRunnerUninstallTrait.php\",\"matches\":[{\"line\":3,\"text\":\"namespace XF\\\\AddOn;\"},{\"line\":4,\"text\":\"\"},{\"line\":5,\"text\":\"use function is_array;\"},{\"line\":6,\"text\":\"\"},{\"line\":7,\"text\":\"/**\"},{\"line\":8,\"text\":\" * @property AddOn $addOn\"},{\"line\":9,\"text\":\" */\"},{\"line\":10,\"text\":\"trait StepRunnerUninstallTrait\"},{\"line\":11,\"text\":\"{\"},{\"line\":12,\"text\":\"\\t/**\"},{\"line\":13,\"text\":\"\\t * @param array $stepParams\"},{\"line\":14,\"text\":\"\\t *\"},{\"line\":15,\"text\":\"\\t * @return null|StepResult\"},{\"line\":16,\"text\":\"\\t */\"},{\"line\":17,\"text\":\"\\tpublic function uninstall(array $stepParams = [])\"},{\"line\":18,\"text\":\"\\t{\"},{\"line\":19,\"text\":\"\\t\\t$stepParams = array_replace([\"},{\"line\":20,\"text\":\"\\t\\t\\t'step' => 0,\"},{\"line\":21,\"text\":\"\\t\\t], $stepParams);\"},{\"line\":22,\"text\":\"\"},{\"line\":23,\"text\":\"\\t\\t$step = $stepParams['step'];\"},{\"line\":24,\"text\":\"\\t\\tif (!$step)\"},{\"line\":25,\"text\":\"\\t\\t{\"},{\"line\":26,\"text\":\"\\t\\t\\t$step = $this->getUninstallResumeStep();\"},{\"line\":27,\"text\":\"\\t\\t}\"},{\"line\":28,\"text\":\"\\t\\treturn $this->uninstallStepRunner($step, $stepParams);\"},{\"line\":29,\"text\":\"\\t}\"},{\"line\":30,\"text\":\"\"},{\"line\":31,\"text\":\"\\tprivate function getUninstallResumeStep()\"},{\"line\":32,\"text\":\"\\t{\"},{\"line\":33,\"text\":\"\\t\\t$installedAddOn = $this->addOn->getInstalledAddOn();\"},{\"line\":34,\"text\":\"\\t\\tif ($installedAddOn)\"},{\"line\":35,\"text\":\"\\t\\t{\"},{\"line\":36,\"text\":\"\\t\\t\\t$lastActionStep = $installedAddOn->getLastActionStep('uninstall');\"},{\"line\":37,\"text\":\"\\t\\t\\tif ($lastActionStep)\"},{\"line\":38,\"text\":\"\\t\\t\\t{\"},{\"line\":39,\"text\":\"\\t\\t\\t\\treturn $lastActionStep + 1; // this is the last completed step, so resume with the next\"},{\"line\":40,\"text\":\"\\t\\t\\t}\"},{\"line\":41,\"text\":\"\\t\\t}\"},{\"line\":42,\"text\":\"\"},{\"line\":43,\"text\":\"\\t\\treturn 1;\"},{\"line\":44,\"text\":\"\\t}\"},{\"line\":45,\"text\":\"\"},{\"line\":46,\"text\":\"\\t/**\"},{\"line\":47,\"text\":\"\\t * @param integer $step\"},{\"line\":48,\"text\":\"\\t * @param array $stepParams\"},{\"line\":49,\"text\":\"\\t *\"},{\"line\":50,\"text\":\"\\t * @return null|StepResult\"},{\"line\":51,\"text\":\"\\t */\"},{\"line\":52,\"text\":\"\\tprivate function uninstallStepRunner($step, array $stepParams)\"},{\"line\":53,\"text\":\"\\t{\"},{\"line\":54,\"text\":\"\\t\\t$fnPrefix = 'uninstallStep';\"},{\"line\":55,\"text\":\"\\t\\t$fn = $fnPrefix . $step;\"},{\"line\":56,\"text\":\"\\t\\tif (!method_exists($this, $fn))\"},{\"line\":57,\"text\":\"\\t\\t{\"},{\"line\":58,\"text\":\"\\t\\t\\treturn null;\"},{\"line\":59,\"text\":\"\\t\\t}\"},{\"line\":60,\"text\":\"\"},{\"line\":61,\"text\":\"\\t\\t$result = $this->$fn($stepParams);\"},{\"line\":62,\"text\":\"\\t\\tif ($result === null || $result === true)\"},{\"line\":63,\"text\":\"\\t\\t{\"},{\"line\":64,\"text\":\"\\t\\t\\t$result = new StepResult(true);\"},{\"line\":65,\"text\":\"\\t\\t}\"},{\"line\":66,\"text\":\"\\t\\telse if (is_array($result))\"},{\"line\":67,\"text\":\"\\t\\t{\"},{\"line\":68,\"text\":\"\\t\\t\\t$result = new StepResult(false, $result);\"},{\"line\":69,\"text\":\"\\t\\t}\"},{\"line\":73,\"text\":\"\\t\\t\\tthrow new \\\\LogicException(\\\"Must return a StepResult object\\\");\"},{\"line\":74,\"text\":\"\\t\\t}\"},{\"line\":75,\"text\":\"\"},{\"line\":76,\"text\":\"\\t\\t$result->step = $step;\"},{\"line\":77,\"text\":\"\"},{\"line\":78,\"text\":\"\\t\\tif ($result->complete)\"},{\"line\":79,\"text\":\"\\t\\t{\"},{\"line\":80,\"text\":\"\\t\\t\\t$this->addOn->updatePendingAction('uninstall', $result->step);\"},{\"line\":81,\"text\":\"\"},{\"line\":82,\"text\":\"\\t\\t\\t$nextStep = $step + 1;\"},{\"line\":83,\"text\":\"\\t\\t\\t$nextFn = $fnPrefix . $nextStep;\"},{\"line\":84,\"text\":\"\\t\\t\\tif (!method_exists($this, $nextFn))\"},{\"line\":85,\"text\":\"\\t\\t\\t{\"},{\"line\":86,\"text\":\"\\t\\t\\t\\treturn null;\"},{\"line\":87,\"text\":\"\\t\\t\\t}\"},{\"line\":88,\"text\":\"\"},{\"line\":89,\"text\":\"\\t\\t\\t$result = new StepResult(false, [], $nextStep);\"},{\"line\":90,\"text\":\"\\t\\t}\"},{\"line\":91,\"text\":\"\"},{\"line\":92,\"text\":\"\\t\\treturn $result;\"},{\"line\":93,\"text\":\"\\t}\"},{\"line\":94,\"text\":\"}\"}],\"sha256\":\"e58a9ab9c30e3cf3c41a0be392e8c5ac37f744578f7b91f76d663139649c49a9\"}],\"state\":{\"addon_columns\":[\"addon_id\",\"title\",\"version_string\",\"version_id\",\"json_hash\",\"active\",\"is_legacy\",\"is_processing\",\"last_pending_action\"],\"addon_object\":{\"canUninstall\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":false},\"class\":\"XF\\\\AddOn\\\\AddOn\",\"getAddOnId\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":\"Gram/Support\"},\"getInstalledAddOnVersion\":{\"exists\":false},\"getInstalledVersion\":{\"exists\":false},\"getLastPendingAction\":{\"exists\":false},\"getPendingAction\":{\"exists\":false},\"getTitle\":{\"exists\":false},\"isActive\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":false},\"isInstalled\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":false},\"isProcessing\":{\"exists\":false},\"present\":true},\"addon_row\":{\"active\":\"1\",\"addon_id\":\"Gram/Support\",\"is_legacy\":\"0\",\"is_processing\":\"1\",\"json_hash\":\"f3804541014a3dfde3b35323475c5dbcbb72ebb0d0c319d66385e9203628724d\",\"last_pending_action\":\"install:1\",\"title\":\"Gram Support\",\"version_id\":\"1000050\",\"version_string\":\"1.0.0 Alpha 3 Unified Fix 3\"},\"board_active\":\"0\",\"error_max\":45,\"errors_after_45\":0,\"manager\":{\"class\":\"XF\\\\AddOn\\\\Manager\",\"getAllAddOns\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":{\"Gram/Support\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"Newfi/Dogs\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"Newfi/Events\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"Newfi/Portal\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"XFMG\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"XFRM\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"}}},\"getById\":{\"exists\":true,\"public\":true,\"required\":1,\"total\":1},\"getInstalledAddOns\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":{\"Newfi/Dogs\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"Newfi/Events\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"Newfi/Portal\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"XFMG\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"XFRM\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"}}}},\"registry\":{\"type\":\"object\"},\"registry_rows\":[{\"bytes\":187,\"contains_gram\":true,\"data_key\":\"addOns\",\"sha256\":\"dca4ff8a040ff5651348c60446b8983b7bc1372d3403ee249da526c679c966e4\"},{\"bytes\":6,\"contains_gram\":false,\"data_key\":\"addOnsComposer\",\"sha256\":\"35786c7117b4e38d0f169239752ce71158266ae2f6e4aa230fbbb87bd699c0e3\"}]},\"state_after\":{\"addon_columns\":[\"addon_id\",\"title\",\"version_string\",\"version_id\",\"json_hash\",\"active\",\"is_legacy\",\"is_processing\",\"last_pending_action\"],\"addon_object\":{\"canUninstall\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":false},\"class\":\"XF\\\\AddOn\\\\AddOn\",\"getAddOnId\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":\"Gram/Support\"},\"getInstalledAddOnVersion\":{\"exists\":false},\"getInstalledVersion\":{\"exists\":false},\"getLastPendingAction\":{\"exists\":false},\"getPendingAction\":{\"exists\":false},\"getTitle\":{\"exists\":false},\"isActive\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":false},\"isInstalled\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":false},\"isProcessing\":{\"exists\":false},\"present\":true},\"addon_row\":{\"active\":\"1\",\"addon_id\":\"Gram/Support\",\"is_legacy\":\"0\",\"is_processing\":\"1\",\"json_hash\":\"f3804541014a3dfde3b35323475c5dbcbb72ebb0d0c319d66385e9203628724d\",\"last_pending_action\":\"install:1\",\"title\":\"Gram Support\",\"version_id\":\"1000050\",\"version_string\":\"1.0.0 Alpha 3 Unified Fix 3\"},\"board_active\":\"0\",\"error_max\":45,\"errors_after_45\":0,\"manager\":{\"class\":\"XF\\\\AddOn\\\\Manager\",\"getAllAddOns\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":{\"Gram/Support\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"Newfi/Dogs\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"Newfi/Events\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"Newfi/Portal\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"XFMG\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"XFRM\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"}}},\"getById\":{\"exists\":true,\"public\":true,\"required\":1,\"total\":1},\"getInstalledAddOns\":{\"exists\":true,\"public\":true,\"required\":0,\"total\":0,\"value\":{\"Newfi/Dogs\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"Newfi/Events\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"Newfi/Portal\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"XFMG\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"},\"XFRM\":{\"object\":\"XF\\\\AddOn\\\\AddOn\"}}}},\"registry\":{\"type\":\"object\"},\"registry_rows\":[{\"bytes\":187,\"contains_gram\":true,\"data_key\":\"addOns\",\"sha256\":\"dca4ff8a040ff5651348c60446b8983b7bc1372d3403ee249da526c679c966e4\"},{\"bytes\":6,\"contains_gram\":false,\"data_key\":\"addOnsComposer\",\"sha256\":\"35786c7117b4e38d0f169239752ce71158266ae2f6e4aa230fbbb87bd699c0e3\"}]},\"status\":\"OK\",\"uninstall_help\":{\"lines\":[\"Description:\",\"Uninstalls the specified add-on\",\"Usage:\",\"xf:addon-uninstall [options] [--] <id>\",\"xf-addon:uninstall\",\"Arguments:\",\"id Add-On ID\",\"Options:\",\"-f, --force Skip verifying that the add-on is uninstallable\",\"-h, --help Display help for the given command. When no command is given display help for the list command\",\"-q, --quiet Do not output any message\",\"-V, --version Display this application version\",\"--ansi|--no-ansi Force (or disable --no-ansi) ANSI output\",\"-n, --no-interaction Do not ask any interactive question\",\"-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\"],\"rc\":0,\"stderr_sha256\":\"\"}}\nSUPPORT066_HOLDS=[]\nSUPPORT066_DECISION=NARROW_PROCESSING_STATE_CAPTURED\nSUPPORT066_MUTATION_SCOPE=NONE_READ_ONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260909-GRAM-XF-PROCESSING-NARROW-066\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nSUPPORT066_END\n"
|
|
}
|