class NsExecutionRequest

La classe NsExecutionRequest décrit une demande d'exécution d'une sauvegarde par le serveur.

Une demande d'exécution permet de demander à un agent client d'exécuter une sauvegarde donnée. La demande est stockée dans une file de messages consultée périodiquement par l'agent client, ce qui explique que le déclenchement ne soit pas immédiat et que le logiciel propose des méthodes destinées à suivre le traitement des demandes d'exécution créées.

Depuis la version 8 du logiciel, il est possible de déclencher au choix des sauvegardes sur le serveur, et des sauvegardes locales. Si le champ ServerBackupID désigne une sauvegarde valide, la sauvegarde serveur sera déclenchée. Si le champ LocalBackupID désigne une sauvegarde locale valide, la sauvegarde locale sera déclenchée.

Comme les sauvegardes peuvent être attribuées à plusieurs utilisateurs, vous devez préciser à la fois l'identifiant de la sauvegarde (dans ServerBackupID) et de l'utilisateur (UserID) lors de la création d'une demande d'exécution.

Les demandes d'exécution sont créées en initialisant les champs de l'objet puis en appelant la méthode CreateExecutionRequest, via la méthode CreateExecutionRequestForUser d'un objet NsBackup, ou via la méthode CreateExecutionRequestForBackup d'un objet NsUser. Une fois créée, les paramètres de la requête ne peuvent être modifiés.

Si l'utilisateur cible est connecté, le logiciel essaie d'utiliser le canal serveur-à-client pour la faire exécuter immédiatement par l'utilisateur, sinon, la demande est déposée dans la file des demandes d'exécution à traiter par l'agent client.

Pour que les demandes d'exécution soient correctement traitées, le "Service d'exécution en arrière-plan" doit-être démarré sur le poste client.

ID : __int64

L'identificateur unique de la demande d'exécution.

CreationDate : VARIANT readonly

La date de création de la demande d'exécution sur le serveur de sauvegarde, au format UTC.

ServerBackupID : __int64

L'identificateur unique de la sauvegarde serveur (NsBackup) à exécuter.

LocalBackupID : __int64

L'identificateur unique de la sauvegarde locale (NsLocalBackup) à exécuter.

UserID : __int64

L'identificateur unique de l'utilisateur (NsUser) devant exécuter la sauvegarde. L'utilisateur doit posséder la sauvegarde et des droits d'écriture sur celle-ci.

Options : long

Réservé.

State : enum NsExecutionRequestState readonly

Le statut actuel de la demande d'exécution.

ProgressValue : long readonly

Un nombre entre 0 et 100 représentant le pourcentage de progression de l'opération.

OperationSummaryID : __int64 readonly

L'identificateur d'événement de l'opération, de type NsOperationSummary, si elle a eu lieu.

Completed : VARIANT_BOOL readonly

Indique si la dernière exécution est arrivée à son terme.

Succeeded : VARIANT_BOOL readonly

Indique si l'exécution a réussie, c'est à dire que la sauvegarde est arrivée à son terme sans reporter aucune erreur.

BackedUpFiles : __int64 readonly

Le nombre de fichiers sauvegardés si l'opération a été exécutée.

BackedUpSize : __int64 readonly

Le volume de données sauvegardé si l'opération a été exécutée.

VARIANT_BOOL LoadFromID(NsConnection Connection, __int64 RequestID)

Charge en mémoire la demande d'exécution d'identificateur RequestID.

VARIANT_BOOL CreateExecutionRequest(NsConnection Connection)

Créée la demande d'exécution décrite par l'objet.

VARIANT_BOOL Refresh(NsConnection Connection)

Mets à jour les indicateurs d'une demande précédemment chargée.

VARIANT_BOOL Delete(NsConnection Connection)

Supprime la demande d'exécution décrite par l'objet.

Exécution d'une sauvegarde sur le serveur à partir de son nom

Set connection = CreateObject("NsAPI.NsConnection")
Set sysutils = CreateObject("NsAPI.NsScriptUtils")

const nsExecutionRequestStateWaiting = 1
const nsExecutionRequestStateExecuting = 2
const nsExecutionRequestStateNeedRetry = 3
const nsExecutionRequestStateFinishedNormally = 4
const nsExecutionRequestStateFinishedNonCompleted = 5

' Renvoit une sauvegarde à partir de son nom
Function FindBackupByName(backups, name)
  set FindBackupByName = Nothing

  for each backup in backups
    if StrComp(backup.Name, name, vbTextCompare) = 0 then
      set FindBackupByName = backup
      Exit Function
    end if
  next
