import-email-addresses (#86)

Co-authored-by: Michael Hoennig <michael@hoennig.de>
Reviewed-on: #86
Reviewed-by: Marc Sandlus <marc.sandlus@hostsharing.net>
This commit is contained in:
Michael Hoennig 2024-08-12 12:06:12 +02:00
parent 99a26aed8b
commit 0763511edd
34 changed files with 1027 additions and 539 deletions

View File

@ -84,3 +84,9 @@ alias fp='grep -r '@Accepts' src | sed -e 's/^.*@/@/g' | sort -u | wc -l'
alias gw-spotless='./gradlew spotlessApply -x pitest -x test -x :processResources' alias gw-spotless='./gradlew spotlessApply -x pitest -x test -x :processResources'
alias gw-test='. .aliases; ./gradlew test importOfficeData' alias gw-test='. .aliases; ./gradlew test importOfficeData'
alias gw-check='. .aliases; gw test importOfficeData check -x pitest -x :dependencyCheckAnalyze' alias gw-check='. .aliases; gw test importOfficeData check -x pitest -x :dependencyCheckAnalyze'
# etc/docker-compose.yml limits CPUs+MEM and includes a PostgreSQL config for analysing slow queries
alias gw-importOfficeData-in-docker-compose='
docker-compose -f etc/docker-compose.yml down &&
docker-compose -f etc/docker-compose.yml up -d && sleep 10 &&
time gw-importHostingAssets'

View File

@ -126,7 +126,7 @@ SELECT calls,
query query
FROM statements FROM statements
WHERE calls > 100 AND shared_blks_hit > 0 WHERE calls > 100 AND shared_blks_hit > 0
ORDER BY total_exec_time_mins DESC ORDER BY total_exec_time DESC
LIMIT 16; LIMIT 16;
``` ```

View File

@ -7,7 +7,7 @@ services:
environment: environment:
POSTGRES_PASSWORD: password POSTGRES_PASSWORD: password
volumes: volumes:
- /home/mi/Projekte/Hostsharing/hsadmin-ng/etc/postgresql-log-slow-queries.conf:/etc/postgresql/postgresql.conf - ./postgresql-log-slow-queries.conf:/etc/postgresql/postgresql.conf
ports: ports:
- "5432:5432" - "5432:5432"
command: command:
@ -17,3 +17,11 @@ services:
apt-get update && apt-get update &&
apt-get install -y postgresql-contrib && apt-get install -y postgresql-contrib &&
docker-entrypoint.sh postgres -c config_file=/etc/postgresql/postgresql.conf docker-entrypoint.sh postgres -c config_file=/etc/postgresql/postgresql.conf
deploy:
resources:
limits:
cpus: '2'
memory: 8G
reservations:
cpus: '1'
memory: 2G

View File

@ -158,8 +158,8 @@ public class HsBookingItemEntity implements Stringifyable, BaseEntity<HsBookingI
} }
@Override @Override
public Map<String, Object> directProps() { public PatchableMapWrapper<Object> directProps() {
return resources; return getResources();
} }
@Override @Override

View File

@ -128,8 +128,8 @@ public class HsHostingAssetEntity implements HsHostingAsset {
} }
@Override @Override
public Map<String, Object> directProps() { public PatchableMapWrapper<Object> directProps() {
return config; return getConfig();
} }
@Override @Override

View File

@ -14,7 +14,7 @@ public class HsHostingAssetEntityPatcher implements EntityPatcher<HsHostingAsset
private final EntityManager em; private final EntityManager em;
private final HsHostingAssetEntity entity; private final HsHostingAssetEntity entity;
HsHostingAssetEntityPatcher(final EntityManager em, final HsHostingAssetEntity entity) { public HsHostingAssetEntityPatcher(final EntityManager em, final HsHostingAssetEntity entity) {
this.em = em; this.em = em;
this.entity = entity; this.entity = entity;
} }

View File

