Function para retornar todos os IPs de um range

Esses tempos tive a necessidade de obter uma lista de todos os ips contidos em um range.

Se fossem somente ranges /24 seria muito fácil, porém para o sistema que eu estava desenvolvendo havia necessidade de escalabilidade, podendo ser inserido qualquer range como /16 /30 /28, etc.

Depois de procurar muito no oráculo google achei algo que se aproximava do que eu precisava, a classe net/ipv4 do PEAR, eu digo que se aproximava porque ela retorna o primeiro e o último IP de qualquer range, mas não a lista completa.

Com a classe ipv4 em mãos, resolví escrever a function abaixo que me retorna a lista completa:

function calculateIpRange($cidr) {
        $cidr = trim($cidr);
        if(!preg_match("/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/[0-9]{1,2}/", $cidr)){
                return Array(false, 'O IP deve estar no formato XXX.XXX.XXX.XXX/XX --> Exemplo 192.168.0.50/28');
        }
        if([email protected]_once 'Net/IPv4.php')
        {
                return Array(false, 'Classe Net_IPv4 não está instalada --> http://pear.php.net/package/Net_IPv4/');
        }

        if(!is_callable('Net_IPv4', 'parseAddress'))
        {
                return Array(false, 'Metodo Net_IPv4::parseAddress inexistente');
        }
        $ip_calc = Net_IPv4::parseAddress($cidr);
        if($ip_calc->message)
        {
                return Array(False, $ip_calc->message);
        }

        $s = sprintf("%u",ip2long($ip_calc->network));
        $e = sprintf("%u",ip2long($ip_calc->broadcast));
        for($i=$s;$i<=$e;$i++){
                $r[] = long2ip($i);
        }
        return Array(
                true,
                'info' => Array(
                        'total' => sizeof($r),
                        'source'        => $cidr,
                        'network' => $ip_calc->network,
                        'broadcast' => $ip_calc->broadcast,
                        'netmask'       => $ip_calc->netmask
                ),
                'data' => $r
        );
}

NOTA: Este método necessita da classe net/ipv4 do pear instalada no servidor, o que pode ser realizado com o comando abaixo:

pear install Net_IPv4-1.3.4

Na dúvida, consulte seu provedor para instalação da mesma no servidor 😉

———————————————-
Posted Listening: “Starblind – Iron Maiden”

Visualizar todas as chaves estrangeiras (foreign keys) do banco de dados

SQL Pra listar todas as chaves estrangeiras criadas

select
CONSTRAINT_NAME as 'foreign_name',
concat(table_name, '.', column_name) as 'foreign _key',
concat(referenced_table_name, '.', referenced_column_name) as 'references'
from
information_schema.key_column_usage
where
referenced_table_name is not null;

OBS: Deve ter um jeito mais fácil, mas esse quebra bem o galho 😉

———————————————-
Posted Listening: “Hot for Teacher – Van Hallen”

Instalar Módulos PERL

Sempre que me deparava erros como o abaixo em um perl, quase chorava, agora graças ao totoro ficou bem simples!

Exemplo de erro:

Can’t locate FCGI.pm in @INC (@INC contains: /etc/perl /usr/lib64/perl5/site_perl/5.12.3/x86_64-linux /usr/lib64/perl5/site_perl/5.12.3 /usr/lib64/perl5/vendor_perl/5.12.3/x86_64-linux /usr/lib64/perl5/vendor_perl/5.12.3 /usr/lib64/perl5/site_perl /usr/lib64/perl5/vendor_perl /usr/lib64/perl5/5.12.3/x86_64-linux /usr/lib64/perl5/5.12.3 /usr/local/lib/site_perl .) at /usr/local/bin/fastcgi-wrapper.pl line 3.
BEGIN failed–compilation aborted at /usr/local/bin/fastcgi-wrapper.pl line 3

Solução:

perl -eshell -MCPAN
install FCGI

OBS: Case sensitive (sim, tive problema com isso :P)

———————————————-
Posted Listening:  “Back to Madness – Stratovarius”