Archivi categoria: Linux

Come aggiungere spazio ad un disco di una VM sotto PVE

Di seguito quello che ho fatto per ampliare da 32 a 64GB lo spazio della mia macchina repository di immagini docker

[23059.572021] sd 2:0:0:0: [sda] 134217728 512-byte logical blocks: (68.7 GB/64.0 GiB)
[23059.573015] sda: detected capacity change from 67108864 to 134217728

root@docker:~# parted /dev/sda
GNU Parted 3.4
Using /dev/sda
Welcome to GNU Parted! Type ‘help’ to view a list of commands.
(parted) print
Warning: Not all of the space available to /dev/sda appears to be used, you can fix the GPT to use all of the space (an extra 67108864
blocks) or continue with the current setting?
Fix/Ignore? f
Model: QEMU QEMU HARDDISK (scsi)
Disk /dev/sda: 68.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB bios_grub
2 2097kB 34.4GB 34.4GB ext4

(parted) resizepart 2 100%
Warning: Partition /dev/sda2 is being used. Are you sure you want to continue?
Yes/No? y
(parted) print
Model: QEMU QEMU HARDDISK (scsi)
Disk /dev/sda: 68.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB bios_grub
2 2097kB 68.7GB 68.7GB ext4

(parted) quit
Information: You may need to update /etc/fstab.

root@docker:~# resize2fs /dev/sda2
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 8
The filesystem on /dev/sda2 is now 16776699 (4k) blocks long.

root@docker:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 198M 1.3M 197M 1% /run
/dev/sda2 63G 28G 33G 47% /
tmpfs 988M 0 988M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 198M 4.0K 198M 1% /run/user/1000
overlay 63G 28G 33G 47% /var/lib/docker/overlay2/c3e70e17d7f859993c39376e66c91ac89099a1336d6bd5a577c701d3f687c921/merged
shm 64M 0 64M 0% /var/lib/docker/containers/677cfe3fd4c993f9a9f0ad650370d105bcc4c3c0e2ee46d012835b0348fdde31/mounts/shm

Piwigo e caricamento bulk

Non ho resistito…

ho messo da parte il mio scriptino bash basilare per passare ad uno script “più meglio assai di più” (forse) in python, che fa la stessa cosa, ma anche di più in quanto è ricorsivo.

Le immagini (per evitare spechi di banda e di spazio) sono ridotte, croppate ed aggiunto il bordino bianco che fa tanto anni 80!

#!/usr/bin/python3
import PythonMagick as Magick
from ftplib import FTP_TLS
import sys, os
import os.path
from pathlib import Path
 
def resize_and_crop(directory, photo):
    """
    Resize and crop image
    :param filename
    """
    img = Magick.Image(directory+'/'+photo)

    img.crop("4200X2800+20+20")
    img.resize("1600x1000");
    img.enhance() #full compression
    img.borderColor("white") #full compression
    img.border("20x20+0+0") #full compression
    img.magick('JPG')
    img.write('/tmp/'+photo)


if len(sys.argv) < 2:
    print("Devi passare il nome della directory da inviare allo script!")
    print("Sto uscendo...")
    sys.exit()

nome_script, directory_immagini = sys.argv

rootfs="/home/user/Immagini/"+directory_immagini
destdir="/public_html/photo/galleries/"+directory_immagini

if (os.path.isdir(rootfs) == False):
    print("Devi esistere il nome della directory da inviare allo script!")
    print("Sto uscendo...")
    sys.exit()
    
ftps = FTP_TLS('ftp.sito.com')
ftps.set_debuglevel(1)
ftps.set_pasv(True)
ftps.connect(port=21, timeout=80)
ftps.login('userid', 'password')
ftps.prot_p()
ftps.ccc()
try:
       ftps.cwd(destdir)
except Exception:
       ftps.mkd(destdir)
