mirror of
https://github.com/danieldemus/openhab-core.git
synced 2026-07-29 12:34:22 +02:00
Add HomieAddonUpgrader to upgradetool (#5180)
Signed-off-by: Cody Cutrer <cody@cutrer.us>
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
* Copyright (c) 2010-2025 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.core.tools;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.eclipse.jdt.annotation.Nullable;
|
||||
import org.openhab.core.storage.json.internal.JsonStorage;
|
||||
import org.openhab.core.thing.dto.ThingDTO;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* The {@link ExtractedAddonUpgrader} checks if the parent addon was previously
|
||||
* installed, and if specific things exist, and if so installs the
|
||||
* corresponding addon.
|
||||
*
|
||||
* @author Cody Cutrer - Initial contribution
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public abstract class ExtractedAddonUpgrader implements Upgrader {
|
||||
private final Logger logger = LoggerFactory.getLogger(ExtractedAddonUpgrader.class);
|
||||
|
||||
public abstract String getParentAddonName();
|
||||
|
||||
public abstract String getAddonName();
|
||||
|
||||
public abstract boolean thingTypeMatches(String thingTypeUID);
|
||||
|
||||
@Override
|
||||
public boolean execute(@Nullable Path userdataPath, @Nullable Path confPath) {
|
||||
if (userdataPath == null) {
|
||||
logger.error("{} skipped: no userdata directory found.", getName());
|
||||
return false;
|
||||
}
|
||||
|
||||
Path addonsConfigPath = userdataPath.resolve("config/org/openhab/addons.config");
|
||||
if (!Files.isWritable(addonsConfigPath)) {
|
||||
logger.error("Cannot access addon config '{}', check path and access rights.", addonsConfigPath);
|
||||
return false;
|
||||
}
|
||||
|
||||
List<String> configLines;
|
||||
try {
|
||||
configLines = Files.readAllLines(addonsConfigPath);
|
||||
} catch (IOException e) {
|
||||
logger.error("Failed to read addon config '{}', check path and access rights.", addonsConfigPath);
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean changed = false;
|
||||
|
||||
for (int i = 0; i < configLines.size(); i++) {
|
||||
String line = Objects.requireNonNull(configLines.get(i));
|
||||
if (line.contains("," + getAddonName())) {
|
||||
logger.info("{} addon already installed, skipping installation.", getAddonName());
|
||||
return true;
|
||||
}
|
||||
if (line.contains("," + getParentAddonName())) {
|
||||
String newLine = line.replace("," + getParentAddonName(),
|
||||
"," + getParentAddonName() + "," + getAddonName());
|
||||
configLines.set(i, newLine);
|
||||
changed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!changed) {
|
||||
logger.info("{} addon not installed, skipping {} addon installation.", getParentAddonName(),
|
||||
getAddonName());
|
||||
return true;
|
||||
}
|
||||
|
||||
Path thingJsonDatabasePath = userdataPath.resolve("jsondb/org.openhab.core.thing.Thing.json");
|
||||
if (!Files.isReadable(thingJsonDatabasePath)) {
|
||||
logger.error("Cannot access thing database '{}', check path and access rights.", thingJsonDatabasePath);
|
||||
return false;
|
||||
}
|
||||
|
||||
JsonStorage<ThingDTO> thingStorage = new JsonStorage<>(thingJsonDatabasePath.toFile(), null, 5, 0, 0,
|
||||
List.of());
|
||||
|
||||
boolean hasHAThing = false;
|
||||
for (String thingId : thingStorage.getKeys()) {
|
||||
ThingDTO thing = thingStorage.get(thingId);
|
||||
if (thing != null && thing.thingTypeUID != null && thingTypeMatches(thing.thingTypeUID.toString())) {
|
||||
hasHAThing = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasHAThing) {
|
||||
logger.info("No {} Things found, skipping addon installation.", getAddonName());
|
||||
return true;
|
||||
}
|
||||
|
||||
logger.info("Marking {} addon for installation.", getAddonName());
|
||||
|
||||
try {
|
||||
Files.write(addonsConfigPath, configLines);
|
||||
} catch (IOException e) {
|
||||
logger.error("Failed to write addon config '{}', check path and access rights.", addonsConfigPath);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -55,7 +55,8 @@ public class UpgradeTool {
|
||||
new JSProfileUpgrader(), //
|
||||
new ScriptProfileUpgrader(), //
|
||||
new YamlConfigurationV1TagsUpgrader(), // Added in 5.0
|
||||
new HomeAssistantAddonUpgrader() // Added in 5.1
|
||||
new HomeAssistantAddonUpgrader(), // Added in 5.1
|
||||
new HomieAddonUpgrader() // Added in 5.1
|
||||
);
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(UpgradeTool.class);
|
||||
|
||||
+12
-88
@@ -12,19 +12,8 @@
|
||||
*/
|
||||
package org.openhab.core.tools.internal;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.eclipse.jdt.annotation.Nullable;
|
||||
import org.openhab.core.storage.json.internal.JsonStorage;
|
||||
import org.openhab.core.thing.dto.ThingDTO;
|
||||
import org.openhab.core.tools.Upgrader;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.openhab.core.tools.ExtractedAddonUpgrader;
|
||||
|
||||
/**
|
||||
* The {@link HomeAssistantAddonUpgrader} checks if the MQTT addon was previously
|
||||
@@ -32,12 +21,9 @@ import org.slf4j.LoggerFactory;
|
||||
* Home Assistant addon.
|
||||
*
|
||||
* @author Cody Cutrer - Initial contribution
|
||||
* @author Jimmy Tanagra - Refactored into a separate class
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class HomeAssistantAddonUpgrader implements Upgrader {
|
||||
private final Logger logger = LoggerFactory.getLogger(HomeAssistantAddonUpgrader.class);
|
||||
|
||||
public class HomeAssistantAddonUpgrader extends ExtractedAddonUpgrader {
|
||||
@Override
|
||||
public String getName() {
|
||||
return "homeAssistantAddonUpgrader";
|
||||
@@ -49,79 +35,17 @@ public class HomeAssistantAddonUpgrader implements Upgrader {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean execute(@Nullable Path userdataPath, @Nullable Path confPath) {
|
||||
if (userdataPath == null) {
|
||||
logger.error("{} skipped: no userdata directory found.", getName());
|
||||
return false;
|
||||
}
|
||||
public String getParentAddonName() {
|
||||
return "mqtt";
|
||||
}
|
||||
|
||||
Path addonsConfigPath = userdataPath.resolve("config/org/openhab/addons.config");
|
||||
if (!Files.isWritable(addonsConfigPath)) {
|
||||
logger.error("Cannot access addon config '{}', check path and access rights.", addonsConfigPath);
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public String getAddonName() {
|
||||
return "homeassistant";
|
||||
}
|
||||
|
||||
List<String> configLines;
|
||||
try {
|
||||
configLines = Files.readAllLines(addonsConfigPath);
|
||||
} catch (IOException e) {
|
||||
logger.error("Failed to read addon config '{}', check path and access rights.", addonsConfigPath);
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean changed = false;
|
||||
|
||||
for (int i = 0; i < configLines.size(); i++) {
|
||||
String line = Objects.requireNonNull(configLines.get(i));
|
||||
if (line.contains(",homeassistant")) {
|
||||
logger.info("Home Assistant addon already installed, skipping installation.");
|
||||
return true;
|
||||
}
|
||||
if (line.contains(",mqtt")) {
|
||||
String newLine = line.replace(",mqtt", ",mqtt,homeassistant");
|
||||
configLines.set(i, newLine);
|
||||
changed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!changed) {
|
||||
logger.info("MQTT addon not installed, skipping Home Assistant addon installation.");
|
||||
return true;
|
||||
}
|
||||
|
||||
Path thingJsonDatabasePath = userdataPath.resolve("jsondb/org.openhab.core.thing.Thing.json");
|
||||
if (!Files.isReadable(thingJsonDatabasePath)) {
|
||||
logger.error("Cannot access thing database '{}', check path and access rights.", thingJsonDatabasePath);
|
||||
return false;
|
||||
}
|
||||
|
||||
JsonStorage<ThingDTO> thingStorage = new JsonStorage<>(thingJsonDatabasePath.toFile(), null, 5, 0, 0,
|
||||
List.of());
|
||||
|
||||
boolean hasHAThing = false;
|
||||
for (String thingId : thingStorage.getKeys()) {
|
||||
ThingDTO thing = thingStorage.get(thingId);
|
||||
if (thing != null && thing.thingTypeUID != null
|
||||
&& thing.thingTypeUID.toString().startsWith("mqtt:homeassistant")) {
|
||||
hasHAThing = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasHAThing) {
|
||||
logger.info("No Home Assistant Things found, skipping addon installation.");
|
||||
return true;
|
||||
}
|
||||
|
||||
logger.info("Marking Home Assistant addon for installation.");
|
||||
|
||||
try {
|
||||
Files.write(addonsConfigPath, configLines);
|
||||
} catch (IOException e) {
|
||||
logger.error("Failed to write addon config '{}', check path and access rights.", addonsConfigPath);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
@Override
|
||||
public boolean thingTypeMatches(String thingTypeUID) {
|
||||
return thingTypeUID.startsWith("mqtt:homeassistant");
|
||||
}
|
||||
}
|
||||
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (c) 2010-2025 Contributors to the openHAB project
|
||||
*
|
||||
* See the NOTICE file(s) distributed with this work for additional
|
||||
* information.
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Eclipse Public License 2.0 which is available at
|
||||
* http://www.eclipse.org/legal/epl-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: EPL-2.0
|
||||
*/
|
||||
package org.openhab.core.tools.internal;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.openhab.core.tools.ExtractedAddonUpgrader;
|
||||
|
||||
/**
|
||||
* The {@link HomeAssistantAddonUpgrader} checks if the MQTT addon was previously
|
||||
* installed, and if Home Assistant things exist, and if so installs the
|
||||
* Home Assistant addon.
|
||||
*
|
||||
* @author Cody Cutrer - Initial contribution
|
||||
*/
|
||||
@NonNullByDefault
|
||||
public class HomieAddonUpgrader extends ExtractedAddonUpgrader {
|
||||
@Override
|
||||
public String getName() {
|
||||
return "homieAddonUpgrader";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "Installs the Homie addon if Homie Things are present";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getParentAddonName() {
|
||||
return "mqtt";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAddonName() {
|
||||
return "homie";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean thingTypeMatches(String thingTypeUID) {
|
||||
return thingTypeUID.startsWith("mqtt:homie");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user