Skip to content

Commit

Permalink
use "no" for no compression, try other variants if properties do not …
Browse files Browse the repository at this point in the history
…match archive file names, reading all also fixes compressionType=default/null/empty/nonexistent confusions
  • Loading branch information
hg42 committed Apr 26, 2024
1 parent 3d98254 commit 1226f67
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 160 deletions.
6 changes: 3 additions & 3 deletions app/src/androidTest/kotlin/tests/Test_BackupRestore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import org.junit.Test
import timber.log.Timber
import java.io.File
import java.text.SimpleDateFormat
import java.util.*
import java.util.Locale

//val timeCompareFormat = "yyyy-MM-dd'T'HH:mm:ss"
val timeCompareFormat = "yyyy-MM-dd'T'HH:mm"
Expand Down Expand Up @@ -305,12 +305,12 @@ class Test_BackupRestore {
if (toType == "tarapi")
restoreAction.genericRestoreFromArchiveTarApi(
"data", archive, restoreDir.toString(),
compress, false, null, restoreCache
compress, null, false, null, restoreCache
)
else
restoreAction.genericRestoreFromArchiveTarCmd(
"data", archive, restoreDir.toString(),
compress, false, null
compress, null, false, null
)
}
Timber.w("#################### RES ${archive.path}")
Expand Down
38 changes: 22 additions & 16 deletions app/src/main/java/com/machiav3lli/backup/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,29 +33,35 @@ const val PREFS_SHARED_PRIVATE = "com.machiav3lli.backup"

const val ADMIN_PREFIX = "!-"

val SELECTIONS_FOLDER_NAME_BASE = "SELECTIONS"
val SELECTIONS_FOLDER_NAME = "$ADMIN_PREFIX$SELECTIONS_FOLDER_NAME_BASE"
val COMPRESSION_TYPES = mapOf(
"gz" to "Gzip Compression", // TODO translation?
"zst" to "Zstd Compression", // TODO translation?
"no" to "No Compression" // TODO translation?
)

const val SELECTIONS_FOLDER_NAME_BASE = "SELECTIONS"
const val SELECTIONS_FOLDER_NAME = "$ADMIN_PREFIX$SELECTIONS_FOLDER_NAME_BASE"

val EXPORTS_FOLDER_NAME_BASE = "EXPORTS"
val EXPORTS_FOLDER_NAME = "$ADMIN_PREFIX$EXPORTS_FOLDER_NAME_BASE"
val EXPORTS_FOLDER_NAME_ALT = EXPORTS_FOLDER_NAME_BASE
const val EXPORTS_FOLDER_NAME_BASE = "EXPORTS"
const val EXPORTS_FOLDER_NAME = "$ADMIN_PREFIX$EXPORTS_FOLDER_NAME_BASE"
const val EXPORTS_FOLDER_NAME_ALT = EXPORTS_FOLDER_NAME_BASE

val LOGS_FOLDER_NAME_BASE = "LOGS"
val LOGS_FOLDER_NAME = "${ADMIN_PREFIX}LOGS"
val LOGS_FOLDER_NAME_ALT = LOGS_FOLDER_NAME_BASE
const val LOGS_FOLDER_NAME_BASE = "LOGS"
const val LOGS_FOLDER_NAME = "${ADMIN_PREFIX}LOGS"
const val LOGS_FOLDER_NAME_ALT = LOGS_FOLDER_NAME_BASE

const val ERROR_PREFIX = "${ADMIN_PREFIX}ERROR."

val PREFS_BACKUP_FILE = "${ADMIN_PREFIX}app.preferences"
const val PREFS_BACKUP_FILE = "${ADMIN_PREFIX}app.preferences"

const val PROP_NAME = "properties"
const val LOG_INSTANCE = "%s.log.txt"

val ISO_LIKE_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"
val ISO_LIKE_DATE_TIME_MIN_PATTERN = "yyyy-MM-dd HH:mm"
val ISO_LIKE_DATE_TIME_MS_PATTERN = "yyyy-MM-dd HH:mm:ss:SSS"
val FILE_DATE_TIME_MS_PATTERN = "yyyy-MM-dd-HH-mm-ss-SSS"
val FILE_DATE_TIME_PATTERN = "yyyy-MM-dd-HH-mm-ss"
const val ISO_LIKE_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"
const val ISO_LIKE_DATE_TIME_MIN_PATTERN = "yyyy-MM-dd HH:mm"
const val ISO_LIKE_DATE_TIME_MS_PATTERN = "yyyy-MM-dd HH:mm:ss:SSS"
const val FILE_DATE_TIME_MS_PATTERN = "yyyy-MM-dd-HH-mm-ss-SSS"
const val FILE_DATE_TIME_PATTERN = "yyyy-MM-dd-HH-mm-ss"

