modifié : public/base-de-donnees/index.html modifié : public/base.css modifié : public/index.html modifié : public/intro.css modifié : sass/color.scss modifié : static/js/menu.js modifié : templates/partials/menu.html
581 lines
59 KiB
HTML
581 lines
59 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<link rel="stylesheet" href="/base.css" type="text/css">
|
|
<title> kitoy.me </title>
|
|
|
|
|
|
<title> kitoy.me </title>
|
|
|
|
|
|
</head>
|
|
|
|
<body>
|
|
<div class="title">
|
|
<h1 style="text-align:center;"> kitoy.me </h1>
|
|
</div>
|
|
|
|
<div class="menugauche">
|
|
|
|
<div class="toggle" id="toggle" onclick="menu-expand()">
|
|
<h2 id="plus"> Menu </h2>
|
|
</div>
|
|
|
|
<div class="menu" id="menu">
|
|
<a href="https://kitoy.me">
|
|
<img src="/img/Blog-icon.svg" alt="Le blog" />
|
|
<p> Le blog </p>
|
|
</a>
|
|
|
|
<a href="https://losprimos.eu">
|
|
<img src="/img/music.svg" alt="Le blog" />
|
|
<p> Azul </p>
|
|
</a>
|
|
|
|
<a href="https://kitoy.me/rss.xml">
|
|
<img src="/img/resese.svg" alt="Suivez le blog par RSS" />
|
|
<p> RSS </p>
|
|
</a>
|
|
|
|
<a href="https://kitoy.me/contact/">
|
|
<img src="/img/mail.svg" alt="Contact" />
|
|
<p> Me contacter </p>
|
|
</a>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div class="articles">
|
|
|
|
<h1> Sauvegarde système de l'Orangepi sous debian/yunohost. </h1>
|
|
<h2 class="description">
|
|
Sauvegarder le système de sa carte ARM OrangePi avec debian sur clé usb
|
|
</h2>
|
|
<hr />
|
|
|
|
<h3 id="le-probleme">Le problème</h3>
|
|
<p>Ou plutôt les problèmes, car il peut y en avoir plusieurs; par exemple le
|
|
système sur la carte ne boot plus. On a fait une bêtise, on la débranché car on
|
|
a voulu la déplacer ou le fil s'est débranché par accident, et aller cette fois
|
|
là c'est la galère. C'est généralement long et fastidieux de récupérer les
|
|
données sur sa carte SD ou autre, j'ai donc fait un script qui fait une
|
|
sauvegarde globale du système sur un disque ou une clé usb que l'on devra
|
|
autoriser auparavant, histoire que dès que l'on branche une clé usb, ça n'envoie
|
|
pas les données dessus. Il y a bien évidement des solutions de sauvegarde en
|
|
ligne mais ayant une connexion avec peu de débit, ça peut prendre beaucoup de
|
|
temps, la connexion peut couper et alors c'est des complications, pour moi ce n'était pas très adapté.</p>
|
|
<h3 id="le-principe">Le principe</h3>
|
|
<p>Le principe c'est que le script a deux fonctionnalitées
|
|
Une pour ajouter les supports de stockages où la sauvegarde sera envoyé. Le script formate la partition et il ajoute l'UUID à la liste des clés ou disques autorisé a recevoir les données. Pour l'utiliser on lancera la commande ./saveonmedia create
|
|
Une pour écouter avec udev les medias branchés et réaliser la sauvegarde quand elle reconnaît L'UUID d'un disque. On lancera la commande ./saveonmedia make
|
|
Pour la liste, un bête fichier texte suffit pour ajouter les supports de stockage lignes par lignes, on se basera sur les UUID des partitions sur le disque qui sont normalement identifier de manière unique. Pour réaliser la sauvegarde le script lancera un script bash qui est généralement plus pratique si l'on veut ajouter des taches à effectuer ou personnaliser le truc un peu comme on veut.</p>
|
|
<pre style="background-color:#272822;">
|
|
<span style="color:#f8f8f2;">
|
|
</span><span style="color:#75715e;">#!/usr/bin/python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
</span><span style="color:#f92672;">import </span><span style="color:#f8f8f2;">pyudev
|
|
</span><span style="color:#f92672;">import </span><span style="color:#f8f8f2;">subprocess
|
|
</span><span style="color:#f92672;">import </span><span style="color:#f8f8f2;">sys
|
|
</span><span style="color:#f92672;">import </span><span style="color:#f8f8f2;">os
|
|
</span><span style="color:#f92672;">import </span><span style="color:#f8f8f2;">socket
|
|
</span><span style="color:#f92672;">from </span><span style="color:#f8f8f2;">email.mime.text </span><span style="color:#f92672;">import </span><span style="color:#f8f8f2;">MIMEText
|
|
</span><span style="color:#f92672;">from </span><span style="color:#f8f8f2;">subprocess </span><span style="color:#f92672;">import </span><span style="color:#f8f8f2;">Popen, PIPE
|
|
|
|
</span><span style="font-style:italic;color:#66d9ef;">def </span><span style="color:#a6e22e;">print_help</span><span style="color:#f8f8f2;">():
|
|
</span><span style="color:#66d9ef;">print </span><span style="color:#f8f8f2;">(</span><span style="color:#e6db74;">"""
|
|
##### saveonusb Sauvergarde sur support USB ####
|
|
! A executer avec l'utilisateur avec des droits root (sudo) ou en root !
|
|
Pour autoriser un disque (clé usb, disque usb)
|
|
Lancez la commande :
|
|
./saveonusb create
|
|
Pour effectuer l'ecoute puis la sauvegarde:
|
|
./saveonusb make
|
|
"""</span><span style="color:#f8f8f2;">)
|
|
|
|
</span><span style="font-style:italic;color:#66d9ef;">def </span><span style="color:#a6e22e;">send_msg</span><span style="color:#f8f8f2;">(</span><span style="font-style:italic;color:#fd971f;">subject</span><span style="color:#f8f8f2;">, </span><span style="font-style:italic;color:#fd971f;">message</span><span style="color:#f8f8f2;">):
|
|
</span><span style="color:#75715e;"># Permet d'envoyer des mail a root via sendmail.
|
|
</span><span style="color:#f8f8f2;">msg </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">MIMEText(message)
|
|
msg[</span><span style="color:#e6db74;">"From"</span><span style="color:#f8f8f2;">] </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"sauvegarde@"</span><span style="color:#f92672;">+</span><span style="color:#f8f8f2;">socket.gethostname()
|
|
msg[</span><span style="color:#e6db74;">"To"</span><span style="color:#f8f8f2;">] </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"root@"</span><span style="color:#f92672;">+</span><span style="color:#f8f8f2;">socket.gethostname()
|
|
msg[</span><span style="color:#e6db74;">"Subject"</span><span style="color:#f8f8f2;">] </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">subject
|
|
p </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">Popen([</span><span style="color:#e6db74;">"/usr/sbin/sendmail"</span><span style="color:#f8f8f2;">, </span><span style="color:#e6db74;">"-t"</span><span style="color:#f8f8f2;">, </span><span style="color:#e6db74;">"-oi"</span><span style="color:#f8f8f2;">], </span><span style="font-style:italic;color:#fd971f;">stdin</span><span style="color:#f92672;">=</span><span style="color:#f8f8f2;">PIPE, </span><span style="font-style:italic;color:#fd971f;">universal_newlines</span><span style="color:#f92672;">=</span><span style="color:#ae81ff;">True</span><span style="color:#f8f8f2;">)
|
|
p.communicate(msg.as_string())
|
|
|
|
|
|
</span><span style="font-style:italic;color:#66d9ef;">def </span><span style="color:#a6e22e;">clean_df_out</span><span style="color:#f8f8f2;">(</span><span style="font-style:italic;color:#fd971f;">df_out</span><span style="color:#f8f8f2;">):
|
|
</span><span style="color:#75715e;"># Ici on tri les enleve les partitions de la sortir de df qui ne sont pas des supports
|
|
# de stockages
|
|
#
|
|
</span><span style="color:#f8f8f2;">df_out </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">df_out.split(</span><span style="color:#e6db74;">'</span><span style="color:#ae81ff;">\n</span><span style="color:#e6db74;">'</span><span style="color:#f8f8f2;">)
|
|
lines</span><span style="color:#f92672;">=</span><span style="color:#f8f8f2;">[]
|
|
</span><span style="color:#f92672;">for </span><span style="color:#f8f8f2;">line </span><span style="color:#f92672;">in </span><span style="color:#f8f8f2;">df_out:
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">line[</span><span style="color:#ae81ff;">0</span><span style="color:#f8f8f2;">:</span><span style="color:#ae81ff;">4</span><span style="color:#f8f8f2;">] </span><span style="color:#f92672;">== </span><span style="color:#e6db74;">'/dev'</span><span style="color:#f8f8f2;">:
|
|
lines.append(line)
|
|
|
|
line_clean </span><span style="color:#f92672;">= </span><span style="font-style:italic;color:#66d9ef;">list</span><span style="color:#f8f8f2;">()
|
|
lines_clean </span><span style="color:#f92672;">= </span><span style="font-style:italic;color:#66d9ef;">list</span><span style="color:#f8f8f2;">()
|
|
</span><span style="color:#75715e;"># On crée la liste des champs de df
|
|
</span><span style="color:#f92672;">for </span><span style="color:#f8f8f2;">line </span><span style="color:#f92672;">in </span><span style="color:#f8f8f2;">lines:
|
|
line </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">line.split(</span><span style="color:#e6db74;">' '</span><span style="color:#f8f8f2;">)
|
|
</span><span style="color:#f92672;">for </span><span style="color:#f8f8f2;">champ </span><span style="color:#f92672;">in </span><span style="color:#f8f8f2;">line:
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">champ </span><span style="color:#f92672;">!= </span><span style="color:#e6db74;">''</span><span style="color:#f8f8f2;">:
|
|
line_clean.append(champ)
|
|
lines_clean.append(line_clean.copy())
|
|
line_clean.clear()
|
|
|
|
</span><span style="color:#f92672;">return </span><span style="color:#f8f8f2;">lines_clean
|
|
|
|
</span><span style="font-style:italic;color:#66d9ef;">def </span><span style="color:#a6e22e;">getMinSpaceRequirement</span><span style="color:#f8f8f2;">():
|
|
</span><span style="color:#75715e;"># df -k A ce schema de sorti
|
|
# Filesystem | 1K-blocks | Used | Avail | Capacity | Mounted on
|
|
#
|
|
# Pour obtenir l'espace minimum on suppose que l'on veut sauvegarder toutes les
|
|
# données de tout les supports de stockages.
|
|
|
|
</span><span style="color:#f8f8f2;">df </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">subprocess.check_output([</span><span style="color:#e6db74;">'/bin/df'</span><span style="color:#f8f8f2;">, </span><span style="color:#e6db74;">'-k'</span><span style="color:#f8f8f2;">]).decode(</span><span style="color:#e6db74;">'utf8'</span><span style="color:#f8f8f2;">)
|
|
df_list </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">clean_df_out(df)
|
|
</span><span style="color:#66d9ef;">print </span><span style="color:#f8f8f2;">(df_list)
|
|
space_used </span><span style="color:#f92672;">= </span><span style="color:#ae81ff;">0
|
|
</span><span style="color:#f92672;">for </span><span style="color:#f8f8f2;">line </span><span style="color:#f92672;">in </span><span style="color:#f8f8f2;">df_list:
|
|
space_used </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">space_used </span><span style="color:#f92672;">+ </span><span style="font-style:italic;color:#66d9ef;">int</span><span style="color:#f8f8f2;">(line[</span><span style="color:#ae81ff;">2</span><span style="color:#f8f8f2;">])
|
|
|
|
</span><span style="color:#f92672;">return </span><span style="color:#f8f8f2;">space_used
|
|
|
|
</span><span style="font-style:italic;color:#66d9ef;">def </span><span style="color:#a6e22e;">get_uuid</span><span style="color:#f8f8f2;">(</span><span style="font-style:italic;color:#fd971f;">device</span><span style="color:#f8f8f2;">):
|
|
cmd </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">subprocess.check_output([</span><span style="color:#e6db74;">'sudo'</span><span style="color:#f8f8f2;">, </span><span style="color:#e6db74;">'blkid'</span><span style="color:#f8f8f2;">, device])
|
|
cmd </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">cmd.decode(</span><span style="color:#e6db74;">'utf-8'</span><span style="color:#f8f8f2;">)
|
|
</span><span style="color:#f92672;">for </span><span style="color:#f8f8f2;">line </span><span style="color:#f92672;">in </span><span style="color:#f8f8f2;">cmd.split(</span><span style="color:#e6db74;">' '</span><span style="color:#f8f8f2;">):
|
|
</span><span style="color:#f92672;">if </span><span style="color:#e6db74;">'UUID=' </span><span style="color:#f92672;">== </span><span style="color:#f8f8f2;">line[</span><span style="color:#ae81ff;">0</span><span style="color:#f8f8f2;">:</span><span style="color:#ae81ff;">5</span><span style="color:#f8f8f2;">]:
|
|
</span><span style="color:#f92672;">return </span><span style="color:#f8f8f2;">line[</span><span style="color:#ae81ff;">6</span><span style="color:#f8f8f2;">:</span><span style="color:#66d9ef;">len</span><span style="color:#f8f8f2;">(line)</span><span style="color:#f92672;">-</span><span style="color:#ae81ff;">1</span><span style="color:#f8f8f2;">]
|
|
</span><span style="color:#f92672;">return </span><span style="color:#e6db74;">''
|
|
|
|
</span><span style="font-style:italic;color:#66d9ef;">def </span><span style="color:#a6e22e;">make_save</span><span style="color:#f8f8f2;">(</span><span style="font-style:italic;color:#fd971f;">save_directory</span><span style="color:#f8f8f2;">, </span><span style="font-style:italic;color:#fd971f;">storages</span><span style="color:#f8f8f2;">):
|
|
context </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">pyudev.Context()
|
|
monitor </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">pyudev.Monitor.from_netlink(context)
|
|
monitor.filter_by(</span><span style="color:#e6db74;">'block'</span><span style="color:#f8f8f2;">)
|
|
done </span><span style="color:#f92672;">= </span><span style="color:#ae81ff;">False
|
|
</span><span style="color:#f92672;">with </span><span style="color:#66d9ef;">open </span><span style="color:#f8f8f2;">(storages, </span><span style="color:#e6db74;">'r'</span><span style="color:#f8f8f2;">) </span><span style="color:#f92672;">as </span><span style="color:#f8f8f2;">f:
|
|
medias_save </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">f.read().splitlines()
|
|
|
|
</span><span style="color:#f92672;">while not</span><span style="color:#f8f8f2;">(done):
|
|
device </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">monitor.poll()
|
|
</span><span style="color:#f92672;">if </span><span style="color:#e6db74;">'ID_FS_TYPE' </span><span style="color:#f92672;">in </span><span style="color:#f8f8f2;">device </span><span style="color:#f92672;">and </span><span style="color:#f8f8f2;">device.action </span><span style="color:#f92672;">== </span><span style="color:#e6db74;">"add"</span><span style="color:#f8f8f2;">:
|
|
</span><span style="color:#66d9ef;">print </span><span style="color:#f8f8f2;">(</span><span style="color:#e6db74;">"device: </span><span style="color:#ae81ff;">{0}</span><span style="color:#e6db74;"> medias: </span><span style="color:#ae81ff;">{1}</span><span style="color:#e6db74;">"</span><span style="color:#f8f8f2;">.format(device.get(</span><span style="color:#e6db74;">'ID_FS_UUID'</span><span style="color:#f8f8f2;">), medias_save))
|
|
</span><span style="color:#f92672;">if </span><span style="color:#e6db74;">"ynh_save" </span><span style="color:#f92672;">== </span><span style="color:#f8f8f2;">device.get(</span><span style="color:#e6db74;">'ID_FS_LABEL'</span><span style="color:#f8f8f2;">) </span><span style="color:#f92672;">and </span><span style="color:#f8f8f2;">device.get(</span><span style="color:#e6db74;">'ID_FS_UUID'</span><span style="color:#f8f8f2;">) </span><span style="color:#f92672;">in </span><span style="color:#f8f8f2;">medias_save:
|
|
</span><span style="color:#66d9ef;">print </span><span style="color:#f8f8f2;">(</span><span style="color:#e6db74;">"La sauvegarde a commencé"</span><span style="color:#f8f8f2;">)
|
|
send_msg(</span><span style="color:#e6db74;">"Une sauvegarde a été lancé"</span><span style="color:#f8f8f2;">,</span><span style="color:#e6db74;">"Ne retirez pas votre disque ou clé usb. Merçi."</span><span style="color:#f8f8f2;">)
|
|
|
|
retcode </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">subprocess.call(</span><span style="color:#e6db74;">"mount " </span><span style="color:#f92672;">+ </span><span style="color:#f8f8f2;">device.device_node </span><span style="color:#f92672;">+ </span><span style="color:#e6db74;">" "</span><span style="color:#f92672;">+ </span><span style="color:#f8f8f2;">save_directory, </span><span style="font-style:italic;color:#fd971f;">shell</span><span style="color:#f92672;">=</span><span style="color:#ae81ff;">True</span><span style="color:#f8f8f2;">)
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">retcode </span><span style="color:#f92672;">!= </span><span style="color:#ae81ff;">0</span><span style="color:#f8f8f2;">:
|
|
subject </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"Bon ... ça s'est mal passé"
|
|
</span><span style="color:#f8f8f2;">message </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"""Impossible de monter la clé USB :( """
|
|
</span><span style="color:#f8f8f2;">send_msg(subject, message)
|
|
|
|
retcode </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">subprocess.call( save_script </span><span style="color:#f92672;">+ </span><span style="color:#e6db74;">" " </span><span style="color:#f92672;">+ </span><span style="color:#f8f8f2;">save_directory, </span><span style="font-style:italic;color:#fd971f;">shell</span><span style="color:#f92672;">=</span><span style="color:#ae81ff;">True</span><span style="color:#f8f8f2;">)
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">retcode </span><span style="color:#f92672;">!= </span><span style="color:#ae81ff;">0</span><span style="color:#f8f8f2;">:
|
|
subject </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"Bon ... ça s'est mal passé"
|
|
</span><span style="color:#f8f8f2;">message </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"""Le script de sauvegarde a remonté une erreur,
|
|
comment dire ... je le ferai autrement moi """
|
|
</span><span style="color:#f8f8f2;">send_msg(subject, message)
|
|
|
|
retcode </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">subprocess.call(</span><span style="color:#e6db74;">"umount " </span><span style="color:#f92672;">+ </span><span style="color:#f8f8f2;">device.device_node, </span><span style="font-style:italic;color:#fd971f;">shell</span><span style="color:#f92672;">=</span><span style="color:#ae81ff;">True</span><span style="color:#f8f8f2;">)
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">retcode </span><span style="color:#f92672;">!= </span><span style="color:#ae81ff;">0</span><span style="color:#f8f8f2;">:
|
|
subject </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"Bon ... ça s'est a peu près bien passé"
|
|
</span><span style="color:#f8f8f2;">message </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"""Ça a monté le support et tout, le script pas de problèmes,
|
|
mais ca démonte pas le support correctement le script ne peut rien faire seul vous pouvez
|
|
voir ce qu'il se passe"""
|
|
</span><span style="color:#f92672;">else</span><span style="color:#f8f8f2;">:
|
|
subject </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"Confirmation de sauvegarde"
|
|
</span><span style="color:#f8f8f2;">message </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"""Votre sauvegarde est prête vous pouvez retirer votre
|
|
support de stockage en toute sécurité. Rebranchez ce même support quand vous
|
|
souhaitez effectuer une sauvergarde. Attention! Toutes modifications de la partiton
|
|
rendra le support invalide"""
|
|
</span><span style="color:#f8f8f2;">send_msg(subject, message)
|
|
|
|
|
|
</span><span style="font-style:italic;color:#66d9ef;">def </span><span style="color:#a6e22e;">create_key_save</span><span style="color:#f8f8f2;">(</span><span style="font-style:italic;color:#fd971f;">storages</span><span style="color:#f8f8f2;">):
|
|
context </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">pyudev.Context()
|
|
monitor </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">pyudev.Monitor.from_netlink(context)
|
|
monitor.filter_by(</span><span style="color:#e6db74;">'block'</span><span style="color:#f8f8f2;">)
|
|
</span><span style="color:#f92672;">with </span><span style="color:#66d9ef;">open </span><span style="color:#f8f8f2;">(storages, </span><span style="color:#e6db74;">'r'</span><span style="color:#f8f8f2;">) </span><span style="color:#f92672;">as </span><span style="color:#f8f8f2;">f:
|
|
medias_save </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">f.read().splitlines()
|
|
done </span><span style="color:#f92672;">= </span><span style="color:#ae81ff;">False
|
|
</span><span style="color:#f92672;">while not</span><span style="color:#f8f8f2;">(done):
|
|
device </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">monitor.poll()
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">device.device_type </span><span style="color:#f92672;">== </span><span style="color:#e6db74;">"partition" </span><span style="color:#f92672;">and </span><span style="color:#f8f8f2;">device.action </span><span style="color:#f92672;">== </span><span style="color:#e6db74;">"add"</span><span style="color:#f8f8f2;">:
|
|
</span><span style="color:#f92672;">if </span><span style="color:#e6db74;">"ynh_save" </span><span style="color:#f92672;">== </span><span style="color:#f8f8f2;">device.get(</span><span style="color:#e6db74;">'ID_FS_LABEL'</span><span style="color:#f8f8f2;">) </span><span style="color:#f92672;">and </span><span style="color:#f8f8f2;">device.get(</span><span style="color:#e6db74;">'ID_FS_UUID'</span><span style="color:#f8f8f2;">) </span><span style="color:#f92672;">in </span><span style="color:#f8f8f2;">medias_save:
|
|
subject </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"Ce support de stockage est déjà initialisé"
|
|
</span><span style="color:#f8f8f2;">message </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"Il n'est pas nécéssaire d'initialisé ce périphérique"
|
|
</span><span style="color:#f8f8f2;">send_msg(subject, message)
|
|
</span><span style="color:#f92672;">else</span><span style="color:#f8f8f2;">:
|
|
size </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">subprocess.check_output(</span><span style="color:#e6db74;">"fdisk -s " </span><span style="color:#f92672;">+
|
|
</span><span style="color:#f8f8f2;">device.device_node,
|
|
</span><span style="font-style:italic;color:#fd971f;">shell</span><span style="color:#f92672;">=</span><span style="color:#ae81ff;">True</span><span style="color:#f8f8f2;">)
|
|
size </span><span style="color:#f92672;">= </span><span style="font-style:italic;color:#66d9ef;">int</span><span style="color:#f8f8f2;">(size)
|
|
size_requirement </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">getMinSpaceRequirement()
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">size </span><span style="color:#f92672;">> </span><span style="color:#f8f8f2;">size_requirement:
|
|
done </span><span style="color:#f92672;">= </span><span style="color:#ae81ff;">True
|
|
</span><span style="color:#f8f8f2;">retcode </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">subprocess.call(</span><span style="color:#e6db74;">"mkfs.ext4" </span><span style="color:#f92672;">+ </span><span style="color:#e6db74;">" -F -L ynh_save" </span><span style="color:#f92672;">+
|
|
</span><span style="color:#e6db74;">" "</span><span style="color:#f92672;">+ </span><span style="color:#f8f8f2;">device.device_node, </span><span style="font-style:italic;color:#fd971f;">shell</span><span style="color:#f92672;">=</span><span style="color:#ae81ff;">True</span><span style="color:#f8f8f2;">)
|
|
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">retcode </span><span style="color:#f92672;">!= </span><span style="color:#ae81ff;">0</span><span style="color:#f8f8f2;">:
|
|
subject </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"Impossible de formatter la clé"
|
|
</span><span style="color:#f8f8f2;">message </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">""" Il y a eu un problème durant le formatage de la clé"""
|
|
</span><span style="color:#f8f8f2;">send_msg(subject, message)
|
|
</span><span style="color:#75715e;"># On récupere le nouvel uuid
|
|
|
|
</span><span style="color:#f92672;">with </span><span style="color:#66d9ef;">open </span><span style="color:#f8f8f2;">(storages, </span><span style="color:#e6db74;">'a'</span><span style="color:#f8f8f2;">) </span><span style="color:#f92672;">as </span><span style="color:#f8f8f2;">f:
|
|
f.write(get_uuid(device.device_node)</span><span style="color:#f92672;">+ </span><span style="color:#e6db74;">'</span><span style="color:#ae81ff;">\n</span><span style="color:#e6db74;">'</span><span style="color:#f8f8f2;">)
|
|
subject </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"Autorisation d'un support de sauvegarde"
|
|
</span><span style="color:#f8f8f2;">message </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">""" Vous venez de créer un support pour votre sauvegarde.
|
|
Cela s'est deroulé normalement. Pour effectuer une sauvegarde maintenant
|
|
rebrancher votre support de stockage; un mail vous signalera quand vous pourrez
|
|
enlevez votre support en toute sécurité."""
|
|
</span><span style="color:#f8f8f2;">send_msg(subject, message)
|
|
done </span><span style="color:#f92672;">= </span><span style="color:#ae81ff;">True
|
|
</span><span style="color:#f92672;">else</span><span style="color:#f8f8f2;">:
|
|
subject </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"Votre support de stockage est de taille insufisante !"
|
|
</span><span style="color:#f8f8f2;">message </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"""Il n'y a pas assez d'espace disque sur le support que
|
|
vous venez de brancher; essayer avec une media de plus grande capacité (minimum """ </span><span style="color:#f92672;">+
|
|
</span><span style="font-style:italic;color:#66d9ef;">str</span><span style="color:#f8f8f2;">(size_requirement</span><span style="color:#f92672;">/</span><span style="color:#ae81ff;">1000000</span><span style="color:#f8f8f2;">) </span><span style="color:#f92672;">+ </span><span style="color:#e6db74;">"Gb)"
|
|
</span><span style="color:#f8f8f2;">send_msg(subject, message)
|
|
|
|
|
|
save_directory </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"/media/save"
|
|
</span><span style="color:#f8f8f2;">save_script </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"/etc/saveonusb/scripts/save.sh"
|
|
</span><span style="color:#f8f8f2;">conf_path </span><span style="color:#f92672;">= </span><span style="color:#e6db74;">"/etc/saveonusb/"
|
|
</span><span style="color:#f8f8f2;">storages </span><span style="color:#f92672;">= </span><span style="color:#f8f8f2;">conf_path</span><span style="color:#f92672;">+</span><span style="color:#e6db74;">"storages"
|
|
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">os.geteuid() </span><span style="color:#f92672;">!= </span><span style="color:#ae81ff;">0</span><span style="color:#f8f8f2;">:
|
|
</span><span style="color:#f92672;">raise </span><span style="font-style:italic;color:#66d9ef;">OSError</span><span style="color:#f8f8f2;">(</span><span style="color:#e6db74;">"Ce programme doit s'executer avec les droits root"</span><span style="color:#f8f8f2;">)
|
|
|
|
</span><span style="color:#f92672;">if not</span><span style="color:#f8f8f2;">(os.path.exists(save_directory)):
|
|
</span><span style="color:#f92672;">raise </span><span style="font-style:italic;color:#66d9ef;">OSError</span><span style="color:#f8f8f2;">(</span><span style="color:#e6db74;">"Le repertoire "</span><span style="color:#f92672;">+ </span><span style="color:#f8f8f2;">save_directory </span><span style="color:#f92672;">+</span><span style="color:#e6db74;">" n'existe pas"</span><span style="color:#f8f8f2;">)
|
|
|
|
</span><span style="color:#f92672;">if not</span><span style="color:#f8f8f2;">(os.path.exists(conf_path)):
|
|
</span><span style="color:#f92672;">raise </span><span style="font-style:italic;color:#66d9ef;">OSError</span><span style="color:#f8f8f2;">(</span><span style="color:#e6db74;">"Le repertoire "</span><span style="color:#f92672;">+ </span><span style="color:#f8f8f2;">conf_path </span><span style="color:#f92672;">+</span><span style="color:#e6db74;">" n'existe pas"</span><span style="color:#f8f8f2;">)
|
|
|
|
</span><span style="color:#f92672;">if not</span><span style="color:#f8f8f2;">(os.path.isfile(save_script)):
|
|
</span><span style="color:#f92672;">raise </span><span style="font-style:italic;color:#66d9ef;">OSError</span><span style="color:#f8f8f2;">(</span><span style="color:#e6db74;">"Le fichier "</span><span style="color:#f92672;">+ </span><span style="color:#f8f8f2;">save_script </span><span style="color:#f92672;">+</span><span style="color:#e6db74;">" n'existe pas"</span><span style="color:#f8f8f2;">)
|
|
|
|
</span><span style="color:#f92672;">if not</span><span style="color:#f8f8f2;">(os.path.isfile(storages)):
|
|
</span><span style="color:#f92672;">raise </span><span style="font-style:italic;color:#66d9ef;">OSError</span><span style="color:#f8f8f2;">(</span><span style="color:#e6db74;">"Le fichier "</span><span style="color:#f92672;">+ </span><span style="color:#f8f8f2;">storages </span><span style="color:#f92672;">+</span><span style="color:#e6db74;">" n'existe pas"</span><span style="color:#f8f8f2;">)
|
|
|
|
</span><span style="color:#f92672;">if </span><span style="color:#66d9ef;">len</span><span style="color:#f8f8f2;">(sys.argv) </span><span style="color:#f92672;">> </span><span style="color:#ae81ff;">1</span><span style="color:#f8f8f2;">:
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">sys.argv[</span><span style="color:#ae81ff;">1</span><span style="color:#f8f8f2;">] </span><span style="color:#f92672;">== </span><span style="color:#e6db74;">'create'</span><span style="color:#f8f8f2;">:
|
|
create_key_save(storages)
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">sys.argv[</span><span style="color:#ae81ff;">1</span><span style="color:#f8f8f2;">] </span><span style="color:#f92672;">== </span><span style="color:#e6db74;">'make'</span><span style="color:#f8f8f2;">:
|
|
make_save(save_directory, storages)
|
|
</span><span style="color:#f92672;">if </span><span style="color:#f8f8f2;">sys.argv[</span><span style="color:#ae81ff;">1</span><span style="color:#f8f8f2;">] </span><span style="color:#f92672;">== </span><span style="color:#e6db74;">'--help' </span><span style="color:#f92672;">or </span><span style="color:#f8f8f2;">sys.argv[</span><span style="color:#ae81ff;">1</span><span style="color:#f8f8f2;">] </span><span style="color:#f92672;">== </span><span style="color:#e6db74;">'-h'</span><span style="color:#f8f8f2;">:
|
|
print_help()
|
|
</span><span style="color:#f92672;">else</span><span style="color:#f8f8f2;">:
|
|
print_help()
|
|
|
|
|
|
</span></pre>
|
|
<p>On installe pyudev:</p>
|
|
<pre style="background-color:#272822;">
|
|
<span style="color:#f8f8f2;"> apt install python3-pyudev
|
|
</span></pre>
|
|
<p>On créé les répertoires et les fichiers nécessaires:</p>
|
|
<pre style="background-color:#272822;">
|
|
<span style="color:#f8f8f2;">mkdir /media/save
|
|
mkdir</span><span style="font-style:italic;color:#fd971f;"> -p</span><span style="color:#f8f8f2;"> /etc/saveonusb/scripts
|
|
touch /etc/saveonusb/storages </span><span style="color:#f92672;">&& </span><span style="color:#f8f8f2;">touch /etc/saveonusb/scripts/save.sh
|
|
chmod +x /etc/saveonusb/scripts/save.sh
|
|
</span></pre>
|
|
<p>Je me suis fait tout d'abord un petit script afin de générer
|
|
une image prête a être flasher sur une carte SD </p>
|
|
<pre style="background-color:#272822;">
|
|
<span style="color:#f8f8f2;">
|
|
</span><span style="color:#75715e;">#!/bin/bash
|
|
|
|
</span><span style="color:#66d9ef;">set </span><span style="font-style:italic;color:#fd971f;">-e
|
|
</span><span style="color:#75715e;">#set -x
|
|
|
|
#Implementer un TRAC error avec exit qui clean quand ca foire
|
|
# Implementer des logs
|
|
|
|
|
|
#Fonction pour check les programmes nécéssaire.
|
|
#lance apt install quand les programmes manques
|
|
# modprobe loop
|
|
|
|
# Test les medias disponibles et passer en parametre le disk a monter pour mettre l'image
|
|
# Demande confirmation pour commencer tout les étapes ou a toutes les étapes
|
|
</span><span style="color:#f8f8f2;">_apt_install_dep()
|
|
{
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"on passe ici avec $1 comme argument"
|
|
</span><span style="color:#f92672;">case </span><span style="color:#f8f8f2;">$1 </span><span style="color:#f92672;">in</span><span style="color:#f8f8f2;">
|
|
truncate</span><span style="color:#f92672;">)
|
|
</span><span style="color:#f8f8f2;">apt-get</span><span style="font-style:italic;color:#fd971f;"> -y</span><span style="color:#f8f8f2;"> install</span><span style="font-style:italic;color:#fd971f;"> --no-install-recommends</span><span style="color:#f8f8f2;"> coreutils
|
|
;;
|
|
mkfs.ext4</span><span style="color:#f92672;">)
|
|
</span><span style="color:#f8f8f2;">apt-get</span><span style="font-style:italic;color:#fd971f;"> -y</span><span style="color:#f8f8f2;"> install</span><span style="font-style:italic;color:#fd971f;"> --no-install-recommends</span><span style="color:#f8f8f2;"> e2fsprogs
|
|
;;
|
|
</span><span style="color:#f92672;">*)
|
|
</span><span style="color:#f8f8f2;">apt-get</span><span style="font-style:italic;color:#fd971f;"> -y</span><span style="color:#f8f8f2;"> install</span><span style="font-style:italic;color:#fd971f;"> --no-install-recommends </span><span style="color:#f8f8f2;">$1
|
|
;;
|
|
</span><span style="color:#f92672;">esac
|
|
</span><span style="color:#f8f8f2;">}
|
|
|
|
</span><span style="color:#a6e22e;">check_dep</span><span style="color:#f8f8f2;">()
|
|
{
|
|
bins</span><span style="color:#f92672;">=</span><span style="color:#f8f8f2;">(dd truncate rsync parted mkfs.ext4 )
|
|
</span><span style="color:#f92672;">for</span><span style="color:#f8f8f2;"> i </span><span style="color:#f92672;">in </span><span style="color:#e6db74;">"${bins[@]}"</span><span style="color:#f92672;">; do
|
|
if ! </span><span style="color:#f8f8f2;">which </span><span style="color:#e6db74;">"${i}" </span><span style="color:#f92672;">&></span><span style="color:#f8f8f2;"> /dev/null</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"${i} command is required"
|
|
</span><span style="color:#f8f8f2;">_apt_install_dep ${i}
|
|
</span><span style="color:#f92672;">fi
|
|
done
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"check_dep ok"
|
|
</span><span style="color:#f8f8f2;">}
|
|
|
|
|
|
|
|
</span><span style="color:#a6e22e;">create_img</span><span style="color:#f8f8f2;">() {
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">folder</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$1
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">image</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$2
|
|
|
|
</span><span style="color:#75715e;"># Espace utilisé sur /
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">usage</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$(df</span><span style="font-style:italic;color:#fd971f;"> -BM </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">grep ^/dev </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">head</span><span style="font-style:italic;color:#fd971f;"> -1 </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">awk '{print $3}' </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">tr</span><span style="font-style:italic;color:#fd971f;"> -cd </span><span style="color:#e6db74;">'[0-9]. \n')
|
|
</span><span style="color:#75715e;"># Espace libre
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">avaible</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$(df</span><span style="font-style:italic;color:#fd971f;"> -BM </span><span style="color:#e6db74;">$folder </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">grep ^/dev </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">head</span><span style="font-style:italic;color:#fd971f;"> -1 </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">awk '{print $4}' </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">tr</span><span style="font-style:italic;color:#fd971f;"> -cd </span><span style="color:#e6db74;">'[0-9]. \n')
|
|
|
|
</span><span style="color:#f92672;">if </span><span style="color:#66d9ef;">[[ </span><span style="color:#f8f8f2;">$usage </span><span style="font-style:italic;color:#fd971f;">-gt </span><span style="color:#f8f8f2;">$avaible </span><span style="color:#66d9ef;">]]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"No space left"
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"Required: $usage MB "
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"Free space in $folder : $avaible MB "
|
|
</span><span style="color:#66d9ef;">exit</span><span style="color:#f8f8f2;"> 1
|
|
</span><span style="color:#f92672;">fi
|
|
</span><span style="color:#75715e;">#On laisse 1024M d'espace libre sur l'image
|
|
</span><span style="color:#f8f8f2;"> local image_size=$(($usage</span><span style="color:#f92672;">+</span><span style="color:#ae81ff;">1024</span><span style="color:#f8f8f2;">))</span><span style="color:#e6db74;">'M'
|
|
</span><span style="color:#f8f8f2;">truncate</span><span style="font-style:italic;color:#fd971f;"> -s </span><span style="color:#f8f8f2;">$image_size $folder/$image
|
|
}
|
|
|
|
|
|
</span><span style="color:#a6e22e;">prepare_part</span><span style="color:#f8f8f2;">() {
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">loop</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$1
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">folder</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$2
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">image</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$3
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">mount_image</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$4
|
|
|
|
</span><span style="color:#f8f8f2;">losetup $loop $folder/$image
|
|
parted</span><span style="font-style:italic;color:#fd971f;"> -s </span><span style="color:#f8f8f2;">$loop</span><span style="color:#f92672;"> --</span><span style="color:#f8f8f2;"> mklabel msdos
|
|
parted</span><span style="font-style:italic;color:#fd971f;"> -s </span><span style="color:#f8f8f2;">$loop</span><span style="color:#f92672;"> --</span><span style="color:#f8f8f2;"> mkpart primary ext4 8192s -1s
|
|
</span><span style="color:#75715e;">#La carte ne boot pas avec la ligne en dessous
|
|
#parted -s $loop align-check optimal 1
|
|
</span><span style="color:#f8f8f2;"> partprobe $loop
|
|
mkfs.ext4 $loop</span><span style="color:#e6db74;">"p1"
|
|
</span><span style="color:#f8f8f2;">mkdir $mount_image
|
|
mount $loop</span><span style="color:#e6db74;">"p1" </span><span style="color:#f8f8f2;">$mount_image
|
|
}
|
|
|
|
</span><span style="color:#a6e22e;">copy_files</span><span style="color:#f8f8f2;">() {
|
|
</span><span style="color:#75715e;"># Stopper les services avant de copie
|
|
# Vérifier que les partitions soient montées
|
|
# Afficher le point de montage de la partition
|
|
# On redirige la sortie du programme vers /dev/null et la sortie erreur (2) sur la sortie standard
|
|
# On ne verra que les erreurs des fichiers ou la copie a posé problème
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">mount_image</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$1
|
|
</span><span style="color:#f8f8f2;">rsync</span><span style="font-style:italic;color:#fd971f;"> -avrltD --delete --exclude</span><span style="color:#f92672;">=</span><span style="color:#f8f8f2;">{/dev/</span><span style="color:#f92672;">*</span><span style="color:#f8f8f2;">,/proc/</span><span style="color:#f92672;">*</span><span style="color:#f8f8f2;">,/sys/</span><span style="color:#f92672;">*</span><span style="color:#f8f8f2;">,/media/</span><span style="color:#f92672;">*</span><span style="color:#f8f8f2;">,/mnt/</span><span style="color:#f92672;">*</span><span style="color:#f8f8f2;">,/run/</span><span style="color:#f92672;">*</span><span style="color:#f8f8f2;">,/tmp/</span><span style="color:#f92672;">*</span><span style="color:#f8f8f2;">} / $mount_image </span><span style="color:#f92672;">></span><span style="color:#f8f8f2;"> /dev/null </span><span style="color:#ae81ff;">2</span><span style="color:#f92672;">>&</span><span style="color:#ae81ff;">1
|
|
</span><span style="color:#f8f8f2;">}
|
|
|
|
</span><span style="color:#75715e;">#Modify fstab
|
|
</span><span style="color:#a6e22e;">change_fstab</span><span style="color:#f8f8f2;">() {
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">mount_image</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$1
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">old_uuid</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$(blkid</span><span style="font-style:italic;color:#fd971f;"> -o</span><span style="color:#e6db74;"> export `mount </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">grep</span><span style="font-style:italic;color:#fd971f;"> -w</span><span style="color:#e6db74;"> / </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">awk '{print $1}'` </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">grep ^UUID)
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">new_uuid</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$(blkid</span><span style="font-style:italic;color:#fd971f;"> -o</span><span style="color:#e6db74;"> export `mount </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">grep</span><span style="font-style:italic;color:#fd971f;"> -w</span><span style="color:#e6db74;"> /media/$IMAGE </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">awk '{print $1}'` </span><span style="color:#f92672;">| </span><span style="color:#e6db74;">grep ^UUID)
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"old_uuid: $old_uuid"
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"new_uuid: $new_uuid"
|
|
</span><span style="color:#f8f8f2;">sed</span><span style="font-style:italic;color:#fd971f;"> -i</span><span style="color:#f8f8f2;"> s/$old_uuid/$new_uuid/ $MOUNT_IMAGE/etc/fstab
|
|
</span><span style="color:#f92672;">if </span><span style="color:#66d9ef;">[ </span><span style="font-style:italic;color:#fd971f;">-e </span><span style="color:#f8f8f2;">$MOUNT_IMAGE/boot/armbianEnv.txt </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#f8f8f2;">sed</span><span style="font-style:italic;color:#fd971f;"> -i</span><span style="color:#f8f8f2;"> s/$old_uuid/$new_uuid/ $MOUNT_IMAGE/boot/armbianEnv.txt
|
|
</span><span style="color:#f92672;">fi
|
|
</span><span style="color:#f8f8f2;">}
|
|
|
|
</span><span style="color:#a6e22e;">write_mbr</span><span style="color:#f8f8f2;">() {
|
|
|
|
</span><span style="color:#75715e;"># On cherche le uboot_sunxi_with_spl.bin selon si on est sur armbian ou non
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">$uboot_mbr
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">$loop
|
|
loop</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$1
|
|
</span><span style="color:#f8f8f2;">uboot_mbr</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$2
|
|
|
|
</span><span style="color:#f92672;">if </span><span style="color:#66d9ef;">[ </span><span style="color:#f92672;">! </span><span style="font-style:italic;color:#fd971f;">-f </span><span style="color:#f8f8f2;">$uboot_mbr </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#66d9ef;">exit</span><span style="color:#f8f8f2;"> 1</span><span style="color:#f92672;">;
|
|
fi
|
|
</span><span style="color:#75715e;"># on Efface la zone pour le mbr
|
|
</span><span style="color:#f8f8f2;"> dd if=/dev/zero of=$loop bs=1k count=1023 seek=1 status=noxfer </span><span style="color:#f92672;">></span><span style="color:#f8f8f2;"> /dev/null </span><span style="color:#ae81ff;">2</span><span style="color:#f92672;">>&</span><span style="color:#ae81ff;">1</span><span style="color:#f92672;">;
|
|
|
|
</span><span style="color:#75715e;"># on flash le mbr
|
|
</span><span style="color:#f8f8f2;">dd if=$uboot_mbr of=$loop bs=1024 seek=8 status=noxfer </span><span style="color:#f92672;">></span><span style="color:#f8f8f2;"> /dev/null </span><span style="color:#ae81ff;">2</span><span style="color:#f92672;">>&</span><span style="color:#ae81ff;">1</span><span style="color:#f92672;">;
|
|
</span><span style="color:#f8f8f2;">}
|
|
|
|
|
|
</span><span style="color:#a6e22e;">clean</span><span style="color:#f8f8f2;">() {
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">loop</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$1
|
|
</span><span style="color:#f92672;">local </span><span style="color:#f8f8f2;">mount_image</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$2
|
|
|
|
</span><span style="color:#f8f8f2;">sync
|
|
umount $mount_image
|
|
losetup</span><span style="font-style:italic;color:#fd971f;"> -d </span><span style="color:#f8f8f2;">$loop
|
|
rmdir $mount_image
|
|
}
|
|
|
|
</span><span style="color:#75715e;">## Début du script
|
|
</span><span style="color:#a6e22e;">show_usage</span><span style="color:#f8f8f2;">() {
|
|
cat </span><span style="color:#f92672;"><< EOF</span><span style="color:#e6db74;">
|
|
Ce script génère une image qui peut être flasher sur une carte SD pour les cartes
|
|
Olimex LIME LIME2 et orange pi pc (plus)
|
|
|
|
$(basename $0)
|
|
|
|
-d Dossier où sera stocké l'image
|
|
|
|
-u uboot_sunxi_with_spl.bin
|
|
|
|
|
|
EOF</span><span style="background-color:#f92672;color:#f8f8f0;">
|
|
</span><span style="color:#e6db74;">
|
|
</span><span style="color:#f8f8f2;"> exit 1
|
|
}
|
|
|
|
</span><span style="color:#f92672;">if </span><span style="color:#66d9ef;">[ </span><span style="color:#f92672;">! </span><span style="color:#f8f8f2;">$(id</span><span style="font-style:italic;color:#fd971f;"> -u</span><span style="color:#f8f8f2;">) </span><span style="color:#f92672;">=</span><span style="color:#f8f8f2;"> 0 </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"L'utilisateur doit être root"
|
|
</span><span style="color:#66d9ef;">exit</span><span style="color:#f8f8f2;"> 1
|
|
</span><span style="color:#f92672;">fi
|
|
|
|
|
|
|
|
</span><span style="color:#75715e;">## Possibilité d'aller chercher le uboot_sunxi_with_spl.bin sur une adresse http
|
|
|
|
|
|
#Check arguments
|
|
|
|
</span><span style="color:#f92672;">if </span><span style="color:#66d9ef;">[ </span><span style="color:#f8f8f2;">$# </span><span style="font-style:italic;color:#fd971f;">-eq</span><span style="color:#f8f8f2;"> 0 </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#f8f8f2;">show_usage
|
|
</span><span style="color:#f92672;">fi
|
|
|
|
</span><span style="color:#75715e;"># Gérer les options https://www.tutorialspoint.com/unix_commands/getopt.htm
|
|
|
|
|
|
</span><span style="color:#f92672;">while </span><span style="color:#66d9ef;">getopts </span><span style="color:#e6db74;">":d:u:h"</span><span style="color:#f8f8f2;"> opt</span><span style="color:#f92672;">; do
|
|
case </span><span style="color:#f8f8f2;">$opt </span><span style="color:#f92672;">in</span><span style="color:#f8f8f2;">
|
|
|
|
d</span><span style="color:#f92672;">)
|
|
</span><span style="color:#f8f8f2;">FOLDER</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$OPTARG
|
|
</span><span style="color:#f8f8f2;">;;
|
|
u</span><span style="color:#f92672;">)
|
|
</span><span style="color:#f8f8f2;">UBOOT_MBR</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$OPTARG
|
|
</span><span style="color:#f8f8f2;">;;
|
|
h </span><span style="color:#f92672;">| *)
|
|
</span><span style="color:#f8f8f2;">show_usage</span><span style="color:#f92672;">;
|
|
</span><span style="color:#f8f8f2;">;;
|
|
</span><span style="color:#f92672;">esac
|
|
done
|
|
|
|
if </span><span style="color:#66d9ef;">[ </span><span style="font-style:italic;color:#fd971f;">-z </span><span style="color:#f8f8f2;">$FOLDER </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#f8f8f2;">show_usage
|
|
</span><span style="color:#f92672;">fi
|
|
|
|
|
|
if </span><span style="color:#66d9ef;">[ </span><span style="color:#f92672;">! </span><span style="font-style:italic;color:#fd971f;">-d </span><span style="color:#f8f8f2;">$FOLDER </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"$FOLDER isn't a directory"</span><span style="color:#f92672;">;
|
|
</span><span style="color:#75715e;">#echo "Le dossier $FOLDER n'existe pas"
|
|
</span><span style="color:#f8f8f2;">show_usage
|
|
</span><span style="color:#f92672;">fi
|
|
if </span><span style="color:#66d9ef;">[ </span><span style="font-style:italic;color:#fd971f;">-z </span><span style="color:#f8f8f2;">$UBOOT_MBR </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#f8f8f2;">show_usage
|
|
</span><span style="color:#f92672;">fi
|
|
|
|
if </span><span style="color:#66d9ef;">[ </span><span style="color:#f92672;">! </span><span style="font-style:italic;color:#fd971f;">-f </span><span style="color:#f8f8f2;">$UBOOT_MBR </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"This file $UBOOT_MBR doesn't exist"</span><span style="color:#f92672;">;
|
|
</span><span style="color:#f8f8f2;">show_usage
|
|
</span><span style="color:#f92672;">fi
|
|
|
|
</span><span style="color:#f8f8f2;">IMAGE</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">snapshot_</span><span style="color:#f8f8f2;">`date +%Y%m%d`.img
|
|
LOOP</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$(losetup</span><span style="font-style:italic;color:#fd971f;"> -f</span><span style="color:#e6db74;">)
|
|
</span><span style="color:#f8f8f2;">MOUNT_IMAGE</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">"/media/"$IMAGE
|
|
|
|
</span><span style="color:#f8f8f2;">check_dep
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"check_dep : OK"
|
|
</span><span style="color:#75715e;">#On crée un image de la taille minimale avec 1024M de place disponible.
|
|
</span><span style="color:#f8f8f2;">create_img $FOLDER $IMAGE
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"create_img: OK"
|
|
|
|
</span><span style="color:#75715e;">#On crée l'interface Loop et les partitions qui vont bien
|
|
</span><span style="color:#f8f8f2;">prepare_part $LOOP $FOLDER $IMAGE $MOUNT_IMAGE
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"prepare_part: OK"
|
|
</span><span style="color:#75715e;">#On copie la /
|
|
</span><span style="color:#f8f8f2;">copy_files $MOUNT_IMAGE
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"copy_file: OK"
|
|
</span><span style="color:#75715e;">#
|
|
</span><span style="color:#f8f8f2;">change_fstab $MOUNT_IMAGE
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"change_fstab: OK"
|
|
|
|
</span><span style="color:#75715e;">#On écrit le MBR
|
|
</span><span style="color:#f8f8f2;">write_mbr $LOOP $UBOOT_MBR
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"write_uboot: OK"
|
|
</span><span style="color:#75715e;">#demonte l'image et detache l'interface loop
|
|
</span><span style="color:#f8f8f2;">clean $LOOP $MOUNT_IMAGE
|
|
|
|
</span></pre>
|
|
<p>je copie ce script dans /usr/local/bin/make_img
|
|
chmod +x /usr/local/bin/make_img</p>
|
|
<p>Puis dans mon fichier /etc/saveonusb/script/save.sh</p>
|
|
<pre style="background-color:#272822;">
|
|
<span style="color:#f8f8f2;">
|
|
DIR_SAVE</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$1
|
|
|
|
</span><span style="color:#f92672;">if </span><span style="color:#66d9ef;">[ </span><span style="color:#f92672;">! </span><span style="font-style:italic;color:#fd971f;">-d </span><span style="color:#e6db74;">"$DIR_SAVE" </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"Le repertoire $DIR_SAVE n'existe pas" </span><span style="color:#ae81ff;">1</span><span style="color:#f92672;">>&</span><span style="color:#ae81ff;">2</span><span style="color:#f92672;">;
|
|
</span><span style="color:#66d9ef;">exit</span><span style="color:#f8f8f2;"> 1</span><span style="color:#f92672;">;
|
|
fi
|
|
|
|
|
|
</span><span style="color:#f8f8f2;">/usr/local/bin/make_img</span><span style="font-style:italic;color:#fd971f;"> -f </span><span style="color:#f8f8f2;">$DIR_SAVE</span><span style="font-style:italic;color:#fd971f;"> -u</span><span style="color:#f8f8f2;"> /usr/lib/linux-u-boot-next-orangepipcplus_5.90_armhf/u-boot-sunxi-with-spl.bin
|
|
|
|
|
|
</span><span style="color:#f92672;">if </span><span style="color:#66d9ef;">[ </span><span style="color:#f8f8f2;">$? </span><span style="font-style:italic;color:#fd971f;">-eq</span><span style="color:#f8f8f2;"> 1 </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"Il y a eu une erreur durant la copie des fichiers" </span><span style="color:#ae81ff;">1</span><span style="color:#f92672;">>&</span><span style="color:#ae81ff;">2</span><span style="color:#f92672;">;
|
|
</span><span style="color:#66d9ef;">exit</span><span style="color:#f8f8f2;"> 1</span><span style="color:#f92672;">;
|
|
fi
|
|
|
|
</span><span style="color:#f8f8f2;">{% endhighlight %}
|
|
|
|
|
|
Version pour les personnes qui sont sous yunohost:
|
|
{% highlight bash %}
|
|
</span><span style="color:#75715e;">#!/bin/bash
|
|
|
|
</span><span style="color:#f8f8f2;">DIR_SAVE</span><span style="color:#f92672;">=</span><span style="color:#e6db74;">$1
|
|
|
|
</span><span style="color:#f92672;">if </span><span style="color:#66d9ef;">[ </span><span style="color:#f92672;">! </span><span style="font-style:italic;color:#fd971f;">-d </span><span style="color:#e6db74;">"$DIR_SAVE" </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"Le repertoire $DIR_SAVE n'existe pas" </span><span style="color:#ae81ff;">1</span><span style="color:#f92672;">>&</span><span style="color:#ae81ff;">2</span><span style="color:#f92672;">;
|
|
</span><span style="color:#66d9ef;">exit</span><span style="color:#f8f8f2;"> 1</span><span style="color:#f92672;">;
|
|
fi
|
|
|
|
|
|
</span><span style="color:#f8f8f2;">/usr/bin/yunohost backup create</span><span style="font-style:italic;color:#fd971f;"> -o </span><span style="color:#f8f8f2;">$DIR_SAVE
|
|
</span><span style="color:#f92672;">if </span><span style="color:#66d9ef;">[ </span><span style="color:#f8f8f2;">$? </span><span style="font-style:italic;color:#fd971f;">-eq</span><span style="color:#f8f8f2;"> 1 </span><span style="color:#66d9ef;">]</span><span style="color:#f92672;">; then
|
|
</span><span style="color:#66d9ef;">echo </span><span style="color:#e6db74;">"Il y a eu une erreur pendant l'exécution de yunohost backup" </span><span style="color:#ae81ff;">1</span><span style="color:#f92672;">>&</span><span style="color:#ae81ff;">2</span><span style="color:#f92672;">;
|
|
</span><span style="color:#66d9ef;">exit</span><span style="color:#f8f8f2;"> 1</span><span style="color:#f92672;">;
|
|
fi
|
|
|
|
</span></pre>
|
|
<p>Il y a biensur des choses à améliorer, mais c'est fonctionnel. On pourrait par exemple avoir plusieurs scripts ou vérifier si le support de sauvergarde a encore la place suffisante. Mais pour mes besoins ça me suffit. Une fonction pour la restauration ça serait pas mal aussi :).</p>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<footer><span class="copyleft">©</span> kitoy.me <br/> Site généré avec <a href="https://getzola.org/"> Zola </a> </footer>
|
|
|
|
<script src="https://kitoy.me/js/menu.js" ></script>
|
|
</body>
|
|
|
|
</html>
|