Haré un aparato para copiar datos de una unidad flash USB a otra. Como base usare Raspberry Pi 4, acceso atraves de Wi-Fi, ¡el engine Node-RED!
Existen duplicadores USB, estas son torretas de 15 a 199 unidades flash, ¡a precios de coche! El más parecido que encontré aquí es Duplicador y borrador de unidad flash USB 2.0 StarTech 1: 2 Standalone (negro) en el oeste por 100$, aca en Rusia por 300$ cada uno, pero es USB 2 (y sin Wi-Fi), ¡y hay un USB 3 en la Raspberry!
Hoy tendré una frambuesa en el estuche Argon NEO Pi 4 Raspberry Pi Case Muy agradable carcasa – metal, elegante y cool, ¡los PINs gracias a tapa en imanes están disponibles en cualquier momento! Pero es muy caliente!
PRECAUCIÓN: debemos tener en cuenta una cosillas: ¡Raspberry Pi 4 tiene cosillas!
1. Los puertos USB están calientes y las unidades flash están tan calientes que imposible sostenerlas en la mano. Pensé que el firmware era viejo, era caliente, no, es el último firmware. Aparentemente, debido al hecho de que las revisiones 1.1 de Rpi 4 tienen problemas con la alimentación USB-C de fuentes de alimentación no nativas, ¡Y también por el case!
2. Los conectores USB 3 en sí mismos son malos. Se resisten al intentar insertar una unidad flash USB de Samsung. Tuve que apretar ligeramente estas abrazaderas (4 piezas), ¡no están en USB 2!
![]()
Es necesario instalar Raspberry Pi OS (32 bits) Lite (anteriormente conocido como Raspbian) en esta versión no hay entorno de escritorio.
Lo descargo aquí www.raspberrypi.org/downloads/raspbian/
Y aquí descargo el instalador – hay para Ubuntu – ¡genial! www.raspberrypi.org/downloads/
Sin embargo, nada funcionó en Ubuntu … lo hizo en Windows, ¡oh! No estamos hablando de eso, pero para decirlo suavemente, Ubuntu no funciona bien con unidades flash enchufables… y la velocidad de copia en una unidad flash usb, y el momento en que se puede quitar, todavía no puede determinar (junio de 2020) – no creas al Prog bar: solo desmonte por software, ¡él dirá con seguridad que puedes sacarlo o no!
Para que ssh funcione, en el mapa en la sección BOOT, debe crear un archivo llamado ssh y luego funcionará. Después de eso, puede insertar la tarjeta en la frambuesa y ver qué frambuesa obtuvo una IP, yo miré en el enrutador. Se puede ir a la frambuesa con manos y ver IP con el comando
ifconfig
Name: pi
Password: raspberry
Veré qué tipo de modelo tengo
cat /sys/firmware/devicetree/base/model
Raspberry Pi 4 Model B Rev 1.1
Veamos cuanta memoria
free -h
total used free shared buff/cache available Mem: 3.8Gi 90Mi 3.5Gi 8.0Mi 242Mi 3.6Gi Swap: 99Mi 0B 99Mi
о 4Gb!
sudo apt update
sudo apt full-upgrade
mida la temperatura inmediatamente después de la actualización
vcgencmd measure_temp
temp=46.0'C
¡No sudo en absoluto!
Compruebo la velocidad de escritura del archivo en rpi4 en la tarjeta SD
dd if=/dev/zero of=test.file count=10000 bs=1048576
10485760000 bytes (10 GB, 9.8 GiB) copied, 1050.75 s, 10.0 MB/s
El mismo resultado fue con la Raspberry Pi 4 en 2 Gb
Ahora a la unidad flash USB 3.1 a través de USB 3 en la frambuesa. Los fabricantes de unidades de memoria flash los suministran con formato vFAT también son FAT32, fs inútil tamaño máximo de archivo 4GB
Formatearemos en NTfS
sudo apt-get install ntfs-3g
sudo mkntfs --fast --label USB32gb /dev/sda1
sudo mkdir /mnt/usb1
sudo mkdir /mnt/usb2
sudo mount /dev/sda1 /mnt/usb1
cd /mnt/usb1
date&&dd if=/dev/zero of=test.file count=10000 bs=1048576&&date&&vcgencmd measure_temp
tenemos
Mon Jun 8 14:12:18 BST 2020 10000+0 records in 10000+0 records out 10485760000 bytes (10 GB, 9.8 GiB) copied, 437.284 s, 24.0 MB/s Mon Jun 8 14:19:35 BST 2020 temp=56.0'C
Ahora conecto la segunda unidad flash de ese tipo y pongo
sudo apt-get install pv
para hacer test de copia de la unidad flash a la unidad flash
pv /mnt/usb1/test.file > /mnt/usb2/test.file
Mon Jun 8 15:24:58 BST 2020 9.77GiB 0:07:07 [23.4MiB/s] [=======================================>] 100% Mon Jun 8 15:32:06 BST 2020 temp=61.0'C
Hacemos punto de acceso de rpi4 Wi-Fi
Todo está perfectamente descrito aquí https://learn.sparkfun.com/tutorials/setting-up-a-raspberry-pi-3-as-an-access-point/all para RPI4 solo necesita agregar un comando más!
Sin embargo, primero debe actualizar, pero no está configurado
sudo apt-get update
sudo apt install dnsmasq hostapd
igual no se instala, lo pongo así
sudo apt install dnsmasq hostapd --fix-missing
luego editamos muchas cosas
sudo vi /etc/dhcpcd.conf
Añadir
denyinterfaces wlan0
sudo vi /etc/network/interfaces
Añadir
auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp allow-hotplug wlan0 iface wlan0 inet static address 10.100.10.1 netmask 255.255.255.0 network 10.100.10.0 broadcast 10.100.10.255
sudo vi /etc/hostapd/hostapd.conf
Añadir
interface=wlan0 driver=nl80211 ssid=Itcooky hw_mode=g channel=6 ieee80211n=1 wmm_enabled=1 ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40] macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_key_mgmt=WPA-PSK wpa_passphrase=QWErty123 rsn_pairwise=CCMP
sudo vi /etc/default/hostapd
Añadir
DAEMON_CONF="/etc/hostapd/hostapd.conf"
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
sudo vi /etc/dnsmasq.conf
Añadir
interface=wlan0 listen-address=10.100.10.1 bind-interfaces server=8.8.8.8 domain-needed bogus-priv dhcp-range=10.100.10.10,10.100.10.250,24h
ejecuta
sudo systemctl start dnsmasq
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd
Y para RPI4 todavía necesitas hacer
sudo rfkill unblock wlan
reboot
sudo reboot
Instalamnos Node Red
Para RPI hay una solucion de los mismos rojos
https://nodered.org/docs/getting-started/raspberrypi
Solo tienes que ejecutar
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
Y para que arranque en boot
sudo systemctl enable nodered.service
Y es todo, entramos a http://111.222.33.44:1880 y hacemos lo que queremos
No diré que fue simple, pero un script simple para copiar de una unidad flash a otra está listo!
Aquí están los ladrillos.
Aquí el código
[{"id":"b44d7514.83389","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"54fb509b.2c2ed","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sda1m.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":370,"y":160,"wires":[["becfcd98.7c18f"],[],[]]},{"id":"e32b03af.b293f","type":"ui_text","z":"b44d7514.83389","group":"7f5c3aa5.c49854","order":0,"width":0,"height":0,"name":"","label":"Size of data:","format":"{{msg.payload}}Mb","layout":"row-left","x":1150,"y":160,"wires":[]},{"id":"58b931c3.744ac8","type":"ui_button","z":"b44d7514.83389","name":"","group":"7f5c3aa5.c49854","order":1,"width":0,"height":0,"passthru":false,"label":"Mount","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":130,"y":160,"wires":[["54fb509b.2c2ed"]]},{"id":"4de280ba.95e15","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"asize","vt":"str"},{"t":"cont","v":"label","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":730,"y":200,"wires":[["cea5bb16.b5a5a8"],["cedce86d.2aa818"]]},{"id":"cea5bb16.b5a5a8","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":870,"y":180,"wires":[["e32b03af.b293f"]]},{"id":"284f5a3e.56b85e","type":"ui_text","z":"b44d7514.83389","group":"7f5c3aa5.c49854","order":0,"width":0,"height":0,"name":"","label":"Label:","format":"{{msg.payload}}","layout":"row-left","x":1170,"y":220,"wires":[]},{"id":"cedce86d.2aa818","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":870,"y":220,"wires":[["284f5a3e.56b85e"]]},{"id":"becfcd98.7c18f","type":"split","z":"b44d7514.83389","name":"","splt":";","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":610,"y":200,"wires":[["4de280ba.95e15"]]},{"id":"54348537.5cdffc","type":"ui_button","z":"b44d7514.83389","name":"","group":"7f5c3aa5.c49854","order":3,"width":0,"height":0,"passthru":false,"label":"Un mount","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":140,"y":240,"wires":[["e2c3bf55.06fee"]]},{"id":"e2c3bf55.06fee","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sda1u.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":370,"y":240,"wires":[["becfcd98.7c18f"],[],[]]},{"id":"826e7da6.89bc","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sda2m.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":370,"y":340,"wires":[["5ca805f5.1e5734"],[],[]]},{"id":"ee6a802b.3ad798","type":"ui_text","z":"b44d7514.83389","group":"ec3ace8.c36b93","order":3,"width":0,"height":0,"name":"","label":"Free size:","format":"{{msg.payload}}Mb","layout":"row-left","x":1160,"y":340,"wires":[]},{"id":"baa5392d.c28648","type":"ui_button","z":"b44d7514.83389","name":"","group":"ec3ace8.c36b93","order":1,"width":0,"height":0,"passthru":false,"label":"Mount","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":130,"y":340,"wires":[["826e7da6.89bc"]]},{"id":"bda8585a.0472e8","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"asize","vt":"str"},{"t":"cont","v":"label","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":890,"y":420,"wires":[["6b20dc3b.1afd9c"],["ce94c5f1.65b9b"]]},{"id":"6b20dc3b.1afd9c","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1010,"y":340,"wires":[["ee6a802b.3ad798"]]},{"id":"9c0610b1.2325c8","type":"ui_text","z":"b44d7514.83389","group":"ec3ace8.c36b93","order":4,"width":0,"height":0,"name":"","label":"Label:","format":"{{msg.payload}}","layout":"row-left","x":1170,"y":460,"wires":[]},{"id":"ce94c5f1.65b9b","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1010,"y":460,"wires":[["9c0610b1.2325c8"]]},{"id":"bc7259c4.a27fd","type":"split","z":"b44d7514.83389","name":"","splt":";","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":770,"y":420,"wires":[["bda8585a.0472e8"]]},{"id":"3592ca8.0bf7db6","type":"ui_button","z":"b44d7514.83389","name":"","group":"ec3ace8.c36b93","order":2,"width":0,"height":0,"passthru":false,"label":"Un mount","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":140,"y":420,"wires":[["692f75d5.160f24"]]},{"id":"692f75d5.160f24","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sda2u.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":370,"y":420,"wires":[["bc7259c4.a27fd"],[],[]]},{"id":"154aa879.197de","type":"ui_button","z":"b44d7514.83389","name":"","group":"2fa9608d.2ce59","order":2,"width":0,"height":0,"passthru":false,"label":"Start copy","tooltip":"","color":"","bgcolor":"","icon":"","payload":"reset","payloadType":"str","topic":"","x":140,"y":560,"wires":[["7ee0395c.eba5b","611d713d.726e48"]]},{"id":"611d713d.726e48","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sdacopy.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":670,"y":620,"wires":[["44ed3481.f21c14"],[],[]]},{"id":"9abe71d5.48763","type":"ui_text","z":"b44d7514.83389","group":"2fa9608d.2ce59","order":3,"width":0,"height":0,"name":"","label":"","format":"Coping to USB IN to folder /{{msg.payload}}","layout":"row-left","x":1170,"y":520,"wires":[]},{"id":"fdd997bc.69107","type":"ui_gauge","z":"b44d7514.83389","name":"","group":"2fa9608d.2ce59","order":4,"width":0,"height":0,"gtype":"donut","title":"progress","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":640,"y":560,"wires":[]},{"id":"7ee0395c.eba5b","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sdaspeed.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":380,"y":560,"wires":[["fdd997bc.69107","a0ec9eaa.97de38"],[],[]]},{"id":"5ca805f5.1e5734","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sda2s.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":650,"y":320,"wires":[["bc7259c4.a27fd"],[],[]]},{"id":"207aabab.8d4fc4","type":"inject","z":"b44d7514.83389","name":"","topic":"null on start","payload":" ","payloadType":"str","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":170,"y":80,"wires":[["e32b03af.b293f","284f5a3e.56b85e","ee6a802b.3ad798","9c0610b1.2325c8","fdd997bc.69107","9abe71d5.48763"]]},{"id":"7fd33d21.b6d0dc","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sdatemp.sh","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":380,"y":680,"wires":[["3ad9aa64.4a2d8e"],[],[]]},{"id":"3ad9aa64.4a2d8e","type":"ui_text","z":"b44d7514.83389","group":"2fa9608d.2ce59","order":4,"width":0,"height":0,"name":"","label":"Rpi4","format":"{{msg.payload}}","layout":"row-left","x":590,"y":680,"wires":[]},{"id":"3b1fe249.a09c66","type":"inject","z":"b44d7514.83389","name":"","topic":"","payload":"","payloadType":"date","repeat":"5","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":680,"wires":[["7fd33d21.b6d0dc"]]},{"id":"a0ec9eaa.97de38","type":"exec","z":"b44d7514.83389","command":"bash /home/pi/sda2sup.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":670,"y":480,"wires":[["6b20dc3b.1afd9c"],[],[]]},{"id":"44ed3481.f21c14","type":"switch","z":"b44d7514.83389","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"pathonusb","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":890,"y":560,"wires":[["2ed432f3.bb44be"]]},{"id":"2ed432f3.bb44be","type":"split","z":"b44d7514.83389","name":"","splt":"#","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1010,"y":560,"wires":[["9abe71d5.48763"]]},{"id":"7f5c3aa5.c49854","type":"ui_group","z":"","name":"USB OUT","tab":"636d4846.38f48","order":1,"disp":true,"width":"6","collapse":false},{"id":"ec3ace8.c36b93","type":"ui_group","z":"","name":"USB IN","tab":"636d4846.38f48","order":2,"disp":true,"width":"6","collapse":false},{"id":"2fa9608d.2ce59","type":"ui_group","z":"","name":"Copy","tab":"636d4846.38f48","order":3,"disp":true,"width":"5","collapse":false},{"id":"636d4846.38f48","type":"ui_tab","z":"","name":"USB dublicator","icon":"dashboard","order":1,"disabled":false,"hidden":false}]
Es necesario instalar para la consola Linux
sudo apt-get install bc
También debería haber carpetas
/mnt/usb1
/mnt/usb2
Y en Node-Red en sí mismo necesita instalar node-red-dashboard
Todo se basa en un ladrillo exec , que ejecuta un script bash, ¡no puede ejecutar comandos de Linux directamente! ¡Entonces necesitamos scripts bash!
En la carpeta /home/pi/ crea scripts siguientes
sda1m.sh - este script monta la primera unidad flash desde la que copiaremos, después de hacer clic en el botón. ¡Y ademas comprueba si el lugar para montar es libre y no importa qué letra haya recogido la unidad flash!
#!/bin/bash for m1 in $( ls /dev/sd*[0-9]* ) do if df -h | grep /mnt/usb1 then echo "busy" break else sudo mount $m1 /mnt/usb1 label=`lsblk -o mountpoint,label| grep /mnt/usb1|awk '{print $2}'` frees=`du -sm --exclude='.Trash*' /mnt/usb1| awk '{print $1}'` echo "label#"$label";asize#"$frees break fi done
¡De sí mismo, este script lanza una línea con datos sobre el tamaño de los datos y la etiqueta de la unidad flash!
sda1u.sh - este script simplemente desmonta la unidad flash después de hacer clic en el botón
#!/bin/bash sudo umount /mnt/usb1 echo "label#no usb flash;asize#0"
sda2m.sh - este script monta la segunda unidad flash
#!/bin/bash if df -h | grep /mnt/usb2 then echo "Busy" else sdam=`df -h | grep usb1 | awk '{print $1}'` for m1 in $( ls /dev/sd*[0-9]* ) do if [ $m1 != $sdam ] then sudo mount $m1 /mnt/usb2 fi done fi
sda2s.sh - seguido de un script que brinda información sobre la ubicación y la etiqueta disponibles de la unidad flash
#!/bin/bash m1=`df -h | grep /mnt/usb2|awk '{print $1}'` label=`lsblk -o mountpoint,label| grep /mnt/usb2|awk '{print $2}'` frees=`df -m|grep $m1 | awk '{print $4}'` echo "label#"$label";asize#"$frees
El script está especialmente dividido.
sda2u.sh - este script simplemente desmonta la unidad flash después de hacer clic en el botón
#!/bin/bash sudo umount /mnt/usb2 echo "label#no usb flash;asize#0"
Es bueno que para desmontar solo necesite saber el nombre de la carpeta, no el dispositivo
Los siguientes son los ladrillos responsables de copiar
sdacopy.sh : con solo hacer clic en un botón, busca ver si hay unidades flash y comienza a copiar en una nueva carpeta con el nombre de la fecha en que comenzó la copia.
#!/bin/bash if df -h | grep /mnt/usb1 then if df -h | grep /mnt/usb2 then pathnew=`date +"%Y%m%d%H%M%S"` echo "pathonusb#"$pathnew sudo mkdir /mnt/usb2/$pathnew #sudo cp -rf /mnt/usb1/* /mnt/usb2/$pathnew sudo rsync -av --exclude=".\Tra*" /mnt/usb1/* /mnt/usb2/$pathnew fi fi
sdaspeed.sh - maravilloso script, dibuja progres bar. Supervisa el tamaño del espacio ocupado en la unidad flash, conoce el tamaño de los datos que deben copiarse. Pero de todos modos, es solo para visualización.
#!/bin/bash fsize=`du -s --exclude='.Trash*' /mnt/usb1| awk '{print $1}'` frees=`df -k | grep /mnt/usb2 | awk '{print $3}'` fres=0 ndelay=0 echo $fres while [ $fres -lt 100 ]; do fresold=$fres frees2=`df -k | grep /mnt/usb2 | awk '{print $3}'` fres=`echo "(100*($frees2-$frees))/$fsize" | bc` if [ $fres -gt 100 ] then fres=100 fi if [ $fres -eq $fresold ] then let ndelay++ if [ $ndelay -gt 500 ] then fres=100 fi else ndelay=0 fi echo $fres done
Y el script sda2sup.sh que actualiza el espacio libre en la segunda unidad flash se ejecuta junto con sdaspeed.sh
#!/bin/bash m1=`df -h | grep /mnt/usb2|awk '{print $1}'` frees=`df -m|grep $m1 | awk '{print $4}'` echo "asize#"$frees
Y el último script sdatemp.sh con un comando para mostrar la temperatura de la frambuesa
#!/bin/bash vcgencmd measure_temp
¿Cómo funciona el duplicador de unidad flash?
Vamos a la direccion http://111.222.33.44:1880/ui/
1. Insertamos la primera unidad flash en una de los ports USB azules - hicimos clic en el botón USB OUT MOUNT - no funcionará de inmediato, espere. Y no pulse inmediatamente después de pegar la unidad flash, no aparece inmediatamente en el sistema
2. Inserte la segunda unidad flash USB en uno de los conectores azules: haga clic en el botón USB IN MOUNT
3. Luego, cuando aparezcan todas las unidades flash, haga clic en el botón COPIAR INICIAR COPIA
Y ves esp
Cuando se llegó al 100%, la copia se completó exactamente
Conéctese a un duplicador USB a través de Wi-Fi
¡Todo para esto ya está listo!
Conectate a la red Wi-Fi itcooky
Vaya a 10.100.10.1:1880/ui
Y vemos nuestra interfaz, podemos copiar:
Uf, ya que todo funciono, debes cerrar el panel de administración de Node-Red con una contraseña!
Hay que instalar
npm install bcryptjs
vamos a
cd /home/pi/.node-red
Generamos contraseñas cifrada
node -e "console.log(require('bcryptjs').hashSync(process.argv[1], 8));" your-password-here
Y en el archivo settings.js
vi /home/pi/.node-red/settings.js
encontramos las líneas y descomentamos que debería ser así, con su propio kryakazabra en lugar de contraseña
adminAuth: { sessionExpiryTime: 86400, type: "credentials", users: [{ username: "admin", password: "$2a$08$ToLl/u9QXxbIWcP2Xjsul.fTgujmnDjVLAgyOwpxNtIRU7TWr.XBu", permissions: "*" }] },
Reiniciar node-Red
sudo service nodered restart
Y vaya bajo su contraseña, inicie sesión admin
Deja una respuesta