for (dir, _, files) in os.walk(rootfs):
       newdir=destdir+dir[len(rootfs):len(dir)]
       try:
               ftps.cwd(newdir)
       except Exception:
               ftps.mkd(newdir)
               ftps.cwd(newdir)
               print('Created new dir on remote')
       for f in files:
           head, tail = os.path.split(f)
           print(newdir)
           ftps.cwd(newdir)
           try:  
               print(ftps.size(f))
           except Exception:
                   resize_and_crop(dir, f)
                   file = open(os.path.join('/tmp', f),'rb')
                   cur_dir=(os.path.abspath(os.curdir))
                   os.chdir("/tmp")
                   ftps.set_debuglevel(1)
                   ftps.storbinary('STOR '+f, file,blocksize=8192)
                   ftps.set_debuglevel(0)
                   os.chdir(cur_dir)
                   file.close()
                   os.remove(os.path.join('/tmp', f))
ftps.close()

E uno script quick and dirty, ma sono interessanti gli utilizzi della libraria PythonMagick che consente di utilizzare da python i pacchetti grafici di ImageMagick e l’utilizzo di FTPS (come già riportato in un post precedente) per l’invio delle foto in sicurezza.. o quasi.

Per PythonMagic ho avuto alcuni problemi in quanto i sorgenti sono fermi alla version 2 di python, ma per fortuna sul repository di Ubuntu era disponibile il pacchetto python3-pythonmagick che mi ha tolto dall’impasse.

Cercando sulla rete NON HO TROVATO alcun documento che mi fornisse indicazioni su come utilizzare la libreria PythonMagick. Tuttavia seguendo diverse indicazioni che ho trovato, mi sono basato sugli esempi e note di Magick++ la controparte in C++ di Python l’utilizzo delle librerie di ImageMagick.

Aggiungere un .png ad un PDF

Avrò cercato ed utilizzato un numero esagerato di volte come porre una firma “digitale” ad un documento sotto Ubuntu, ma ogni volta lo dimentico !

Usando xournal gli step da seguire sono i seguenti:

  • Installare xournal
  • Eseguire xournal
  • Selezionare “Annota PDF” dal menu File e selezionare il file PDF da “firmare”.
  • Click l’icona “Imagine” nella toolbar (sembra la silhouette di una persona).
  • Click sul documento ed appare la finestra di selezione del file grafico da inserire.
  • Selezionare il file PNG che contiene la firma.
  • Ridimensionare e posizionarle il file grafico all’interno del PDF.
  • Selezionare “Esporta in PDF” dal menu di File.

Aggiornamento PostgreSQL

l’aggiornamento di PostgreSQL dalla versione 11 alla 12 (per esempio)può essere fatto con i soliti

sudo apt-get update
sudo apt-get install postgresql-12 postgresql-server-dev-12

installando il nuovo pacchetto e modificando i file

/etc/postgresql/11/main/postgresql.conf
/etc/postgresql/12/main/postgresql.conf

modificando le porte, ma i dati ?
Dopo aver stoppato il servizio con un

sudo systemctl stop postgresql.service

eseguire questo comando come utente postgres

sudo su postgres
/usr/lib/postgresql/12/bin/pg_upgrade \
  --old-datadir=/var/lib/postgresql/11/main \
  --new-datadir=/var/lib/postgresql/12/main \
  --old-bindir=/usr/lib/postgresql/11/bin \
  --new-bindir=/usr/lib/postgresql/12/bin \
  --old-options '-c config_file=/etc/postgresql/11/main/postgresql.conf' \
  --new-options '-c config_file=/etc/postgresql/12/main/postgresql.conf' \
  --check

una volta che tutto è a posto, possiamo eseguire la migrazione rieseguendo il comando di prima, ma SENZA il –check, cioè

/usr/lib/postgresql/12/bin/pg_upgrade \
  --old-datadir=/var/lib/postgresql/11/main \
  --new-datadir=/var/lib/postgresql/12/main \
  --old-bindir=/usr/lib/postgresql/11/bin \
  --new-bindir=/usr/lib/postgresql/12/bin \
  --old-options '-c config_file=/etc/postgresql/11/main/postgresql.conf' \
  --new-options '-c config_file=/etc/postgresql/12/main/postgresql.conf'

Avremo in questo modo fatto il dump del db, verificato la configurazioe ed importati i db della 11.

