HowTo e Doc Vari

Raccolta di howto, informazioni, consigli, trucchi e documentazione di varia utilità per ricordare tante cose utili

lunedì 22 marzo 2010

Comandi utili per la "pulitura" di un Linux Gentoo

Anche in un sistema performante come Linux e controllabile come la distribuzione Gentoo può succedere che sul disco si accumulino dei pacchetti, o delle loro versioni, non più utili e che occupano inutilmente spazio su disco.
Di seguito saranno elencati alcuni tools e trucchi per "ripulire" un sistema Gentoo Linux da questi pacchetti non più utili.

Come prima operazione è utile eliminare tutti i pacchetti che non siano richiesti per il funzionamento di altri package o che non siano richiesti esplicitamente dall'utente (mediante il comando emerge); generalmente sono package di dipendenze richiesti da pacchetti ormai non più installati. Il comando per compiere questa operazione è:
emerge -pv --depclean
Puo tornare utile ricordare che La lista dei pacchetti esplicitamente instatllati dall'utente è contenuta nel file 
/var/lib/portage/world
da notare che tale file non contiene i file installati come dipendenze ma solo quelli esplicitamente richiesti con emerge.

IMPORATNTE:
Prima di effettuare un depclean è necessario verificare che il profilo del gcc sia impostato su quello più recente impostato sul sistema con il comando
gcc-config -l

venerdì 26 febbraio 2010

(MOVED) Uso di Bluez 4.xx in Gentoo Linux

Si vuole illustrare la configurazione di un sistema Gentoo Linux per utilizzare un dispositivo bluetooth con il pacchetto Blue-z nella versione 4.xx

Questo post è stato spostato su:

http://freeehowto.wordpress.com/2010/04/30/uso-di-bluez-4-xx-in-gentoo-linux/

giovedì 11 febbraio 2010

VirtualBox: Montare una cartella condivisa in un guest Ubuntu

VirtualBox, l'applicazione di virtualizzazione open source di Sun, permette di impostare delle cartelle condivise tra sistema host e sistema guest. Sul sistema host le cartelle si condividono con gli appositi menu di configurazione di ciascuna virtual machine di VirtualBox; al momento della condivisione della cartella gli si assegna un nome, ad esempio CARTELLACONDIVISA
Se come guest c'è installato un sistema Ubuntu (o più in generale Linux) per montare la cartella condivisa va dato il comando:
sudo mkdir /mnt/SharedWin
sudo mount.vboxsf CARTELLACONDIVISA /mnt/SharedWin
Da far notare che sul sistema guest devono essere installate le VirtualBox Addition

giovedì 4 febbraio 2010

Realizzazione di un TCP server multithread in linguaggio C, C++

La parte iniziale del programma deve contenere gli include necessari per l'uso dei socket:
#include
#include
#include
#include