End Function

if connection.ConnectToLocalServer then
  set server = CreateObject("NsAPI.NsServer")

  if server.Load(connection) then
    ' Demander un nom de sauvegarde
    backupName = InputBox("Saisissez le nom d'une sauvegarde sur le serveur (ex : Ma sauvegarde) : ", "Test de l'API UB", "")

    ' L'utilisateur a t-il saisi un nom de backup ?
    if backupName <> "" then
      set backup = FindBackupByName(server.AllBackups(connection), backupName)

      ' Est ce qu'on a bien trouvé une sauvegarde valide ?
      if backup is Nothing then
        MsgBox "Erreur : la sauvegarde """ & backupName & """ n'a pu être trouvée sur le serveur."
      else
        ' En théorie, la sauvegarde devrait être associée à un seul utilisateur.
        ' Néanmoins, le logiciel permet de partager une tâche avec plusieurs utilisateurs,
        ' par conséquent, on cherche l'utilisateur qui a des droits d'écriture sur la
        ' sauvegarde.
        '
        ' Charger les associations
        set backupAssociations = backup.Associations(connection)
        
        userID = -1
        
        ' On cherche l'utilisateur qui a les droits d'écriture
        for each association in backupAssociations
          if association.CanBackup then
             userID = association.UserID ' Trouvé !
          end if
        next
        
        ' On vérifie qu'on l'a trouvé
        if sysutils.CompareInt64(userID, -1) = 0 then
          MsgBox "Aucun utilisateur ne peut actuellement exécuter la sauvegarde."
        else
          ' Créer la demande d'exécution
          set execRequest = CreateObject("NsAPI.NsExecutionRequest")
          execRequest.ID = -1 ' Constante nécessaire pour la création
          execRequest.ServerBackupID = backup.ID ' Affectation de l'ID de la sauvegarde à exécuter
          execRequest.UserID = userID ' Affectiation de l'ID de l'utilisateur devant l'exécuter

          executed = false
          
          if execRequest.CreateExecutionRequest(connection) then ' Créer la demande d'exécution
            do while true
              if not execRequest.LoadFromID(connection, execRequest.ID) then ' Mise à jour des infos
                MsgBox "Echec lors de la mise à jour des informations."
                exit do
              end if
              select case execRequest.State ' Inspection de l'état actuel de la demande d'exécution...
                case nsExecutionRequestStateWaiting:
                  MsgBox "Attente du contact avec l'agent client..."
                case nsExecutionRequestStateExecuting:
                  MsgBox "Sauvegarde en cours d'exécution..."
                case nsExecutionRequestStateNeedRetry:
                  MsgBox "Attente de réexécution de la sauvegarde par l'agent client..."
                case nsExecutionRequestStateFinishedNormally:
                  executed = true ' Terminé, on sort de la boucle !
                  exit do
                case nsExecutionRequestStateFinishedNonCompleted:
                  MsgBox "Sauvegarde interrompue dans son exécution. Elle va être redéclenchée."
               end select
              loop
            if executed then
              ' On veut afficher des informations sur le résultat de l'exécution
              ' On utilise l'objet NsOperationSummary.
              set operationInfo = CreateObject("NsAPI.NsOperationSummary")
              if not operationInfo.LoadFromID(connection, execRequest.OperationSummaryID) then
                MsgBox "Impossible de charger les informations sur l'exécution de la sauvegarde."
              else
                strSummary = "La sauvegarde a été exécutée avec succès ! " & vbCrLf
                strSummary = strSummary & sysutils.Int64ToStr(operationInfo.DeleteCount) & " fichier(s) supprimé(s)" & vbCrLf
                strSummary = strSummary & sysutils.Int64ToStr(operationInfo.UpdateCount) & " fichier(s) mis à jour" & vbCrLf
                strSummary = strSummary & sysutils.Int64ToStr(operationInfo.ErrorsCount) & " erreur(s)" & vbCrLf
                strSummary = strSummary & sysutils.SizeToStr(operationInfo.SentBytes) & " transférés."
                MsgBox strSummary
              end if
            end if
          else
            MsgBox "Impossible de créer la demande d'exécution."
          end if
        end if
      end if
    end if
  else
    MsgBox "Impossible de charger les informations serveur."
  end if

  connection.Disconnect
else
  MsgBox "Connexion au serveur local impossible."
end if