Neste post irei apresentar como gerenciar o backup e a restauração das informações do GeoServer através de sua API REST.

5. Backup através da API REST do GeoServer

A API REST de backup e restauração consiste em alguns recursos destinados a serem usados ​​de maneira assíncrona:

Vamos usar a ferramenta de linha de comando cURL para enviar solicitações HTTP REST para o GeoServer.

Os endpoints /rest/br/backup/ e /rest/br/restore aceitam um sufixo de formato opcional que permite que o arquivo de Backup/Restauração seja transmitido de/para o cliente em vez de ser gravado/lido no sistema de arquivos.

5.1 Iniciar um backup

Prepare um arquivo contendo um objeto JSON representando a configuração do procedimento de backup.

{
   "backup":{
      "archiveFile":"/home/sg/BackupAndRestore/test_rest_1.zip",
      "overwrite":true,
      "options":{
      }
   }
}

Neste caso, não especificamos nenhuma opção na configuração de backup, de forma que os valores padrão serão usados.

As opções disponíveis são:

BK_BEST_EFFORT: Ignore quaisquer recursos com falha e continue com o procedimento de backup
BK_PARAM_PASSWORDS: Se as senhas do armazenamento de saída devem ser parametrizadas no backup. Com essa opção, todas as senhas armazenadas serão substituídas por um token parecido com ${workspaceName:storeName.passwd.encryptedValue}
BK_SKIP_SECURITY: Isso excluirá as configurações de segurança do backup (Experimental).
BK_SKIP_SETTINGS: Isso tentará excluir a maioria das configurações globais do backup, bem como as configurações de segurança (Experimental).

Além disso, um opcional Filter pode ser passado para restringir o escopo da operação de restauração a uma lista de espaços de trabalho. Por exemplo:

{
   "backup":{
      "archiveFile":"/home/sg/BackupAndRestore/test_rest_1.zip",
"overwrite":true,
      "options":{
        "option": ["BK_BEST_EFFORT=true"]
      },
"filter": "name IN ('topp','geosolutions-it')"
   }
}

O procedimento de backup será iniciado. Aqui está uma amostra da resposta:

HTTP/1.1 201 Created
Date: Mon, 01 Aug 2016 14:35:44 GMT
Location: http://mygeoserver/geoserver/rest/br/backup/1
Server: Noelios-Restlet-Engine/1.0..8
Content-Type: application/json
Transfer-Encoding: chunked

{
   "backup":{
      "totalNumberOfSteps":9,
      "execution":{
         "id":1,
         "version":1,
         "stepExecutions":{
            "@class":"java.util.concurrent.CopyOnWriteArraySet"
         },
         "status":[
            "STARTED"
         ],
         "startTime":"2016-08-01 14:35:44.802 UTC",
         "createTime":"2016-08-01 14:35:44.798 UTC",
         "lastUpdated":"2016-08-01 14:35:44.803 UTC",
         "exitStatus":{
            "exitCode":"UNKNOWN",
            "exitDescription":""
         },
         "progress":"1\/9"
      },
      "options":{
         "@class":"synchList",
         "option":[
            "OVERWRITE=true"
         ]
      },
      "warningsList":{
         "@class":"synchList"
      },
      "archiveFile":{
         "@class":"resource",
         "$":"\/home\/sg\/BackupAndRestore\/test_rest_1.zip"
      },
      "overwrite":true
   }
}

No final do procedimento de backup, você poderá fazer o download do arquivo gerado para o seu sistema de arquivos local, fazendo uma solicitação HTTP GET para o mesmo endpoint, usando o ID de backup como abaixo e adicionando a extensão .zip no final.

curl -u "admin:geoserver" -i -X GET  "http://mygeoserver/geoserver/rest/br/backup/1.zip" -o 1.zip

O status da operação pode ser consultado fazendo uma solicitação HTTP GET para o local listado na resposta:

 http://mygeoserver/geoserver/rest/br/backup/$ID.{json/xml}

Substitua $ID pela ID da operação de backup que você gostaria de inspecionar:

