@XmlRootElement @FilterConfig(cliName = "cua-extractor") @Label("CUA Extraction Filter") @Documentation("Extracts CUA files directly from CAS clips (must use CAS source). NOTE: this filter requires a " + "specifically formatted CSV file as the source list file. " + "For NFS, the format is: [source-id],[relative-path-name],NFS,[uid],[gid],[mode],[mtime],[ctime],[atime],[symlink-target]" + "For CIFS, the format is: [source-id],[relative-path-name],[cifs-ecs-encoding],[original-name],[file-attributes],[security-descriptor]") public class CuaExtractorConfig extends AbstractExtractorConfig { }
this.cliName = targetClass.getAnnotation(FilterConfig.class).cliName(); if (targetClass.isAnnotationPresent(Label.class)) this.label = targetClass.getAnnotation(Label.class).value(); if (targetClass.isAnnotationPresent(Documentation.class)) this.documentation = targetClass.getAnnotation(Documentation.class).value();
@XmlRootElement @FilterConfig(cliName = "restore-acl") @Label("Restore Preserved ACLs") @Documentation("This plugin will read preserved ACLs from user metadata and restore them to each object") public class RestoreAclConfig extends AbstractConfig { }
@XmlRootElement @FilterConfig(cliName = "preserve-file-attributes") @Label("Preserve File Attributes") @Documentation("This plugin will read and preserve POSIX file attributes as metadata on the object") public class PreserveFileAttributesConfig extends AbstractConfig { }
@XmlRootElement @FilterConfig(cliName = "preserve-acl") @Label("Preserve ACLs") @Documentation("This plugin will preserve source ACL information as user metadata on each object") public class PreserveAclConfig extends AbstractConfig { }
@XmlRootElement @FilterConfig(cliName = "restore-file-attributes") @Label("Restore File Attributes") @Documentation("This plugin will restore POSIX file attributes that were previously preserved in metadata on the object") public class RestoreFileAttributesConfig extends AbstractConfig { }
@XmlRootElement @FilterConfig(cliName = "dx-extractor") @Label("DX Extraction Filter") @Documentation("Extracts DX file data directly from the backing storage system. NOTE: this filter requires a " + "specifically formatted CSV file as the source list file. " + "The format is: [source-id],[relative-path-name],[cifs-ecs-encoding],[original-name],[file-attributes],[security-descriptor]") public class DxExtractorConfig extends AbstractExtractorConfig { }
@XmlRootElement @FilterConfig(cliName = "id-logging") @Label("ID Logging Filter") @Documentation("Logs the input and output Object IDs to a file. These IDs " + "are specific to the source and target plugins") public class IdLoggingConfig extends AbstractConfig { private String idLogFile; @Option(orderIndex = 10, required = true, valueHint = "path-to-file", description = "The path to the file to log IDs to") public String getIdLogFile() { return idLogFile; } public void setIdLogFile(String idLogFile) { this.idLogFile = idLogFile; } }
@XmlRootElement @FilterConfig(cliName = "local-cache") @Label("Local Cache") @Documentation("Writes each object to a local cache directory before writing to the target. Useful for applying " + "external transformations or for transforming objects in-place (source/target are the same)\n" + "NOTE: this filter will remove any extended properties from storage plugins (i.e. versions, CAS tags, etc.) " + "Do not use this plugin if you are using those features") public class LocalCacheConfig extends AbstractConfig { private String localCacheRoot; @Option(orderIndex = 10, required = true, valueHint = "cache-directory", description = "specifies the root directory in which to cache files") public String getLocalCacheRoot() { return localCacheRoot; } public void setLocalCacheRoot(String localCacheRoot) { this.localCacheRoot = localCacheRoot; } }
@XmlRootElement @FilterConfig(cliName = "gladinet-mapping") @Label("Gladinet Mapper") @Documentation("This plugin creates the appropriate metadata in Atmos to " + "upload data in a fashion compatible with Gladinet's Cloud " + "Desktop software when it's hosted by EMC Atmos") public class GladinetMappingConfig extends AbstractConfig { private String gladinetDir; @Option(orderIndex = 10, required = true, valueHint = "base-directory", description = "Sets the base directory in Gladinet to load content into. This directory must already exist") public String getGladinetDir() { return gladinetDir; } public void setGladinetDir(String gladinetDir) { this.gladinetDir = gladinetDir; } }
@XmlRootElement @FilterConfig(cliName = "shell-command") @Label("Shell Command Filter") @Documentation("Executes a shell command after each successful transfer. " + "The command will be given two arguments: the source identifier " + "and the target identifier") public class ShellCommandConfig extends AbstractConfig { private String shellCommand; @Option(orderIndex = 10, required = true, valueHint = "path-to-command", description = "The shell command to execute") public String getShellCommand() { return shellCommand; } public void setShellCommand(String shellCommand) { this.shellCommand = shellCommand; } }
@XmlRootElement @FilterConfig(cliName = "cifs-ecs-ingester") @Label("CIFS-ECS Ingest Filter") @Documentation("Ingests CIFS attribute and security descriptor metadata so it is compatible with CIFS-ECS. NOTE: typically, " + "this filter requires a specifically formatted CSV file as the source list file. " + "The format is: [source-id],[relative-path-name],[cifs-ecs-encoding],[original-name],[file-attributes],[security-descriptor]") public class CifsEcsConfig extends AbstractConfig { private boolean fileMetadataRequired = true; @Option(orderIndex = 10, cliInverted = true, advanced = true, description = "by default, file metadata must be " + "extracted from the source CIFS share and provided in the source file list. this is the only way to get the " + "CIFS security descriptor and extended attributes. you can disable this if you are ingesting from a " + "GeoDrive Atmos subtenant") public boolean isFileMetadataRequired() { return fileMetadataRequired; } public void setFileMetadataRequired(boolean fileMetadataRequired) { this.fileMetadataRequired = fileMetadataRequired; } }
@XmlRootElement @FilterConfig(cliName = "path-sharding") @Label("Path Sharding Filter") @Documentation("Shards the relative path of an object based on the MD5 of the existing path (i.e. \"a1/fe/my-identifier\"). " + "Useful when migrating a flat list of many identifiers to a filesystem to prevent overloading directories") public class PathShardingConfig { private int shardSize = 2; private int shardCount = 2; @Option(description = "The number of hexadecimal characters in each shard directory (a value of 2 would mean each subdirectory name has 2 hex characters). I.e. a path \"my-identifier\" with shardCount of 2 and shardSize of 2 would change to \"28/24/my-identifier\"") public int getShardSize() { return shardSize; } public void setShardSize(int shardSize) { this.shardSize = shardSize; } @Option(description = "The number of shard directories (a value of 2 means two levels of subdirectories, each containing a set of hex characters from the MD5). I.e. a path \"my-identifier\" with shardCount of 2 and shardSize of 2 would change to \"28/24/my-identifier\"") public int getShardCount() { return shardCount; } public void setShardCount(int shardCount) { this.shardCount = shardCount; } }
@XmlRootElement @FilterConfig(cliName = "override-mimetype") @Label("Override Mimetype") @Documentation("This plugin allows you to override the default mimetype " + "of objects getting transferred. It is useful for instances " +
@XmlRootElement @StorageConfig(uriPrefix = URI_PREFIX) @Label("Archive File") @Documentation("The archive plugin reads/writes data from/to an archive file (tar, zip, etc.) " + "It is triggered by an archive URL:\n" +
@FilterConfig(cliName = "foo") @Label("Foo Filter") public static class FooFilterConfig { }
@XmlRootElement @FilterConfig(cliName = "metadata") @Label("Metadata Filter") @Documentation("Allows adding regular and listable (Atmos only) metadata to each object") public class MetadataConfig extends AbstractConfig {
@XmlRootElement @FilterConfig(cliName = "decrypt") @Label("Decryption Filter") @Documentation("Decrypts object data using the Atmos Java SDK encryption standard (https://community.emc.com/docs/DOC-34465). " + "This method uses envelope encryption where each object has its own symmetric key that is itself " +
@StorageConfig(uriPrefix = "foo:") @Label("Foo Storage") public static class FooStorageConfig { }
@XmlRootElement @FilterConfig(cliName = "cas-extractor") @Label("CAS Single Blob Extractor") @Documentation("Extracts a single blob from each CAS clip (must use CAS source). If more than one blob is found in a clip, " + "an error is thrown and the clip will not be migrated. Please specify what should be used as the relative path/name of " +