int main(int argc, char *argv[])
{
    int sockfd;
    int newsockfd = 0;
    struct sockaddr_in serv_addr, cli_addr;
si crea il socket per il server
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if ( sockfd < 0 ) {
        perror("FATAL: Impossibile aprire il listener TCP");
        exit(1);
    }
si esegue il bind sull'indirizzo/porta voluto
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(0x4bfc);
    if ( bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 ) {
        perror("FATAL: Impossibile effettuare il bind del listener TCP");
        exit(1);
    }
e lo si pone in ascolto 
    listen(sockfd,5);
a questo punto per ogni nuova connessione entrante accettata si crea uno thread specifico che la gestisce. E' necessario attendere di essere sicuri che il nuovo thread abbia preso in carico il valore del socket da usare per la comunicazione.
    while( true ) {
        socklen_t clilen = sizeof(cli_addr);
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        if ( newsockfd < 0 ) {
            perror("Nuova connessione non creata");
        } else {
            pthread_t pTh;
            pthread_create(&pTh, NULL, InitiateThreadTCP, (void *)newsockfd);
            pthread_detach(pTh);
            int maxsleep = 1000;
            while (newsockfd > 0 && maxsleep > 0) {
                usleep(1000);
                maxsleep--;
            }
        }
    }
la funzione di gestine della comunicazione è la seguente, bisogna ricordarsi di definirla all'inizio del file prima del main.
void * InitiateThreadTCP( void *p )
{
    int sck = &(int *)p;
    char rbuffer[1000];
    char sbuffer[1128];
 
    int n = read(sck, rbuffer, 1022);
    if (n >= 0) {
        rbuffer[n] = 0;
        sprintf(sbuffer, "Ricevuto messaggio: %s ", rbuffer);
        write(sck, sbuffer, strlen(sbuffer));
    }
    close(sck);
    pthread_exit( NULL );
}
Di seguito il sorgente completo
#include
#include
#include
#include

void * InitiateThreadTCP( void *p )
{
    int sck = &(int *)p;
    char rbuffer[1000];
    char sbuffer[1128];
 
    int n = read(sck, rbuffer, 1022);
    if (n >= 0) {
        rbuffer[n] = 0;
        sprintf(sbuffer, "Ricevuto messaggio: %s ", rbuffer);
        write(sck, sbuffer, strlen(sbuffer));
    }
    close(sck);
    pthread_exit( NULL );
}

int main(int argc, char *argv[])
{
    int sockfd;
    int newsockfd = 0;
    struct sockaddr_in serv_addr, cli_addr;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if ( sockfd < 0 ) {
        perror("FATAL: Impossibile aprire il listener TCP");
        exit(1);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(0x4bfc);
    if ( bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 ) {
        perror("FATAL: Impossibile effettuare il bind del listener TCP");
        exit(1);
    }
 
    listen(sockfd,5);

    while( true ) {
        socklen_t clilen = sizeof(cli_addr);
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        if ( newsockfd < 0 ) {
            perror("Nuova connessione non creata");
        } else {
            pthread_t pTh;
            pthread_create(&pTh, NULL, InitiateThreadTCP, (void *)newsockfd);
            pthread_detach(pTh);
            int maxsleep = 1000;
            while (newsockfd > 0 && maxsleep > 0) {
                usleep(1000);
                maxsleep--;
            }
        }
    }

    exit(0);
}

Sapere se una directory è un mountpoint da script bash

Il comando mountpoint è un comando presente su molte distribuzioni recenti di Linux che ci permette di sapere se una certa directory è un mountpoint; l'uso delllo switch -q inoltre permette di eseguire il comando senza che generi alcuna uscita nell stdout in modo da usare il comando solo per il suo exit status:
  • == 0 se la directory testata è un mountpoin
  • != 0 se la directory testata NON è un mountpoint
Un esempio di script bash per l'uso del comando è il seguente:

#!/bin/bash
mountpoint -q $1
if [ $? == 0 ]
then
    echo "$1 is è un mountpoint"
else
    echo "$1 non è un mountpoint"
fi

venerdì 29 gennaio 2010

Password di admin persa in osCommerce

Sviluppando su osCommerce può succedere di perdere la password di amministratore. Qui di seguito viene elencata una possibile procedura per recuperarne l'accesso.

Per prima cosa è necessario modificare il file admin/login.php. Alla linea 29 circa (almeno per la versione 2.2RC) troviamo un'istruzione del tipo
if (tep_validate_password($password, $check['user_password'])) {
è necessario commentarla e sostituirla con l'istruzione
if(true) {
A questo punto andando sulla pagina di amministrazione sarà possibile effettuare l'accesso semplicemente inserendo uno username di amministrazione valido senza che la password venga controllata. Se necessario è possibile recuperare lo Username andando sul database di osCommerce guardando nella tabella administrators il campo user_name.

Una volta connessi come amministratori è possibile modificare a piacimento gli account di amministrazione e quindi reimpostare la password.

Al termine bisogna ricordarsi di ripristinare il login.php originale per eveitare pericolose falle di sicurezza del sistema.

martedì 26 gennaio 2010

Utilizzo del comando "ssmtp" con Gmail

Quando su un sistema linux non abbiamo necessità di ricevere mail possiamo evitare le difficolta ed il lavoro ceh comporta l'installazione di un smtp server quale ad esempio sendmail, ricorrendo per l'invio al comando ssmtp.
Come primo passo è necessario installare il programma: su un sistema ubuntu utilizziamo il comando
sudo apt-get install ssmtp
se invece si utilizza un sistema gentoo si deve date il comando
emerge mail-mta/ssmtp

La configurazione si trova nel file /etc/ssmtp/ssmtp.conf ed è sostanzialmente composta da 5 linee:
root=mioindirizzo@gmail.com
mailhub=smtp.gmail.com:587
AuthUser=miogmailusername
AuthPass=miogmailpassword
UseSTARTTLS=YES

Si deve ora creare il file con il contenuto della mail. Il file deve contenere tre linee di intestazione con i campi To, From e Subject, seguiti da una linea vuota e dal testo del messaggio. Di seguito un esempio
To: destinatario@tin.it
From mioindirizzo@gmail.com
Subject: Oggetto del messaggio

Qui dopo una linea vuota inserisco il testo del messaggio

A questo punto si può inviare la mail dando il comando:
ssmtp destinatario@tin.it < msg.txt