curl -u "admin:geoserver" http://mygeoserver/geoserver/rest/br/backup/1.json

OU

curl -u "admin:geoserver" http://mygeoserver/geoserver/rest/br/backup/1.xml

O GeoServer responderá com o status do backup correspondente a esse ID:

Aqui você pode ver o status de todas as etapas envolvidas no procedimento de backup com hora de criação, hora de início, hora de término, status de saída, etc.

5.2 Cancelar um backup

Para cancelar um backup em andamento, é necessário enviar uma solicitação HTTP DELETE com o ID da tarefa:

curl -v -XDELETE -u "admin:geoserver" http://mygeoserver/geoserver/rest/br/backup/$ID

Substitua $IDpela ID da operação de backup que você deseja cancelar.

5.3 Restaurando um backup

Prepare um arquivo com um objeto JSON representando a configuração do procedimento de Restore:

{
   "restore":{
      "archiveFile":"/home/sg/BackupAndRestore/test_rest_1.zip",
      "options":{
      }
   }
}

Neste caso, não especificamos nenhuma opção na configuração de restauração para que os valores padrão sejam usados.

Opções disponíveis são:

BK_DRY_RUN: Apenas testar o arquivo e não persistir a configuração restaurada

BK_BEST_EFFORT: Ignorar quaisquer recursos com falha e continuar com o procedimento de restauração

BK_PASSWORD_TOKENS: Uma lista separada por vírgula de chave e valores separados por sinal de igual deve ser substituída em senhas de armazenamento de dados em um backup de entrada. Por exemplo:

BK_PASSWORD_TOKENS=${workspace:store1.passwd.encryptedValye}=foo,${workspace:store2.passwd.encryptedValue}=bar

BK_SKIP_SECURITY: Isso excluirá as configurações de segurança da restauração. Padrão: falso (Experimental).

BK_SKIP_SETTINGS: Isso tentará excluir a maioria das configurações globais do backup, bem como as configurações de segurança. Padrão: falso (Experimental).

BK_PURGE_RESOURCES: Isso irá ignorar a exclusão de recursos sempre que possível. Em particular, os espaços de trabalho existentes não serão excluídos durante a restauração. Padrão: true (Experimental).

Além disso, um opcional Filter pode ser passado para restituir o escopo da operação de restauração a uma lista de espaços de trabalho. Por exemplo:

{
   "restore":{
      "archiveFile":"/home/sg/BackupAndRestore/test_rest_1.zip",
      "options":{
        "option": ["BK_DRY_RUN=true"]
      },
"filter": "name IN ('topp','geosolutions-it')"
   }
}

Se o caminho for especificado, o arquivo especificado nesse caminho (remoto) será usado para iniciar o procedimento de restauração. Caso contrário, você precisa inserir o arquivo do seu sistema local.

Em seguida, faça uma solicitação POST HTTP para a interface REST do GeoServer para o procedimento de restauração:

curl -u “admin:geoserver” -i -H “Content-Type: application/json” -X POST –data @restore_post.json http://mygeoserver/geoserver/rest/br/restore/

O procedimento de restauração será iniciado. Aqui está uma resposta de exemplo:

HTTP/1.1 201 Created
Date: Mon, 01 Aug 2016 15:07:29 GMT
Location: http://mygeoserver/geoserver/rest/br/restore/2
Server: Noelios-Restlet-Engine/1.0..8
Content-Type: application/json
Transfer-Encoding: chunked

{
“restore”:{
“totalNumberOfSteps”:9,
“execution”:{
“id”:2,
“version”:1,
“stepExecutions”:{
“@class”:”java.util.concurrent.CopyOnWriteArraySet”
},
“status”:[
“STARTED”
],
“startTime”:”2016-08-01 15:07:29.398 UTC”,
“createTime”:”2016-08-01 15:07:29.393 UTC”,
“lastUpdated”:”2016-08-01 15:07:29.398 UTC”,
“exitStatus”:{
“exitCode”:”UNKNOWN”,
“exitDescription”:””
},
“progress”:”0\/9″
},
“options”:{
“@class”:”synchList”
},
“warningsList”:{
“@class”:”synchList”
},
“archiveFile”:{
“@class”:”resource”,
“$”:”\/home\/sg\/BackupAndRestore\/test_rest_1.zip”
}
}
}

