1
0
Files
homelab-public-context/runtime/latest.json
T
2026-09-09 12:45:54 +00:00

39 lines
28 KiB
JSON

{
"schema_version": 1,
"channel": "homelab-runtime",
"command_id": "SUPPORT-260909-GRAM-XF-PROCESSING-RCA-065",
"status": "OK",
"rc": 0,
"host": "pve01",
"mode": "read-only",
"component": "gram-support-processing-state-rca",
"started_at_utc": "2026-09-09T12:45:51Z",
"finished_at_utc": "2026-09-09T12:45:54Z",
"reference_register_checked": true,
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
"error_register_checked": true,
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
"command_sha256": "58650c7036826de2b367e43288c37a4bd74fa37fd38895b6cd899c5b17b53b68",
"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": "9fff9616621e2e34c86e9d1b10d3848cacb6aea9487d9a67a849be45c240506d",
"sanitized_output_sha256": "9fff9616621e2e34c86e9d1b10d3848cacb6aea9487d9a67a849be45c240506d",
"output_truncated_in_json": false,
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
"output": "SUPPORT065_BEGIN\nERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nSUPPORT065_QGA_STATE={\"exitcode\":0,\"state\":\"COMPLETE\"}\nSUPPORT065_VM211={\"addon_list\":{\"rc\":0,\"stderr\":\"\",\"stdout\":\"{\\n \\\"addons\\\": [\\n {\\n \\\"addon_id\\\": \\\"Newfi\\\\/Dogs\\\",\\n \\\"title\\\": \\\"Newfi Dogs\\\",\\n \\\"version_string\\\": \\\"1.0.0 Alpha 1\\\",\\n \\\"version_id\\\": 1000010,\\n \\\"active\\\": true,\\n \\\"legacy\\\": false,\\n \\\"is_processing\\\": false,\\n \\\"last_pending_action\\\": null,\\n \\\"developer\\\": \\\"Newfi\\\",\\n \\\"path\\\": \\\"\\\\/var\\\\/www\\\\/forums\\\\/newfi\\\\/public\\\\/src\\\\/addons\\\\/Newfi\\\\/Dogs\\\"\\n },\\n {\\n \\\"addon_id\\\": \\\"Newfi\\\\/Events\\\",\\n \\\"title\\\": \\\"Newfi Events\\\",\\n \\\"version_string\\\": \\\"1.0.0 Alpha 1\\\",\\n \\\"version_id\\\": 1000010,\\n \\\"active\\\": true,\\n \\\"legacy\\\": false,\\n \\\"is_processing\\\": false,\\n \\\"last_pending_action\\\": null,\\n \\\"developer\\\": \\\"Newfi\\\",\\n \\\"path\\\": \\\"\\\\/var\\\\/www\\\\/forums\\\\/newfi\\\\/public\\\\/src\\\\/addons\\\\/Newfi\\\\/Events\\\"\\n },\\n {\\n \\\"addon_id\\\": \\\"Newfi\\\\/Portal\\\",\\n \\\"title\\\": \\\"Newfi Portal\\\",\\n \\\"version_string\\\": \\\"1.0.0 Alpha 1\\\",\\n \\\"version_id\\\": 1000010,\\n \\\"active\\\": true,\\n \\\"legacy\\\": false,\\n \\\"is_processing\\\": false,\\n \\\"last_pending_action\\\": null,\\n \\\"developer\\\": \\\"Newfi\\\",\\n \\\"path\\\": \\\"\\\\/var\\\\/www\\\\/forums\\\\/newfi\\\\/public\\\\/src\\\\/addons\\\\/Newfi\\\\/Portal\\\"\\n },\\n {\\n \\\"addon_id\\\": \\\"XFMG\\\",\\n \\\"title\\\": \\\"XenForo Media Gallery\\\",\\n \\\"version_string\\\": \\\"2.3.11\\\",\\n \\\"version_id\\\": 902031170,\\n \\\"active\\\": true,\\n \\\"legacy\\\": false,\\n \\\"is_processing\\\": false,\\n \\\"last_pending_action\\\": null,\\n \\\"developer\\\": \\\"XenForo Ltd.\\\",\\n \\\"path\\\": \\\"\\\\/var\\\\/www\\\\/forums\\\\/newfi\\\\/public\\\\/src\\\\/addons\\\\/XFMG\\\"\\n },\\n {\\n \\\"addon_id\\\": \\\"XFRM\\\",\\n \\\"title\\\": \\\"XenForo Resource Manager\\\",\\n \\\"version_string\\\": \\\"2.3.11\\\",\\n \\\"version_id\\\": 2031170,\\n \\\"active\\\": true,\\n \\\"legacy\\\": false,\\n \\\"is_processing\\\": false,\\n \\\"last_pending_action\\\": null,\\n \\\"developer\\\": \\\"XenForo Ltd.\\\",\\n \\\"path\\\": \\\"\\\\/var\\\\/www\\\\/forums\\\\/newfi\\\\/public\\\\/src\\\\/addons\\\\/XFRM\\\"\\n }\\n ],\\n \\\"summary\\\": {\\n \\\"total\\\": 5,\\n \\\"active\\\": 5,\\n \\\"inactive\\\": 0\\n }\\n}\"},\"command_id\":\"SUPPORT-260909-GRAM-XF-PROCESSING-RCA-065\",\"decision\":\"PROCESSING_STATE_AND_UNINSTALL_SOURCE_CAPTURED\",\"guest\":\"newfi-staging\",\"holds\":[],\"identity_ok\":true,\"list_help\":{\"rc\":0,\"stderr\":\"\",\"stdout\":\"Description:\\n Lists installed add-ons\\n\\nUsage:\\n xf:addon-list [options]\\n xf-addon:list\\n\\nOptions:\\n --active Only show active add-ons\\n --inactive Only show inactive add-ons\\n --json Output as JSON\\n -h, --help Display help for the given command. When no command is given display help for the list command\\n -q, --quiet Do not output any message\\n -V, --version Display this application version\\n --ansi|--no-ansi Force (or disable --no-ansi) ANSI output\\n -n, --no-interaction Do not ask any interactive question\\n -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\"},\"php_state\":{\"data\":{\"addon_columns\":[\"addon_id\",\"title\",\"version_string\",\"version_id\",\"json_hash\",\"active\",\"is_legacy\",\"is_processing\",\"last_pending_action\"],\"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\",\"manager_getById\":{\"canUninstall\":false,\"class\":\"XF\\\\AddOn\\\\AddOn\",\"getSetup\":\"Gram\\\\Support\\\\Setup\",\"isActive\":false,\"isInstalled\":false},\"manager_methods\":{\"getAllAddOns\":{\"public\":true,\"required\":0,\"total\":0},\"getById\":{\"public\":true,\"required\":1,\"total\":1},\"getInstalledAddOns\":{\"public\":true,\"required\":0,\"total\":0}}},\"rc\":0,\"stderr_sha256\":\"\"},\"scope\":\"READ_ONLY_NO_MUTATION\",\"source_evidence\":[{\"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/Cli/Command/AddOnUninstall.php\",\"matches\":[{\"line\":2,\"text\":\"\"},{\"line\":3,\"text\":\"namespace XF\\\\Cli\\\\Command;\"},{\"line\":4,\"text\":\"\"},{\"line\":5,\"text\":\"use Symfony\\\\Component\\\\Console\\\\Helper\\\\QuestionHelper;\"},{\"line\":6,\"text\":\"use Symfony\\\\Component\\\\Console\\\\Input\\\\InputArgument;\"},{\"line\":7,\"text\":\"use Symfony\\\\Component\\\\Console\\\\Input\\\\InputInterface;\"},{\"line\":8,\"text\":\"use Symfony\\\\Component\\\\Console\\\\Input\\\\InputOption;\"},{\"line\":9,\"text\":\"use Symfony\\\\Component\\\\Console\\\\Output\\\\OutputInterface;\"},{\"line\":10,\"text\":\"use Symfony\\\\Component\\\\Console\\\\Question\\\\ConfirmationQuestion;\"},{\"line\":11,\"text\":\"\"},{\"line\":12,\"text\":\"class AddOnUninstall extends AbstractCommand\"},{\"line\":13,\"text\":\"{\"},{\"line\":14,\"text\":\"\\tuse AddOnActionTrait;\"},{\"line\":15,\"text\":\"\\tuse JobRunnerTrait;\"},{\"line\":16,\"text\":\"\"},{\"line\":17,\"text\":\"\\tprotected function configure()\"},{\"line\":18,\"text\":\"\\t{\"},{\"line\":19,\"text\":\"\\t\\t$this\"},{\"line\":20,\"text\":\"\\t\\t\\t->setName('xf:addon-uninstall')\"},{\"line\":21,\"text\":\"\\t\\t\\t->setAliases(['xf-addon:uninstall'])\"},{\"line\":22,\"text\":\"\\t\\t\\t->setDescription('Uninstalls the specified add-on')\"},{\"line\":23,\"text\":\"\\t\\t\\t->addArgument(\"},{\"line\":24,\"text\":\"\\t\\t\\t\\t'id',\"},{\"line\":25,\"text\":\"\\t\\t\\t\\tInputArgument::REQUIRED,\"},{\"line\":26,\"text\":\"\\t\\t\\t\\t'Add-On ID'\"},{\"line\":27,\"text\":\"\\t\\t\\t)\"},{\"line\":28,\"text\":\"\\t\\t\\t->addOption(\"},{\"line\":29,\"text\":\"\\t\\t\\t\\t'force',\"},{\"line\":30,\"text\":\"\\t\\t\\t\\t'f',\"},{\"line\":31,\"text\":\"\\t\\t\\t\\tInputOption::VALUE_NONE,\"},{\"line\":32,\"text\":\"\\t\\t\\t\\t'Skip verifying that the add-on is uninstallable'\"},{\"line\":33,\"text\":\"\\t\\t\\t);\"},{\"line\":34,\"text\":\"\\t}\"},{\"line\":35,\"text\":\"\"},{\"line\":36,\"text\":\"\\tprotected function execute(InputInterface $input, OutputInterface $output)\"},{\"line\":37,\"text\":\"\\t{\"},{\"line\":38,\"text\":\"\\t\\t$id = $input->getArgument('id');\"},{\"line\":39,\"text\":\"\"},{\"line\":40,\"text\":\"\\t\\t$addOn = $this->checkInstalledAddOn($id, $error);\"},{\"line\":41,\"text\":\"\\t\\tif (!$addOn)\"},{\"line\":42,\"text\":\"\\t\\t{\"},{\"line\":43,\"text\":\"\\t\\t\\t$output->writeln('<error>' . $error . '</error>');\"},{\"line\":44,\"text\":\"\\t\\t\\treturn 1;\"},{\"line\":45,\"text\":\"\\t\\t}\"},{\"line\":46,\"text\":\"\"},{\"line\":47,\"text\":\"\\t\\tif (!$addOn->canUninstall() && !$input->getOption('force'))\"},{\"line\":48,\"text\":\"\\t\\t{\"},{\"line\":49,\"text\":\"\\t\\t\\t$output->writeln(\\\"<error>\\\" . \\\\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing') . \\\"</error>\\\");\"},{\"line\":50,\"text\":\"\\t\\t\\treturn 1;\"},{\"line\":51,\"text\":\"\\t\\t}\"},{\"line\":52,\"text\":\"\"},{\"line\":53,\"text\":\"\\t\\t/** @var QuestionHelper $helper */\"},{\"line\":54,\"text\":\"\\t\\t$helper = $this->getHelper('question');\"},{\"line\":55,\"text\":\"\"},{\"line\":56,\"text\":\"\\t\\t$question = new ConfirmationQuestion(\\\"<question>\\\" . \\\\XF::phrase('please_confirm_that_you_want_to_uninstall_following_add_on') . ': (' . $addOn->title . ' ' . $addOn->version_string . \\\") (y/n)</question>\\\");\"},{\"line\":57,\"text\":\"\\t\\t$response = $helper->ask($input, $output, $question);\"},{\"line\":58,\"text\":\"\\t\\tif (!$response)\"},{\"line\":59,\"text\":\"\\t\\t{\"},{\"line\":60,\"text\":\"\\t\\t\\treturn 1;\"},{\"line\":61,\"text\":\"\\t\\t}\"},{\"line\":62,\"text\":\"\"},{\"line\":63,\"text\":\"\\t\\t// make sure any errors get logged here\"},{\"line\":64,\"text\":\"\\t\\t\\\\XF::app()->error()->setIgnorePendingUpgrade(true);\"},{\"line\":65,\"text\":\"\"},{\"line\":66,\"text\":\"\\t\\t$addOn->preUninstall();\"},{\"line\":67,\"text\":\"\"},{\"line\":68,\"text\":\"\\t\\t$this->runSubAction($output, $addOn, 'uninstall');\"},{\"line\":69,\"text\":\"\\t\\t$this->runSubAction($output, $addOn, 'uninstall-data');\"},{\"line\":70,\"text\":\"\\t\\t$this->runSubAction($output, $addOn, 'post-uninstall');\"},{\"line\":71,\"text\":\"\"},{\"line\":72,\"text\":\"\\t\\treturn 0;\"},{\"line\":73,\"text\":\"\\t}\"},{\"line\":74,\"text\":\"}\"}],\"sha256\":\"6dc768f60efd4af161b549cd54c01ae8922326cf7fd230b8ef93403bf8dba90c\"},{\"file\":\"src/XF/AddOn/AddOn.php\",\"matches\":[{\"line\":45,\"text\":\"\\t/**\"},{\"line\":46,\"text\":\"\\t * @var \\\\XF\\\\Entity\\\\AddOn\"},{\"line\":47,\"text\":\"\\t */\"},{\"line\":48,\"text\":\"\\tprotected $installedAddOn;\"},{\"line\":49,\"text\":\"\"},{\"line\":50,\"text\":\"\\t/**\"},{\"line\":51,\"text\":\"\\t * @var AbstractSetup\"},{\"line\":52,\"text\":\"\\t */\"},{\"line\":53,\"text\":\"\\tprotected $setup;\"},{\"line\":54,\"text\":\"\"},{\"line\":55,\"text\":\"\\tprotected $addOnId;\"},{\"line\":56,\"text\":\"\\tprotected $legacyAddOnId;\"},{\"line\":57,\"text\":\"\"},{\"line\":58,\"text\":\"\\tprotected $addOnDir;\"},{\"line\":59,\"text\":\"\\tprotected $buildDir;\"},{\"line\":60,\"text\":\"\\tprotected $dataDir;\"},{\"line\":61,\"text\":\"\\tprotected $filesDir;\"},{\"line\":62,\"text\":\"\\tprotected $outputDir;\"},{\"line\":63,\"text\":\"\\tprotected $releasesDir;\"},{\"line\":64,\"text\":\"\"},{\"line\":65,\"text\":\"\\tprotected $jsonPath;\"},{\"line\":66,\"text\":\"\\tprotected $json = [];\"},{\"line\":67,\"text\":\"\"},{\"line\":68,\"text\":\"\\tprotected $buildJsonPath;\"},{\"line\":69,\"text\":\"\\tprotected $buildJson = [];\"},{\"line\":70,\"text\":\"\"},{\"line\":71,\"text\":\"\\tprotected $missingFiles = [];\"},{\"line\":72,\"text\":\"\"},{\"line\":73,\"text\":\"\\tprotected $addOnHashes;\"},{\"line\":74,\"text\":\"\"},{\"line\":75,\"text\":\"\\tpublic function __construct($addOnOrId, Manager $manager)\"},{\"line\":76,\"text\":\"\\t{\"},{\"line\":77,\"text\":\"\\t\\t$this->manager = $manager;\"},{\"line\":78,\"text\":\"\"},{\"line\":79,\"text\":\"\\t\\tif ($addOnOrId instanceof \\\\XF\\\\Entity\\\\AddOn)\"},{\"line\":80,\"text\":\"\\t\\t{\"},{\"line\":81,\"text\":\"\\t\\t\\t$this->installedAddOn = $addOnOrId;\"},{\"line\":82,\"text\":\"\\t\\t\\t$this->addOnId = $addOnOrId->addon_id;\"},{\"line\":83,\"text\":\"\\t\\t}\"},{\"line\":84,\"text\":\"\\t\\telse\"},{\"line\":85,\"text\":\"\\t\\t{\"},{\"line\":86,\"text\":\"\\t\\t\\t$this->addOnId = $addOnOrId;\"},{\"line\":87,\"text\":\"\\t\\t}\"},{\"line\":88,\"text\":\"\"},{\"line\":89,\"text\":\"\\t\\t$ds = \\\\XF::$DS;\"},{\"line\":90,\"text\":\"\"},{\"line\":91,\"text\":\"\\t\\t$this->addOnDir = \\\\XF::getAddOnDirectory() . $ds . $this->prepareAddOnIdForPath();\"},{\"line\":92,\"text\":\"\"},{\"line\":93,\"text\":\"\\t\\t// Resolve symlinks to ensure consistent path handling\"},{\"line\":94,\"text\":\"\\t\\t$realAddOnDir = realpath($this->addOnDir);\"},{\"line\":95,\"text\":\"\\t\\tif ($realAddOnDir !== false)\"},{\"line\":96,\"text\":\"\\t\\t{\"},{\"line\":97,\"text\":\"\\t\\t\\t$this->addOnDir = $realAddOnDir;\"},{\"line\":98,\"text\":\"\\t\\t}\"},{\"line\":99,\"text\":\"\"},{\"line\":100,\"text\":\"\\t\\t$this->buildDir = $this->addOnDir . $ds . '_build';\"},{\"line\":101,\"text\":\"\\t\\t$this->dataDir = $this->addOnDir . $ds . '_data';\"},{\"line\":102,\"text\":\"\\t\\t$this->filesDir = $this->addOnDir . $ds . '_files';\"},{\"line\":103,\"text\":\"\\t\\t$this->outputDir = $this->addOnDir . $ds . '_output';\"},{\"line\":104,\"text\":\"\\t\\t$this->releasesDir = $this->addOnDir . $ds . '_releases';\"},{\"line\":105,\"text\":\"\"},{\"line\":106,\"text\":\"\\t\\t$this->jsonPath = $this->addOnDir . $ds . 'addon.json';\"},{\"line\":107,\"text\":\"\\t\\tif (file_exists($this->jsonPath))\"},{\"line\":108,\"text\":\"\\t\\t{\"},{\"line\":109,\"text\":\"\\t\\t\\t$this->json = $this->prepareJsonFile(\"},{\"line\":110,\"text\":\"\\t\\t\\t\\tjson_decode(file_get_contents($this->jsonPath), true) ?: []\"},{\"line\":111,\"text\":\"\\t\\t\\t);\"},{\"line\":112,\"text\":\"\\t\\t}\"},{\"line\":113,\"text\":\"\\t\\telse\"},{\"line\":114,\"text\":\"\\t\\t{\"},{\"line\":115,\"text\":\"\\t\\t\\t$this->missingFiles[] = 'addon.json';\"},{\"line\":116,\"text\":\"\\t\\t}\"},{\"line\":117,\"text\":\"\"},{\"line\":118,\"text\":\"\\t\\tif (!$this->installedAddOn && !empty($this->json['legacy_addon_id']))\"},{\"line\":119,\"text\":\"\\t\\t{\"},{\"line\":120,\"text\":\"\\t\\t\\t$this->legacyAddOnId = $this->json['legacy_addon_id'];\"},{\"line\":121,\"text\":\"\\t\\t\\t$this->installedAddOn = \\\\XF::em()->find(\\\\XF\\\\Entity\\\\AddOn::class, $this->legacyAddOnId);\"},{\"line\":122,\"text\":\"\\t\\t}\"},{\"line\":123,\"text\":\"\"},{\"line\":124,\"text\":\"\\t\\t$this->buildJsonPath = $this->addOnDir . $ds . 'build.json';\"},{\"line\":125,\"text\":\"\\t\\t$this->buildJson = [\"},{\"line\":126,\"text\":\"\\t\\t\\t'additional_files' => [],\"},{\"line\":127,\"text\":\"\\t\\t\\t'minify' => [],\"},{\"line\":128,\"text\":\"\\t\\t\\t'rollup' => [],\"},{\"line\":129,\"text\":\"\\t\\t\\t'exec' => [],\"},{\"line\":130,\"text\":\"\\t\\t];\"},{\"line\":131,\"text\":\"\\t\\tif (file_exists($this->buildJsonPath))\"},{\"line\":132,\"text\":\"\\t\\t{\"},{\"line\":133,\"text\":\"\\t\\t\\t$buildJson = @json_decode(file_get_contents($this->buildJsonPath), true);\"},{\"line\":134,\"text\":\"\"},{\"line\":135,\"text\":\"\\t\\t\\t$this->buildJson = array_replace(\"},{\"line\":136,\"text\":\"\\t\\t\\t\\t$this->buildJson,\"},{\"line\":137,\"text\":\"\\t\\t\\t\\t$buildJson ?: []\"},{\"line\":138,\"text\":\"\\t\\t\\t);\"},{\"line\":139,\"text\":\"\\t\\t}\"},{\"line\":140,\"text\":\"\\t}\"},{\"line\":141,\"text\":\"\"},{\"line\":142,\"text\":\"\\tpublic function getInstalledAddOn()\"},{\"line\":143,\"text\":\"\\t{\"},{\"line\":144,\"text\":\"\\t\\treturn $this->installedAddOn;\"},{\"line\":145,\"text\":\"\\t}\"},{\"line\":146,\"text\":\"\"},{\"line\":147,\"text\":\"\\tpublic function getAddOnId()\"},{\"line\":148,\"text\":\"\\t{\"},{\"line\":149,\"text\":\"\\t\\treturn $this->addOnId;\"},{\"line\":150,\"text\":\"\\t}\"},{\"line\":151,\"text\":\"\"},{\"line\":152,\"text\":\"\\tpublic function getAddOnIdUrl()\"},{\"line\":153,\"text\":\"\\t{\"},{\"line\":154,\"text\":\"\\t\\treturn \\\\XF::app()->repository(AddOnRepository::class)->convertAddOnIdToUrlVersion($this->getAddOnId());\"},{\"line\":155,\"text\":\"\\t}\"},{\"line\":156,\"text\":\"\"},{\"line\":157,\"text\":\"\\tpublic function prepareVersionForFilename()\"},{\"line\":158,\"text\":\"\\t{\"},{\"line\":159,\"text\":\"\\t\\t$versionString = preg_replace('/[^a-z0-9-_. ]/i', '', $this->version_string);\"},{\"line\":160,\"text\":\"\\t\\treturn trim(preg_replace('/\\\\s{2,}/', ' ', $versionString));\"},{\"line\":161,\"text\":\"\\t}\"},{\"line\":162,\"text\":\"\"},{\"line\":163,\"text\":\"\\tpublic function prepareAddOnIdForFilename()\"},{\"line\":164,\"text\":\"\\t{\"},{\"line\":165,\"text\":\"\\t\\tif (strpos($this->addOnId, '/') !== false)\"},{\"line\":166,\"text\":\"\\t\\t{\"},{\"line\":167,\"text\":\"\\t\\t\\treturn str_replace('/', '-', $this->addOnId);\"},{\"line\":168,\"text\":\"\\t\\t}\"},{\"line\":169,\"text\":\"\\t\\telse\"},{\"line\":170,\"text\":\"\\t\\t{\"},{\"line\":171,\"text\":\"\\t\\t\\treturn $this->addOnId;\"},{\"line\":172,\"text\":\"\\t\\t}\"},{\"line\":173,\"text\":\"\\t}\"},{\"line\":174,\"text\":\"\"},{\"line\":175,\"text\":\"\\tpublic function prepareAddOnIdForPath()\"},{\"line\":176,\"text\":\"\\t{\"},{\"line\":177,\"text\":\"\\t\\tif (strpos($this->addOnId, '/') !== false)\"},{\"line\":178,\"text\":\"\\t\\t{\"},{\"line\":179,\"text\":\"\\t\\t\\treturn str_replace('/', \\\\XF::$DS, $this->addOnId);\"},{\"line\":180,\"text\":\"\\t\\t}\"},{\"line\":181,\"text\":\"\\t\\telse\"},{\"line\":182,\"text\":\"\\t\\t{\"},{\"line\":183,\"text\":\"\\t\\t\\treturn $this->addOnId;\"},{\"line\":184,\"text\":\"\\t\\t}\"},{\"line\":185,\"text\":\"\\t}\"},{\"line\":186,\"text\":\"\"},{\"line\":187,\"text\":\"\\tpublic function prepareAddOnIdForClass()\"},{\"line\":188,\"text\":\"\\t{\"},{\"line\":189,\"text\":\"\\t\\tif (strpos($this->addOnId, '/') !== false)\"},{\"line\":190,\"text\":\"\\t\\t{\"},{\"line\":191,\"text\":\"\\t\\t\\treturn str_replace('/', '\\\\\\\\', $this->addOnId);\"},{\"line\":192,\"text\":\"\\t\\t}\"},{\"line\":193,\"text\":\"\\t\\telse\"},{\"line\":194,\"text\":\"\\t\\t{\"},{\"line\":195,\"text\":\"\\t\\t\\treturn $this->addOnId;\"},{\"line\":196,\"text\":\"\\t\\t}\"},{\"line\":197,\"text\":\"\\t}\"},{\"line\":198,\"text\":\"\"},{\"line\":199,\"text\":\"\\tpublic function getMissingFiles()\"},{\"line\":200,\"text\":\"\\t{\"},{\"line\":201,\"text\":\"\\t\\treturn $this->missingFiles;\"},{\"line\":202,\"text\":\"\\t}\"},{\"line\":203,\"text\":\"\"},{\"line\":204,\"text\":\"\\tpublic function getAddOnDirectory()\"},{\"line\":205,\"text\":\"\\t{\"},{\"line\":206,\"text\":\"\\t\\treturn $this->addOnDir;\"},{\"line\":207,\"text\":\"\\t}\"},{\"line\":208,\"text\":\"\"},{\"line\":209,\"text\":\"\\tpublic function getBuildDirectory()\"},{\"line\":210,\"text\":\"\\t{\"},{\"line\":211,\"text\":\"\\t\\treturn $this->buildDir;\"},{\"line\":212,\"text\":\"\\t}\"},{\"line\":213,\"text\":\"\"},{\"line\":214,\"text\":\"\\tpublic function getDataDirectory()\"},{\"line\":215,\"text\":\"\\t{\"},{\"line\":216,\"text\":\"\\t\\treturn $this->dataDir;\"},{\"line\":221,\"text\":\"\\t\\treturn $this->filesDir;\"},{\"line\":222,\"text\":\"\\t}\"},{\"line\":223,\"text\":\"\"},{\"line\":224,\"text\":\"\\tpublic function getReleasesDirectory()\"},{\"line\":225,\"text\":\"\\t{\"},{\"line\":226,\"text\":\"\\t\\treturn $this->releasesDir;\"},{\"line\":227,\"text\":\"\\t}\"},{\"line\":228,\"text\":\"\"}],\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"},{\"file\":\"src/XF/AddOn/StepRunnerUninstallTrait.php\",\"matches\":[{\"line\":1,\"text\":\"<?php\"},{\"line\":2,\"text\":\"\"},{\"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\":70,\"text\":\"\"},{\"line\":71,\"text\":\"\\t\\tif (!($result instanceof StepResult))\"},{\"line\":72,\"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_after\":{\"addon_columns\":[\"addon_id\",\"title\",\"version_string\",\"version_id\",\"json_hash\",\"active\",\"is_legacy\",\"is_processing\",\"last_pending_action\"],\"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\",\"manager_getById\":{\"canUninstall\":false,\"class\":\"XF\\\\AddOn\\\\AddOn\",\"getSetup\":\"Gram\\\\Support\\\\Setup\",\"isActive\":false,\"isInstalled\":false},\"manager_methods\":{\"getAllAddOns\":{\"public\":true,\"required\":0,\"total\":0},\"getById\":{\"public\":true,\"required\":1,\"total\":1},\"getInstalledAddOns\":{\"public\":true,\"required\":0,\"total\":0}}},\"status\":\"OK\",\"uninstall_help\":{\"rc\":0,\"stderr\":\"\",\"stdout\":\"Description:\\n Uninstalls the specified add-on\\n\\nUsage:\\n xf:addon-uninstall [options] [--] <id>\\n xf-addon:uninstall\\n\\nArguments:\\n id Add-On ID\\n\\nOptions:\\n -f, --force Skip verifying that the add-on is uninstallable\\n -h, --help Display help for the given command. When no command is given display help for the list command\\n -q, --quiet Do not output any message\\n -V, --version Display this application version\\n --ansi|--no-ansi Force (or disable --no-ansi) ANSI output\\n -n, --no-interaction Do not ask any interactive question\\n -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\"}}\nSUPPORT065_HOLDS=[]\nSUPPORT065_DECISION=PROCESSING_STATE_AND_UNINSTALL_SOURCE_CAPTURED\nSUPPORT065_MUTATION_SCOPE=NONE_READ_ONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260909-GRAM-XF-PROCESSING-RCA-065\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nSUPPORT065_END\n"
}