val ISO_DATE_TIME_FORMAT
get() = SimpleDateFormat(
Expand Down Expand Up @@ -103,8 +109,8 @@ fun backupInstancePropsFlat(packageInfo: PackageInfo, dateTimeStr: String) =

const val BACKUP_INSTANCE_PROPERTIES_INDIR = "backup.$PROP_NAME"
const val BACKUP_PACKAGE_FOLDER_REGEX_PATTERN = """\w+(\.\w+)+"""
val BACKUP_SPECIAL_FILE_REGEX_PATTERN = """(^\.|^$ADMIN_PREFIX|^$ERROR_PREFIX)"""
val BACKUP_SPECIAL_FOLDER_REGEX_PATTERN =
const val BACKUP_SPECIAL_FILE_REGEX_PATTERN = """(^\.|^$ADMIN_PREFIX|^$ERROR_PREFIX)"""
const val BACKUP_SPECIAL_FOLDER_REGEX_PATTERN =
"""(^\.|^$ADMIN_PREFIX|$EXPORTS_FOLDER_NAME_BASE|$LOGS_FOLDER_NAME_BASE|$SELECTIONS_FOLDER_NAME_BASE)"""
const val EXPORTS_INSTANCE = "%s.scheds"

Expand Down
72 changes: 29 additions & 43 deletions app/src/main/java/com/machiav3lli/backup/actions/BackupAppAction.kt
Original file line number Diff line number Diff line change
Expand Up @@ -238,18 +238,16 @@ open class BackupAppAction(context: Context, work: AppActionWork?, shell: ShellH
return ActionResult(app, backup, "", true)
}

@Throws(IOException::class, CryptoSetupException::class)
protected fun createBackupArchiveTarApi(
backupInstanceDir: StorageFile,
fun createArchiveFile(
dataType: String,
allFilesToBackup: List<ShellHandler.FileInfo>,
backupInstanceDir: StorageFile,
compress: Boolean,
iv: ByteArray?,
) {
iv: ByteArray?
): OutputStream {

val password = getEncryptionPassword()
val shouldCompress = compress && isCompressionEnabled()

Timber.i("Creating $dataType backup via API")
val backupFilename = getBackupArchiveFilename(
dataType,
shouldCompress,
Expand All @@ -267,6 +265,7 @@ open class BackupAppAction(context: Context, work: AppActionWork?, shell: ShellH
if (shouldCompress) {
val compressionLevel = getCompressionLevel()
when (getCompressionType()) {
"no" -> {}
"gz" -> {
val gzipParams = GzipParameters()
gzipParams.compressionLevel = compressionLevel
Expand All @@ -276,23 +275,41 @@ open class BackupAppAction(context: Context, work: AppActionWork?, shell: ShellH
gzipParams
)
}
"zst" -> outStream = ZstdCompressorOutputStream(outStream, compressionLevel)
"zst" -> {
outStream = ZstdCompressorOutputStream(
outStream,
compressionLevel
)
}
else -> throw UnsupportedOperationException("Unsupported compression algorithm: ${getCompressionType()}")
}
}
return outStream
}

@Throws(IOException::class, CryptoSetupException::class)
protected fun createBackupArchiveTarApi(
backupInstanceDir: StorageFile,
dataType: String,
allFilesToBackup: List<ShellHandler.FileInfo>,
compress: Boolean,
iv: ByteArray?,
) {
Timber.i("Creating $dataType backup via API")

val outStream = createArchiveFile(dataType, backupInstanceDir, compress, iv)

try {
TarArchiveOutputStream(outStream).use { archive ->
archive.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX)
archive.suAddFiles(allFilesToBackup)
}
} finally {
Timber.d("Done compressing. Closing $backupFilename")
Timber.d("Done compressing. Closing archive stream.")
outStream.close()
}
}


@Throws(BackupFailedException::class)
protected open fun backupPackage(app: Package, backupInstanceDir: StorageFile) {
Timber.i("<${app.packageName}> Backup package apks")
Expand Down Expand Up @@ -404,40 +421,9 @@ open class BackupAppAction(context: Context, work: AppActionWork?, shell: ShellH
if (!ShellUtils.fastCmdResult("test -d ${quote(sourcePath)}"))
return false

val password = getEncryptionPassword()
val shouldCompress = compress && isCompressionEnabled()

Timber.i("Creating $dataType backup via tar")
val backupFilename = getBackupArchiveFilename(
dataType,
shouldCompress,
getCompressionType(),
iv != null && isEncryptionEnabled()
)
val backupFile = backupInstanceDir.createFile(backupFilename)

var outStream: OutputStream = backupFile.outputStream()!!

if (iv != null && password.isNotEmpty() && isEncryptionEnabled()) {
outStream = outStream.encryptStream(password, getCryptoSalt(), iv)
}

if (shouldCompress) {
val compressionLevel = getCompressionLevel()
when (getCompressionType()) {
"gz" -> {
val gzipParams = GzipParameters()
gzipParams.compressionLevel = compressionLevel

outStream = GzipCompressorOutputStream(
outStream,
gzipParams
)
}
"zst" -> outStream = ZstdCompressorOutputStream(outStream, compressionLevel)
else -> throw UnsupportedOperationException("Unsupported compression algorithm: ${getCompressionType()}")
}
}
val outStream = createArchiveFile(dataType, backupInstanceDir, compress, iv)

var result = false
try {
Expand Down Expand Up @@ -501,7 +487,7 @@ open class BackupAppAction(context: Context, work: AppActionWork?, shell: ShellH
LogsHandler.unexpectedException(e, message)
throw BackupFailedException(message, e)
} finally {
Timber.d("Done compressing. Closing $backupFilename")
Timber.d("Done compressing. Closing archive stream.")
outStream.close()
}
return result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,10 @@ abstract class BaseAppAction protected constructor(
val extension = buildString {
if (isCompressed) {
append(when (compressionType) {
null, "no" -> ""
"gz" -> ".gz"
"zst" -> ".zst"
else -> ""
else -> ".gz"
})
}
if (isEncrypted) {
Expand Down
Loading

0 comments on commit 1226f67

Please sign in to comment.