# Папка для загрузки

Как мы описывали сложность операций с папками в Папка загрузки, для упрощения этот шаг также выполняется с помощью «aemulari». Процесс тот же как и в случае с загрузкой папки, с той лишь разницей, что теперь используется команда upload-folder и есть несколько новых аргументов. Вот справочное сообщение:

$ ./aemulari upload-folder --help

Upload folder usage:
  --profile-id TEXT     Profile ID to use
  --path TEXT           Path to the profile folder. You can omit this option if
                        you did not specify a custom path when creating folder 
                        with this utility
  --delete              Delete folder after upload
  --profile-lock TEXT   If the profile was started with session lock, this 
                        option is required
  --api-key TEXT        Your API key

Common options:
  --verbose             Be verbose (enable logging)


Если операция завершится успешно, исполняемый файл завершится с кодом 0. В противном случае см. таблицу ниже.

# Коды выхода

Код Значение
0 Success
1 Unknown error, может указывать на что угодно: от недопустимых аргументов до некоторых сетевых ошибок. Должно быть сообщение об ошибке, выведенное в stdout
2 Network error (где-то неверный код Curl). Должно быть сообщение об ошибке, выведенное в stdout
4 Папка была успешно загружена, но после этого программе не удалось ее удалить. Вызывающий абонент должен удалить его вручную. Также должно быть сообщение об ошибке, выведенное в stdout
101 Unauthorized. Ключ API недействителен.
104 Not found. Профиль не существует или ваш ключ API не принадлежит кластеру профиля.
109 Conflict. Профиль используется, но вы не указали profileLock.
122 Unprocessable Entity. Профиль в данный момент синхронизируется с сервером (кто-то загружает папку профиля)
123 Blocked. Предоставленная блокировка профиля неверна. Возможно, кто-то переопределил предыдущий сеанс до вас.
200 Internal server error

Вы получите сообщение об ошибке сервера, выведенное в stdout, если получите коды ошибок 101-200. Обычно вам следует обратиться в службу поддержки, если вы получаете коды выхода «1», «2» или «200» и не можете исправить это самостоятельно.

# Пример кода

val pathToAemulari = "/home/myuser/.surfinite/aemulari/aemulari"

val profileId = "my_profile_id"
val apiKey = "MY_API_KEY"
val profileLock = "profile_lock_from_start_profile_response"

val pathToProfile = "/home/myuser/surfiprofiles/$profileId"

// Start aemulari with our arguments
val process = ProcessBuilder(
    listOf(
        pathToAemulari,
        "upload-folder",
        "--profile-id", profileId,
        "--path", pathToProfile,
        "--api-key", apiKey,
        "--profile-lock", profileLock,
        "--delete"
    )
)
    .redirectOutput(ProcessBuilder.Redirect.INHERIT)
    .redirectError(ProcessBuilder.Redirect.INHERIT)
    .start()

// Wait for the process to exit
process.waitFor()

val exitCode = process.exitValue()
when (exitCode) {
    0 -> println("Success")
    4 -> {
        // For some reason the folder was not deleted,
        // so delete it manually
        File(pathToProfile).deleteRecursively()
        println("Success")
    }
    else -> {
        // The error message was already printed, as we called
        // redirectOutput(INHERIT), so just print the exit code
        println("Got error from aemulari. Code: $exitCode")
    }
}