Ora si possono modificare i file di configurazione postgresql.conf e mettere le porte giuste.
Far ripartire il db con

sudo systemctl start postgresql.service

e verificare quale versione di postgresql è in esecuzione con questi comandi

sudo su postgres
psql -c “SELECT version();”
./analyze_new_cluster.sh
exit

infine fare un pò di pulizia

apt list –installed | grep postgresql
sudo apt-get remove postgresql-11 postgresql-server-dev-11
sudo rm -rf /etc/postgresql/11/
sudo su postgres
./delete_old_cluster.sh

Fatto !

Reinstallazione OCI

Dopo aver fatto l’aggiornamento ad Ubiuntu 20.04 lts, mi sono reso conto che non funzionava più la mia paginetta web che prendeva i dati dal db oracle.

Il problema, probabilmente, durante la fase di avanzamento della versione, qualcosa non è andata come doveva.

Prima un bel

pecl channel-update pecl.php.net

per aggiornare come riportato

WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update

poi con

pecl install oci8

ho iniziato la compilazione ed ho inserito

instantclient,/usr/lib/oracle/19.3/client64/lib/

quando mi ha chiesto il path delle librerie, ed alla fine

Build process completed successfully
Installing ‘/usr/lib/php/20190902/oci8.so’
install ok: channel://pecl.php.net/oci8-2.2.0
configuration option “php_ini” is not set to php.ini location
You should add “extension=oci8.so” to php.ini
# vi /etc/php/7.4/cli/php.ini
# vi /etc/php/7.4/apache2/php.ini
# systemctl restart apache2.service

e tutto è andato a posto.

do-release-upgrade e screen

Stavo facendo l’aggiornamento e la connessione cade: per fortuna screen era in esecuzione:

# screen -list
There is a screen on:

2184.ubuntu-release-upgrade-screen-window   (09/29/2020 02:38:06 PM)    (Detached)

1 Socket in /run/screen/S-root.

e con il magioco

# screen -d -r root/2184.ubuntu-release-upgrade-screen-window

tutto è stato recuperato!

Telegram e public ChatID

Avendo creato un piccolo bot con Telegram, avevo il bisogno di inviare su di un gruppo le elaborazioni dei consumi elettrici. Trovare la chatID “uno ad uno” è facile, mentre la chatID di un gruppo pubblico è più complicata.

In ogni caso:

  1. Aggiungere il BOT al gruppo
  2. ottenere gli aggiornamenti del BOT tramite:
    https://api.telegram.org/bot<YourBOTToken>/getUpdates
    per esempio
    https://api.telegram.org/bot123456789:pippopippopippopippo/getUpdates
  3. il campo”chat” riporta l’ID che ci interessa:
    {“update_id”:8393,”message”:{“message_id”:3,”from”:{“id”:7474,”first_name”:”AAA”},”chat”:{“id”:-999999,”title”:””},”date”:25497,”new_chat_participant”:{“id”:71,”first_name”:”NAME”,”username”:”YOUR_BOT_NAME”}}}
    se invece ottieni
    {“ok”:true,”result”:[]}
    devi provare ad inviare un comando anche errato (per esempio /test) sul canale del BOT per ottenere l’ID che DEVE essere NEGATIVO (con il segno – davanti) altrimenti la chat indicata non è di gruppo.

Verifica Freeradius

stavo installando un nuovo server FreeRadius e dovevo verificare il corretto funzionamento.

In teoria andrebbe bene anche il semplice

radtest userid password 127.0.0.1 10 testing123

Ma la configurazione del server impone anche l’uso di attributi per l’autenticazione, nel mio caso il Calling-Station-Id

Ho perso diverso tempo, poi ho trovato la soluzione:

echo "User-Name=userid,User-Password=password,Calling-Station-Id=statioid,Framed-Protocol=PPP " | radclient localhost:1812 auth testing123

Come creare una semplice mappa (con segnaposto) usando OpenLayers ?

Questo tutorial si basasu OpenLayers Quick Start Guide e OpenLayers Popup Example ed è riferito alla versione 5.3.0 della libreria. Controlla se è presente una versione aggiornata.

