Sauvegarde automatique de la passerelle Conbee

Bonjour,


edit : ce bout de code n’est finalement pas vraiment nécessaire … :frowning:
j’y avais pourtant mis tout mon coeur ! :smiley:
cf la solution :slight_smile:


préambule : le pourquoi

Je suis sur un pi 3b, et il y a quelques jours ma carte SD nous a quitté :frowning_face: :pray:
J’ai donc été obligé de faire une réinstall toute belle toute propre, et j’avais heureusement une sauvegarde de mon instance jeedom que j’ai pu restaurer.
Tout s’est plutôt bien passé et j’ai retrouvé mes équipements sauf que …
… la restauration Jeedom ne restaure pas la passerelle et ses éléments sur la clé conbee ! :sob: J’avais bien réaliser à un moment donnée une sauvegarde mais elle datait de plusieurs semaines et je n’avais pas tous les derniers éléments dessus … j’ai donc du ré-intégrer certains équipements sur la clé Conbee (et c’est pénible!)


Je viens de faire un petit bout de code permettant de sauvegarder automatique la configuration et éléments de la passerelle Conbee.

Il est vrai que l’on n’intègre pas forcément de nouveaux équipements tous les jours, mais c’est quand même plus sympa quand un process auto fait le job à votre place sans avoir à s’en soucier(*)

Je vous partage donc ces quelques lignes si jamais ça peut servir à quelqu’un :slight_smile:

Pré-requis :

  • créer un répertoire de sauvegarde dédié, sous /var/www/html/ de façon à ce que les sauvegarde jeedom prennent également celle-ci.

Ensuite il suffit de

  • créer un scénario
  • choisir un déclencheur programmé (à vous de définir : tous les jours, les semaines, …),
  • ajouter un bloc code et coller le code qui suit
  • modifier les 2 premiers paramètres : le chemin où mettre les sauvegardes, et le nombre de sauvegarde qui vous semble intéressant de garder(*)
  • sauvegarder

& enjoy :slight_smile:

//~~~~~~~~~~~~~~~~~~~~~~~~
// Custom with your own data here only !
$path_for_backup='/var/www/html/backup_deconz';
$nb_backup_allowed = 10;  //-1 if you dont want to make the check

//~~~~~~~~~~~~~~~~~~~~~~~~

//********
// deConZ path details
$deconz_path = '/root/.local/share/dresden-elektronik/deCONZ/';
$deconz_initial_name = 'deCONZ.tar.gz';
//********
if ( ! is_dir($path_for_backup) ){
	$scenario->setLog('   ~~' .$path_for_backup . ' folder does NOT exist. Abort') ;	
}
else{
  
  $gateways = config::byKey('gateway',   'deCONZ') ;

  $keys = array('id', 'name', 'internalipaddress', 'internalport', 'websocketport', 'apikey', 'manageTimeZone') ; 

  foreach($gateways as $gateway) {

      $current_datetime = date("Ymd_His") ;

      $scenario->setLog('***************************') ;
      $scenario->setLog('   === New gateway conf ===') ;
      foreach($keys as $key){
          $scenario->setLog('    | ' . $key . ' : ' . $gateway[$key] ) ;
      }
      $scenario->setLog('    _________' );

      $gateway_id = ($gateway['name'] ?: 'gatewayDefault') . '_' . ($gateway['id'] ?: '0000') ;
      $scenario->setLog('    |** Manage backup for : ' . $gateway_id );

      $url = 'http://' . $gateway['internalipaddress'] . ':' . $gateway['internalport'] . '/api/' . $gateway['apikey'] . '/config/export';

      $scenario->setLog('    | url called : ' . $url );
      $request = create_gateway_backup($url) ;
      //$scenario->setLog('    | backup response ('.$request[0].') :' . $request[1] );

      if ($request[0] == 200 ) {
        $shell_output = shell_exec('sudo mv '. $deconz_path . $deconz_initial_name . ' ' . $path_for_backup . '/'. $current_datetime . '_backup_deconz_gateway_' . $gateway_id . '.tar.gz  2>&1; echo $?'  );
        if ( $shell_output != 0 ){
          $scenario->setLog('    | ~~~ sheel output : ' . $shell_output );
          message::add('Backup Gateway Deconz', 'Something went wrong for backup '. $gateway_id .'. Please check scenario logs' );
          break;
        }
        $scenario->setLog('    | Backup successfully created for '. $gateway_id);

      }
      else { 
        $scenario->setLog('    | Something went wrong ... \n' . $request[1] );
        message::add('Backup Gateway Deconz', 'Something went wrong for backup '. $gateway_id .'. Please check scenario logs' );
      }

      $scenario->setLog('    _________' );

  }
  
  //*****
  // Check if the number of backups do not exceed  the max allowed in $nb_backup_allowed
  //*****
  if ( $nb_backup_allowed > 0 ){
    $shell_count_file = shell_exec('ls '. $path_for_backup . '/* | wc -l '  );
    $bkp_count_file = str_replace(array("\n","\r","\r\n"),'', trim($shell_count_file)) ;
    if (  $bkp_count_file > $nb_backup_allowed) {
        $scenario->setLog('Clean-up required ! '. $bkp_count_file . ' backup(s) exist in ' . $path_for_backup );
        message::add('Backup Gateway Deconz', 'Clean-up required ! '. $bkp_count_file . ' backup(s) exist in ' . $path_for_backup );
    }
  }
}