@ -6,8 +6,10 @@ import net.hostsharing.hsadminng.hs.hosting.generated.api.v1.model.HsHostingAsse
import net.hostsharing.hsadminng.hs.validation.HsEntityValidator; import net.hostsharing.hsadminng.hs.validation.HsEntityValidator;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import java.util.Arrays;
import java.util.Map; import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
import java.util.regex.Pattern;
/** /**
* Wraps the steps of the pararation, validation, mapping and revamp around saving of a HsHostingAsset into a readable API. * Wraps the steps of the pararation, validation, mapping and revamp around saving of a HsHostingAsset into a readable API.
@ -40,12 +42,14 @@ public class HostingAssetEntitySaveProcessor {
return this; return this;
} }
// TODO.impl: remove once the migration of legacy data is done
/// validates the entity itself including its properties, but ignoring some error messages for import of legacy data /// validates the entity itself including its properties, but ignoring some error messages for import of legacy data
public HostingAssetEntitySaveProcessor validateEntityIgnoring(final String ignoreRegExp) { public HostingAssetEntitySaveProcessor validateEntityIgnoring(final String... ignoreRegExp) {
step("validateEntity", "prepareForSave"); step("validateEntity", "prepareForSave");
final var ignoreRegExpPatterns = Arrays.stream(ignoreRegExp).map(Pattern::compile).toList();
MultiValidationException.throwIfNotEmpty( MultiValidationException.throwIfNotEmpty(
validator.validateEntity(entity).stream() validator.validateEntity(entity).stream()
.filter(errorMsg -> !errorMsg.matches(ignoreRegExp)) .filter(error -> ignoreRegExpPatterns.stream().noneMatch(p -> p.matcher(error).matches() ))
.toList() .toList()
); );
return this; return this;

View File

@ -11,20 +11,22 @@ import static net.hostsharing.hsadminng.hs.validation.StringProperty.stringPrope
class HsEMailAddressHostingAssetValidator extends HostingAssetEntityValidator { class HsEMailAddressHostingAssetValidator extends HostingAssetEntityValidator {
private static final String UNIX_USER_REGEX = "^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\._-]*)?$"; // also accepts legacy pac-names private static final String TARGET_MAILBOX_REGEX = "^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\.+_-]*)?$"; // also accepts legacy pac-names
private static final String EMAIL_ADDRESS_LOCAL_PART_REGEX = "[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+"; // RFC 5322 private static final String EMAIL_ADDRESS_LOCAL_PART_REGEX = "[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+"; // RFC 5322
private static final String EMAIL_ADDRESS_DOMAIN_PART_REGEX = "[a-zA-Z0-9.-]+"; private static final String EMAIL_ADDRESS_DOMAIN_PART_REGEX = "[a-zA-Z0-9.-]+";
private static final String EMAIL_ADDRESS_FULL_REGEX = "^" + EMAIL_ADDRESS_LOCAL_PART_REGEX + "@" + EMAIL_ADDRESS_DOMAIN_PART_REGEX + "$"; private static final String EMAIL_ADDRESS_FULL_REGEX = "^(" + EMAIL_ADDRESS_LOCAL_PART_REGEX + ")?@" + EMAIL_ADDRESS_DOMAIN_PART_REGEX + "$";
private static final String NOBODY_REGEX = "^nobody$";
private static final String DEVNULL_REGEX = "^/dev/null$";
public static final int EMAIL_ADDRESS_MAX_LENGTH = 320; // according to RFC 5321 and RFC 5322 public static final int EMAIL_ADDRESS_MAX_LENGTH = 320; // according to RFC 5321 and RFC 5322
HsEMailAddressHostingAssetValidator() { HsEMailAddressHostingAssetValidator() {
super( HsHostingAssetType.EMAIL_ADDRESS, super( HsHostingAssetType.EMAIL_ADDRESS,
AlarmContact.isOptional(), AlarmContact.isOptional(),
stringProperty("local-part").matchesRegEx("^" + EMAIL_ADDRESS_LOCAL_PART_REGEX + "$").required(), stringProperty("local-part").matchesRegEx("^" + EMAIL_ADDRESS_LOCAL_PART_REGEX + "$").writeOnce().optional(),
stringProperty("sub-domain").matchesRegEx("^" + EMAIL_ADDRESS_LOCAL_PART_REGEX + "$").optional(), stringProperty("sub-domain").matchesRegEx("^" + EMAIL_ADDRESS_LOCAL_PART_REGEX + "$").writeOnce().optional(),
arrayOf( arrayOf(
stringProperty("target").maxLength(EMAIL_ADDRESS_MAX_LENGTH).matchesRegEx(UNIX_USER_REGEX, EMAIL_ADDRESS_FULL_REGEX) stringProperty("target").maxLength(EMAIL_ADDRESS_MAX_LENGTH).matchesRegEx(TARGET_MAILBOX_REGEX, EMAIL_ADDRESS_FULL_REGEX, NOBODY_REGEX, DEVNULL_REGEX)
).required().minLength(1)); ).required().minLength(1));
} }
@ -43,9 +45,9 @@ class HsEMailAddressHostingAssetValidator extends HostingAssetEntityValidator {
} }
private static String combineIdentifier(final HsHostingAsset emailAddressAssetEntity) { private static String combineIdentifier(final HsHostingAsset emailAddressAssetEntity) {
return emailAddressAssetEntity.getDirectValue("local-part", String.class) + return ofNullable(emailAddressAssetEntity.getDirectValue("local-part", String.class)).orElse("")
ofNullable(emailAddressAssetEntity.getDirectValue("sub-domain", String.class)).map(s -> "." + s).orElse("") + + "@"
"@" + + ofNullable(emailAddressAssetEntity.getDirectValue("sub-domain", String.class)).map(s -> s + ".").orElse("")
emailAddressAssetEntity.getParentAsset().getIdentifier(); + emailAddressAssetEntity.getParentAsset().getParentAsset().getIdentifier();
} }
} }

View File

@ -43,10 +43,10 @@ public class ArrayProperty<P extends ValidatableProperty<?, E>, E> extends Valid
@Override @Override
protected void validate(final List<String> result, final E[] propValue, final PropertiesProvider propProvider) { protected void validate(final List<String> result, final E[] propValue, final PropertiesProvider propProvider) {
if (minLength != null && propValue.length < minLength) { if (minLength != null && propValue.length < minLength) {
result.add(propertyName + "' length is expected to be at min " + minLength + " but length of " + display(propValue) + " is " + propValue.length); result.add(propertyName + "' length is expected to be at min " + minLength + " but length of " + displayArray(propValue) + " is " + propValue.length);
} }
if (maxLength != null && propValue.length > maxLength) { if (maxLength != null && propValue.length > maxLength) {
result.add(propertyName + "' length is expected to be at max " + maxLength + " but length of " + display(propValue) + " is " + propValue.length); result.add(propertyName + "' length is expected to be at max " + maxLength + " but length of " + displayArray(propValue) + " is " + propValue.length);
} }
stream(propValue).forEach(e -> elementsOf.validate(result, e, propProvider)); stream(propValue).forEach(e -> elementsOf.validate(result, e, propProvider));
} }
@ -57,7 +57,7 @@ public class ArrayProperty<P extends ValidatableProperty<?, E>, E> extends Valid
} }
@SafeVarargs @SafeVarargs
private String display(final E... propValue) { private String displayArray(final E... propValue) {
return "[" + Arrays.toString(propValue) + "]"; return "[" + Arrays.toString(propValue) + "]";
} }
} }

View File

@ -1,11 +1,11 @@
package net.hostsharing.hsadminng.hs.validation; package net.hostsharing.hsadminng.hs.validation;
import java.util.Map; import net.hostsharing.hsadminng.mapper.PatchableMapWrapper;
public interface PropertiesProvider { public interface PropertiesProvider {
boolean isLoaded(); boolean isLoaded();
Map<String, Object> directProps(); PatchableMapWrapper<Object> directProps();
Object getContextValue(final String propName); Object getContextValue(final String propName);
default <T> T getDirectValue(final String propName, final Class<T> clazz) { default <T> T getDirectValue(final String propName, final Class<T> clazz) {
@ -16,6 +16,10 @@ public interface PropertiesProvider {
return cast(propName, directProps().get(propName), clazz, defaultValue); return cast(propName, directProps().get(propName), clazz, defaultValue);
} }
default boolean isPatched(String propertyName) {
return directProps().isPatched(propertyName);
}
default <T> T getContextValue(final String propName, final Class<T> clazz) { default <T> T getContextValue(final String propName, final Class<T> clazz) {
return cast(propName, getContextValue(propName), clazz, null); return cast(propName, getContextValue(propName), clazz, null);
} }

View File

@ -77,6 +77,7 @@ public class StringProperty<P extends StringProperty<P>> extends ValidatableProp
@Override @Override
protected void validate(final List<String> result, final String propValue, final PropertiesProvider propProvider) { protected void validate(final List<String> result, final String propValue, final PropertiesProvider propProvider) {
super.validate(result, propValue, propProvider);
if (minLength != null && propValue.length()<minLength) { if (minLength != null && propValue.length()<minLength) {
result.add(propertyName + "' length is expected to be at min " + minLength + " but length of " + display(propValue) + " is " + propValue.length()); result.add(propertyName + "' length is expected to be at min " + minLength + " but length of " + display(propValue) + " is " + propValue.length());
} }
@ -87,12 +88,10 @@ public class StringProperty<P extends StringProperty<P>> extends ValidatableProp
stream(matchesRegEx).map(p -> p.matcher(propValue)).noneMatch(Matcher::matches)) { stream(matchesRegEx).map(p -> p.matcher(propValue)).noneMatch(Matcher::matches)) {
result.add(propertyName + "' is expected to match any of " + Arrays.toString(matchesRegEx) + " but " + display(propValue) + " does not match" + (matchesRegEx.length>1?" any":"")); result.add(propertyName + "' is expected to match any of " + Arrays.toString(matchesRegEx) + " but " + display(propValue) + " does not match" + (matchesRegEx.length>1?" any":""));
} }
if (isReadOnly() && propValue != null) {
result.add(propertyName + "' is readonly but given as " + display(propValue));
}
} }
private String display(final String propValue) { @Override
protected String display(final String propValue) {
return undisclosed ? "provided value" : ("'" + propValue + "'"); return undisclosed ? "provided value" : ("'" + propValue + "'");
} }

View File

@ -34,7 +34,7 @@ import static org.apache.commons.lang3.ObjectUtils.isArray;
public abstract class ValidatableProperty<P extends ValidatableProperty<?, ?>, T> { public abstract class ValidatableProperty<P extends ValidatableProperty<?, ?>, T> {
protected static final String[] KEY_ORDER_HEAD = Array.of("propertyName"); protected static final String[] KEY_ORDER_HEAD = Array.of("propertyName");
protected static final String[] KEY_ORDER_TAIL = Array.of("required", "requiresAtLeastOneOf", "requiresAtMaxOneOf", "defaultValue", "readOnly", "writeOnly", "computed", "isTotalsValidator", "thresholdPercentage"); protected static final String[] KEY_ORDER_TAIL = Array.of("required", "requiresAtLeastOneOf", "requiresAtMaxOneOf", "defaultValue", "readOnly", "writeOnce","writeOnly", "computed", "isTotalsValidator", "thresholdPercentage");
protected static final String[] KEY_ORDER = Array.join(KEY_ORDER_HEAD, KEY_ORDER_TAIL); protected static final String[] KEY_ORDER = Array.join(KEY_ORDER_HEAD, KEY_ORDER_TAIL);
final Class<T> type; final Class<T> type;
@ -66,6 +66,9 @@ public abstract class ValidatableProperty<P extends ValidatableProperty<?, ?>, T
@Accessors(makeFinal = true, chain = true, fluent = false) @Accessors(makeFinal = true, chain = true, fluent = false)
private boolean writeOnly; private boolean writeOnly;
@Accessors(makeFinal = true, chain = true, fluent = false)
private boolean writeOnce;
private Function<ValidatableProperty<?, ?>[], T[]> deferredInit; private Function<ValidatableProperty<?, ?>[], T[]> deferredInit;
private boolean isTotalsValidator = false; private boolean isTotalsValidator = false;
@ -97,7 +100,11 @@ public abstract class ValidatableProperty<P extends ValidatableProperty<?, ?>, T
public P writeOnly() { public P writeOnly() {
this.writeOnly = true; this.writeOnly = true;
optional(); return self();
}
public P writeOnce() {
this.writeOnce = true;
return self(); return self();
} }
@ -198,6 +205,9 @@ public abstract class ValidatableProperty<P extends ValidatableProperty<?, ?>, T
if (required == TRUE) { if (required == TRUE) {
result.add(propertyName + "' is required but missing"); result.add(propertyName + "' is required but missing");
} }
if (isWriteOnce() && propsProvider.isLoaded() && propsProvider.isPatched(propertyName) ) {
result.add(propertyName + "' is write-once but got removed");
}
validateRequiresAtLeastOneOf(result, propsProvider); validateRequiresAtLeastOneOf(result, propsProvider);
} }
if (propValue != null){ if (propValue != null){
@ -239,19 +249,35 @@ public abstract class ValidatableProperty<P extends ValidatableProperty<?, ?>, T
} }
} }
protected abstract void validate(final List<String> result, final T propValue, final PropertiesProvider propProvider); protected void validate(final List<String> result, final T propValue, final PropertiesProvider propProvider) {
if (isReadOnly() && propValue != null) {
result.add(propertyName + "' is readonly but given as " + display(propValue));
}
if (isWriteOnce() && propProvider.isLoaded() && propValue != null && propProvider.isPatched(propertyName) ) {
result.add(propertyName + "' is write-once but given as " + display(propValue));
}
}
public void verifyConsistency(final Map.Entry<? extends Enum<?>, ?> typeDef) { public void verifyConsistency(final Map.Entry<? extends Enum<?>, ?> typeDef) {
if (required == null && requiresAtLeastOneOf == null && requiresAtMaxOneOf == null && !readOnly && defaultValue == null) { if (isSpecPotentiallyComplete()) {
throw new IllegalStateException(typeDef.getKey() + "[" + propertyName + "] not fully initialized, please call either .readOnly(), .required(), .optional(), .withDefault(...), .requiresAtLeastOneOf(...) or .requiresAtMaxOneOf(...)" ); throw new IllegalStateException(typeDef.getKey() + "[" + propertyName + "] not fully initialized, please call either .readOnly(), .required(), .optional(), .withDefault(...), .requiresAtLeastOneOf(...) or .requiresAtMaxOneOf(...)" );
} }
} }
private boolean isSpecPotentiallyComplete() {
return required == null && requiresAtLeastOneOf == null && requiresAtMaxOneOf == null && !readOnly && !writeOnly
&& defaultValue == null;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public T getValue(final Map<String, Object> propValues) { public T getValue(final Map<String, Object> propValues) {
return (T) Optional.ofNullable(propValues.get(propertyName)).orElse(defaultValue); return (T) Optional.ofNullable(propValues.get(propertyName)).orElse(defaultValue);
} }
protected String display(final T propValue) {
return propValue == null ? null : propValue.toString();
}
protected abstract String simpleTypeName(); protected abstract String simpleTypeName();
public Map<String, Object> toOrderedMap() { public Map<String, Object> toOrderedMap() {

View File

@ -7,7 +7,9 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -23,6 +25,7 @@ public class PatchableMapWrapper<T> implements Map<String, T> {
.configure(SerializationFeature.INDENT_OUTPUT, true); .configure(SerializationFeature.INDENT_OUTPUT, true);
private final Map<String, T> delegate; private final Map<String, T> delegate;
private final Set<String> patched = new HashSet<>();
private PatchableMapWrapper(final Map<String, T> map) { private PatchableMapWrapper(final Map<String, T> map) {
delegate = map; delegate = map;
@ -36,6 +39,10 @@ public class PatchableMapWrapper<T> implements Map<String, T> {
}); });
} }
public static <T> PatchableMapWrapper<T> of(final Map<String, T> delegate) {
return new PatchableMapWrapper<T>(delegate);
}
@NotNull @NotNull
public static <E> ImmutablePair<String, E> entry(final String key, final E value) { public static <E> ImmutablePair<String, E> entry(final String key, final E value) {
return new ImmutablePair<>(key, value); return new ImmutablePair<>(key, value);
@ -45,6 +52,7 @@ public class PatchableMapWrapper<T> implements Map<String, T> {
if (entries != null ) { if (entries != null ) {
delegate.clear(); delegate.clear();
delegate.putAll(entries); delegate.putAll(entries);
patched.clear();
} }
} }
@ -58,6 +66,10 @@ public class PatchableMapWrapper<T> implements Map<String, T> {
}); });
} }
public boolean isPatched(final String propertyName) {
return patched.contains(propertyName);
}
@SneakyThrows @SneakyThrows
public String toString() { public String toString() {
return jsonWriter.writeValueAsString(delegate); return jsonWriter.writeValueAsString(delegate);
@ -92,11 +104,17 @@ public class PatchableMapWrapper<T> implements Map<String, T> {
@Override @Override
public T put(final String key, final T value) { public T put(final String key, final T value) {
if (!Objects.equals(value, delegate.get(key))) {
patched.add(key);
}
return delegate.put(key, value); return delegate.put(key, value);
} }
@Override @Override
public T remove(final Object key) { public T remove(final Object key) {
if (delegate.containsKey(key.toString())) {
patched.add(key.toString());
}
return delegate.remove(key); return delegate.remove(key);
} }
@ -107,20 +125,24 @@ public class PatchableMapWrapper<T> implements Map<String, T> {
@Override @Override
public void clear() { public void clear() {
patched.addAll(delegate.keySet());
delegate.clear(); delegate.clear();
} }
@Override @Override
@NotNull
public Set<String> keySet() { public Set<String> keySet() {
return delegate.keySet(); return delegate.keySet();
} }
@Override @Override
@NotNull
public Collection<T> values() { public Collection<T> values() {
return delegate.values(); return delegate.values();
} }
@Override @Override
@NotNull
public Set<Entry<String, T>> entrySet() { public Set<Entry<String, T>> entrySet() {
return delegate.entrySet(); return delegate.entrySet();
} }

View File

@ -189,15 +189,11 @@ begin
select g.descendantUuid, g.ascendantUuid, level + 1 as level select g.descendantUuid, g.ascendantUuid, level + 1 as level
from RbacGrants g from RbacGrants g
inner join grants on grants.descendantUuid = g.ascendantUuid inner join grants on grants.descendantUuid = g.ascendantUuid
where g.assumed where g.assumed and level<10
),
granted as (
select distinct descendantUuid
from grants
) )
select distinct perm.objectUuid as objectUuid select distinct perm.objectUuid as objectUuid
from granted from grants
join RbacPermission perm on granted.descendantUuid = perm.uuid join RbacPermission perm on grants.descendantUuid = perm.uuid
join RbacObject obj on obj.uuid = perm.objectUuid join RbacObject obj on obj.uuid = perm.objectUuid
where obj.objectTable = '%1$s' -- 'SELECT' permission is included in all other permissions where obj.objectTable = '%1$s' -- 'SELECT' permission is included in all other permissions
limit 8001 limit 8001

View File

@ -170,9 +170,9 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup
// then // then
allTheseBookingItemsAreReturned( allTheseBookingItemsAreReturned(
result, result,
"HsBookingItemEntity(D-1000212:D-1000212 default project, MANAGED_WEBSPACE, [2022-10-01,), separate ManagedWebspace, { Daemons: 0, Multi: 1, SSD: 100, Traffic: 50 } )", "HsBookingItemEntity(D-1000212:D-1000212 default project, MANAGED_WEBSPACE, [2022-10-01,), separate ManagedWebspace, { Daemons: 0, Multi: 1, SSD: 100, Traffic: 50 })",
"HsBookingItemEntity(D-1000212:D-1000212 default project, MANAGED_SERVER, [2022-10-01,), separate ManagedServer, { CPU: 2, RAM: 8, SSD: 500, Traffic: 500 } )", "HsBookingItemEntity(D-1000212:D-1000212 default project, MANAGED_SERVER, [2022-10-01,), separate ManagedServer, { CPU: 2, RAM: 8, SSD: 500, Traffic: 500 })",
"HsBookingItemEntity(D-1000212:D-1000212 default project, PRIVATE_CLOUD, [2024-04-01,), some PrivateCloud, { CPU: 10, HDD: 10000, RAM: 32, SSD: 4000, Traffic: 2000 } )"); "HsBookingItemEntity(D-1000212:D-1000212 default project, PRIVATE_CLOUD, [2024-04-01,), some PrivateCloud, { CPU: 10, HDD: 10000, RAM: 32, SSD: 4000, Traffic: 2000 })");
assertThat(result.stream().filter(bi -> bi.getRelatedHostingAsset()!=null).findAny()) assertThat(result.stream().filter(bi -> bi.getRelatedHostingAsset()!=null).findAny())
.as("at least one relatedProject expected, but none found => fetching relatedProject does not work") .as("at least one relatedProject expected, but none found => fetching relatedProject does not work")
.isNotEmpty(); .isNotEmpty();
@ -193,9 +193,9 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup
// then: // then:
exactlyTheseBookingItemsAreReturned( exactlyTheseBookingItemsAreReturned(
result, result,
"HsBookingItemEntity(D-1000111:D-1000111 default project, MANAGED_WEBSPACE, [2022-10-01,), separate ManagedWebspace, { Daemons: 0, Multi: 1, SSD: 100, Traffic: 50 } )", "HsBookingItemEntity(D-1000111:D-1000111 default project, MANAGED_WEBSPACE, [2022-10-01,), separate ManagedWebspace, { Daemons : 0, Multi : 1, SSD : 100, Traffic : 50 })",
"HsBookingItemEntity(D-1000111:D-1000111 default project, MANAGED_SERVER, [2022-10-01,), separate ManagedServer, { CPU: 2, RAM: 8, SSD: 500, Traffic: 500 } )", "HsBookingItemEntity(D-1000111:D-1000111 default project, MANAGED_SERVER, [2022-10-01,), separate ManagedServer, { CPU : 2, RAM : 8, SSD : 500, Traffic : 500 })",
"HsBookingItemEntity(D-1000111:D-1000111 default project, PRIVATE_CLOUD, [2024-04-01,), some PrivateCloud, { CPU: 10, HDD: 10000, RAM: 32, SSD: 4000, Traffic: 2000 } )"); "HsBookingItemEntity(D-1000111:D-1000111 default project, PRIVATE_CLOUD, [2024-04-01,), some PrivateCloud, { CPU : 10, HDD : 10000, RAM : 32, SSD : 4000, Traffic : 2000 })");
} }
} }
@ -359,6 +359,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup
.extracting(HsBookingItemEntity::toString) .extracting(HsBookingItemEntity::toString)
.extracting(string -> string.replaceAll("\\s+", " ")) .extracting(string -> string.replaceAll("\\s+", " "))
.extracting(string -> string.replaceAll("\"", "")) .extracting(string -> string.replaceAll("\"", ""))
.extracting(string -> string.replaceAll(" : ", ": "))
.contains(bookingItemNames); .contains(bookingItemNames);
} }
} }

View File

@ -546,7 +546,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
.contentType(ContentType.JSON) .contentType(ContentType.JSON)
.body(""" .body("""
{ {
"caption": "some patched test-unix-user", "caption" : "some patched test-unix-user",
"config": { "config": {
"shell": "/bin/bash", "shell": "/bin/bash",
"totpKey": "0x1234567890abcdef0123456789abcdef", "totpKey": "0x1234567890abcdef0123456789abcdef",
@ -588,7 +588,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
}).returnedValue()).isPresent().get() }).returnedValue()).isPresent().get()
.matches(asset -> { .matches(asset -> {
assertThat(asset.getCaption()).isEqualTo("some patched test-unix-user"); assertThat(asset.getCaption()).isEqualTo("some patched test-unix-user");
assertThat(asset.getConfig().toString()).isEqualTo(""" assertThat(asset.getConfig().toString()).isEqualToIgnoringWhitespace("""
{ {
"password": "$6$Jr5w/Y8zo8pCkqg7$/rePRbvey3R6Sz/02YTlTQcRt5qdBPTj2h5.hz.rB8NfIoND8pFOjeB7orYcPs9JNf3JDxPP2V.6MQlE5BwAY/", "password": "$6$Jr5w/Y8zo8pCkqg7$/rePRbvey3R6Sz/02YTlTQcRt5qdBPTj2h5.hz.rB8NfIoND8pFOjeB7orYcPs9JNf3JDxPP2V.6MQlE5BwAY/",
"shell": "/bin/bash", "shell": "/bin/bash",

View File

@ -227,7 +227,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu
exactlyTheseAssetsAreReturned( exactlyTheseAssetsAreReturned(
result, result,
"HsHostingAssetEntity(MANAGED_WEBSPACE, fir01, some Webspace, MANAGED_SERVER:vm1011, D-1000111:D-1000111 default project:separate ManagedWebspace)", "HsHostingAssetEntity(MANAGED_WEBSPACE, fir01, some Webspace, MANAGED_SERVER:vm1011, D-1000111:D-1000111 default project:separate ManagedWebspace)",
"HsHostingAssetEntity(MANAGED_SERVER, vm1011, some ManagedServer, D-1000111:D-1000111 default project:separate ManagedServer, { monit_max_cpu_usage: 90, monit_max_ram_usage: 80, monit_max_ssd_usage: 70 } )"); "HsHostingAssetEntity(MANAGED_SERVER, vm1011, some ManagedServer, D-1000111:D-1000111 default project:separate ManagedServer, { monit_max_cpu_usage : 90, monit_max_ram_usage : 80, monit_max_ssd_usage : 70 })");
} }
@Test @Test
@ -444,6 +444,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu
.extracting(HsHostingAssetEntity::toString) .extracting(HsHostingAssetEntity::toString)
.extracting(input -> input.replaceAll("\\s+", " ")) .extracting(input -> input.replaceAll("\\s+", " "))
.extracting(input -> input.replaceAll("\"", "")) .extracting(input -> input.replaceAll("\"", ""))
.extracting(input -> input.replaceAll("\" : ", "\": "))
.containsExactlyInAnyOrder(serverNames); .containsExactlyInAnyOrder(serverNames);
} }
} }

View File

@ -5,8 +5,10 @@ import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType;
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder;
import net.hostsharing.hsadminng.mapper.Array; import net.hostsharing.hsadminng.mapper.Array;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Map; import java.util.Map;
import static java.util.Map.entry; import static java.util.Map.entry;
@ -60,6 +62,11 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest {
)); ));
} }
@BeforeEach
void reset() {
HsDomainDnsSetupHostingAssetValidator.addZonefileErrorsTo(null);
}
@Test @Test
void containsExpectedProperties() { void containsExpectedProperties() {
// when // when
@ -318,4 +325,30 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest {
"[example.org|DNS] zone example.org/IN: not loaded due to errors." "[example.org|DNS] zone example.org/IN: not loaded due to errors."
); );
} }
@Test
void acceptsInvalidZonefileWithActiveErrorFilter() {
// 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 (4321 10800 900 604800 86400)"
))
))
.build();
final var validator = HostingAssetEntityValidatorRegistry.forType(givenEntity.getType());
// when
final var zonefileErrors = new ArrayList<String>();
HsDomainDnsSetupHostingAssetValidator.addZonefileErrorsTo(zonefileErrors);
final var errors = validator.validateContext(givenEntity);
// then
assertThat(errors).isEmpty();
assertThat(zonefileErrors).containsExactlyInAnyOrder(
"[example.org|DNS] dns_master_load:line 26: example.org: multiple RRs of singleton type",
"[example.org|DNS] zone example.org/IN: loading from master file (null) failed: multiple RRs of singleton type",
"[example.org|DNS] zone example.org/IN: not loaded due to errors."
);
}
} }

View File

@ -4,30 +4,43 @@ import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
import net.hostsharing.hsadminng.mapper.Array; import net.hostsharing.hsadminng.mapper.Array;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static java.util.Map.entry; import static java.util.Map.ofEntries;
import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM;
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_MBOX_SETUP; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_MBOX_SETUP;
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ADDRESS; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ADDRESS;
import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET;
import static net.hostsharing.hsadminng.mapper.PatchableMapWrapper.entry;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
class HsEMailAddressHostingAssetValidatorUnitTest { class HsEMailAddressHostingAssetValidatorUnitTest {
final static HsHostingAssetEntity domainMboxetup = HsHostingAssetEntity.builder() final static HsHostingAssetEntity domainSetup = HsHostingAssetEntity.builder()
.type(DOMAIN_MBOX_SETUP) .type(DOMAIN_MBOX_SETUP)
.identifier("example.org") .identifier("example.org")
.build(); .build();
final static HsHostingAssetEntity domainMboxSetup = HsHostingAssetEntity.builder()
.type(DOMAIN_MBOX_SETUP)
.identifier("example.org|MBOX")
.parentAsset(domainSetup)
.build();
static HsHostingAssetEntity.HsHostingAssetEntityBuilder validEntityBuilder() { static HsHostingAssetEntity.HsHostingAssetEntityBuilder validEntityBuilder() {
return HsHostingAssetEntity.builder() return HsHostingAssetEntity.builder()
.type(EMAIL_ADDRESS) .type(EMAIL_ADDRESS)
.parentAsset(domainMboxetup) .parentAsset(domainMboxSetup)
.identifier("test@example.org") .identifier("old-local-part@example.org")
.config(Map.ofEntries( .config(new HashMap<>(ofEntries(
entry("local-part", "test"), entry("local-part", "old-local-part"),
entry("target", Array.of("xyz00", "xyz00-abc", "office@example.com")) entry("target", Array.of(
)); "xyz00",
"xyz00-abc",
"xyz00-xyz+list",
"office@example.com",
"/dev/null"
))
)));
} }
@Test @Test
@ -37,9 +50,9 @@ class HsEMailAddressHostingAssetValidatorUnitTest {
// then // then
assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder( assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder(
"{type=string, propertyName=local-part, matchesRegEx=[^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$], required=true}", "{type=string, propertyName=local-part, matchesRegEx=[^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$], writeOnce=true}",
"{type=string, propertyName=sub-domain, matchesRegEx=[^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$]}", "{type=string, propertyName=sub-domain, matchesRegEx=[^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$], writeOnce=true}",
"{type=string[], propertyName=target, elementsOf={type=string, propertyName=target, matchesRegEx=[^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\._-]*)?$, ^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$], maxLength=320}, required=true, minLength=1}"); "{type=string[], propertyName=target, elementsOf={type=string, propertyName=target, matchesRegEx=[^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\.+_-]*)?$, ^([a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+)?@[a-zA-Z0-9.-]+$, ^nobody$, ^/dev/null$], maxLength=320}, required=true, minLength=1}");
} }
@Test @Test
@ -59,10 +72,14 @@ class HsEMailAddressHostingAssetValidatorUnitTest {
void rejectsInvalidProperties() { void rejectsInvalidProperties() {
// given // given
final var emailAddressHostingAssetEntity = validEntityBuilder() final var emailAddressHostingAssetEntity = validEntityBuilder()
.config(Map.ofEntries( .config(new HashMap<>(ofEntries(
entry("local-part", "no@allowed"), entry("local-part", "no@allowed"),
entry("sub-domain", "no@allowedeither"), entry("sub-domain", "no@allowedeither"),
entry("target", Array.of("xyz00", "xyz00-abc", "garbage", "office@example.com")))) entry("target", Array.of(
"xyz00",
"xyz00-abc",
"garbage",
"office@example.com")))))
.build(); .build();
final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType()); final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType());
@ -71,9 +88,69 @@ class HsEMailAddressHostingAssetValidatorUnitTest {
// then // then
assertThat(result).containsExactlyInAnyOrder( assertThat(result).containsExactlyInAnyOrder(
"'EMAIL_ADDRESS:test@example.org.config.local-part' is expected to match any of [^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$] but 'no@allowed' does not match", "'EMAIL_ADDRESS:old-local-part@example.org.config.local-part' is expected to match any of [^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$] but 'no@allowed' does not match",
"'EMAIL_ADDRESS:test@example.org.config.sub-domain' is expected to match any of [^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$] but 'no@allowedeither' does not match", "'EMAIL_ADDRESS:old-local-part@example.org.config.sub-domain' is expected to match any of [^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$] but 'no@allowedeither' does not match",
"'EMAIL_ADDRESS:test@example.org.config.target' is expected to match any of [^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\._-]*)?$, ^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$] but 'garbage' does not match any"); "'EMAIL_ADDRESS:old-local-part@example.org.config.target' is expected to match any of [^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\.+_-]*)?$, ^([a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+)?@[a-zA-Z0-9.-]+$, ^nobody$, ^/dev/null$] but 'garbage' does not match any");
}
@Test
void rejectsOverwritingWriteOnceProperties() {
// given
final var emailAddressHostingAssetEntity = validEntityBuilder()
.isLoaded(true)
.build();
final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType());
// when
emailAddressHostingAssetEntity.getConfig().put("local-part", "new-local-part");
emailAddressHostingAssetEntity.getConfig().put("sub-domain", "new-sub-domain");
final var result = validator.validateEntity(emailAddressHostingAssetEntity);
// then
assertThat(result).containsExactlyInAnyOrder(
"'EMAIL_ADDRESS:old-local-part@example.org.config.local-part' is write-once but given as 'new-local-part'",
"'EMAIL_ADDRESS:old-local-part@example.org.config.sub-domain' is write-once but given as 'new-sub-domain'");
}
@Test
void rejectsRemovingWriteOnceProperties() {
// given
final var emailAddressHostingAssetEntity = validEntityBuilder()
.config(new HashMap<>(ofEntries(
entry("local-part", "old-local-part"),
entry("sub-domain", "old-sub-domain"),
entry("target", Array.of("xyz00", "xyz00-abc", "office@example.com"))
)))
.isLoaded(true)
.build();
final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType());
// when
emailAddressHostingAssetEntity.getConfig().remove("local-part");
emailAddressHostingAssetEntity.getConfig().remove("sub-domain");
final var result = validator.validateEntity(emailAddressHostingAssetEntity);
// then
assertThat(result).containsExactlyInAnyOrder(
"'EMAIL_ADDRESS:old-local-part@example.org.config.local-part' is write-once but got removed",
"'EMAIL_ADDRESS:old-local-part@example.org.config.sub-domain' is write-once but got removed");
}
@Test
void acceptsOverwritingWriteOncePropertiesWithSameValues() {
// given
final var emailAddressHostingAssetEntity = validEntityBuilder()
.isLoaded(true)
.build();
final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType());
// when
emailAddressHostingAssetEntity.getConfig().put("local-part", "old-local-part");
emailAddressHostingAssetEntity.getConfig().remove("sub-domain"); // is not there anyway
final var result = validator.validateEntity(emailAddressHostingAssetEntity);
// then
assertThat(result).isEmpty();
} }
@Test @Test
@ -89,7 +166,7 @@ class HsEMailAddressHostingAssetValidatorUnitTest {
// then // then
assertThat(result).containsExactlyInAnyOrder( assertThat(result).containsExactlyInAnyOrder(
"'identifier' expected to match '^\\Qtest@example.org\\E$', but is 'abc00-office'"); "'identifier' expected to match '^\\Qold-local-part@example.org\\E$', but is 'abc00-office'");
} }
@Test @Test
@ -107,8 +184,8 @@ class HsEMailAddressHostingAssetValidatorUnitTest {
// then // then
assertThat(result).containsExactlyInAnyOrder( assertThat(result).containsExactlyInAnyOrder(
"'EMAIL_ADDRESS:test@example.org.bookingItem' must be null but is of type MANAGED_SERVER", "'EMAIL_ADDRESS:old-local-part@example.org.bookingItem' must be null but is of type MANAGED_SERVER",
"'EMAIL_ADDRESS:test@example.org.parentAsset' must be of type DOMAIN_MBOX_SETUP but is of type MANAGED_SERVER", "'EMAIL_ADDRESS:old-local-part@example.org.parentAsset' must be of type DOMAIN_MBOX_SETUP but is of type MANAGED_SERVER",
"'EMAIL_ADDRESS:test@example.org.assignedToAsset' must be null but is of type MANAGED_SERVER"); "'EMAIL_ADDRESS:old-local-part@example.org.assignedToAsset' must be null but is of type MANAGED_SERVER");
} }
} }

View File

@ -20,6 +20,7 @@ import org.springframework.transaction.support.TransactionTemplate;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceContext;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ValidationException;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
@ -309,7 +310,7 @@ public class CsvDataImport extends ContextBasedTest {
void logError(final Runnable assertion) { void logError(final Runnable assertion) {
try { try {
assertion.run(); assertion.run();
} catch (final AssertionError exc) { } catch (final AssertionError | ValidationException exc) {
logError(exc.getMessage()); logError(exc.getMessage());
} }
} }

View File

@ -103,8 +103,8 @@ public class HsHostingAssetRealEntity implements HsHostingAsset {
} }
@Override @Override
public Map<String, Object> directProps() { public PatchableMapWrapper<Object> directProps() {
return config; return getConfig();
} }
@Override @Override

View File

@ -134,6 +134,15 @@ public class ImportOfficeData extends CsvDataImport {
static Map<Integer, HsOfficeCoopSharesTransactionEntity> coopShares = new WriteOnceMap<>(); static Map<Integer, HsOfficeCoopSharesTransactionEntity> coopShares = new WriteOnceMap<>();
static Map<Integer, HsOfficeCoopAssetsTransactionEntity> coopAssets = new WriteOnceMap<>(); static Map<Integer, HsOfficeCoopAssetsTransactionEntity> coopAssets = new WriteOnceMap<>();
@Test
@Order(1)
void verifyInitialDatabase() {
// SQL DELETE for thousands of records takes too long, so we make sure, we only start with initial or test data
final var contactCount = (Integer) em.createNativeQuery("select count(*) from hs_office_contact", Integer.class)
.getSingleResult();
assertThat(contactCount).isLessThan(20);
}
@Test @Test
@Order(1010) @Order(1010)
void importBusinessPartners() { void importBusinessPartners() {

View File

@ -1,6 +1,7 @@
package net.hostsharing.hsadminng.hs.validation; package net.hostsharing.hsadminng.hs.validation;
import net.hostsharing.hsadminng.hash.LinuxEtcShadowHashGenerator; import net.hostsharing.hsadminng.hash.LinuxEtcShadowHashGenerator;
import net.hostsharing.hsadminng.mapper.PatchableMapWrapper;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource; import org.junit.jupiter.params.provider.ValueSource;
@ -109,10 +110,10 @@ class PasswordPropertyUnitTest {
} }
@Override @Override
public Map<String, Object> directProps() { public PatchableMapWrapper<Object> directProps() {
return Map.ofEntries( return PatchableMapWrapper.of(Map.ofEntries(
entry(passwordProp.propertyName, "some password") entry(passwordProp.propertyName, "some password")
); ));
} }
@Override @Override

View File

@ -34,7 +34,7 @@ public abstract class PatchUnitTestBase<R, E> {
@Test @Test
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
void willPatchAllProperties() { protected void willPatchAllProperties() {
// given // given
final var givenEntity = newInitialEntity(); final var givenEntity = newInitialEntity();
final var patchResource = newPatchResource(); final var patchResource = newPatchResource();
@ -55,7 +55,7 @@ public abstract class PatchUnitTestBase<R, E> {
@ParameterizedTest @ParameterizedTest
@MethodSource("propertyTestCases") @MethodSource("propertyTestCases")
void willPatchOnlyGivenProperty(final Property<R, Object, E, Object> testCase) { protected void willPatchOnlyGivenProperty(final Property<R, Object, E, Object> testCase) {
// given // given
final var givenEntity = newInitialEntity(); final var givenEntity = newInitialEntity();

View File

@ -1,8 +1,8 @@
database_id;engine;packet_id;name;owner;encoding database_id;engine;packet_id;name;owner;encoding
77;pgsql;630;hsh00_vorstand;hsh00_vorstand;LATIN1 1077;pgsql;630;hsh00_vorstand;hsh00_vorstand;LATIN1
786;mysql;630;hsh00_addr;hsh00;latin1 1786;mysql;630;hsh00_addr;hsh00;latin1
805;mysql;630;hsh00_db2;hsh00;LATIN-1 1805;mysql;630;hsh00_dba;hsh00;LATIN-1
1858;pgsql;630;hsh00;hsh00;LATIN1 1858;pgsql;630;hsh00;hsh00;LATIN1
1860;pgsql;630;hsh00_hsadmin;hsh00_hsadmin;UTF8 1860;pgsql;630;hsh00_hsadmin;hsh00_hsadmin;UTF8

1 database_id engine packet_id name owner encoding
2 77 1077 pgsql 630 hsh00_vorstand hsh00_vorstand LATIN1
3 786 1786 mysql 630 hsh00_addr hsh00 latin1
4 805 1805 mysql 630 hsh00_db2 hsh00_dba hsh00 LATIN-1
5 1858 pgsql 630 hsh00 hsh00 LATIN1
6 1860 pgsql 630 hsh00_hsadmin hsh00_hsadmin UTF8
7 4931 pgsql 630 hsh00_phpPgSqlAdmin hsh00_phpPgSqlAdmin UTF8
8 4932 pgsql 630 hsh00_phpPgSqlAdmin_new hsh00_phpPgSqlAdmin utf8

View File

@ -1,17 +1,17 @@
dbuser_id;engine;packet_id;name;password_hash dbuser_id;engine;packet_id;name;password_hash
1857;pgsql;630;hsh00;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc= 1857;pgsql;10630;hsh00;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc=
1858;mysql;630;hsh00;*59067A36BA197AD0A47D74909296C5B002A0FB9F 1858;mysql;10630;hsh00;*59067A36BA197AD0A47D74909296C5B002A0FB9F
1859;pgsql;630;hsh00_vorstand;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg= 1859;pgsql;10630;hsh00_vorstand;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg=
1860;pgsql;630;hsh00_hsadmin;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg= 1860;pgsql;10630;hsh00_hsadmin;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg=
1861;pgsql;630;hsh00_hsadmin_ro;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8= 1861;pgsql;10630;hsh00_hsadmin_ro;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8=
4931;pgsql;630;hsh00_phpPgSqlAdmin;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8= 4931;pgsql;10630;hsh00_phpPgSqlAdmin;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8=
4908;mysql;630;hsh00_mantis;*EA4C0889A22AAE66BBEBC88161E8CF862D73B44F 4908;mysql;10630;hsh00_mantis;*EA4C0889A22AAE66BBEBC88161E8CF862D73B44F
4909;mysql;630;hsh00_mantis_ro;*B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383 4909;mysql;10630;hsh00_mantis_ro;*B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383
4932;mysql;630;hsh00_phpMyAdmin;*3188720B1889EF5447C722629765F296F40257C2 4932;mysql;10630;hsh00_phpMyAdmin;*3188720B1889EF5447C722629765F296F40257C2
7520;mysql;1094;lug00_wla;*11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5 7520;mysql;11094;lug00_wla;*11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5
7522;pgsql;1094;lug00_ola;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$tir+cV3ZzOZeEWurwAJk+8qkvsTAWaBfwx846oYMOr4=:p4yk/4hHkfSMAFxSuTuh3RIrbSpHNBh7h6raVa3nt1c= 7522;pgsql;11094;lug00_ola;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$tir+cV3ZzOZeEWurwAJk+8qkvsTAWaBfwx846oYMOr4=:p4yk/4hHkfSMAFxSuTuh3RIrbSpHNBh7h6raVa3nt1c=
7604;mysql;1112;mim00_test;*156CFD94A0594A5C3F4C6742376DDF4B8C5F6D90 7604;mysql;11112;mim00_test;*156CFD94A0594A5C3F4C6742376DDF4B8C5F6D90
7605;pgsql;1112;mim00_office;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$43jziwd1o+nkfjE0zFbks24Zy5GK+km87B7vzEQt4So=:xRQntZxBxdo1JJbhkegnUFKHT0T8MDW75hkQs2S3z6k= 7605;pgsql;11112;mim00_office;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$43jziwd1o+nkfjE0zFbks24Zy5GK+km87B7vzEQt4So=:xRQntZxBxdo1JJbhkegnUFKHT0T8MDW75hkQs2S3z6k=

1 dbuser_id engine packet_id name password_hash
2 1857 pgsql 630 10630 hsh00 SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc=
3 1858 mysql 630 10630 hsh00 *59067A36BA197AD0A47D74909296C5B002A0FB9F
4 1859 pgsql 630 10630 hsh00_vorstand SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg=
5 1860 pgsql 630 10630 hsh00_hsadmin SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg=
6 1861 pgsql 630 10630 hsh00_hsadmin_ro SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8=
7 4931 pgsql 630 10630 hsh00_phpPgSqlAdmin SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8=
8 4908 mysql 630 10630 hsh00_mantis *EA4C0889A22AAE66BBEBC88161E8CF862D73B44F
9 4909 mysql 630 10630 hsh00_mantis_ro *B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383
10 4932 mysql 630 10630 hsh00_phpMyAdmin *3188720B1889EF5447C722629765F296F40257C2
11 7520 mysql 1094 11094 lug00_wla *11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5
12 7522 pgsql 1094 11094 lug00_ola SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$tir+cV3ZzOZeEWurwAJk+8qkvsTAWaBfwx846oYMOr4=:p4yk/4hHkfSMAFxSuTuh3RIrbSpHNBh7h6raVa3nt1c=
13 7604 mysql 1112 11112 mim00_test *156CFD94A0594A5C3F4C6742376DDF4B8C5F6D90
14 7605 pgsql 1112 11112 mim00_office SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$43jziwd1o+nkfjE0zFbks24Zy5GK+km87B7vzEQt4So=:xRQntZxBxdo1JJbhkegnUFKHT0T8MDW75hkQs2S3z6k=
15
16
17

View File

@ -7,4 +7,4 @@ domain_id;domain_name;domain_since;domain_dns_master;domain_owner;valid_subdomai
4589;ist-im-netz.de;2013-09-17;dns.hostsharing.net;5964;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;htdocsfallback,indexes,includes,letsencrypt,multiviews,cgi,fastcgi,passenger 4589;ist-im-netz.de;2013-09-17;dns.hostsharing.net;5964;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;htdocsfallback,indexes,includes,letsencrypt,multiviews,cgi,fastcgi,passenger
4600;waera.de;2013-09-17;dns.hostsharing.net;5964;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger 4600;waera.de;2013-09-17;dns.hostsharing.net;5964;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger
4604;xn--wra-qla.de;2013-09-17;dns.hostsharing.net;5964;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger 4604;xn--wra-qla.de;2013-09-17;dns.hostsharing.net;5964;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger
27662;dph-netzwerk.de;2021-06-02;h93.hostsharing.net;169596;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;htdocsfallback,indexes,autoconfig,greylisting,includes,letsencrypt,multiviews,cgi,fastcgi,passenger 7662;dph-netzwerk.de;2021-06-02;h93.hostsharing.net;9596;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;htdocsfallback,indexes,autoconfig,greylisting,includes,letsencrypt,multiviews,cgi,fastcgi,passenger

1 domain_id domain_name domain_since domain_dns_master domain_owner valid_subdomain_names passenger_python passenger_nodejs passenger_ruby fcgi_php_bin domainoptions
7 4589 ist-im-netz.de 2013-09-17 dns.hostsharing.net 5964 * /usr/bin/python3 /usr/bin/node /usr/bin/ruby /usr/lib/cgi-bin/php htdocsfallback,indexes,includes,letsencrypt,multiviews,cgi,fastcgi,passenger
8 4600 waera.de 2013-09-17 dns.hostsharing.net 5964 * /usr/bin/python3 /usr/bin/node /usr/bin/ruby /usr/lib/cgi-bin/php greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger
9 4604 xn--wra-qla.de 2013-09-17 dns.hostsharing.net 5964 * /usr/bin/python3 /usr/bin/node /usr/bin/ruby /usr/lib/cgi-bin/php greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger
10 27662 7662 dph-netzwerk.de 2021-06-02 h93.hostsharing.net 169596 9596 * /usr/bin/python3 /usr/bin/node /usr/bin/ruby /usr/lib/cgi-bin/php htdocsfallback,indexes,autoconfig,greylisting,includes,letsencrypt,multiviews,cgi,fastcgi,passenger

View File

@ -0,0 +1,72 @@
emailaddr_id;domain_id;localpart;subdomain;target
54746;4531;abuse;;lug00
54747;4531;postmaster;;nomail
54748;4531;webmaster;;bounce
54745;4531;lugmaster;;nobody
54749;4532;abuse;;lug00-mars
54750;4532;postmaster;;m.hinsel@example.org
54751;4532;webmaster;;m.hinsel@example.org
54755;4534;abuse;;lug00-marl
54756;4534;postmaster;;m.hinsel@example.org
54757;4534;webmaster;;m.hinsel@example.org
54760;4531;info;hamburg-west;peter.lottmann@example.com
54761;4531;lugmaster;hamburg-west;raoul.lottmann@example.com
54762;4531;postmaster;hamburg-west;raoul.lottmann@example.com
54763;4531;webmaster;hamburg-west;raoul.lottmann@example.com peter.lottmann@example.com
54764;4531;;eliza;eliza@example.net
54765;4531;;;lug00
54766;4532;;;nomail
54767;4532;hostmaster;;hostmaster@example.net
54795;4534;;;bounce
54796;4534;hostmaster;;hostmaster@example.net
54963;4581;abuse;;mim00
54964;4581;postmaster;;mim00
54965;4581;webmaster;;mim00
54981;4587;abuse;;
54982;4587;postmaster;;/dev/null
54983;4587;webmaster;;mim00
54987;4589;abuse;;""
54988;4589;postmaster;;mim00
54989;4589;webmaster;;mim00
55020;4600;abuse;;mim00
55021;4600;postmaster;;mim00
55022;4600;webmaster;;mim00
55032;4604;abuse;;mim00
55033;4604;postmaster;;mim00
55034;4604;webmaster;;mim00
55037;4587;;eberhard;eberhard@mellis.de
55038;4587;;marleen;marleen@mellis.de
55039;4587;;michael;mh@dump.mellis.de
55040;4587;lists;michael;mim00-lists
55041;4587;ooo;michael;mim00-ooo
55043;4587;;test;test@mellis.de
55044;4587;;trap;mim00-spam
55046;4587;anke;;anke@segelschule-jade.de
55052;4587;eberhard;;mellis@example.org
55053;4587;gitti;;gitta.mellis@gmx.de
55054;4587;imap;;mim00-imap
55057;4587;listar;;mim00-listar
55059;4587;marleen;;marleen.mellis@t-online.de
55060;4587;mime;;mh@dump.mellis.de
55061;4587;michael;;mh@dump.mellis.de
55062;4587;monika;;nomail
55063;4587;nobody;;nobody
55064;4587;palm;;mim00-imap
55065;4587;procmail;;mim00-mail
55066;4587;reporter.web.de;;nomail
55067;4587;script;;mim00-script
55068;4587;spamtrap;;mim00-spamtrap
55069;4587;susanne;;susanne.mellis@example.net
55070;4587;test;;mim00-test
55071;4587;ursula;;01234wasauchimmer@example.net
55072;4587;webcmstag;;mim00-webcmstag
55073;4587;wichtig;;mim00-imap,01234567@smsmail.example.org
55074;4604;;;@waera.de
60601;4589;highlander;;mim00-highlander,michael@mellis.de
65150;4589;little-sunshine;;mim00-marleen
75964;4589;;mail;michael@mellis.de
75965;4589;;;michael@mellis.de
77726;4587;chat;michael;mim00-chat
93790;7662;abuse;;dph00-dph
93791;7662;postmaster;;dph00-dph
93792;7662;webmaster;;dph00-dph
1 emailaddr_id domain_id localpart subdomain target
2 54746 4531 abuse lug00
3 54747 4531 postmaster nomail
4 54748 4531 webmaster bounce
5 54745 4531 lugmaster nobody
6 54749 4532 abuse lug00-mars
7 54750 4532 postmaster m.hinsel@example.org
8 54751 4532 webmaster m.hinsel@example.org
9 54755 4534 abuse lug00-marl
10 54756 4534 postmaster m.hinsel@example.org
11 54757 4534 webmaster m.hinsel@example.org
12 54760 4531 info hamburg-west peter.lottmann@example.com
13 54761 4531 lugmaster hamburg-west raoul.lottmann@example.com
14 54762 4531 postmaster hamburg-west raoul.lottmann@example.com
15 54763 4531 webmaster hamburg-west raoul.lottmann@example.com peter.lottmann@example.com
16 54764 4531 eliza eliza@example.net
17 54765 4531 lug00
18 54766 4532 nomail
19 54767 4532 hostmaster hostmaster@example.net
20 54795 4534 bounce
21 54796 4534 hostmaster hostmaster@example.net
22 54963 4581 abuse mim00
23 54964 4581 postmaster mim00
24 54965 4581 webmaster mim00
25 54981 4587 abuse
26 54982 4587 postmaster /dev/null
27 54983 4587 webmaster mim00
28 54987 4589 abuse
29 54988 4589 postmaster mim00
30 54989 4589 webmaster mim00
31 55020 4600 abuse mim00
32 55021 4600 postmaster mim00
33 55022 4600 webmaster mim00
34 55032 4604 abuse mim00
35 55033 4604 postmaster mim00
36 55034 4604 webmaster mim00
37 55037 4587 eberhard eberhard@mellis.de
38 55038 4587 marleen marleen@mellis.de
39 55039 4587 michael mh@dump.mellis.de
40 55040 4587 lists michael mim00-lists
41 55041 4587 ooo michael mim00-ooo
42 55043 4587 test test@mellis.de
43 55044 4587 trap mim00-spam
44 55046 4587 anke anke@segelschule-jade.de
45 55052 4587 eberhard mellis@example.org
46 55053 4587 gitti gitta.mellis@gmx.de
47 55054 4587 imap mim00-imap
48 55057 4587 listar mim00-listar
49 55059 4587 marleen marleen.mellis@t-online.de
50 55060 4587 mime mh@dump.mellis.de
51 55061 4587 michael mh@dump.mellis.de
52 55062 4587 monika nomail
53 55063 4587 nobody nobody
54 55064 4587 palm mim00-imap
55 55065 4587 procmail mim00-mail
56 55066 4587 reporter.web.de nomail
57 55067 4587 script mim00-script
58 55068 4587 spamtrap mim00-spamtrap
59 55069 4587 susanne susanne.mellis@example.net
60 55070 4587 test mim00-test
61 55071 4587 ursula 01234wasauchimmer@example.net
62 55072 4587 webcmstag mim00-webcmstag
63 55073 4587 wichtig mim00-imap,01234567@smsmail.example.org
64 55074 4604 @waera.de
65 60601 4589 highlander mim00-highlander,michael@mellis.de
66 65150 4589 little-sunshine mim00-marleen
67 75964 4589 mail michael@mellis.de
68 75965 4589 michael@mellis.de
69 77726 4587 chat michael mim00-chat
70 93790 7662 abuse dph00-dph
71 93791 7662 postmaster dph00-dph
72 93792 7662 webmaster dph00-dph

View File

@ -1,10 +1,10 @@
emailalias_id;pac_id;name;target emailalias_id;pac_id;name;target
2403;1094;lug00;michael.mellis@example.com 2403;11094;lug00;michael.mellis@example.com
2405;1094;lug00-wla-listar;|/home/pacs/lug00/users/in/mailinglist/listar 2405;11094;lug00-wla-listar;|/home/pacs/lug00/users/in/mailinglist/listar
2429;1112;mim00;mim12-mi@mim12.hostsharing.net 2429;11112;mim00;mim12-mi@mim12.hostsharing.net
2431;1112;mim00-abruf;michael.mellis@hostsharing.net 2431;11112;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""" 2449;11112;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 2451;11112;mim00-hhfx-l;:include:/home/pacs/mim00/etc/hhfx.list
2454;1112;mim00-dev.null; /dev/null 2454;11112;mim00-dev.null; /dev/null
2455;1112;mim00-1_with_space;" ""|/home/pacs/mim00/install/corpslistar/listar""" 2455;11112;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' 2456;11112;mim00-1_with_single_quotes;'|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern'

1 emailalias_id pac_id name target
2 2403 1094 11094 lug00 michael.mellis@example.com
3 2405 1094 11094 lug00-wla-listar |/home/pacs/lug00/users/in/mailinglist/listar
4 2429 1112 11112 mim00 mim12-mi@mim12.hostsharing.net
5 2431 1112 11112 mim00-abruf michael.mellis@hostsharing.net
6 2449 1112 11112 mim00-hhfx mim00-hhfx,"|/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l"
7 2451 1112 11112 mim00-hhfx-l :include:/home/pacs/mim00/etc/hhfx.list
8 2454 1112 11112 mim00-dev.null /dev/null
9 2455 1112 11112 mim00-1_with_space "|/home/pacs/mim00/install/corpslistar/listar"
10 2456 1112 11112 mim00-1_with_single_quotes '|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern'

View File

@ -1,26 +1,26 @@
hive_id;hive_name;inet_addr_id;description hive_id;hive_name;inet_addr_id;description
1;h00;358; 1001;h00;358;
2;h01;359; 1002;h01;359;
4;h02;360; 1004;h02;360;
7;h03;361; 1007;h03;361;
13;h04;430; 1013;h04;430;
14;h50;433; 1014;h50;433;
20;h05;354; 1020;h05;354;
21;h06;355; 1021;h06;355;
22;h07;357; 1022;h07;357;
28;h60;363; 1028;h60;363;
31;h63;431; 1031;h63;431;
37;h67;381; 1037;h67;381;
38;h97;537; 1038;h97;537;
39;h96;536; 1039;h96;536;
45;h74;485; 1045;h74;485;
50;h82;514; 1050;h82;514;
128;h19;565; 1128;h19;565;
148;h50;522; 1148;h50;522;
163;h92;457; 1163;h92;457;
173;h25;1759; 1173;h25;1759;
192;h93;1778; 1192;h93;1778;
193;h95;1779; 1193;h95;1779;
205;vm1107;1861; 1205;vm1107;1861;
208;vm1110;1864; 1208;vm1110;1864;
210;vm1112;1833; 1210;vm1112;1833;

1 hive_id hive_name inet_addr_id description
2 1 1001 h00 358
3 2 1002 h01 359
4 4 1004 h02 360
5 7 1007 h03 361
6 13 1013 h04 430
7 14 1014 h50 433
8 20 1020 h05 354
9 21 1021 h06 355
10 22 1022 h07 357
11 28 1028 h60 363
12 31 1031 h63 431
13 37 1037 h67 381
14 38 1038 h97 537
15 39 1039 h96 536
16 45 1045 h74 485
17 50 1050 h82 514
18 128 1128 h19 565
19 148 1148 h50 522
20 163 1163 h92 457
21 173 1173 h25 1759
22 192 1192 h93 1778
23 193 1193 h95 1779
24 205 1205 vm1107 1861
25 208 1208 vm1110 1864
26 210 1210 vm1112 1833

View File

@ -1,10 +1,10 @@
packet_id;basepacket_code;packet_name;bp_id;hive_id;created;cancelled;cur_inet_addr_id;old_inet_addr_id;free packet_id;basepacket_code;packet_name;bp_id;hive_id;created;cancelled;cur_inet_addr_id;old_inet_addr_id;free
630;PAC/WEB;hsh00;213;14;2001-06-01;;473;;1 10630;PAC/WEB;hsh00;213;1014;2001-06-01;;473;;1
968;SRV/MGD;vm1061;132;28;2013-04-01;;363;;0 10968;SRV/MGD;vm1061;132;1028;2013-04-01;;363;;0
978;SRV/MGD;vm1050;213;14;2013-04-01;;433;;1 10978;SRV/MGD;vm1050;213;1014;2013-04-01;;433;;1
1061;SRV/MGD;vm1068;100;37;2013-08-19;;381;;f 11061;SRV/MGD;vm1068;100;1037;2013-08-19;;381;;f
1094;PAC/WEB;lug00;100;37;2013-09-10;;1168;;1 11094;PAC/WEB;lug00;100;1037;2013-09-10;;1168;;1
1112;PAC/WEB;mim00;100;37;2013-09-17;;402;;1 11112;PAC/WEB;mim00;100;1037;2013-09-17;;402;;1
1447;SRV/MGD;vm1093;213;163;2014-11-28;;457;;t 11447;SRV/MGD;vm1093;213;1163;2014-11-28;;457;;t
19959;PAC/WEB;dph00;542;163;2021-06-02;;574;;0 19959;PAC/WEB;dph00;542;1163;2021-06-02;;574;;0
23611;SRV/CLD;vm2097;541;;2022-08-10;;1790;;0 23611;SRV/CLD;vm2097;541;;2022-08-10;;1790;;0

1 packet_id basepacket_code packet_name bp_id hive_id created cancelled cur_inet_addr_id old_inet_addr_id free
2 630 10630 PAC/WEB hsh00 213 14 1014 2001-06-01 473 1
3 968 10968 SRV/MGD vm1061 132 28 1028 2013-04-01 363 0
4 978 10978 SRV/MGD vm1050 213 14 1014 2013-04-01 433 1
5 1061 11061 SRV/MGD vm1068 100 37 1037 2013-08-19 381 f
6 1094 11094 PAC/WEB lug00 100 37 1037 2013-09-10 1168 1
7 1112 11112 PAC/WEB mim00 100 37 1037 2013-09-17 402 1
8 1447 11447 SRV/MGD vm1093 213 163 1163 2014-11-28 457 t
9 19959 PAC/WEB dph00 542 163 1163 2021-06-02 574 0
10 23611 SRV/CLD vm2097 541 2022-08-10 1790 0

View File

@ -1,68 +1,68 @@
packet_component_id;packet_id;quantity;basecomponent_code;created;cancelled packet_component_id;packet_id;quantity;basecomponent_code;created;cancelled
46105;1094;10;TRAFFIC;2017-03-27; 46105;11094;10;TRAFFIC;2017-03-27;
46109;1094;5;MULTI;2017-03-27; 46109;11094;5;MULTI;2017-03-27;
46111;1094;0;DAEMON;2017-03-27; 46111;11094;0;DAEMON;2017-03-27;
46113;1094;1024;QUOTA;2017-03-27; 46113;11094;1024;QUOTA;2017-03-27;
46117;1112;0;DAEMON;2017-03-27; 46117;11112;0;DAEMON;2017-03-27;
46121;1112;20;TRAFFIC;2017-03-27; 46121;11112;20;TRAFFIC;2017-03-27;
46122;1112;5;MULTI;2017-03-27; 46122;11112;5;MULTI;2017-03-27;
46123;1112;3072;QUOTA;2017-03-27; 46123;11112;3072;QUOTA;2017-03-27;
143133;1094;1;SLABASIC;2017-09-01; 143133;11094;1;SLABASIC;2017-09-01;
143483;1112;1;SLABASIC;2017-09-01; 143483;11112;1;SLABASIC;2017-09-01;
757383;1112;0;SLAEXT24H;; 757383;11112;0;SLAEXT24H;;
770533;1094;0;SLAEXT24H;; 770533;11094;0;SLAEXT24H;;
784283;1112;0;OFFICE;; 784283;11112;0;OFFICE;;
797433;1094;0;OFFICE;; 797433;11094;0;OFFICE;;
1228033;1112;0;STORAGE;; 1228033;11112;0;STORAGE;;
1241433;1094;0;STORAGE;; 1241433;11094;0;STORAGE;;
1266451;978;0;SLAPLAT4H;2021-10-05; 1266451;10978;0;SLAPLAT4H;2021-10-05;
1266452;978;250;TRAFFIC;2021-10-05; 1266452;10978;250;TRAFFIC;2021-10-05;
1266453;978;0;SLAPLAT8H;2021-10-05; 1266453;10978;0;SLAPLAT8H;2021-10-05;
1266454;978;0;SLAMAIL4H;2021-10-05; 1266454;10978;0;SLAMAIL4H;2021-10-05;
1266455;978;0;SLAMARIA8H;2021-10-05; 1266455;10978;0;SLAMARIA8H;2021-10-05;
1266456;978;0;SLAPGSQL4H;2021-10-05; 1266456;10978;0;SLAPGSQL4H;2021-10-05;
1266457;978;0;SLAWEB4H;2021-10-05; 1266457;10978;0;SLAWEB4H;2021-10-05;
1266458;978;0;SLAMARIA4H;2021-10-05; 1266458;10978;0;SLAMARIA4H;2021-10-05;
1266459;978;0;SLAPGSQL8H;2021-10-05; 1266459;10978;0;SLAPGSQL8H;2021-10-05;
1266460;978;0;SLAOFFIC8H;2021-10-05; 1266460;10978;0;SLAOFFIC8H;2021-10-05;
1266461;978;0;SLAWEB8H;2021-10-05; 1266461;10978;0;SLAWEB8H;2021-10-05;
1266462;978;256000;STORAGE;2021-10-05; 1266462;10978;256000;STORAGE;2021-10-05;
1266463;978;153600;QUOTA;2021-10-05; 1266463;10978;153600;QUOTA;2021-10-05;
1266464;978;0;SLAOFFIC4H;2021-10-05; 1266464;10978;0;SLAOFFIC4H;2021-10-05;
1266465;978;32768;RAM;2021-10-05; 1266465;10978;32768;RAM;2021-10-05;
1266466;978;4;CPU;2021-10-05; 1266466;10978;4;CPU;2021-10-05;
1266467;978;1;SLABASIC;2021-10-05; 1266467;10978;1;SLABASIC;2021-10-05;
1266468;978;0;SLAMAIL8H;2021-10-05; 1266468;10978;0;SLAMAIL8H;2021-10-05;
1275583;978;0;SLAPLAT2H;2022-04-20; 1275583;10978;0;SLAPLAT2H;2022-04-20;
1280533;978;0;SLAWEB2H;2022-04-20; 1280533;10978;0;SLAWEB2H;2022-04-20;
1285483;978;0;SLAMARIA2H;2022-04-20; 1285483;10978;0;SLAMARIA2H;2022-04-20;
1290433;978;0;SLAPGSQL2H;2022-04-20; 1290433;10978;0;SLAPGSQL2H;2022-04-20;
1295383;978;0;SLAMAIL2H;2022-04-20; 1295383;10978;0;SLAMAIL2H;2022-04-20;
1300333;978;0;SLAOFFIC2H;2022-04-20; 1300333;10978;0;SLAOFFIC2H;2022-04-20;
1305933;1447;0;SLAWEB2H;2022-05-02; 1305933;11447;0;SLAWEB2H;2022-05-02;
1305934;1447;0;SLAPLAT4H;2022-05-02; 1305934;11447;0;SLAPLAT4H;2022-05-02;
1305935;1447;0;SLAWEB8H;2022-05-02; 1305935;11447;0;SLAWEB8H;2022-05-02;
1305936;1447;0;SLAOFFIC4H;2022-05-02; 1305936;11447;0;SLAOFFIC4H;2022-05-02;
1305937;1447;0;SLAMARIA4H;2022-05-02; 1305937;11447;0;SLAMARIA4H;2022-05-02;
1305938;1447;0;SLAOFFIC8H;2022-05-02; 1305938;11447;0;SLAOFFIC8H;2022-05-02;
1305939;1447;1;SLABASIC;2022-05-02; 1305939;11447;1;SLABASIC;2022-05-02;
1305940;1447;0;SLAMAIL8H;2022-05-02; 1305940;11447;0;SLAMAIL8H;2022-05-02;
1305941;1447;0;SLAPGSQL4H;2022-05-02; 1305941;11447;0;SLAPGSQL4H;2022-05-02;
1305942;1447;6;CPU;2022-05-02; 1305942;11447;6;CPU;2022-05-02;
1305943;1447;250;TRAFFIC;2022-05-02; 1305943;11447;250;TRAFFIC;2022-05-02;
1305944;1447;0;SLAOFFIC2H;2022-05-02; 1305944;11447;0;SLAOFFIC2H;2022-05-02;
1305945;1447;0;SLAMAIL4H;2022-05-02; 1305945;11447;0;SLAMAIL4H;2022-05-02;
1305946;1447;0;SLAPGSQL2H;2022-05-02; 1305946;11447;0;SLAPGSQL2H;2022-05-02;
1305947;1447;0;SLAMARIA2H;2022-05-02; 1305947;11447;0;SLAMARIA2H;2022-05-02;
1305948;1447;0;SLAMARIA8H;2022-05-02; 1305948;11447;0;SLAMARIA8H;2022-05-02;
1305949;1447;0;SLAWEB4H;2022-05-02; 1305949;11447;0;SLAWEB4H;2022-05-02;
1305950;1447;16384;RAM;2022-05-02; 1305950;11447;16384;RAM;2022-05-02;
1305951;1447;0;SLAPGSQL8H;2022-05-02; 1305951;11447;0;SLAPGSQL8H;2022-05-02;
1305952;1447;512000;STORAGE;2022-05-02; 1305952;11447;512000;STORAGE;2022-05-02;
1305953;1447;0;SLAMAIL2H;2022-05-02; 1305953;11447;0;SLAMAIL2H;2022-05-02;
1305954;1447;0;SLAPLAT2H;2022-05-02; 1305954;11447;0;SLAPLAT2H;2022-05-02;
1305955;1447;0;SLAPLAT8H;2022-05-02; 1305955;11447;0;SLAPLAT8H;2022-05-02;
1305956;1447;307200;QUOTA;2022-05-02; 1305956;11447;307200;QUOTA;2022-05-02;
1312013;23611;1;SLABASIC;2022-08-10; 1312013;23611;1;SLABASIC;2022-08-10;
1312014;23611;0;BANDWIDTH;2022-08-10; 1312014;23611;0;BANDWIDTH;2022-08-10;
1312015;23611;12288;RAM;2022-08-10; 1312015;23611;12288;RAM;2022-08-10;
@ -73,33 +73,33 @@ packet_component_id;packet_id;quantity;basecomponent_code;created;cancelled
1312020;23611;8;CPU;2022-08-10; 1312020;23611;8;CPU;2022-08-10;
1312021;23611;250;TRAFFIC;2022-08-10; 1312021;23611;250;TRAFFIC;2022-08-10;
1312022;23611;0;SLAINFR4H;2022-08-10; 1312022;23611;0;SLAINFR4H;2022-08-10;
1313883;978;0;BANDWIDTH;; 1313883;10978;0;BANDWIDTH;;
1316583;1447;0;BANDWIDTH;; 1316583;11447;0;BANDWIDTH;;
1338074;968;0;SLAMARIA2H;2023-09-05; 1338074;10968;0;SLAMARIA2H;2023-09-05;
1338075;968;384000;QUOTA;2023-09-05; 1338075;10968;384000;QUOTA;2023-09-05;
1338076;968;1;SLAMAIL8H;2023-09-05; 1338076;10968;1;SLAMAIL8H;2023-09-05;
1338077;968;0;BANDWIDTH;2023-09-05; 1338077;10968;0;BANDWIDTH;2023-09-05;
1338078;968;0;SLAWEB2H;2023-09-05; 1338078;10968;0;SLAWEB2H;2023-09-05;
1338079;968;0;SLAOFFIC4H;2023-09-05; 1338079;10968;0;SLAOFFIC4H;2023-09-05;
1338080;968;256000;STORAGE;2023-09-05; 1338080;10968;256000;STORAGE;2023-09-05;
1338081;968;0;SLAPLAT4H;2023-09-05; 1338081;10968;0;SLAPLAT4H;2023-09-05;
1338082;968;0;SLAPGSQL2H;2023-09-05; 1338082;10968;0;SLAPGSQL2H;2023-09-05;
1338083;968;0;SLAPLAT2H;2023-09-05; 1338083;10968;0;SLAPLAT2H;2023-09-05;
1338084;968;250;TRAFFIC;2023-09-05; 1338084;10968;250;TRAFFIC;2023-09-05;
1338085;968;1;SLAMARIA8H;2023-09-05; 1338085;10968;1;SLAMARIA8H;2023-09-05;
1338086;968;0;SLAPGSQL4H;2023-09-05; 1338086;10968;0;SLAPGSQL4H;2023-09-05;
1338087;968;0;SLAMAIL2H;2023-09-05; 1338087;10968;0;SLAMAIL2H;2023-09-05;
1338088;968;1;SLAPLAT8H;2023-09-05; 1338088;10968;1;SLAPLAT8H;2023-09-05;
1338089;968;0;SLAWEB4H;2023-09-05; 1338089;10968;0;SLAWEB4H;2023-09-05;
1338090;968;6;CPU;2023-09-05; 1338090;10968;6;CPU;2023-09-05;
1338091;968;1;SLAPGSQL8H;2023-09-05; 1338091;10968;1;SLAPGSQL8H;2023-09-05;
1338092;968;0;SLAMARIA4H;2023-09-05; 1338092;10968;0;SLAMARIA4H;2023-09-05;
1338093;968;0;SLAMAIL4H;2023-09-05; 1338093;10968;0;SLAMAIL4H;2023-09-05;
1338094;968;14336;RAM;2023-09-05; 1338094;10968;14336;RAM;2023-09-05;
1338095;968;0;SLAOFFIC2H;2023-09-05; 1338095;10968;0;SLAOFFIC2H;2023-09-05;
1338096;968;0;SLAOFFIC8H;2023-09-05; 1338096;10968;0;SLAOFFIC8H;2023-09-05;
1338097;968;1;SLABASIC;2023-09-05; 1338097;10968;1;SLABASIC;2023-09-05;
1338098;968;1;SLAWEB8H;2023-09-05; 1338098;10968;1;SLAWEB8H;2023-09-05;
1339228;19959;20;TRAFFIC;2023-10-27; 1339228;19959;20;TRAFFIC;2023-10-27;
1339229;19959;1;SLABASIC;2023-10-27; 1339229;19959;1;SLABASIC;2023-10-27;
1339230;19959;0;DAEMON;2023-10-27; 1339230;19959;0;DAEMON;2023-10-27;
@ -108,36 +108,36 @@ packet_component_id;packet_id;quantity;basecomponent_code;created;cancelled
1339233;19959;0;SLAEXT24H;2023-10-27; 1339233;19959;0;SLAEXT24H;2023-10-27;
1339234;19959;0;OFFICE;2023-10-27; 1339234;19959;0;OFFICE;2023-10-27;
1339235;19959;1;MULTI;2023-10-27; 1339235;19959;1;MULTI;2023-10-27;
1341088;1061;0;SLAOFFIC2H;2023-12-14; 1341088;11061;0;SLAOFFIC2H;2023-12-14;
1341089;1061;0;SLAOFFIC8H;2023-12-14; 1341089;11061;0;SLAOFFIC8H;2023-12-14;
1341090;1061;256000;STORAGE;2023-12-14; 1341090;11061;256000;STORAGE;2023-12-14;
1341091;1061;0;SLAMAIL4H;2023-12-14; 1341091;11061;0;SLAMAIL4H;2023-12-14;
1341092;1061;0;SLAMAIL2H;2023-12-14; 1341092;11061;0;SLAMAIL2H;2023-12-14;
1341093;1061;0;SLAPLAT2H;2023-12-14; 1341093;11061;0;SLAPLAT2H;2023-12-14;
1341094;1061;4096;RAM;2023-12-14; 1341094;11061;4096;RAM;2023-12-14;
1341095;1061;0;SLAPLAT4H;2023-12-14; 1341095;11061;0;SLAPLAT4H;2023-12-14;
1341096;1061;1;SLAPGSQL8H;2023-12-14; 1341096;11061;1;SLAPGSQL8H;2023-12-14;
1341097;1061;2;CPU;2023-12-14; 1341097;11061;2;CPU;2023-12-14;
1341098;1061;0;QUOTA;2023-12-14; 1341098;11061;0;QUOTA;2023-12-14;
1341099;1061;0;SLAMAIL8H;2023-12-14; 1341099;11061;0;SLAMAIL8H;2023-12-14;
1341100;1061;1;SLABASIC;2023-12-14; 1341100;11061;1;SLABASIC;2023-12-14;
1341101;1061;1;SLAMARIA8H;2023-12-14; 1341101;11061;1;SLAMARIA8H;2023-12-14;
1341102;1061;0;SLAPGSQL4H;2023-12-14; 1341102;11061;0;SLAPGSQL4H;2023-12-14;
1341103;1061;0;SLAPGSQL2H;2023-12-14; 1341103;11061;0;SLAPGSQL2H;2023-12-14;
1341104;1061;0;SLAMARIA4H;2023-12-14; 1341104;11061;0;SLAMARIA4H;2023-12-14;
1341105;1061;0;SLAOFFIC4H;2023-12-14; 1341105;11061;0;SLAOFFIC4H;2023-12-14;
1341106;1061;1;SLAPLAT8H;2023-12-14; 1341106;11061;1;SLAPLAT8H;2023-12-14;
1341107;1061;0;BANDWIDTH;2023-12-14; 1341107;11061;0;BANDWIDTH;2023-12-14;
1341108;1061;1;SLAWEB8H;2023-12-14; 1341108;11061;1;SLAWEB8H;2023-12-14;
1341109;1061;0;SLAWEB2H;2023-12-14; 1341109;11061;0;SLAWEB2H;2023-12-14;
1341110;1061;0;SLAMARIA2H;2023-12-14; 1341110;11061;0;SLAMARIA2H;2023-12-14;
1341111;1061;250;TRAFFIC;2023-12-14; 1341111;11061;250;TRAFFIC;2023-12-14;
1341112;1061;0;SLAWEB4H;2023-12-14; 1341112;11061;0;SLAWEB4H;2023-12-14;
1346628;630;0;SLAEXT24H;2024-03-19; 1346628;10630;0;SLAEXT24H;2024-03-19;
1346629;630;0;OFFICE;2024-03-19; 1346629;10630;0;OFFICE;2024-03-19;
1346630;630;16384;QUOTA;2024-03-19; 1346630;10630;16384;QUOTA;2024-03-19;
1346631;630;0;DAEMON;2024-03-19; 1346631;10630;0;DAEMON;2024-03-19;
1346632;630;10240;STORAGE;2024-03-19; 1346632;10630;10240;STORAGE;2024-03-19;
1346633;630;1;SLABASIC;2024-03-19; 1346633;10630;1;SLABASIC;2024-03-19;
1346634;630;50;TRAFFIC;2024-03-19; 1346634;10630;50;TRAFFIC;2024-03-19;
1346635;630;25;MULTI;2024-03-19; 1346635;10630;25;MULTI;2024-03-19;

1 packet_component_id packet_id quantity basecomponent_code created cancelled
2 46105 1094 11094 10 TRAFFIC 2017-03-27
3 46109 1094 11094 5 MULTI 2017-03-27
4 46111 1094 11094 0 DAEMON 2017-03-27
5 46113 1094 11094 1024 QUOTA 2017-03-27
6 46117 1112 11112 0 DAEMON 2017-03-27
7 46121 1112 11112 20 TRAFFIC 2017-03-27
8 46122 1112 11112 5 MULTI 2017-03-27
9 46123 1112 11112 3072 QUOTA 2017-03-27
10 143133 1094 11094 1 SLABASIC 2017-09-01
11 143483 1112 11112 1 SLABASIC 2017-09-01
12 757383 1112 11112 0 SLAEXT24H
13 770533 1094 11094 0 SLAEXT24H
14 784283 1112 11112 0 OFFICE
15 797433 1094 11094 0 OFFICE
16 1228033 1112 11112 0 STORAGE
17 1241433 1094 11094 0 STORAGE
18 1266451 978 10978 0 SLAPLAT4H 2021-10-05
19 1266452 978 10978 250 TRAFFIC 2021-10-05
20 1266453 978 10978 0 SLAPLAT8H 2021-10-05
21 1266454 978 10978 0 SLAMAIL4H 2021-10-05
22 1266455 978 10978 0 SLAMARIA8H 2021-10-05
23 1266456 978 10978 0 SLAPGSQL4H 2021-10-05
24 1266457 978 10978 0 SLAWEB4H 2021-10-05
25 1266458 978 10978 0 SLAMARIA4H 2021-10-05
26 1266459 978 10978 0 SLAPGSQL8H 2021-10-05
27 1266460 978 10978 0 SLAOFFIC8H 2021-10-05
28 1266461 978 10978 0 SLAWEB8H 2021-10-05
29 1266462 978 10978 256000 STORAGE 2021-10-05
30 1266463 978 10978 153600 QUOTA 2021-10-05
31 1266464 978 10978 0 SLAOFFIC4H 2021-10-05
32 1266465 978 10978 32768 RAM 2021-10-05
33 1266466 978 10978 4 CPU 2021-10-05
34 1266467 978 10978 1 SLABASIC 2021-10-05
35 1266468 978 10978 0 SLAMAIL8H 2021-10-05
36 1275583 978 10978 0 SLAPLAT2H 2022-04-20
37 1280533 978 10978 0 SLAWEB2H 2022-04-20
38 1285483 978 10978 0 SLAMARIA2H 2022-04-20
39 1290433 978 10978 0 SLAPGSQL2H 2022-04-20
40 1295383 978 10978 0 SLAMAIL2H 2022-04-20
41 1300333 978 10978 0 SLAOFFIC2H 2022-04-20
42 1305933 1447 11447 0 SLAWEB2H 2022-05-02
43 1305934 1447 11447 0 SLAPLAT4H 2022-05-02
44 1305935 1447 11447 0 SLAWEB8H 2022-05-02
45 1305936 1447 11447 0 SLAOFFIC4H 2022-05-02
46 1305937 1447 11447 0 SLAMARIA4H 2022-05-02
47 1305938 1447 11447 0 SLAOFFIC8H 2022-05-02
48 1305939 1447 11447 1 SLABASIC 2022-05-02
49 1305940 1447 11447 0 SLAMAIL8H 2022-05-02
50 1305941 1447 11447 0 SLAPGSQL4H 2022-05-02
51 1305942 1447 11447 6 CPU 2022-05-02
52 1305943 1447 11447 250 TRAFFIC 2022-05-02
53 1305944 1447 11447 0 SLAOFFIC2H 2022-05-02
54 1305945 1447 11447 0 SLAMAIL4H 2022-05-02
55 1305946 1447 11447 0 SLAPGSQL2H 2022-05-02
56 1305947 1447 11447 0 SLAMARIA2H 2022-05-02
57 1305948 1447 11447 0 SLAMARIA8H 2022-05-02
58 1305949 1447 11447 0 SLAWEB4H 2022-05-02
59 1305950 1447 11447 16384 RAM 2022-05-02
60 1305951 1447 11447 0 SLAPGSQL8H 2022-05-02
61 1305952 1447 11447 512000 STORAGE 2022-05-02
62 1305953 1447 11447 0 SLAMAIL2H 2022-05-02
63 1305954 1447 11447 0 SLAPLAT2H 2022-05-02
64 1305955 1447 11447 0 SLAPLAT8H 2022-05-02
65 1305956 1447 11447 307200 QUOTA 2022-05-02
66 1312013 23611 1 SLABASIC 2022-08-10
67 1312014 23611 0 BANDWIDTH 2022-08-10
68 1312015 23611 12288 RAM 2022-08-10
73 1312020 23611 8 CPU 2022-08-10
74 1312021 23611 250 TRAFFIC 2022-08-10
75 1312022 23611 0 SLAINFR4H 2022-08-10
76 1313883 978 10978 0 BANDWIDTH
77 1316583 1447 11447 0 BANDWIDTH
78 1338074 968 10968 0 SLAMARIA2H 2023-09-05
79 1338075 968 10968 384000 QUOTA 2023-09-05
80 1338076 968 10968 1 SLAMAIL8H 2023-09-05
81 1338077 968 10968 0 BANDWIDTH 2023-09-05
82 1338078 968 10968 0 SLAWEB2H 2023-09-05
83 1338079 968 10968 0 SLAOFFIC4H 2023-09-05
84 1338080 968 10968 256000 STORAGE 2023-09-05
85 1338081 968 10968 0 SLAPLAT4H 2023-09-05
86 1338082 968 10968 0 SLAPGSQL2H 2023-09-05
87 1338083 968 10968 0 SLAPLAT2H 2023-09-05
88 1338084 968 10968 250 TRAFFIC 2023-09-05
89 1338085 968 10968 1 SLAMARIA8H 2023-09-05
90 1338086 968 10968 0 SLAPGSQL4H 2023-09-05
91 1338087 968 10968 0 SLAMAIL2H 2023-09-05
92 1338088 968 10968 1 SLAPLAT8H 2023-09-05
93 1338089 968 10968 0 SLAWEB4H 2023-09-05
94 1338090 968 10968 6 CPU 2023-09-05
95 1338091 968 10968 1 SLAPGSQL8H 2023-09-05
96 1338092 968 10968 0 SLAMARIA4H 2023-09-05
97 1338093 968 10968 0 SLAMAIL4H 2023-09-05
98 1338094 968 10968 14336 RAM 2023-09-05
99 1338095 968 10968 0 SLAOFFIC2H 2023-09-05
100 1338096 968 10968 0 SLAOFFIC8H 2023-09-05
101 1338097 968 10968 1 SLABASIC 2023-09-05
102 1338098 968 10968 1 SLAWEB8H 2023-09-05
103 1339228 19959 20 TRAFFIC 2023-10-27
104 1339229 19959 1 SLABASIC 2023-10-27
105 1339230 19959 0 DAEMON 2023-10-27
108 1339233 19959 0 SLAEXT24H 2023-10-27
109 1339234 19959 0 OFFICE 2023-10-27
110 1339235 19959 1 MULTI 2023-10-27
111 1341088 1061 11061 0 SLAOFFIC2H 2023-12-14
112 1341089 1061 11061 0 SLAOFFIC8H 2023-12-14
113 1341090 1061 11061 256000 STORAGE 2023-12-14
114 1341091 1061 11061 0 SLAMAIL4H 2023-12-14
115 1341092 1061 11061 0 SLAMAIL2H 2023-12-14
116 1341093 1061 11061 0 SLAPLAT2H 2023-12-14
117 1341094 1061 11061 4096 RAM 2023-12-14
118 1341095 1061 11061 0 SLAPLAT4H 2023-12-14
119 1341096 1061 11061 1 SLAPGSQL8H 2023-12-14
120 1341097 1061 11061 2 CPU 2023-12-14
121 1341098 1061 11061 0 QUOTA 2023-12-14
122 1341099 1061 11061 0 SLAMAIL8H 2023-12-14
123 1341100 1061 11061 1 SLABASIC 2023-12-14
124 1341101 1061 11061 1 SLAMARIA8H 2023-12-14
125 1341102 1061 11061 0 SLAPGSQL4H 2023-12-14
126 1341103 1061 11061 0 SLAPGSQL2H 2023-12-14
127 1341104 1061 11061 0 SLAMARIA4H 2023-12-14
128 1341105 1061 11061 0 SLAOFFIC4H 2023-12-14
129 1341106 1061 11061 1 SLAPLAT8H 2023-12-14
130 1341107 1061 11061 0 BANDWIDTH 2023-12-14
131 1341108 1061 11061 1 SLAWEB8H 2023-12-14
132 1341109 1061 11061 0 SLAWEB2H 2023-12-14
133 1341110 1061 11061 0 SLAMARIA2H 2023-12-14
134 1341111 1061 11061 250 TRAFFIC 2023-12-14
135 1341112 1061 11061 0 SLAWEB4H 2023-12-14
136 1346628 630 10630 0 SLAEXT24H 2024-03-19
137 1346629 630 10630 0 OFFICE 2024-03-19
138 1346630 630 10630 16384 QUOTA 2024-03-19
139 1346631 630 10630 0 DAEMON 2024-03-19
140 1346632 630 10630 10240 STORAGE 2024-03-19
141 1346633 630 10630 1 SLABASIC 2024-03-19
142 1346634 630 10630 50 TRAFFIC 2024-03-19
143 1346635 630 10630 25 MULTI 2024-03-19

View File

@ -1,19 +1,19 @@
unixuser_id;name;comment;shell;homedir;locked;packet_id;userid;quota_softlimit;quota_hardlimit;storage_softlimit;storage_hardlimit unixuser_id;name;comment;shell;homedir;locked;packet_id;userid;quota_softlimit;quota_hardlimit;storage_softlimit;storage_hardlimit
100824;hsh00;Hostsharing Paket;/bin/bash;/home/pacs/hsh00;0;630;10000;0;0;0;0 6824;hsh00;Hostsharing Paket;/bin/bash;/home/pacs/hsh00;0;10630;10000;0;0;0;0
5803;lug00;LUGs;/bin/bash;/home/pacs/lug00;0;1094;102090;0;0;0;0 5803;lug00;LUGs;/bin/bash;/home/pacs/lug00;0;11094;102090;0;0;0;0
5805;lug00-wla.1;Paul Klemm;/bin/bash;/home/pacs/lug00/users/deaf;0;1094;102091;4;0;0;0 5805;lug00-wla.1;Paul Klemm;/bin/bash;/home/pacs/lug00/users/deaf;0;11094;102091;4;0;0;0
5809;lug00-wla.2;Walter Müller;/bin/bash;/home/pacs/lug00/users/marl;0;1094;102093;4;8;0;0 5809;lug00-wla.2;Walter Müller;/bin/bash;/home/pacs/lug00/users/marl;0;11094;102093;4;8;0;0
5811;lug00-ola.a;LUG OLA - POP a;/usr/bin/passwd;/home/pacs/lug00/users/marl.a;1;1094;102094;0;0;0;0 5811;lug00-ola.a;LUG OLA - POP a;/usr/bin/passwd;/home/pacs/lug00/users/marl.a;1;11094;102094;0;0;0;0
5813;lug00-ola.b;LUG OLA - POP b;/usr/bin/passwd;/home/pacs/lug00/users/marl.b;1;1094;102095;0;0;0;0 5813;lug00-ola.b;LUG OLA - POP b;/usr/bin/passwd;/home/pacs/lug00/users/marl.b;1;11094;102095;0;0;0;0
5835;lug00-test;Test;/usr/bin/passwd;/home/pacs/lug00/users/test;0;1094;102106;2000000;4000000;20;0 5835;lug00-test;Test;/usr/bin/passwd;/home/pacs/lug00/users/test;0;11094;102106;2000000;4000000;20;0
100705;hsh00-mim;Michael Mellis;/bin/false;/home/pacs/hsh00/users/mi;0;630;10003;0;0;0;0 6705;hsh00-mim;Michael Mellis;/bin/false;/home/pacs/hsh00/users/mi;0;10630;10003;0;0;0;0
5964;mim00;Michael Mellis;/bin/bash;/home/pacs/mim00;0;1112;102147;0;0;0;0 5964;mim00;Michael Mellis;/bin/bash;/home/pacs/mim00;0;11112;102147;0;0;0;0
5966;mim00-1981;Jahrgangstreffen 1981;/bin/bash;/home/pacs/mim00/users/1981;0;1112;102148;128;256;0;0 5966;mim00-1981;Jahrgangstreffen 1981;/bin/bash;/home/pacs/mim00/users/1981;0;11112;102148;128;256;0;0
5990;mim00-mail;Mailbox;/bin/bash;/home/pacs/mim00/users/mail;0;1112;102160;0;0;0;0 5990;mim00-mail;Mailbox;/bin/bash;/home/pacs/mim00/users/mail;0;11112;102160;0;0;0;0
167846;hsh00-dph;hsh00-uph;/bin/false;/home/pacs/hsh00/users/uph;0;630;110568;0;0;0;0 7846;hsh00-dph;hsh00-uph;/bin/false;/home/pacs/hsh00/users/uph;0;10630;110568;0;0;0;0
169546;dph00;Reinhard Wiese;/bin/bash;/home/pacs/dph00;0;19959;110593;0;0;0;0 9546;dph00;Reinhard Wiese;/bin/bash;/home/pacs/dph00;0;19959;110593;0;0;0;0
169596;dph00-dph;Domain admin;/bin/bash;/home/pacs/dph00/users/uph;0;19959;110594;0;0;0;0 9596;dph00-dph;Domain admin;/bin/bash;/home/pacs/dph00/users/uph;0;19959;110594;0;0;0;0

1 unixuser_id name comment shell homedir locked packet_id userid quota_softlimit quota_hardlimit storage_softlimit storage_hardlimit
2 100824 6824 hsh00 Hostsharing Paket /bin/bash /home/pacs/hsh00 0 630 10630 10000 0 0 0 0
3 5803 lug00 LUGs /bin/bash /home/pacs/lug00 0 1094 11094 102090 0 0 0 0
4 5805 lug00-wla.1 Paul Klemm /bin/bash /home/pacs/lug00/users/deaf 0 1094 11094 102091 4 0 0 0
5 5809 lug00-wla.2 Walter Müller /bin/bash /home/pacs/lug00/users/marl 0 1094 11094 102093 4 8 0 0
6 5811 lug00-ola.a LUG OLA - POP a /usr/bin/passwd /home/pacs/lug00/users/marl.a 1 1094 11094 102094 0 0 0 0
7 5813 lug00-ola.b LUG OLA - POP b /usr/bin/passwd /home/pacs/lug00/users/marl.b 1 1094 11094 102095 0 0 0 0
8 5835 lug00-test Test /usr/bin/passwd /home/pacs/lug00/users/test 0 1094 11094 102106 2000000 4000000 20 0
9 100705 6705 hsh00-mim Michael Mellis /bin/false /home/pacs/hsh00/users/mi 0 630 10630 10003 0 0 0 0
10 5964 mim00 Michael Mellis /bin/bash /home/pacs/mim00 0 1112 11112 102147 0 0 0 0
11 5966 mim00-1981 Jahrgangstreffen 1981 /bin/bash /home/pacs/mim00/users/1981 0 1112 11112 102148 128 256 0 0
12 5990 mim00-mail Mailbox /bin/bash /home/pacs/mim00/users/mail 0 1112 11112 102160 0 0 0 0
13 167846 7846 hsh00-dph hsh00-uph /bin/false /home/pacs/hsh00/users/uph 0 630 10630 110568 0 0 0 0
14 169546 9546 dph00 Reinhard Wiese /bin/bash /home/pacs/dph00 0 19959 110593 0 0 0 0
15 169596 9596 dph00-dph Domain admin /bin/bash /home/pacs/dph00/users/uph 0 19959 110594 0 0 0 0
16
17
18
19