diff --git a/.run/ImportOfficeData.run.xml b/.run/ImportOfficeData.run.xml index 92ce7bd5..6dfa1d1d 100644 --- a/.run/ImportOfficeData.run.xml +++ b/.run/ImportOfficeData.run.xml @@ -33,4 +33,38 @@ true - + + + + + + + false + true + + + + false + true + + + \ No newline at end of file diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java index 052db872..b283c99b 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidator.java @@ -18,18 +18,18 @@ import static net.hostsharing.hsadminng.hs.validation.StringProperty.stringPrope class HsDomainDnsSetupHostingAssetValidator extends HostingAssetEntityValidator { // according to RFC 1035 (section 5) and RFC 1034 - static final String RR_REGEX_NAME = "([a-z0-9\\.-]+|@)\\s+"; + static final String RR_REGEX_NAME = "(\\*\\.)?([a-z0-9\\._-]+|@)\\s+"; static final String RR_REGEX_TTL = "(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*"; static final String RR_REGEX_IN = "IN\\s+"; // record class IN for Internet static final String RR_RECORD_TYPE = "[A-Z]+\\s+"; - static final String RR_RECORD_DATA = "[^;].*"; - static final String RR_COMMENT = "(;.*)*"; + static final String RR_RECORD_DATA = "[([^;]+)|(\".*\")|(\\(.*\\))]\\s*"; + static final String RR_COMMENT = "(;.*)?"; static final String RR_REGEX_TTL_IN = - RR_REGEX_NAME + RR_REGEX_TTL + RR_REGEX_IN + RR_RECORD_TYPE + RR_RECORD_DATA + RR_COMMENT; + RR_REGEX_NAME + RR_REGEX_TTL + RR_REGEX_IN + RR_RECORD_TYPE + ".*"; // RR_RECORD_DATA + RR_COMMENT; FIXME static final String RR_REGEX_IN_TTL = - RR_REGEX_NAME + RR_REGEX_IN + RR_REGEX_TTL + RR_RECORD_TYPE + RR_RECORD_DATA + RR_COMMENT; + RR_REGEX_NAME + RR_REGEX_IN + RR_REGEX_TTL + RR_RECORD_TYPE + ".*"; // RR_RECORD_DATA + RR_COMMENT; FIXME public static final String IDENTIFIER_SUFFIX = "|DNS"; HsDomainDnsSetupHostingAssetValidator() { @@ -38,7 +38,7 @@ class HsDomainDnsSetupHostingAssetValidator extends HostingAssetEntityValidator AlarmContact.isOptional(), integerProperty("TTL").min(0).withDefault(21600), - booleanProperty("auto-SOA-RR").withDefault(true), + booleanProperty("auto-SOA").withDefault(true), booleanProperty("auto-NS-RR").withDefault(true), booleanProperty("auto-MX-RR").withDefault(true), booleanProperty("auto-A-RR").withDefault(true), @@ -60,7 +60,7 @@ class HsDomainDnsSetupHostingAssetValidator extends HostingAssetEntityValidator @Override protected Pattern identifierPattern(final HsHostingAsset assetEntity) { - return Pattern.compile("^" + Pattern.quote(assetEntity.getParentAsset().getIdentifier() + IDENTIFIER_SUFFIX) + "$"); + return Pattern.compile("^" + Pattern.quote(assetEntity.getParentAsset().getIdentifier() + IDENTIFIER_SUFFIX) + "$"); } @Override @@ -78,7 +78,8 @@ class HsDomainDnsSetupHostingAssetValidator extends HostingAssetEntityValidator // TODO.spec: define which checks should get raised to error level final var namedCheckZone = new SystemProcess("named-checkzone", fqdn(assetEntity)); - if (namedCheckZone.execute(toZonefileString(assetEntity)) != 0) { + final var zonefileString = toZonefileString(assetEntity); + if (namedCheckZone.execute(zonefileString) != 0) { // yes, named-checkzone writes error messages to stdout stream(namedCheckZone.getStdOut().split("\n")) .map(line -> line.replaceAll(" stream-0x[0-9a-f:]+", "")) @@ -90,21 +91,41 @@ class HsDomainDnsSetupHostingAssetValidator extends HostingAssetEntityValidator String toZonefileString(final HsHostingAsset assetEntity) { // TODO.spec: we need to expand the templates (auto-...) in the same way as in Saltstack return """ - $ORIGIN {domain}. - $TTL {ttl} + $ORIGIN {domain}. + $TTL {ttl} - ; these records are just placeholders to create a valid zonefile for the validation - @ 1814400 IN SOA {domain}. root.{domain} ( 1999010100 10800 900 604800 86400 ) - @ IN NS ns - - {userRRs} - """ - .replace("{domain}", fqdn(assetEntity)) - .replace("{ttl}", getPropertyValue(assetEntity, "TTL")) - .replace("{userRRs}", getPropertyValues(assetEntity, "user-RR") ); + {auto-SOA} + {auto-NS-RR} + {auto-A-RR} + {auto-AAAA-RR} + + {userRRs} + """ + .replace("{ttl}", assetEntity.getDirectValue("TTL", Integer.class, 43200).toString()) + .replace("{auto-SOA}", assetEntity.getDirectValue("auto-SOA", Boolean.class, false).equals(true) + ? """ + {domain}. IN SOA h00.hostsharing.net. hostmaster.hostsharing.net. ( + 1303649373 ; serial secs since Jan 1 1970 + 6H ; refresh (>=10000) + 1H ; retry (>=1800) + 1W ; expire + 1H ; minimum + ) + """ + : "" + ) + .replace("{auto-NS-RR}", """ + {domain}. IN NS dns1.hostsharing.net. + {domain}. IN NS dns2.hostsharing.net. + {domain}. IN NS dns3.hostsharing.net. + """) + .replace("{auto-A-RR}", "{domain}. IN A 83.223.95.160") // arbitrary IP-number + .replace("{auto-AAAA-RR}", "{domain}. IN AAAA 2a01:37:1000::53df:5fa0:0") // arbitrary IP-number + .replace("{domain}", fqdn(assetEntity)) + .replace("{userRRs}", getPropertyValues(assetEntity, "user-RR")); } private String fqdn(final HsHostingAsset assetEntity) { - return assetEntity.getIdentifier().substring(0, assetEntity.getIdentifier().length()-IDENTIFIER_SUFFIX.length()); + return assetEntity.getIdentifier().substring(0, assetEntity.getIdentifier().length() - IDENTIFIER_SUFFIX.length()); } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidator.java index cec021a2..8701d2fe 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidator.java @@ -9,7 +9,7 @@ import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMA class HsDomainSetupHostingAssetValidator extends HostingAssetEntityValidator { - public static final String FQDN_REGEX = "^((?!-)[A-Za-z0-9-]{1,63}(? implements Map { + private static final ObjectMapper jsonWriter = new ObjectMapper() + .configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true) + .configure(SerializationFeature.INDENT_OUTPUT, true); + private final Map delegate; private PatchableMapWrapper(final Map map) { @@ -53,24 +58,9 @@ public class PatchableMapWrapper implements Map { }); } + @SneakyThrows public String toString() { - return "{\n" - + ( - keySet().stream().sorted() - .map(k -> " \"" + k + "\": " + formatted(get(k)))) - .collect(joining(",\n") - ) - + "\n}\n"; - } - - private Object formatted(final Object value) { - if ( value == null || value instanceof Number || value instanceof Boolean ) { - return value; - } - if ( value.getClass().isArray() ) { - return "\"" + Arrays.toString( (Object[]) value) + "\""; - } - return "\"" + value + "\""; + return jsonWriter.writeValueAsString(delegate); } // --- below just delegating methods -------------------------------- diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java index 7f66379c..2f22ba16 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java @@ -40,7 +40,8 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { "www IN CNAME example.com. ; www.example.com is an alias for example.com", "test1 IN 1h30m CNAME example.com.", "test2 1h30m IN CNAME example.com.", - "ns IN A 192.0.2.2; IPv4 address for ns.example.com") + "ns IN A 192.0.2.2; IPv4 address for ns.example.com", + "key1._domainkey.example.org. 21600 IN TXT \"v=DKIM1; k=rsa; t=s; h=sha256; s=email; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKzG+6ZiD7p60PFZ/qxmKNmP3AO3cIszXYyfvHn/MkyGx0vXhSolAheZtK6+g/h3m6McdPR6kHywcPuQRAPbcVh+SpPAorWe18VLdMcW4D6KxbMjQipRw1cZ4PjglGgcvsT42IAVQMFlEGl6KutmDkZebJNHlrFj38FcwD1wjL0wIDAQAB\"") ) )); } @@ -53,7 +54,7 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { // then assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder( "{type=integer, propertyName=TTL, min=0, defaultValue=21600}", - "{type=boolean, propertyName=auto-SOA-RR, defaultValue=true}", + "{type=boolean, propertyName=auto-SOA, defaultValue=true}", "{type=boolean, propertyName=auto-NS-RR, defaultValue=true}", "{type=boolean, propertyName=auto-MX-RR, defaultValue=true}", "{type=boolean, propertyName=auto-A-RR, defaultValue=true}", @@ -68,7 +69,7 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { "{type=boolean, propertyName=auto-WILDCARD-AAAA-RR, defaultValue=true}", "{type=boolean, propertyName=auto-WILDCARD-DKIM-RR, defaultValue=true}", "{type=boolean, propertyName=auto-WILDCARD-SPF-RR, defaultValue=true}", - "{type=string[], propertyName=user-RR, elementsOf={type=string, propertyName=user-RR, matchesRegEx=[([a-z0-9\\.-]+|@)\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*IN\\s+[A-Z]+\\s+[^;].*(;.*)*, ([a-z0-9\\.-]+|@)\\s+IN\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*[A-Z]+\\s+[^;].*(;.*)*], required=true}}" + "{type=string[], propertyName=user-RR, elementsOf={type=string, propertyName=user-RR, matchesRegEx=[(\\*\\.)?([a-z0-9\\._-]+|@)\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*IN\\s+[A-Z]+\\s+(\".*\")?([^;]*)?(;.*)?, (\\*\\.)?([a-z0-9\\._-]+|@)\\s+IN\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*[A-Z]+\\s+(\".*\")?([^;]*)?(;.*)?], required=true}}" ); } @@ -166,8 +167,8 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { // then assertThat(result).containsExactlyInAnyOrder( "'DOMAIN_DNS_SETUP:example.org|DNS.config.TTL' is expected to be of type Integer, but is of type String", - "'DOMAIN_DNS_SETUP:example.org|DNS.config.user-RR' is expected to match any of [([a-z0-9\\.-]+|@)\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*IN\\s+[A-Z]+\\s+[^;].*(;.*)*, ([a-z0-9\\.-]+|@)\\s+IN\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*[A-Z]+\\s+[^;].*(;.*)*] but '@ 1814400 IN 1814400 BAD1 TTL only allowed once' does not match any", - "'DOMAIN_DNS_SETUP:example.org|DNS.config.user-RR' is expected to match any of [([a-z0-9\\.-]+|@)\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*IN\\s+[A-Z]+\\s+[^;].*(;.*)*, ([a-z0-9\\.-]+|@)\\s+IN\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*[A-Z]+\\s+[^;].*(;.*)*] but 'www BAD1 Record-Class missing / not enough columns' does not match any"); + "'DOMAIN_DNS_SETUP:example.org|DNS.config.user-RR' is expected to match any of [(\\*\\.)?([a-z0-9\\._-]+|@)\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*IN\\s+[A-Z]+\\s+(\".*\")?([^;]*)?(;.*)?, (\\*\\.)?([a-z0-9\\._-]+|@)\\s+IN\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*[A-Z]+\\s+(\".*\")?([^;]*)?(;.*)?] but '@ 1814400 IN 1814400 BAD1 TTL only allowed once' does not match any", + "'DOMAIN_DNS_SETUP:example.org|DNS.config.user-RR' is expected to match any of [(\\*\\.)?([a-z0-9\\._-]+|@)\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*IN\\s+[A-Z]+\\s+(\".*\")?([^;]*)?(;.*)?, (\\*\\.)?([a-z0-9\\._-]+|@)\\s+IN\\s+(([1-9][0-9]*[mMhHdDwW]{0,1})+\\s+)*[A-Z]+\\s+(\".*\")?([^;]*)?(;.*)?] but 'www BAD1 Record-Class missing / not enough columns' does not match any"); } @Test @@ -191,7 +192,9 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { assertThat("CNAME \t\t").matches(RR_RECORD_TYPE); assertThat("example.com.").matches(RR_RECORD_DATA); + assertThat("example.com. ").matches(RR_RECORD_DATA); assertThat("123.123.123.123").matches(RR_RECORD_DATA); + assertThat("123.123.123.123 ").matches(RR_RECORD_DATA); assertThat("(some more complex argument in parenthesis)").matches(RR_RECORD_DATA); assertThat("\"some more complex argument; including a semicolon\"").matches(RR_RECORD_DATA); @@ -210,17 +213,22 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { // then assertThat(zonefile).isEqualTo(""" $ORIGIN example.org. - $TTL 21600 - - ; these records are just placeholders to create a valid zonefile for the validation - @ 1814400 IN SOA example.org. root.example.org ( 1999010100 10800 900 604800 86400 ) - @ IN NS ns - + $TTL 43200 + + + example.org. IN NS dns1.hostsharing.net. + example.org. IN NS dns2.hostsharing.net. + example.org. IN NS dns3.hostsharing.net. + + example.org. IN A 83.223.95.160 + example.org. IN AAAA 2a01:37:1000::53df:5fa0:0 + @ 1814400 IN XXX example.org. root.example.org ( 1234 10800 900 604800 86400 ) www IN CNAME example.com. ; www.example.com is an alias for example.com test1 IN 1h30m CNAME example.com. test2 1h30m IN CNAME example.com. ns IN A 192.0.2.2; IPv4 address for ns.example.com + key1._domainkey.example.org. 21600 IN TXT "v=DKIM1; k=rsa; t=s; h=sha256; s=email; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKzG+6ZiD7p60PFZ/qxmKNmP3AO3cIszXYyfvHn/MkyGx0vXhSolAheZtK6+g/h3m6McdPR6kHywcPuQRAPbcVh+SpPAorWe18VLdMcW4D6KxbMjQipRw1cZ4PjglGgcvsT42IAVQMFlEGl6KutmDkZebJNHlrFj38FcwD1wjL0wIDAQAB" """); } @@ -229,7 +237,8 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { // given final var givenEntity = validEntityBuilder().config(Map.ofEntries( entry("user-RR", Array.of( - "example.org. 1814400 IN SOA example.org. root.example.org (1234 10800 900 604800 86400)" + "example.org. 1814400 IN SOA example.org. root.example.org (1234 10800 900 604800 86400)", + "example.org. 1814400 IN SOA example.org. root.example.org (4321 10800 900 604800 86400)" )) )) .build(); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java index f312fae9..f7f88eb5 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainSetupHostingAssetValidatorUnitTest.java @@ -49,7 +49,7 @@ class HsDomainSetupHostingAssetValidatorUnitTest { // then assertThat(result).containsExactly( - "'identifier' expected to match '^((?!-)[A-Za-z0-9-]{1,63}(? withoutHeader(final List records) { @@ -127,7 +140,9 @@ public class CsvDataImport extends ContextBasedTest { try (final var reader = new CSVReader(new StringReader(csvLine))) { return stream(ofNullable(reader.readNext()).orElse(emptyArray(String.class))) .map(String::trim) - .map(target -> target.startsWith("'") && target.endsWith("'") ? target.substring(1, target.length()-1) : target) + .map(target -> target.startsWith("'") && target.endsWith("'") ? + target.substring(1, target.length() - 1) : + target) .toArray(String[]::new); } } @@ -147,7 +162,7 @@ public class CsvDataImport extends ContextBasedTest { //noinspection unchecked return (T) persistViaSql(id, ha); } - return persistViaEM(id, entity); + return persistViaEM(id, entity); } catch (Exception exc) { errors.add("failed to persist #" + entity.hashCode() + ": " + entity); errors.add(exc.toString()); @@ -171,38 +186,40 @@ public class CsvDataImport extends ContextBasedTest { } final var query = em.createNativeQuery(""" - insert into hs_hosting_asset( - uuid, - type, - bookingitemuuid, - parentassetuuid, - assignedtoassetuuid, - alarmcontactuuid, - identifier, - caption, - config, - version) - values ( - :uuid, - :type, - :bookingitemuuid, - :parentassetuuid, - :assignedtoassetuuid, - :alarmcontactuuid, - :identifier, - :caption, - cast(:config as jsonb), - :version) - """) + insert into hs_hosting_asset( + uuid, + type, + bookingitemuuid, + parentassetuuid, + assignedtoassetuuid, + alarmcontactuuid, + identifier, + caption, + config, + version) + values ( + :uuid, + :type, + :bookingitemuuid, + :parentassetuuid, + :assignedtoassetuuid, + :alarmcontactuuid, + :identifier, + :caption, + cast(:config as jsonb), + :version) + """) .setParameter("uuid", entity.getUuid()) .setParameter("type", entity.getType().name()) .setParameter("bookingitemuuid", ofNullable(entity.getBookingItem()).map(BaseEntity::getUuid).orElse(null)) .setParameter("parentassetuuid", ofNullable(entity.getParentAsset()).map(BaseEntity::getUuid).orElse(null)) - .setParameter("assignedtoassetuuid", ofNullable(entity.getAssignedToAsset()).map(BaseEntity::getUuid).orElse(null)) + .setParameter( + "assignedtoassetuuid", + ofNullable(entity.getAssignedToAsset()).map(BaseEntity::getUuid).orElse(null)) .setParameter("alarmcontactuuid", ofNullable(entity.getAlarmContact()).map(BaseEntity::getUuid).orElse(null)) .setParameter("identifier", entity.getIdentifier()) .setParameter("caption", entity.getCaption()) - .setParameter("config", entity.getConfig().toString()) + .setParameter("config", entity.getConfig().toString().replace("\t", "\\t")) .setParameter("version", entity.getVersion()); final var count = query.executeUpdate(); @@ -212,17 +229,18 @@ public class CsvDataImport extends ContextBasedTest { return entity; } - protected String toFormattedString(final Map map) { + protected String toJsonFormattedString(final Map map) { if ( map.isEmpty() ) { return "{}"; } - return "{\n" + + final var json = "{\n" + map.keySet().stream() .map(id -> " " + id + "=" + map.get(id).toString()) - .map(e -> e.replaceAll("\n ", " ").replace("\n", "")) + .map(e -> e.replaceAll("\n ", " ").replace("\n", "").replace(" : ", ": ").replace("{ ", "{").replace(", ", ", ")) .sorted() .collect(Collectors.joining(",\n")) + "\n}\n"; + return json; } protected void deleteTestDataFromHsOfficeTables() { @@ -301,35 +319,6 @@ public class CsvDataImport extends ContextBasedTest { errors.clear(); assertThat(errorsToLog).isEmpty(); } - - void expectErrors(final String... expectedErrors) { - assertContainsExactlyInAnyOrderIgnoringWhitespace(errors, expectedErrors); - } - - private static class IgnoringWhitespaceComparator implements Comparator { - @Override - public int compare(String s1, String s2) { - return s1.replaceAll("\\s", "").compareTo(s2.replaceAll("\\s", "")); - } - } - - public static void assertContainsExactlyInAnyOrderIgnoringWhitespace(final List expected, final List actual) { - final var sortedExpected = expected.stream() - .map(m -> m.replaceAll("\\s+", " ")) - .map(m -> m.replaceAll("^ ", "")) - .map(m -> m.replaceAll(" $", "")) - .toList(); - final var sortedActual = actual.stream() - .map(m -> m.replaceAll("\\s+", " ")) - .map(m -> m.replaceAll("^ ", "")) - .map(m -> m.replaceAll(" $", "")) - .toArray(String[]::new); - assertThat(sortedExpected).containsExactlyInAnyOrder(sortedActual); - } - - public static void assertContainsExactlyInAnyOrderIgnoringWhitespace(final List expected, final String... actual) { - assertContainsExactlyInAnyOrderIgnoringWhitespace(expected, asList(actual)); - } } class Columns { @@ -373,7 +362,7 @@ class Record { boolean getBoolean(final String columnName) { final String value = getString(columnName); return isNotBlank(value) && - ( parseBoolean(value.trim()) || value.trim().startsWith("t")); + (parseBoolean(value.trim()) || value.trim().startsWith("t")); } Integer getInteger(final String columnName) { @@ -408,7 +397,9 @@ class OrderedDependedTestsExtension implements TestWatcher, BeforeEachCallback { @Override public void testFailed(final ExtensionContext context, final Throwable cause) { - previousTestsPassed = previousTestsPassed && context.getElement().map(e -> e.isAnnotationPresent(ContinueOnFailure.class)).orElse(false); + previousTestsPassed = previousTestsPassed && context.getElement() + .map(e -> e.isAnnotationPresent(ContinueOnFailure.class)) + .orElse(false); } @Override diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java index 00d6d241..ea7b3f5a 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java @@ -1,5 +1,7 @@ package net.hostsharing.hsadminng.hs.migration; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import net.hostsharing.hsadminng.context.Context; import net.hostsharing.hsadminng.hash.HashGenerator; import net.hostsharing.hsadminng.hash.HashGenerator.Algorithm; @@ -18,12 +20,15 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.extension.ExtendWith; +import org.reflections.Reflections; +import org.reflections.scanners.ResourcesScanner; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; import org.springframework.test.annotation.Commit; import org.springframework.test.annotation.DirtiesContext; import java.io.Reader; +import java.net.IDN; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -32,6 +37,8 @@ import java.util.TreeMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; +import java.util.regex.Pattern; +import java.util.stream.Collectors; import static java.util.Arrays.stream; import static java.util.Map.entry; @@ -186,7 +193,7 @@ public class ImportHostingAssets extends ImportOfficeData { void verifyHives() { assumeThatWeAreImportingControlledTestData(); - assertThat(toFormattedString(first(5, hives))).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(first(5, hives))).isEqualToIgnoringWhitespace(""" { 2000001=Hive[hive_id=1, hive_name=h00, inet_addr_id=358, serverRef=null], 2000002=Hive[hive_id=2, hive_name=h01, inet_addr_id=359, serverRef=null], @@ -278,15 +285,15 @@ public class ImportHostingAssets extends ImportOfficeData { HsBookingItemType.MANAGED_WEBSPACE)) .isEqualToIgnoringWhitespace(""" { - 3000630=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_WEBSPACE, [2001-06-01,), BI hsh00, { "HDD": 10, "Multi": 25, "SLA-Platform": "EXT24H", "SSD": 16, "Traffic": 50}), - 3000968=HsBookingItemEntity(D-1015200:rar default project, MANAGED_SERVER, [2013-04-01,), BI vm1061, { "CPU": 6, "HDD": 250, "RAM": 14, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 375, "Traffic": 250}), - 3000978=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2013-04-01,), BI vm1050, { "CPU": 4, "HDD": 250, "RAM": 32, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 150, "Traffic": 250}), - 3001061=HsBookingItemEntity(D-1000300:mim default project, MANAGED_SERVER, [2013-08-19,), BI vm1068, { "CPU": 2, "HDD": 250, "RAM": 4, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT2H", "SLA-Web": true, "Traffic": 250}), - 3001094=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-10,), BI lug00, { "Multi": 5, "SLA-Platform": "EXT24H", "SSD": 1, "Traffic": 10}), - 3001112=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-17,), BI mim00, { "Multi": 5, "SLA-Platform": "EXT24H", "SSD": 3, "Traffic": 20}), - 3001447=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2014-11-28,), BI vm1093, { "CPU": 6, "HDD": 500, "RAM": 16, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 300, "Traffic": 250}), - 3019959=HsBookingItemEntity(D-1101900:dph default project, MANAGED_WEBSPACE, [2021-06-02,), BI dph00, { "Multi": 1, "SLA-Platform": "EXT24H", "SSD": 25, "Traffic": 20}), - 3023611=HsBookingItemEntity(D-1101800:wws default project, CLOUD_SERVER, [2022-08-10,), BI vm2097, { "CPU": 8, "RAM": 12, "SLA-Infrastructure": "EXT4H", "SSD": 25, "Traffic": 250}) + 3000630=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_WEBSPACE, [2001-06-01,), BI hsh00, {"HDD" : 10, "Multi" : 25, "SLA-Platform" : "EXT24H", "SSD" : 16, "Traffic" : 50}), + 3000968=HsBookingItemEntity(D-1015200:rar default project, MANAGED_SERVER, [2013-04-01,), BI vm1061, {"CPU" : 6, "HDD" : 250, "RAM" : 14, "SLA-EMail" : true, "SLA-Maria" : true, "SLA-Office" : true, "SLA-PgSQL" : true, "SLA-Platform" : "EXT4H", "SLA-Web" : true, "SSD" : 375, "Traffic" : 250}), + 3000978=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2013-04-01,), BI vm1050, {"CPU" : 4, "HDD" : 250, "RAM" : 32, "SLA-EMail" : true, "SLA-Maria" : true, "SLA-Office" : true, "SLA-PgSQL" : true, "SLA-Platform" : "EXT4H", "SLA-Web" : true, "SSD" : 150, "Traffic" : 250}), + 3001061=HsBookingItemEntity(D-1000300:mim default project, MANAGED_SERVER, [2013-08-19,), BI vm1068, {"CPU" : 2, "HDD" : 250, "RAM" : 4, "SLA-EMail" : true, "SLA-Maria" : true, "SLA-Office" : true, "SLA-PgSQL" : true, "SLA-Platform" : "EXT2H", "SLA-Web" : true, "Traffic" : 250}), + 3001094=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-10,), BI lug00, {"Multi" : 5, "SLA-Platform" : "EXT24H", "SSD" : 1, "Traffic" : 10}), + 3001112=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-17,), BI mim00, {"Multi" : 5, "SLA-Platform" : "EXT24H", "SSD" : 3, "Traffic" : 20}), + 3001447=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2014-11-28,), BI vm1093, {"CPU" : 6, "HDD" : 500, "RAM" : 16, "SLA-EMail" : true, "SLA-Maria" : true, "SLA-Office" : true, "SLA-PgSQL" : true, "SLA-Platform" : "EXT4H", "SLA-Web" : true, "SSD" : 300, "Traffic" : 250}), + 3019959=HsBookingItemEntity(D-1101900:dph default project, MANAGED_WEBSPACE, [2021-06-02,), BI dph00, {"Multi" : 1, "SLA-Platform" : "EXT24H", "SSD" : 25, "Traffic" : 20}), + 3023611=HsBookingItemEntity(D-1101800:wws default project, CLOUD_SERVER, [2022-08-10,), BI vm2097, {"CPU" : 8, "RAM" : 12, "SLA-Infrastructure" : "EXT4H", "SSD" : 25, "Traffic" : 250}) } """); } @@ -309,20 +316,20 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(15, UNIX_USER)).isEqualToIgnoringWhitespace(""" { - 4005803=HsHostingAssetRealEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102090}), - 4005805=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102091}), - 4005809=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "shell": "/bin/bash", "userid": 102093}), - 4005811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102094}), - 4005813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102095}), - 4005835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "shell": "/usr/bin/passwd", "userid": 102106}), - 4005964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102147}), - 4005966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "shell": "/bin/bash", "userid": 102148}), - 4005990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102160}), - 4100705=HsHostingAssetRealEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 10003}), - 4100824=HsHostingAssetRealEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 10000}), - 4167846=HsHostingAssetRealEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 110568}), - 4169546=HsHostingAssetRealEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110593}), - 4169596=HsHostingAssetRealEntity(UNIX_USER, dph00-uph, Domain admin, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110594}) + 4005803=HsHostingAssetRealEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102090}), + 4005805=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102091}), + 4005809=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "shell": "/bin/bash", "userid": 102093}), + 4005811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102094}), + 4005813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102095}), + 4005835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "shell": "/usr/bin/passwd", "userid": 102106}), + 4005964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102147}), + 4005966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "shell": "/bin/bash", "userid": 102148}), + 4005990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102160}), + 4100705=HsHostingAssetRealEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 10003}), + 4100824=HsHostingAssetRealEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 10000}), + 4167846=HsHostingAssetRealEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 110568}), + 4169546=HsHostingAssetRealEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110593}), + 4169596=HsHostingAssetRealEntity(UNIX_USER, dph00-uph, Domain admin, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110594}) } """); } @@ -345,17 +352,15 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(firstOfEachType(15, EMAIL_ALIAS)).isEqualToIgnoringWhitespace(""" { - 5002403=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00, lug00, MANAGED_WEBSPACE:lug00, { "target": "[michael.mellis@example.com]"}), - 5002405=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00-wla-listar, lug00-wla-listar, MANAGED_WEBSPACE:lug00, { "target": "[|/home/pacs/lug00/users/in/mailinglist/listar]"}), - 5002429=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00, mim00, MANAGED_WEBSPACE:mim00, { "target": "[mim12-mi@mim12.hostsharing.net]"}), - 5002431=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-abruf, mim00-abruf, MANAGED_WEBSPACE:mim00, { "target": "[michael.mellis@hostsharing.net]"}), - 5002449=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx, mim00-hhfx, MANAGED_WEBSPACE:mim00, { "target": "[mim00-hhfx, |/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l]"}), - 5002451=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx-l, mim00-hhfx-l, MANAGED_WEBSPACE:mim00, { "target": "[:include:/home/pacs/mim00/etc/hhfx.list]"}), - 5002452=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-empty, mim00-empty, MANAGED_WEBSPACE:mim00, { "target": "[]"}), - 5002453=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-0_entries, mim00-0_entries, MANAGED_WEBSPACE:mim00, { "target": "[]"}), - 5002454=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-dev.null, mim00-dev.null, MANAGED_WEBSPACE:mim00, { "target": "[/dev/null]"}), - 5002455=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_space, mim00-1_with_space, MANAGED_WEBSPACE:mim00, { "target": "[|/home/pacs/mim00/install/corpslistar/listar]"}), - 5002456=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_single_quotes, mim00-1_with_single_quotes, MANAGED_WEBSPACE:mim00, { "target": "[|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern]"}) + 5002403=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00, lug00, MANAGED_WEBSPACE:lug00, {"target": [ "michael.mellis@example.com" ]}), + 5002405=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00-wla-listar, lug00-wla-listar, MANAGED_WEBSPACE:lug00, {"target": [ "|/home/pacs/lug00/users/in/mailinglist/listar" ]}), + 5002429=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00, mim00, MANAGED_WEBSPACE:mim00, {"target": [ "mim12-mi@mim12.hostsharing.net" ]}), + 5002431=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-abruf, mim00-abruf, MANAGED_WEBSPACE:mim00, {"target": [ "michael.mellis@hostsharing.net" ]}), + 5002449=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx, mim00-hhfx, MANAGED_WEBSPACE:mim00, {"target": [ "mim00-hhfx", "|/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l" ]}), + 5002451=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx-l, mim00-hhfx-l, MANAGED_WEBSPACE:mim00, {"target": [ ":include:/home/pacs/mim00/etc/hhfx.list" ]}), + 5002454=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-dev.null, mim00-dev.null, MANAGED_WEBSPACE:mim00, {"target": [ "/dev/null" ]}), + 5002455=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_space, mim00-1_with_space, MANAGED_WEBSPACE:mim00, {"target": [ "|/home/pacs/mim00/install/corpslistar/listar" ]}), + 5002456=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_single_quotes, mim00-1_with_single_quotes, MANAGED_WEBSPACE:mim00, {"target": [ "|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern" ]}) } """); } @@ -363,7 +368,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Test @Order(15000) void createDatabaseInstances() { - createDatabaseInstances(hostingAssets.values().stream().filter(ha -> ha.getType()==MANAGED_SERVER).toList()); + createDatabaseInstances(hostingAssets.values().stream().filter(ha -> ha.getType() == MANAGED_SERVER).toList()); } @Test @@ -460,38 +465,75 @@ public class ImportHostingAssets extends ImportOfficeData { } } + @Test + @Order(16020) + void importZonenfiles() { + final var reflections = new Reflections(MIGRATION_DATA_PATH + "/hosting/zonefiles", new ResourcesScanner()); + final var zonefileFiles = reflections.getResources(Pattern.compile(".*\\.json")); + zonefileFiles.forEach(zonenfileName -> { + System.out.println("Processing zonenfile: " + zonenfileName); + importZonefiles(resourceAsString(zonenfileName)); + }); + } + @Test @Order(16019) void verifyDomains() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType(5, DOMAIN_SETUP, DOMAIN_DNS_SETUP, DOMAIN_HTTP_SETUP, DOMAIN_MBOX_SETUP, DOMAIN_SMTP_SETUP)).isEqualToIgnoringWhitespace(""" + assertThat(firstOfEachType( + 12, + DOMAIN_SETUP, + DOMAIN_DNS_SETUP, + DOMAIN_HTTP_SETUP, + DOMAIN_MBOX_SETUP, + DOMAIN_SMTP_SETUP)).isEqualToIgnoringWhitespace(""" { - 10004530=HsHostingAssetRealEntity(DOMAIN_SETUP, l-u-g.de, l-u-g.de), 10004531=HsHostingAssetRealEntity(DOMAIN_SETUP, l-u-g.org, l-u-g.org), 10004532=HsHostingAssetRealEntity(DOMAIN_SETUP, linuxfanboysngirls.de, linuxfanboysngirls.de), 10004534=HsHostingAssetRealEntity(DOMAIN_SETUP, lug-mars.de, lug-mars.de), 10004581=HsHostingAssetRealEntity(DOMAIN_SETUP, 1981.ist-im-netz.de, 1981.ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de), - 11004530=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, l-u-g.de|DNS, DNS-Setup für l-u-g.de, DOMAIN_SETUP:l-u-g.de, MANAGED_WEBSPACE:lug00), + 10004587=HsHostingAssetRealEntity(DOMAIN_SETUP, mellis.de, mellis.de), + 10004589=HsHostingAssetRealEntity(DOMAIN_SETUP, ist-im-netz.de, ist-im-netz.de), + 10004600=HsHostingAssetRealEntity(DOMAIN_SETUP, waera.de, waera.de), + 10004604=HsHostingAssetRealEntity(DOMAIN_SETUP, xn--wra-qla.de, wära.de), + 10027662=HsHostingAssetRealEntity(DOMAIN_SETUP, dph-netzwerk.de, dph-netzwerk.de), 11004531=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, l-u-g.org|DNS, DNS-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), 11004532=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, linuxfanboysngirls.de|DNS, DNS-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), 11004534=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, lug-mars.de|DNS, DNS-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), 11004581=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, 1981.ist-im-netz.de|DNS, DNS-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), - 12004530=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, l-u-g.de|HTTP, HTTP-Setup für l-u-g.de, DOMAIN_SETUP:l-u-g.de, UNIX_USER:lug00, { "autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), - 12004531=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, l-u-g.org|HTTP, HTTP-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, UNIX_USER:lug00, { "autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), - 12004532=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, linuxfanboysngirls.de|HTTP, HTTP-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, UNIX_USER:lug00-wla.2, { "autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), - 12004534=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, lug-mars.de|HTTP, HTTP-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, UNIX_USER:lug00-wla.2, { "autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), - 12004581=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, 1981.ist-im-netz.de|HTTP, HTTP-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, UNIX_USER:mim00, { "autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), - 13004530=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, l-u-g.de|MBOX, E-Mail-Empfang-Setup für l-u-g.de, DOMAIN_SETUP:l-u-g.de, MANAGED_WEBSPACE:lug00), + 11004587=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, mellis.de|DNS, DNS-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), + 11004589=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, ist-im-netz.de|DNS, DNS-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 11004600=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, waera.de|DNS, DNS-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), + 11004604=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, xn--wra-qla.de|DNS, DNS-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), + 11027662=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, dph-netzwerk.de|DNS, DNS-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00), + 12004531=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, l-u-g.org|HTTP, HTTP-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, UNIX_USER:lug00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), + 12004532=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, linuxfanboysngirls.de|HTTP, HTTP-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, UNIX_USER:lug00-wla.2, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), + 12004534=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, lug-mars.de|HTTP, HTTP-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, UNIX_USER:lug00-wla.2, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), + 12004581=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, 1981.ist-im-netz.de|HTTP, HTTP-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), + 12004587=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, mellis.de|HTTP, HTTP-Setup für mellis.de, DOMAIN_SETUP:mellis.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": false, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), + 12004589=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, ist-im-netz.de|HTTP, HTTP-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": false, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), + 12004600=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, waera.de|HTTP, HTTP-Setup für waera.de, DOMAIN_SETUP:waera.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), + 12004604=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, xn--wra-qla.de|HTTP, HTTP-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), + 12027662=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, dph-netzwerk.de|HTTP, HTTP-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, UNIX_USER:dph00-uph, {"autoconfig": true, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby"}), 13004531=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, l-u-g.org|MBOX, E-Mail-Empfang-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), 13004532=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, linuxfanboysngirls.de|MBOX, E-Mail-Empfang-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), 13004534=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, lug-mars.de|MBOX, E-Mail-Empfang-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), 13004581=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, 1981.ist-im-netz.de|MBOX, E-Mail-Empfang-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), - 14004530=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, l-u-g.de|SMTP, E-Mail-Versand-Setup für l-u-g.de, DOMAIN_SETUP:l-u-g.de, MANAGED_WEBSPACE:lug00), + 13004587=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, mellis.de|MBOX, E-Mail-Empfang-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), + 13004589=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, ist-im-netz.de|MBOX, E-Mail-Empfang-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 13004600=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, waera.de|MBOX, E-Mail-Empfang-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), + 13004604=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, xn--wra-qla.de|MBOX, E-Mail-Empfang-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), + 13027662=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, dph-netzwerk.de|MBOX, E-Mail-Empfang-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00), 14004531=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, l-u-g.org|SMTP, E-Mail-Versand-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), 14004532=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, linuxfanboysngirls.de|SMTP, E-Mail-Versand-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), 14004534=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, lug-mars.de|SMTP, E-Mail-Versand-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), - 14004581=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, 1981.ist-im-netz.de|SMTP, E-Mail-Versand-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00) + 14004581=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, 1981.ist-im-netz.de|SMTP, E-Mail-Versand-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 14004587=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, mellis.de|SMTP, E-Mail-Versand-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), + 14004589=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, ist-im-netz.de|SMTP, E-Mail-Versand-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 14004600=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, waera.de|SMTP, E-Mail-Versand-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), + 14004604=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, xn--wra-qla.de|SMTP, E-Mail-Versand-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), + 14027662=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, dph-netzwerk.de|SMTP, E-Mail-Versand-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00) } """); } @@ -702,14 +744,16 @@ public class ImportHostingAssets extends ImportOfficeData { @Test @Order(19910) void verifyBookingItemsAreActuallyPersisted() { - final var biCount = (Integer) em.createNativeQuery("SELECT count(*) FROM hs_booking_item", Integer.class).getSingleResult(); + final var biCount = (Integer) em.createNativeQuery("select count(*) from hs_booking_item", Integer.class) + .getSingleResult(); assertThat(biCount).isGreaterThan(isImportingControlledTestData() ? 5 : 500); } @Test @Order(19920) void verifyHostingAssetsAreActuallyPersisted() { - final var haCount = (Integer) em.createNativeQuery("SELECT count(*) FROM hs_hosting_asset", Integer.class).getSingleResult(); + final var haCount = (Integer) em.createNativeQuery("select count(*) from hs_hosting_asset", Integer.class) + .getSingleResult(); assertThat(haCount).isGreaterThan(isImportingControlledTestData() ? 40 : 15000); } @@ -718,21 +762,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Test @Order(99999) void logErrors() { - if (isImportingControlledTestData()) { - super.expectErrors(""" - validation failed for id:5002452( HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-empty, mim00-empty, MANAGED_WEBSPACE:mim00, { - "target": "[]" - } - )): ['EMAIL_ALIAS:mim00-empty.config.target' length is expected to be at min 1 but length of [[]] is 0]""", - """ - validation failed for id:5002453( HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-0_entries, mim00-0_entries, MANAGED_WEBSPACE:mim00, { - "target": "[]" - } - )): ['EMAIL_ALIAS:mim00-0_entries.config.target' length is expected to be at min 1 but length of [[]] is 0]""" - ); - } else { - super.logErrors(); - } + super.logErrors(); } private void persistRecursively(final Integer key, final HsBookingItemEntity bi) { @@ -746,8 +776,9 @@ public class ImportHostingAssets extends ImportOfficeData { private void persistHostingAssetsOfType(final HsHostingAssetType... hsHostingAssetTypes) { final var hsHostingAssetTypeSet = stream(hsHostingAssetTypes).collect(toSet()); - jpaAttempt.transacted(() -> { - hostingAssets.forEach((key, ha) -> { + // jpaAttempt.transacted(() -> { + hostingAssets.forEach((key, ha) -> { + jpaAttempt.transacted(() -> { context(rbacSuperuser); if (hsHostingAssetTypeSet.contains(ha.getType())) { new HostingAssetEntitySaveProcessor(em, ha) @@ -757,9 +788,10 @@ public class ImportHostingAssets extends ImportOfficeData { .saveUsing(entity -> persist(key, entity)) .validateContext(); } - } - ); - }).assertSuccessful(); + }).assertSuccessful(); + } + ); + // }).assertSuccessful(); } private void importIpNumbers(final String[] header, final List records) { @@ -992,12 +1024,14 @@ public class ImportHostingAssets extends ImportOfficeData { // TODO.spec: crop SSD+HDD limits if > booked if (unixUserAsset.getDirectValue("SSD hard quota", Integer.class, 0) - > 1024*unixUserAsset.getContextValue("SSD", Integer.class, 0)) { - unixUserAsset.getConfig().put("SSD hard quota", unixUserAsset.getContextValue("SSD", Integer.class, 0)*1024); + > 1024 * unixUserAsset.getContextValue("SSD", Integer.class, 0)) { + unixUserAsset.getConfig() + .put("SSD hard quota", unixUserAsset.getContextValue("SSD", Integer.class, 0) * 1024); } if (unixUserAsset.getDirectValue("HDD hard quota", Integer.class, 0) - > 1024*unixUserAsset.getContextValue("HDD", Integer.class, 0)) { - unixUserAsset.getConfig().put("HDD hard quota", unixUserAsset.getContextValue("HDD", Integer.class, 0)*1024); + > 1024 * unixUserAsset.getContextValue("HDD", Integer.class, 0)) { + unixUserAsset.getConfig() + .put("HDD hard quota", unixUserAsset.getContextValue("HDD", Integer.class, 0) * 1024); } // TODO.spec: does `softlimit()); // Domain DNS Setup final var ownerAsset = hostingAssets.get(UNIXUSER_ID_OFFSET + owner_id); @@ -1178,12 +1218,11 @@ public class ImportHostingAssets extends ImportOfficeData { .parentAsset(domainSetupAsset) .assignedToAsset(webspaceAsset) .identifier(domain_name + "|DNS") - .caption("DNS-Setup für " + domain_name) - .config(ofEntries( - // FIXME: read from separate files - )) + .caption("DNS-Setup für " + IDN.toUnicode(domain_name)) + .config(new HashMap<>()) // is read from separate files .build(); hostingAssets.put(DOMAIN_DNS_SETUP_OFFSET + domain_id, domainDnsSetupAsset); + domainSetupAsset.getSubHostingAssets().add(domainDnsSetupAsset); // Domain HTTP Setup final var options = stream(domainoptions.split(",")).collect(toSet()); @@ -1192,7 +1231,7 @@ public class ImportHostingAssets extends ImportOfficeData { .parentAsset(domainSetupAsset) .assignedToAsset(ownerAsset) .identifier(domain_name + "|HTTP") - .caption("HTTP-Setup für " + domain_name) + .caption("HTTP-Setup für " + IDN.toUnicode(domain_name)) .config(ofEntries( entry("htdocsfallback", options.contains("htdocsfallback")), entry("indexes", options.contains("indexes")), @@ -1212,6 +1251,7 @@ public class ImportHostingAssets extends ImportOfficeData { )) .build(); hostingAssets.put(DOMAIN_HTTP_SETUP_OFFSET + domain_id, domainHttpSetupAsset); + domainSetupAsset.getSubHostingAssets().add(domainHttpSetupAsset); // Domain MBOX Setup final var domainMboxSetupAsset = HsHostingAssetRealEntity.builder() @@ -1219,12 +1259,13 @@ public class ImportHostingAssets extends ImportOfficeData { .parentAsset(domainSetupAsset) .assignedToAsset(webspaceAsset) .identifier(domain_name + "|MBOX") - .caption("E-Mail-Empfang-Setup für " + domain_name) + .caption("E-Mail-Empfang-Setup für " + IDN.toUnicode(domain_name)) .config(ofEntries( // no properties available )) .build(); hostingAssets.put(DOMAIN_MBOX_SETUP_OFFSET + domain_id, domainMboxSetupAsset); + domainSetupAsset.getSubHostingAssets().add(domainMboxSetupAsset); // Domain SMTP Setup final var domainSmtpSetupAsset = HsHostingAssetRealEntity.builder() @@ -1232,12 +1273,13 @@ public class ImportHostingAssets extends ImportOfficeData { .parentAsset(domainSetupAsset) .assignedToAsset(webspaceAsset) .identifier(domain_name + "|SMTP") - .caption("E-Mail-Versand-Setup für " + domain_name) + .caption("E-Mail-Versand-Setup für " + IDN.toUnicode(domain_name)) .config(ofEntries( // no properties available )) .build(); hostingAssets.put(DOMAIN_SMTP_SETUP_OFFSET + domain_id, domainSmtpSetupAsset); + domainSetupAsset.getSubHostingAssets().add(domainSmtpSetupAsset); }); domainSetupsByName.values().forEach(domainSetup -> { @@ -1249,6 +1291,43 @@ public class ImportHostingAssets extends ImportOfficeData { }); } + private void importZonefiles(final String zonenfilesJson) { + if (zonenfilesJson == null || zonenfilesJson.isEmpty() || zonenfilesJson.isBlank()) { + return; + } + + final var objectMapper = new ObjectMapper(); + try { + //noinspection unchecked + final Map> zoneData = objectMapper.readValue(zonenfilesJson, Map.class); + importZonenfile(zoneData); + } catch (JsonProcessingException e) { + throw new RuntimeException("cannot read zonefile JSON: '"+zonenfilesJson+"'", e); + } + } + + private void importZonenfile(final Map> zoneDataForVM) { + zoneDataForVM.forEach((domainName, zoneData) -> { + //noinspection unchecked + final var domainAsset = domainSetupsByName.get(domainName); + if (domainAsset != null) { + final var domainDnsSetupAsset = domainAsset.getSubHostingAssets().stream() + .filter(subAsset -> subAsset.getType() == DOMAIN_DNS_SETUP) + .findAny().orElse(null); + logError(() -> { + assertThat(domainDnsSetupAsset).as(domainAsset.getIdentifier() + " has no DOMAIN_DNS_SETUP").isNotNull(); + zoneData.remove("DOM_OWNER"); // FIXME: doublecheck + //noinspection unchecked + zoneData.put("user-RR", ((ArrayList>) zoneData.get("user-RR")).stream() + .map(userRR -> userRR.stream().map(Object::toString).collect(Collectors.joining(" "))) + .toArray(String[]::new) + ); + domainDnsSetupAsset.getConfig().putAll(zoneData); + }); + } + }); + } + // ============================================================================================ V returning( @@ -1293,7 +1372,7 @@ public class ImportHostingAssets extends ImportOfficeData { private String firstOfEachType( final int maxCount, final HsHostingAssetType... types) { - return toFormattedString(stream(types) + return toJsonFormattedString(stream(types) .flatMap(t -> hostingAssets.entrySet().stream() .filter(hae -> hae.getValue().getType() == t) @@ -1309,7 +1388,7 @@ public class ImportHostingAssets extends ImportOfficeData { private String firstOfEachType( final int maxCount, final HsBookingItemType... types) { - return toFormattedString(stream(types) + return toJsonFormattedString(stream(types) .flatMap(t -> bookingItems.entrySet().stream() .filter(bie -> bie.getValue().getType() == t) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java index 4e3e9e01..42b0cfa0 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java @@ -105,6 +105,7 @@ public class ImportOfficeData extends CsvDataImport { // at least as the number of lines in business_partners.csv from test-data, but less than real data partner count public static final int MAX_NUMBER_OF_TEST_DATA_PARTNERS = 100; + public static final int DELIBERATELY_BROKEN_BUSINESS_PARTNER_ID = 199; static int relationId = 2000000; @@ -151,7 +152,7 @@ public class ImportOfficeData extends CsvDataImport { assumeThatWeAreImportingControlledTestData(); // no contacts yet => mostly null values - assertThat(toFormattedString(partners)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(partners)).isEqualToIgnoringWhitespace(""" { 100=partner(P-10003: null null, null), 120=partner(P-10020: null null, null), @@ -164,8 +165,8 @@ public class ImportOfficeData extends CsvDataImport { 542=partner(P-11019: null null, null) } """); - assertThat(toFormattedString(contacts)).isEqualTo("{}"); - assertThat(toFormattedString(debitors)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(contacts)).isEqualTo("{}"); + assertThat(toJsonFormattedString(debitors)).isEqualToIgnoringWhitespace(""" { 100=debitor(D-1000300: rel(anchor='null null, null', type='DEBITOR'), mim), 120=debitor(D-1002000: rel(anchor='null null, null', type='DEBITOR'), xyz), @@ -178,7 +179,7 @@ public class ImportOfficeData extends CsvDataImport { 542=debitor(D-1101900: rel(anchor='null null, null', type='DEBITOR'), dph) } """); - assertThat(toFormattedString(memberships)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(memberships)).isEqualToIgnoringWhitespace(""" { 100=Membership(M-1000300, P-10003, [2000-12-06,), ACTIVE), 120=Membership(M-1002000, P-10020, [2000-12-06,2016-01-01), UNKNOWN), @@ -206,7 +207,7 @@ public class ImportOfficeData extends CsvDataImport { void verifyContacts() { assumeThatWeAreImportingControlledTestData(); - assertThat(toFormattedString(partners)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(partners)).isEqualToIgnoringWhitespace(""" { 100=partner(P-10003: ?? Michael Mellis, Herr Michael Mellis , Michael Mellis), 120=partner(P-10020: LP JM GmbH, Herr Philip Meyer-Contract , JM GmbH), @@ -219,7 +220,7 @@ public class ImportOfficeData extends CsvDataImport { 542=partner(P-11019: ?? Das Perfekte Haus, Herr Richard Wiese , Das Perfekte Haus) } """); - assertThat(toFormattedString(contacts)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(contacts)).isEqualToIgnoringWhitespace(""" { 100=contact(caption='Herr Michael Mellis , Michael Mellis', emailAddresses='{ "main": "michael@Mellis.example.org"}'), 1200=contact(caption='JM e.K.', emailAddresses='{ "main": "jm-ex-partner@example.org"}'), @@ -241,7 +242,7 @@ public class ImportOfficeData extends CsvDataImport { 90698=contact(caption='Jan Henning ', emailAddresses='{ "main": "mail@jan-henning.example.org"}') } """); - assertThat(toFormattedString(persons)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(persons)).isEqualToIgnoringWhitespace(""" { 100=person(personType='??', tradeName='Michael Mellis', familyName='Mellis', givenName='Michael'), 1200=person(personType='LP', tradeName='JM e.K.'), @@ -263,7 +264,7 @@ public class ImportOfficeData extends CsvDataImport { 90698=person(personType='NP', familyName='Henning', givenName='Jan') } """); - assertThat(toFormattedString(debitors)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(debitors)).isEqualToIgnoringWhitespace(""" { 100=debitor(D-1000300: rel(anchor='?? Michael Mellis', type='DEBITOR', holder='?? Michael Mellis'), mim), 120=debitor(D-1002000: rel(anchor='LP JM GmbH', type='DEBITOR', holder='LP JM GmbH'), xyz), @@ -276,7 +277,7 @@ public class ImportOfficeData extends CsvDataImport { 542=debitor(D-1101900: rel(anchor='?? Das Perfekte Haus', type='DEBITOR', holder='?? Das Perfekte Haus'), dph) } """); - assertThat(toFormattedString(memberships)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(memberships)).isEqualToIgnoringWhitespace(""" { 100=Membership(M-1000300, P-10003, [2000-12-06,), ACTIVE), 120=Membership(M-1002000, P-10020, [2000-12-06,2016-01-01), UNKNOWN), @@ -286,7 +287,7 @@ public class ImportOfficeData extends CsvDataImport { 542=Membership(M-1101900, P-11019, [2021-05-25,), ACTIVE) } """); - assertThat(toFormattedString(relations)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(relations)).isEqualToIgnoringWhitespace(""" { 2000000=rel(anchor='LP Hostsharing e.G.', type='PARTNER', holder='?? Michael Mellis', contact='Herr Michael Mellis , Michael Mellis'), 2000001=rel(anchor='?? Michael Mellis', type='DEBITOR', holder='?? Michael Mellis', contact='Herr Michael Mellis , Michael Mellis'), @@ -373,7 +374,7 @@ public class ImportOfficeData extends CsvDataImport { void verifySepaMandates() { assumeThatWeAreImportingControlledTestData(); - assertThat(toFormattedString(bankAccounts)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(bankAccounts)).isEqualToIgnoringWhitespace(""" { 132=bankAccount(DE37500105177419788228: holder='Michael Mellis', bic='GENODEF1HH2'), 234234=bankAccount(DE37500105177419788228: holder='Michael Mellis', bic='INGDDEFFXXX'), @@ -384,7 +385,7 @@ public class ImportOfficeData extends CsvDataImport { 387=bankAccount(DE89370400440532013000: holder='Richard Wiese Das Perfekte Haus', bic='COBADEFFXXX') } """); - assertThat(toFormattedString(sepaMandates)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(sepaMandates)).isEqualToIgnoringWhitespace(""" { 132=SEPA-Mandate(DE37500105177419788228, HS-10003-20140801, 2013-12-01, [2013-12-01,)), 234234=SEPA-Mandate(DE37500105177419788228, MH12345, 2004-06-12, [2004-06-15,)), @@ -413,7 +414,7 @@ public class ImportOfficeData extends CsvDataImport { void verifyCoopShares() { assumeThatWeAreImportingControlledTestData(); - assertThat(toFormattedString(coopShares)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(coopShares)).isEqualToIgnoringWhitespace(""" { 241=CoopShareTransaction(M-1000300: 2011-12-05, SUBSCRIPTION, 16, 1000300), 279=CoopShareTransaction(M-1015200: 2013-10-21, SUBSCRIPTION, 1, 1015200), @@ -446,7 +447,7 @@ public class ImportOfficeData extends CsvDataImport { void verifyCoopAssets() { assumeThatWeAreImportingControlledTestData(); - assertThat(toFormattedString(coopAssets)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(coopAssets)).isEqualToIgnoringWhitespace(""" { 1093=CoopAssetsTransaction(M-1000300: 2023-10-05, DEPOSIT, 3072, 1000300, Kapitalerhoehung - Ueberweisung), 1094=CoopAssetsTransaction(M-1000300: 2023-10-06, DEPOSIT, 3072, 1000300, Kapitalerhoehung - Ueberweisung), @@ -475,7 +476,7 @@ public class ImportOfficeData extends CsvDataImport { void verifyMemberships() { assumeThatWeAreImportingControlledTestData(); - assertThat(toFormattedString(memberships)).isEqualToIgnoringWhitespace(""" + assertThat(toJsonFormattedString(memberships)).isEqualToIgnoringWhitespace(""" { 100=Membership(M-1000300, P-10003, [2000-12-06,), ACTIVE), 120=Membership(M-1002000, P-10020, [2000-12-06,2016-01-01), UNKNOWN), @@ -494,11 +495,15 @@ public class ImportOfficeData extends CsvDataImport { partners.forEach((id, p) -> { final var partnerRel = p.getPartnerRel(); assertThat(partnerRel).describedAs("partner " + id + " without partnerRel").isNotNull(); - if ( id != 199 ) { - logError( () -> assertThat(partnerRel.getContact()).describedAs("partner " + id + " without partnerRel.contact").isNotNull()); - logError( () -> assertThat(partnerRel.getContact().getCaption()).describedAs("partner " + id + " without valid partnerRel.contact").isNotNull()); - logError( () -> assertThat(partnerRel.getHolder()).describedAs("partner " + id + " without partnerRel.relHolder").isNotNull()); - logError( () -> assertThat(partnerRel.getHolder().getPersonType()).describedAs("partner " + id + " without valid partnerRel.relHolder").isNotNull()); + if (id != DELIBERATELY_BROKEN_BUSINESS_PARTNER_ID) { + logError( () -> { + assertThat(partnerRel.getContact()).describedAs("partner " + id + " without partnerRel.contact").isNotNull(); + assertThat(partnerRel.getContact().getCaption()).describedAs("partner " + id + " without valid partnerRel.contact").isNotNull(); + }); + logError( () -> { + assertThat(partnerRel.getHolder()).describedAs("partner " + id + " without partnerRel.relHolder").isNotNull(); + assertThat(partnerRel.getHolder().getPersonType()).describedAs("partner " + id + " without valid partnerRel.relHolder").isNotNull(); + }); } }); } @@ -604,6 +609,13 @@ public class ImportOfficeData extends CsvDataImport { @Test @Order(9000) + @ContinueOnFailure + void logCollectedErrorsBeforePersist() { + this.logErrors(); + } + + @Test + @Order(9010) void persistOfficeEntities() { System.out.println("PERSISTING office data to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); @@ -716,6 +728,13 @@ public class ImportOfficeData extends CsvDataImport { ); } + @Test + @Order(9999) + @ContinueOnFailure + void logCollectedErrors() { + this.logErrors(); + } + private void importBusinessPartners(final String[] header, final List records) { final var columns = new Columns(header); diff --git a/src/test/resources/migration/hosting/domain.csv b/src/test/resources/migration/hosting/domain.csv index 989148a6..3471bcfd 100644 --- a/src/test/resources/migration/hosting/domain.csv +++ b/src/test/resources/migration/hosting/domain.csv @@ -1,5 +1,4 @@ domain_id;domain_name;domain_since;domain_dns_master;domain_owner;valid_subdomain_names;passenger_python;passenger_nodejs;passenger_ruby;fcgi_php_bin;domainoptions -4530;l-u-g.de;2013-09-10;dns.hostsharing.net;5803;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger 4531;l-u-g.org;2013-09-10;dns.hostsharing.net;5803;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger 4532;linuxfanboysngirls.de;2013-09-10;dns.hostsharing.net;5809;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger 4534;lug-mars.de;2013-09-10;dns.hostsharing.net;5809;www;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;greylisting,letsencrypt,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger diff --git a/src/test/resources/migration/hosting/emailalias.csv b/src/test/resources/migration/hosting/emailalias.csv index 6b007ce3..b2421536 100644 --- a/src/test/resources/migration/hosting/emailalias.csv +++ b/src/test/resources/migration/hosting/emailalias.csv @@ -5,8 +5,6 @@ emailalias_id;pac_id;name;target 2431;1112;mim00-abruf;michael.mellis@hostsharing.net 2449;1112;mim00-hhfx;"mim00-hhfx,""|/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l""" 2451;1112;mim00-hhfx-l;:include:/home/pacs/mim00/etc/hhfx.list -2452;1112;mim00-empty; -2453;1112;mim00-0_entries;"" 2454;1112;mim00-dev.null; /dev/null 2455;1112;mim00-1_with_space;" ""|/home/pacs/mim00/install/corpslistar/listar""" 2456;1112;mim00-1_with_single_quotes;'|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern' diff --git a/src/test/resources/migration/hosting/zonefiles/zonefiles-vm1068.json b/src/test/resources/migration/hosting/zonefiles/zonefiles-vm1068.json new file mode 100644 index 00000000..e64b0988 --- /dev/null +++ b/src/test/resources/migration/hosting/zonefiles/zonefiles-vm1068.json @@ -0,0 +1,293 @@ +{ + "1981.ist-im-netz.de": { + "DOM_OWNER": "mih00", + "TTL": 21600, + "auto-A-RR": true, + "auto-AAAA-RR": false, + "auto-AUTOCONFIG-RR": false, + "auto-AUTODISCOVER-RR": false, + "auto-DKIM-RR": false, + "auto-MAILSERVICES-RR": false, + "auto-MX-RR": true, + "auto-NS-RR": true, + "auto-SOA": true, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": false, + "auto-WILDCARD-MX-RR": true, + "auto-WILDCARD-SPF-RR": false, + "user-RR": [] + }, + "mellis.de": { + "DOM_OWNER": "mih00", + "TTL": 21600, + "auto-A-RR": true, + "auto-AAAA-RR": true, + "auto-AUTOCONFIG-RR": true, + "auto-AUTODISCOVER-RR": true, + "auto-DKIM-RR": true, + "auto-MAILSERVICES-RR": true, + "auto-MX-RR": true, + "auto-NS-RR": true, + "auto-SOA": true, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": true, + "auto-WILDCARD-MX-RR": true, + "auto-WILDCARD-SPF-RR": true, + "user-RR": [ + [ + "dump.hoennig.de.", + 21600, + "IN", + "CNAME", + "mih12.hostsharing.net." + ], + [ + "fotos.hoennig.de.", + 21600, + "IN", + "CNAME", + "mih12.hostsharing.net." + ], + [ + "maven.hoennig.de.", + 21600, + "IN", + "NS", + "dns1.hostsharing.net." + ], + [ + "key1._domainkey.mellis.de.", + 21600, + "IN", + "TXT", + "\"v=DKIM1; k=rsa; t=s; h=sha256; s=email; \" \"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzAIotiz04KGTF9ECNxEmnnl6eTHplxxYJpOWhx3YiLbQyt6D+sN5uMa/\" \"RMIJDr5BzqzHDQPTM6esLldtIu4OpHppdu3PG4BUB8aXfA0EQvt0wQ/VFGNP36x87nfqs2L8NxbgPwhVD5RqFgj6aheTt64PB+VRco3Nc2qLF4iGpM9UlQbp/W2IITXPbLd9Z/qPo4S6Yeghsq4eFSlcNqSGyO42d23EbAxiehJKBu2eTKX5Vj+n06h1zuXOHyC5IwIe515hmS/\" \"kybbyTTEe35Rmuh+1W9aBJb85d34Thi+knUJeysFleHe7mXG7k6zFiG5HjaP7CvDzzdWvCcaJhOIqXwIDAQAB\"" + ] + ] + }, + "ist-im-netz.de": { + "DOM_OWNER": "mih00", + "TTL": 14400, + "auto-A-RR": true, + "auto-AAAA-RR": false, + "auto-AUTOCONFIG-RR": false, + "auto-AUTODISCOVER-RR": false, + "auto-DKIM-RR": false, + "auto-MAILSERVICES-RR": false, + "auto-MX-RR": true, + "auto-NS-RR": true, + "auto-SOA": true, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": false, + "auto-WILDCARD-MX-RR": false, + "auto-WILDCARD-SPF-RR": false, + "user-RR": [ + [ + "1981.ist-im-netz.de.", + 14400, + "IN", + "NS", + "dns1.hostsharing.net." + ], + [ + "1981.ist-im-netz.de.", + 14400, + "IN", + "NS", + "dns2.hostsharing.net." + ], + [ + "1981.ist-im-netz.de.", + 14400, + "IN", + "NS", + "dns3.hostsharing.net." + ] + ] + }, + "l-u-g.de": { + "DOM_OWNER": "lug00", + "TTL": 21600, + "auto-A-RR": true, + "auto-AAAA-RR": false, + "auto-AUTOCONFIG-RR": false, + "auto-AUTODISCOVER-RR": false, + "auto-DKIM-RR": false, + "auto-MAILSERVICES-RR": false, + "auto-MX-RR": true, + "auto-NS-RR": true, + "auto-SOA": true, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": false, + "auto-WILDCARD-MX-RR": true, + "auto-WILDCARD-SPF-RR": false, + "user-RR": [] + }, + "l-u-g.org": { + "DOM_OWNER": "lug00", + "TTL": 21600, + "auto-A-RR": true, + "auto-AAAA-RR": false, + "auto-AUTOCONFIG-RR": false, + "auto-AUTODISCOVER-RR": false, + "auto-DKIM-RR": false, + "auto-MAILSERVICES-RR": false, + "auto-MX-RR": true, + "auto-NS-RR": true, + "auto-SOA": true, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": false, + "auto-WILDCARD-MX-RR": true, + "auto-WILDCARD-SPF-RR": false, + "user-RR": [] + }, + "linuxfanboysngirls.de": { + "DOM_OWNER": "lug00-marl", + "TTL": 21600, + "auto-A-RR": true, + "auto-AAAA-RR": false, + "auto-AUTOCONFIG-RR": false, + "auto-AUTODISCOVER-RR": false, + "auto-DKIM-RR": false, + "auto-MAILSERVICES-RR": false, + "auto-MX-RR": true, + "auto-NS-RR": true, + "auto-SOA": true, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": false, + "auto-WILDCARD-MX-RR": true, + "auto-WILDCARD-SPF-RR": false, + "user-RR": [] + }, + "lug-in.de": { + "DOM_OWNER": "lug00-in", + "TTL": 21600, + "auto-A-RR": true, + "auto-AAAA-RR": false, + "auto-AUTOCONFIG-RR": false, + "auto-AUTODISCOVER-RR": false, + "auto-DKIM-RR": false, + "auto-MAILSERVICES-RR": false, + "auto-MX-RR": true, + "auto-NS-RR": true, + "auto-SOA": true, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": false, + "auto-WILDCARD-MX-RR": true, + "auto-WILDCARD-SPF-RR": false, + "user-RR": [] + }, + "lug-mars.de": { + "DOM_OWNER": "lug00-marl", + "TTL": 14400, + "auto-A-RR": true, + "auto-AAAA-RR": false, + "auto-AUTOCONFIG-RR": false, + "auto-AUTODISCOVER-RR": false, + "auto-DKIM-RR": false, + "auto-MAILSERVICES-RR": false, + "auto-MX-RR": false, + "auto-NS-RR": true, + "auto-SOA": false, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": false, + "auto-WILDCARD-MX-RR": false, + "auto-WILDCARD-SPF-RR": false, + "user-RR": [ + [ + "lug-mars.de.", + 14400, + "IN", + "SOA", + "dns1.hostsharing.net. hostmaster.hostsharing.net. 1611590905 10800 3600 604800 3600" + ], + [ + "lug-mars.de.", + 14400, + "IN", + "MX", + "10 mailin1.hostsharing.net." + ], + [ + "lug-mars.de.", + 14400, + "IN", + "MX", + "20 mailin2.hostsharing.net." + ], + [ + "lug-mars.de.", + 14400, + "IN", + "MX", + "30 mailin3.hostsharing.net." + ], + [ + "bbb.lug-mars.de.", + 14400, + "IN", + "A", + "83.223.79.72" + ], + [ + "ftp.lug-mars.de.", + 14400, + "IN", + "A", + "83.223.79.72" + ], + [ + "www.lug-mars.de.", + 14400, + "IN", + "A", + "83.223.79.72" + ] + ] + }, + "waera.de": { + "DOM_OWNER": "mih00", + "TTL": 21600, + "auto-A-RR": true, + "auto-AAAA-RR": false, + "auto-AUTOCONFIG-RR": false, + "auto-AUTODISCOVER-RR": false, + "auto-DKIM-RR": false, + "auto-MAILSERVICES-RR": false, + "auto-MX-RR": true, + "auto-NS-RR": true, + "auto-SOA": true, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": false, + "auto-WILDCARD-MX-RR": true, + "auto-WILDCARD-SPF-RR": false, + "user-RR": [] + }, + "xn--wra-qla.de": { + "DOM_OWNER": "mih00", + "TTL": 21600, + "auto-A-RR": true, + "auto-AAAA-RR": false, + "auto-AUTOCONFIG-RR": false, + "auto-AUTODISCOVER-RR": false, + "auto-DKIM-RR": false, + "auto-MAILSERVICES-RR": false, + "auto-MX-RR": true, + "auto-NS-RR": true, + "auto-SOA": true, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": false, + "auto-WILDCARD-MX-RR": true, + "auto-WILDCARD-SPF-RR": false, + "user-RR": [] + } +} diff --git a/src/test/resources/migration/hosting/zonefiles/zonefiles-vm1093.json b/src/test/resources/migration/hosting/zonefiles/zonefiles-vm1093.json new file mode 100644 index 00000000..432857fc --- /dev/null +++ b/src/test/resources/migration/hosting/zonefiles/zonefiles-vm1093.json @@ -0,0 +1,36 @@ +{ + "dph-netzwerk.de": { + "DOM_OWNER": "dph00-dph", + "TTL": 21600, + "auto-A-RR": true, + "auto-AAAA-RR": true, + "auto-AUTOCONFIG-RR": true, + "auto-AUTODISCOVER-RR": true, + "auto-DKIM-RR": false, + "auto-MAILSERVICES-RR": true, + "auto-MX-RR": true, + "auto-NS-RR": true, + "auto-SOA": true, + "auto-SPF-RR": false, + "auto-WILDCARD-A-RR": true, + "auto-WILDCARD-AAAA-RR": true, + "auto-WILDCARD-MX-RR": true, + "auto-WILDCARD-SPF-RR": false, + "user-RR": [ + [ + "dph-netzwerk.de.", + 21600, + "IN", + "TXT", + "\"v=spf1 include:spf.hostsharing.net ?all\"" + ], + [ + "*.dph-netzwerk.de.", + 21600, + "IN", + "TXT", + "\"v=spf1 include:spf.hostsharing.net ?all\"" + ] + ] + } +}