Para carregar o arquivo do nosso sistema local, omita o parâmetro archiveFile no objeto JSON e passe o –upload-file para o cURL:

{
   "restore":{
      "options":{
      },
   }
}
curl -u "admin:geoserver" -i -H "Content-Type: application/json" --upload-file "archive_to_restore.zip" -X POST --data @restore_post.json http://localhost:8081/geoserver/rest/br/restore/

O arquivo archive_to_restore.zip (local) será carregado e usado pelo processo de restauração.

Consulta para o status de operações de restauração:

 http://mygeoserver/geoser/restore/$ID.{json/xml}
{
   "restore":{
      "execution":{
         "hash":2,
         "key":{
            "@class":"long",
            "$":"2"
         },
         "val":{
            "@class":"restore",
            "totalNumberOfSteps":9,
            "execution":{
               "id":2,
               "version":2,
               "stepExecutions":{
                  "@class":"java.util.concurrent.CopyOnWriteArraySet",
                  "step":[
                     {
                        "name":"restoreNamespaceInfos",
                        "status":"COMPLETED",
                        "exitStatus":{
                           "exitCode":"COMPLETED",
                           "exitDescription":""
                        },
                        "startTime":"8\/1\/16 3:07 PM",
                        "endTime":"8\/1\/16 3:07 PM",
                        "lastUpdated":"8\/1\/16 3:07 PM",
                        "parameters":{
                           "input.file.path":"file:\/\/\/opt\/tomcat-geoserver-2.9.x\/temp\/tmpbbe2388a-f26d-4f26-a20f-88c653d88aec",
                           "time":1470064049392
                        },
                        "readCount":1,
                        "writeCount":1,
                        "failureExceptions":""
                     },
                    ...
                     {
                        "name":"restoreGeoServerSecurityManager",
                        "status":"COMPLETED",
                        "exitStatus":{
                           "exitCode":"COMPLETED",
                           "exitDescription":""
                        },
                        "startTime":"8\/1\/16 3:07 PM",
                        "endTime":"8\/1\/16 3:07 PM",
                        "lastUpdated":"8\/1\/16 3:07 PM",
                        "parameters":{
                           "input.file.path":"file:\/\/\/opt\/tomcat-geoserver-2.9.x\/temp\/tmpbbe2388a-f26d-4f26-a20f-88c653d88aec",
                           "time":1470064049392
                        },
                        "readCount":0,
                        "writeCount":0,
                        "failureExceptions":""
                     }
                  ]
               },
               "status":"COMPLETED",
               "startTime":"2016-08-01 15:07:29.398 UTC",
               "createTime":"2016-08-01 15:07:29.393 UTC",
               "endTime":"2016-08-01 15:07:30.356 UTC",
               "lastUpdated":"2016-08-01 15:07:30.772 UTC",
               "exitStatus":{
                  "exitCode":"COMPLETED",
                  "exitDescription":""
               },
               "progress":"9\/9"
            },
            "options":{
               "@class":"synchList"
            },
            "warningsList":{
               "@class":"synchList"
            },
            "archiveFile":{
               "@class":"resource",
               "$":"\/home\/sg\/BackupAndRestore\/test_rest_1.zip"
            }
         }
      }
    ...

Aqui você pode ver o status de todas as etapas envolvidas no procedimento de restauração com hora de criação, hora de início, hora de término, status de saída, etc.

5.4 Cancelar uma restauração

Par cancelar uma restauração em andamento, envie uma solicitação HTTP DELETE:

curl -v -XDELETE -u "admin:geoserver" http://mygeoserver/geoserver/rest/br/restore/$ID

Substitua $ID pelo ID da operação de restauração que você deseja cancelar.

Fonte: GeoServer Documentation