function create_gateway_backup($url){
  
  $ch = curl_init();

  curl_setopt($ch, CURLOPT_URL,$url);
  curl_setopt($ch, CURLOPT_POST, 1);
   
  // Receive server response ...
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  $exec = curl_exec($ch);
  $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

  curl_close ($ch);
  
  return array($httpcode, $exec);
}

(*) ou presque…
mes sauvegardes ne font que 10ko ! donc ca n’est vraiment pas très gros. Je n’ai pas voulu intégrer les suppressions automatique d’anciens fichiers (bien que ca soit faisable!), donc à la main pour le moment

Salut,
Sur le principe, c’est intéressant.
Ceci étant si tu n’externalises pas automatiquement ces sauvegardes tu déplaces le problème.
Tu crées automatiquement la sauvegarde qui, avec un disque flingué, est également inexploitable.
C’est quand même une première étape à prendre en compte et à saluer.

la remarque est vraie aussi pour ta sauvegarde jeedom.
si tu ne la dupliques pas quelque part et que le disk se flingue, tu perds toute ta conf jeedom …

je considère que Jeedom propose déjà des solutions : samba, market, …
libre à chacun de faire comme il souhaite !

je propose justement que cette sauvegarde soite fait sous le rép html de façon à ce qu’elle soit incluse dans la sauvegarde de jeedom !
si tu sauvegardes donc tes backup jeedom autre part, tu sauvegardes aussi celle de la gateway (puisqu’elle est incluse!)

(et cette fois-ci je ne me suis pas trompé pour bien te répondre à toi ! :slight_smile: :stuck_out_tongue: )

1 « J'aime »

J’utilise CloudSyncPro qui transféré automatiquement mes sauvegardes jeedom sur le cloud. Le répertoire backup est recopié dans sa totalité.

C’est la question que je me posais. Est-ce que Jeedom sauvegarde ce qui ne lui appartient pas? C’est à vérifier mais si c’est le cas, ça devient effectivement jouable.

tout va bien pour toi alors ! :smiley:

le backup créé par jeedom prend tout ce qu’il y a sous html à l’exclusion de :

$excludes = array('tmp','log','docs','doc','tests','support','backup','script/tunnel','.git','.log','core/config/common.config.php',config::byKey('backup::path'))

cf code

autrement dit ta sauvegarde « jeedom » qui est dans backup aura aussi récupéré le dossier backup_deconz si il est sous html

la preuve en image sur une sauvegarde faite à l’instant :

Alors c’est tout bon, félicitations et merci du partage.
:clap::clap::clap:

1 « J'aime »

Excellent @tomitomas merci beaucoup.
C la même sauvegarde que sous phoscon en fait ?

yes sir !

la seule « différence » c’est que ca produit un tar.gz
alors que manuellement sous phoscon ca produit un .dat qui contient le tar.gz

Yes ok mr, c’est parfait en plus de manière auto c le top!
Il te reste plus qu’à faire la même chose en zwave :wink: mais je crois que jeedom est en train de le faire :grinning:

j’ai pas d’équipement en z-wave sorry ! :wink:

Installé et testé.
Ça marche impeccable.

Moi je me demande toujours pourquoi est il nécessaire de mettre des phrases en anglais dans un code … :white_flag:
Édit : Humour :joy::joy::joy:

Question d’habitude ! :blush:
De base les fonctions sont en anglais, donc on reste dans le theme pour la suite ! ^^
Bon … rien de tres tres compliqué ceci dit hein :wink:

Deja je trouve que j’ai ete vachement sympa de mettre toute l explication en Français ! :laughing: :rofl:

1 « J'aime »

Et moi je me demande toujours pourquoi faire des remarques déplacées à quelqu’un qui travaille pour la communauté.
:person_shrugging::person_shrugging:

Ca me rappelle une petit coup de gueule de @sigalou dernièrement :grin:

Je n’ai pas lu ça.

Je ne veux pas lui faire de la [bonne] pub, mais j’aimais assez bien sa remarque/coup de gueule sur son post

1 « J'aime »

Effectivement, j!ai un peu le même ressenti.
Beaucoup d’exigences et moins de respect.
Enfin, c’est comme ça, on n’est pas obligé de continuer.
Bonne soirée.

Bonjour,

Pour information, le plugin DeCONZ sauvegarde déjà la base phoscon.
Pour plus de détails, voir la fin du flash ici : [Présentation] akenad - #16 par akenad

akenad :slight_smile:

Bonjour, Moi je croyais ça aussi mais comme tu fais pour extraire le .dat de la sauvegarde ?