Includi lo stylesheet di OpenLayers nella sezione <head> della tua pagina HTML.

<link rel="stylesheet" href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" type="text/css">

Includ la libreria in Javascript di OpenLayers alla fine della sezione <body> del tuo HTML

<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>

Inserisci un elemento <div id="map"> dove deve trovarsi la mappa

 <div id="map" style="width: 600px; height: 400px;"></div>

Ora puoi aggiugere una sezione <script> alla fine della sezione <body>  (dopo lo <script> che carica la libreria JavaScript OpenLayers). Tutto il seguente JavaScript deve trovarsi nella sezione <script.

Inizializza la mappa con la base dei dati del Belgio

 var attribution = new ol.control.Attribution({
     collapsible: false
 });

 var map = new ol.Map({
     controls: ol.control.defaults({attribution: false}).extend([attribution]),
     layers: [
         new ol.layer.Tile({
             source: new ol.source.OSM({
                 url: 'https://tile.openstreetmap.be/osmbe/{z}/{x}/{y}.png',
                 attributions: [ ol.source.OSM.ATTRIBUTION, 'Tiles courtesy of <a href="https://geo6.be/">GEO-6</a>' ],
                 maxZoom: 18
             })
         })
     ],
     target: 'map',
     view: new ol.View({
         center: ol.proj.fromLonLat([4.35247, 50.84673]),
         maxZoom: 18,
         zoom: 12
     })
 });

Devi aggiungere un segnaposto per un luogo

 var layer = new ol.layer.Vector({
     source: new ol.source.Vector({
         features: [
             new ol.Feature({
                 geometry: new ol.geom.Point(ol.proj.fromLonLat([4.35247, 50.84673]))
             })
         ]
     })
 });
 map.addLayer(layer);

Devi creare una nuova sezione <div id="popup"> dopo l’elemento <div id="map">

 <div id="popup" class="ol-popup">
     <a href="#" id="popup-closer" class="ol-popup-closer"></a>
     <div id="popup-content"></div>
 </div>

Inizializza il popup (il seguente codice JavaScript deve essere inserito nella sezione<script>)

 var container = document.getElementById('popup');
 var content = document.getElementById('popup-content');
 var closer = document.getElementById('popup-closer');

 var overlay = new ol.Overlay({
     element: container,
     autoPan: true,
     autoPanAnimation: {
         duration: 250
     }
 });
 map.addOverlay(overlay);

 closer.onclick = function() {
     overlay.setPosition(undefined);
     closer.blur();
     return false;
 };

Add the function to open the popup when you click on the marker

 map.on('singleclick', function (event) {
     if (map.hasFeatureAtPixel(event.pixel) === true) {
         var coordinate = event.coordinate;

         content.innerHTML = '<b>Hello world!</b><br />I am a popup.';
         overlay.setPosition(coordinate);
     } else {
         overlay.setPosition(undefined);
         closer.blur();
     }
 });

Di default, il popup si aprirà clickando sl segnaposto. Se vuoi che il popup si apre non appena la mappa viene caricata, basterà aggiungere


 content.innerHTML = '<b>Hello world!</b><br />I am a popup.';
 overlay.setPosition(ol.proj.fromLonLat([4.35247, 50.84673]));

Qui puoi vedere il risultato

Testo adattato con origine di : https://openstreetmap.be/en/projects/howto/openlayers.html

Mail senza mail

Ho avuto l’esigenza di testare la funzionalità di un mailrelay, ma senza che la macchina client disponesse del pacchetto mail:

per ovviare al problema i comadi da lanciare sono pochi e semplici:

$ telnet mailrelay smtp
Connected to mailrelay.
Escape character is ‘^]’.
220 mailrelay ESMTP Exim 4.90_1
HELO mailrelay
250 mailrelay Hello mailrelay [mailrelay]
mail from: user@domain.com
250 OK
rcpt to: user2@otherdomain.com
250 Accepted
data
354 Enter message, ending with “.” on a line by itself
This is test email only

Thanks
.

250 OK id=1j6umb-0005ko-VZ
quit
221 mailrelay closing connection
Connection closed by foreign host.
$

Fatto !