Olah Lista,

Gracas a ajuda de vcs consegui resolver o problema do login simultaneo,
resolvi rodando um script em Perl que o colega Roberth enviou, gostaria
de agradece-lo desde jah.
O script Autoriza.sh eu encontri no histohrico da lista.

Um script chamado "Autoriza.sh" roda de dentro do arquivo "useres" do
radius,
ele, por sua vez, roda um comando um script Perl chamado "radwhocgi.pl",
esse comando do script Perl retorna se o usuahrio jah estah logado.

Segue abaixo os arquivos envolvidos na solicao:

>>>> Users  <<<<<
# First setup all accounts to be checked against the UNIX /etc/passwd.
# (Unless a password was already given earlier in this file).
#
DEFAULT Service-Type = Framed-User
        Framed-Protocol = PPP,
#        Framed-IP-Adress = 255.255.255.254,
#        Framed-Netmask = 255.255.255.255,
#        Framed-Routing = Broadcast,
        Framed-Compression = Van-Jacobson-TCP-IP,
        Framed-MTU = 1500,
        Fall-Through = Yes,
        Exec-Program-Wait = "/etc/raddb/autoriza.sh %u %i %s %n %p",
        Fall-Through = 1

DEFAULT Auth-Type = System
        Fall-Through = 1
#


>>>>> Autoriza.sh <<<<<
#!/bin/sh

#################################################################
# Script de valida��o de usu�rio.                               #
# by Marcelo Watson (c) 2000 V.1.0 - 21/06/200                  #
# Acionado pelo Radius em /etc/raddb/users                      #
#################################################################

#################################################################
# Cria arquivo de log /tmp/autoriza.log se n�o existir.         #
#################################################################
if [ ! -f /var/log/autoriza.log ]
then
        touch /var/log/autoriza.log
        chmod 777 /var/log/autoriza.log
fi

#################################################################
# Testa logins duplicados                                       #
# Verifica se usuario tem permiss�o de logar mais de uma vez    #
# simultaneamente. Se n�o, grava log no /tmp/autoriza.log.      #
#################################################################

# Deixa acessar quem estiver no arquivo "duplicaveis"

DUP=`grep ^$1: /etc/raddb/duplicaveis | wc -l`
if [ $DUP -eq 0 ]
then
  # Trava login duplicado
  TRAV=`perl /etc/raddb/radwhocgi.pl | grep $1 | wc -l`
  if [ $TRAV -ne 0 ]
  then
    echo `date +%d/%m/%y-%H:%M`"-$1-Tentou duplo login de" >>
/var/log/autoriza.log
    exit 1
  fi
fi

########################################
# SE TUDO CORRER BEM AUTORIZA O USUARIO#
########################################
exit 0

>>>>> radwhocgi.pl <<<<<

#******* INICIO *******

#!/usr/bin/perl

use POSIX;
use Socket;

sub who {

my($utmpsize, $utmpfile, %proto, $i);
my($login, $nas_port, $session_id, $nas_address, $framed_address);
my($protocol, $time, $delay, $type, @info, $j, $name, $from);
my($location, $host, $tm);
my($porttype, $res1, $res2, $res3, $caller_id, $reserved);

# Tamanho da estrutura do radutmp
$utmpsize = 100;
# Localizacao do arquivo utmp
$utmpfile = '/var/log/radutmp';

%proto = (
           'L' => 'LOCAL',
           'R' => 'RLOGI',
           'S' => 'SLIP',
           'C' => 'CSLIP',
           'P' => 'PPP',
           'E' => 'TELNE',
           'T' => 'TCPCL',
           'U' => 'TCPLO',
           '!' => 'CONSO',
           'X' => 'SHELL',
           '' => 'UNKNO',
);

open(FD, "<$utmpfile");
$i = 1;
while (read(FD, $ut, $utmpsize)) {
      ($login, $nas_port, $session_id, $nas_address, $framed_address,
       $protocol, $time, $delay, $type, $porttype, $res1, $res2, $res3,
       $caller_id, $reserved) = &unpackradutmp($ut);
       next if ! $type;

       @info = getpwnam($login);
       $j = index($info[6],',');
#   $name = ($j < 0) ? $info[6] : substr($info[6],0,$j);
#   $name = $login if ! $name;
    $name = $login;

  $from = join('.',unpack("CCCC",$nas_address));
  $location = join('.',unpack("CCCC",$framed_address));
  #$host = gethostbyip($location);
  $host = $location;
  # $tm    = strftime( "%a %H:%M", localtime($time));
  $tm = strftime( "%c", localtime($time));
  if ($i == 1) {

    print"Ord Login   LoginTime         RAS
IP        Telefone\n\n";

   }
   if (length($caller_id) == 10) {
    $caller_id = '('.substr($caller_id,0,2).') '.substr
 ($caller_id,2,4).'-'.substr($caller_id,6,4);
   } else {
    $caller_id = substr($caller_id,0,(length($caller_id)-4)).'-
 '.substr($caller_id,(length($caller_id)-4)
 ,4);
   }
   printf("%3d %-8s %-24s %-15s %-15s %-s\n",$i++, $name, substr
 ($tm,0,24), $from, $host, $caller_id);
  }
  close FD;
 }

  sub unpackradutmp {
  my @tmp;
  my ($la);

  @tmp = unpack("A32 i A8 a4 a4 I I i I A1 a1 a1 a1 A16 A12", $_[0]);
  $tmp[5] =~ s/\0+$//g;
  return @tmp;
 }

 &who;

 #******* FIM **********

Luciano Rodrigues Machado
Suporte - Porto das Canoas
Provedor de acesso - Igarapava-SP



Assinantes em 07/03/2002: 2245
Mensagens recebidas desde 07/01/1999: 157461
Historico e [des]cadastramento: http://linux-br.conectiva.com.br
Assuntos administrativos e problemas com a lista: 
            mailto:[EMAIL PROTECTED]

Responder a