[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

RES: Projeto LinUSP (http://linusp.usp.br)



Desculpem os cortes mas já estava grande demais ;-)

-----Mensagem original-----
De:		Arnaldo Carvalho de Melo [SMTP:acme@conectiva.com.br]
Enviada em:		Sexta-feira, 12 de Fevereiro de 1999 21:21
Para:		Daniel Doro Ferrante
Cc:		Debian User List - Portuguese
Assunto:		Re: Projeto LinUSP (http://linusp.usp.br)

On Wed, 3 Feb 1999, Daniel Doro Ferrante wrote:

> On Wed, 3 Feb 1999, Clovis Sena / Itautec Servicos Recife wrote:
> 
> 	Você citou a distribuição da Conectiva. Em particular, eu acho que
> essa distribuição tem alguns "problemas": Ela não é GPL! Além disso, eles

Não, ela não é 100% GPL, como a debian também não é. Os softwares
disponíveis no Conectiva Linux são liberados sob várias licenças: GPL,
LGPL, BSD, MIT, Artistic, Domínio Público, etc, como são os disponíveis na
debian. Mas todos são de livre distribuição. Somente o segundo CD contém
pacotes "non free", mas são claramente designados como tal e estão em um
CD a parte.

[Itamar]  Tudo bem. Assim como a Debian...

> usam o RedHat! :((( Eu acho que deveria ser feito um esforço (e GRANDE pelo

Questão de gosto. Novamente: a melhor distribuição é a que você está
acostumado. O resto é flame war desnecessária. Instale várias, experimente
e use.

[Itamar]  Acho que vc não tem direito de falar que o Daniel está instigando uma flame war se ele está demonstrando sua simpatia pela distribuição Debian numa lista de usuários DEBIAN.

> visto... ;) para que a distribuição usada fosse Debian - e acho que os
> motivos disso são bastante óbvios. Não estou menosprezando as outras

Nem tanto. Tema _muito_ polêmico.

> distribuições, mas a Debian é o mais próximo de GPL que há por aí! E, como
> diz o Linus: "Software is like sex; it's better when it's free."

E como o RMS diz: (http://www.gnu.org/philosophy/free-sw.html - What is
Free Software?)


[Itamar]  É. Mas se além do que é dito no texto supracitado ele ainda for barato é melhor ainda. ;-)

	E como foi dito:
"``Free software'' refers to the users' freedom to run, copy, distribute, study, change and improve the software."
	Eu senti menos liberdade de estudar e modificar usando distribuição Conectiva, doque usando Debian, apesar da documentação não estar numa língua que eu domine (mas também não tem problema, sou péssimo em português ;-) ). Como vc disse pode ser uma questão de gosto, ou de estar acostumado.

   ``Free software'' is a matter of liberty, not price. To understand the
concept, you should think of ``free speech'', not ``free beer.''

> 	Eu acho bastante inutil fazermos todo um movimento para gerarmos um
> software que não seja Free. Aí o quê estaríamos fazendo seria copiar os
> moldes da Micro$oft!

Leia o conceito de Free Software acima.

[Itamar]  Nem oito nem oitenta, ainda acho que ganha quem oferecer um produto de qualidade por menor preço...

> > No ambito mundial existe muito isto, por ex aquele caso do "refund day",
> > congressos, e a atencao ( que por aqui eh mal acompanhada) dada ao
> > julgamento da MS, que com estas lapadas que tem tomado do DOJ americano, tem
> > aberto espaco para outras sistemas. Temos que nos preparar para qdo isto
> > acontecer no brasil. Os distribuidores hoje nao tem maquinas preinstaladas ,
> > pelo menos a maioria nao, mas em breve sera viavel por isto em pratica.

Estamos trabalhando para que isto aconteça, vários OEMs estarão
disponibilizando Linux pré-instalado em máquinas (servidores e estações de
trabalho, sem Windows) aqui no Brasil, em breve. E nos próximos meses mais
160 mil CDs do Linux estarão nas bancas de revistas pelo pais afora, em
adição aos 50 mil que já sairam.

[Itamar]  É legal, eu ouvi dizer que a Compaq estão pensando (ou já implementando) em fornecer o Linux pré-instalado em algumas de suas máquinas. Muuiito legal! Pelo menos o indivíduo que estiver comprando sua máquina vai ter alguma opção, e não vai ter aquela idéia inicial de que "computador tem Windows, se tiver outra coisa é um outro tipo de máquina que só profissional sabe mexer".

> 	O Mercado Brasileiro (assim como os outros) vai certamente se
> livrar do domínio da M$, pelo motivo mais óbvio que existe: o Linux
> FUNICONA!!! Atualmente, pelo que eu tenho ouvido, as novas versões do

:)
> 
> 	Eu acho que, uma vez que já estamos nos engajando em
> "Internacionalização do Debian" poderíamos aproveitar a viagem e começar a
> trabalhar num projeto de "Friendlization" do Debian ;) Afinal, acho que nós
> estamos mais a par das necessidades do nosso público alvo (e de seus
> conhecimentos também).

Exatamente! Quanto mais fáceis forem os processos de instalação das
distribuições mais usuários usarão o Linux! 

[Itamar]  Não só o processo de instalação, mas a manutenção também.
Acho que este projeto de "Friendilization" tem muito de aprender com a distribuição Conectiva, que é impressionante. Certa vez o Arnaldo me pediu que explicasse a "bagunça" que eu achei na distribuição dele e não consegui resumir meus sentimentos, mas recentemente descobri que usar o dselect para manusear pacotes é muito melhor doque o gerenciador de pacotes do painel de controle, pois nele não tem a vista a descrição de cada pacote, nem a facilidade de encontrá-los pois estão divididos em "diretórios" com alguns nomes que são impronunciáveis.

Mais uma vantagem para a Debian (que eu tenha percebido). Agente encontra pessoas fazendo esforços sem querer dinheiro, fazem coisas simples porque precisaram, agora quem quiser que use, fique à vontade, a exemplo do nosso amigo João Luís, que fez um gerenciador de pacotes muitíssimo útil, porque é simples, maleável e rápido. e ta aí. Quem quiser, use. ( A seguir vai uma mensagem que eu recebi dele, bom proveito ;-)  ) 

Novamente, por favor visitem
http://lie-br.conectiva.com.br e nos unamos por softwares de livre
distribuição que falem nossa língua!

[Itamar]  Muito Bom!

[Itamar]    
--- Begin Message ---
Ola pessoal.

Sou usuario da distribuicao Debian ja a algum tempo. Ja usei RedHat, mas
acho a Debian um pouco mais organizada. O problema com a Debian e' a
interface de instalacao, o deselect, que e' muito confuso, e `as vezes nao
funciona direito. E usar o dpkg, tendo que resolver na unha as
dependencias, e' uma chatice.

Devido `as minhas proprias necessidades desenvolvi um programa em Perl que
instala pacotes debian, instalando antes, e recursivamente, todas as
dependencias. O programa "dinst" e as instrucoes "leiame" vem em
attachment. Nao esquecer do "chmod 755 dinst" !

Ficaria agradecido por comentarios e sugestoes!

Joao Luis.


#!/usr/bin/perl -w

##################################################################
# Dinst v 0.60p.
# Instala pacotes debian recursivamente.
# Este programa pode ser distribuido gratuitamente e modificado
# segundo as necessidades do usuario.
# Autor: Joao Luis Meloni Assirati <assirati@fma.if.usp.br>
##################################################################

sub usage {
    print "Uso: dinst --configure <lista de caminhos>\n";
    print "     dinst [dpkg options] <pacotes a instalar>\n";
}


#######################################################################
# Pretty much like bash's select. Takes as argument a scalar variable
# with the form opt1|opt2|...|optn and prompt a user selection. Returns
# the selection. 
sub select_opts {
    my(%opt, @list, $i, $s);
    @list = split /\|/, $_[1];
    for($i = 1; $i <= @list; $i++) {
	$opt{$i} = $list[$i-1];
    }
    do {
	print "$_[0]\n";
	foreach $i (sort {$a <=> $b} keys %opt) {
	    if($i < 10) {
		print " $i) $opt{$i}\n";
	    } else {
		print "$i) $opt{$i}\n";
	    }
	}
	print "dinst:> ";
	chomp($s = <stdin>);
    } until(defined($opt{$s}));
    return $opt{$s};
}


##################################################################
#
#            Interface with debian package database
#

sub comp_versions {
    return ! system("/usr/bin/dpkg --compare-versions $_[0] \'$_[1]\' $_[2]");
} 

# Returns the system status of a list of packages separed by "|" 
sub inst_status {
    my(@opts, $item, $status, $ins, $ver1, $sign, $ver2);
    @opts = split(/\|/, $_[0]);
    foreach $item (@opts) {
	$sign = undef; $ver2 = undef;
	if( $item =~ /(.*)\(([><=]*)(.*)\)/ ) {
	    $item = $1; $sign = $2; $ver2 = $3;
	}
	$status = `/usr/bin/dpkg --status $item`;
	$status =~ /\n *(?:Status|STATUS):(.*)\n/; $ins = $1;
	if (defined($ins)) {
	    $status =~ /Version:(.*)/; $ver1 = $1;
	    if( ($ins =~  / *install ok installed */) && 
	       ((! defined($ver2)) || comp_versions($ver1, $sign, $ver2))) {
		return "ii";
	    }
	}
    }
    return "ni";
}

# Query the dependencies of a given package by its file name
sub dependencies_of {
    my($info, $dep, $predep, $tdep);
    $info = `/usr/bin/dpkg --info $_[0]`;
    $info =~ /\n *(?:Pre-Depends|PRE-DEPENDS):(.*)\n/;
    $predep = $1;
    $info =~ /\n *(?:Depends|DEPENDS):(.*)\n/;
    $dep = $1;
    if(defined($predep)) {
	if(defined($dep)) {
	    $tdep = "$predep,$dep";
	} else {
	    $tdep = "$predep";
	}
    } else {
	if(defined($dep)) {
	    $tdep = "$dep";
	} else {
	    return undef;
	}
    }
    $tdep =~ s/ +//g;
    return split /,/, $tdep;
}

# Query the suggestions of a given package by its file name
sub suggestions_of {
    my($info, $dep, $predep, $tdep);
    $info = `/usr/bin/dpkg --info $_[0]`;
    $info =~ /\n *(?:Recommends|RECOMMENDS):(.*)\n/;
    $predep = $1;
    $info =~ /\n *(?:Suggests|SUGGESTS):(.*)\n/;
    $dep = $1;
    if(defined($predep)) {
	if(defined($dep)) {
	    $tdep = "$predep,$dep";
	} else {
	    $tdep = "$predep";
	}
    } else {
	if(defined($dep)) {
	    $tdep = "$dep";
	} else {
	    return undef;
	}
    }
    return $tdep;
}

# Takes as argument something as <package_name> or 
# <package_name>(<version_condition>). Then looks for all debian
# files with same package_name and, in case of existing a 
# version_condition, selects only the compatible ones, recording them
# as keys in the hash %version, with the respective versions as values.
# After that, sorts the keys of %version and returns the package of
# highest version available.
sub find_pack {
    my($pack, $sign, $vers, $f, @list, $dir, @files);
    if( ($pack = $_[0]) =~ /(.*)\(([><=]+)(.*)\)/ ) {
	$pack = $1; $sign = $2; $vers = $3;
	foreach $dir (@pathlist) { 
	    if(defined(@files = glob($dir . "/" . $pack . "_*.deb"))) {
		foreach $f (@files) {
		    (`/usr/bin/dpkg --info $f`) =~ /\n *(?:Version|VERSION):(.*)\n/;
		    if( comp_versions($1, $sign, $vers) ) {
			push(@list, $f);
		    }
		}
	    }
	}
    } else {
        foreach $dir (@pathlist) {
	    if(defined(@files = glob($dir . "/" . $pack . "_*.deb"))) {
		@list = (@list, @files);
	    }
	}
    }
    if( @list == 0 ) { 
	return undef;
    }
    if( @list == 1 ) { 
	return $list[0];
    } 
    print "dinst: Mais de um arquivo encontrado para o pacote $_[0].\n";
    return select_opts("dinst: Escolha um arquivo:", join("|",@list));
}

sub what_provides {
    my($provide);
    if(`/usr/bin/dpkg --info $_[0]` =~ /\n *(?:Provides|PROVIDES):(.*)\n/) {
        ($provide = $1) =~ s/ //g;
        return $provide;
    }
    return undef;
}

#
#          End of interface with debian package database
#
##########################################################################


######################################################################
# In a list of options separed with |, substitutes all options 
# that match with an available alias in the hash %alias.
sub subst_alias {
    my(@opts, $item);
    @opts = split(/\|/, $_[0]);
    foreach $item (@opts) {
	if (defined ($alias{$item})) {
	    $item = $alias{$item};
	}
    }
    return join "|", @opts;
}


sub detect_cycle {
    my($i);
    foreach $i (split(/ /, $_[0])) {
	if($i eq $_[1]) {
	    return 1;
	}
    }
    return 0;
}

#################################################################
# Takes as its argument a list of package names and install them
# and their dependencies recursively 
sub install {
    my($item, $file, $message, $dep, $cycle);
    $message = shift @_;
    $cycle = shift @_;
    foreach $item (@_) {
	print "$message $item\n";
	$item = subst_alias($item);
	if( inst_status($item) eq "ii" ) {
	    print("dinst: $item ja instalado, desviando...\n");
	} else {
	    if( $item =~ /.*\|.*/ ) {
		$item = select_opts("dinst: Escolha uma opcao:", $item);
	    }
	    if(defined($file = find_pack $item)) {
		print "dinst: Pacote $item encontrado em $file.\n";
		if( detect_cycle($cycle, $item) ) {
		    print "dinst: Dependencias ciclicas!\n";
		    print "dinst: Ciclo: $cycle $item\n";
		    print "dinst: Nao posso instalar, encerrando.\n";
		    exit;
		}
		if(defined($dep = dependencies_of $file)) {
		    install("dinst: $item depende de", $cycle . " " . $item, dependencies_of $file);
		}
		system "/usr/bin/dpkg --install $dopt $file";
		if("ii" eq inst_status $item) {
		    print "dinst: $item instalado com sucesso.\n";
		    $suggest{$item} = suggestions_of $file;
		} else {
		    push(@problems, $item);
		    print "dinst: Problemas com a instalacao de $item\n";
		    print "dinst: Enter continua, ^C aborta.\n";
		    <STDIN>;
		}
	    } else {
		print "dinst: Pacote $item nao encontrado, escolha outro.\n";
		print "dinst: (Enter escolhe nenhum)\n";
		print "dinst:> ";
		chomp($item = <stdin>);
		unless ($item =~ /^ *$/) {
		    install("dinst: Instalando o pacote", $cycle . " " . $item, $item);
		}
	    }
	}
    }
}
	    
if(@ARGV ==  0) {
    usage;
    exit;
}

if( $ARGV[0] eq "--configure" ) {
    shift(@ARGV);
    if(@ARGV ==  0) {
	usage;
	exit;
    }
    
    $base = join(" ", @ARGV);
    print "dinst: Procurando pacotes baseados em $base ...\n";
    ($find = `/usr/bin/find $base -name \'*.deb\'`) =~ s/\/[^\/]*\n/\n/g;
    if(defined($find) && ($find ne "")) {
	print "dinst: ... terminado.\n";
    } else {
	print "dinst: ... falha na busca dos pacotes.\n"; 
	print "dinst: Verifique se os caminhos estao digitados corretamente\n";
	print "dinst: e find esta instalado no sistema.\n";
	exit;
    }
    foreach $i (split /\n/, $find) {
	$dirs{$i} = "on";
    }
    @pathlist = keys %dirs;
    
    foreach $path (@pathlist) {
	@found = (@found, glob($path . "/*.deb"));
    }
    $nfound = @found;
    print "dinst: Configurando aliases para os pacotes ...\n";
    $i = 0;
    foreach $file (@found) {
	$i++;
	print "$i/$nfound - $file\n";
	$file =~ /\/([^\/]*)_.*$/;
	$name = $1;
	$alias{$name} = $name;
	if($prov = what_provides($file)) {
	    foreach $a (split(/,/, $prov)){
		if(defined $alias{$a}) {
		    $alias{$a} = $alias{$a} . "|" . $name;
		} else {
		    $alias{$a} = $name;
		}
	    }
	}
    }
    print "dinst: ... Terminada a configuracao dos aliases.\n";
    
    open(DINSTRC,">$ENV{HOME}/.dinstrc");
    print DINSTRC join(":", @pathlist) . "\n";
    foreach $a (keys %alias) {
	unless($alias{$a} eq $a) {
	    print DINSTRC "$a = $alias{$a}\n";
	}
    }
    close(DINSTRC); 
    
    print "dinst: Terminada a configuracao de dinst.\n";
    print "dinst: Para configuracoes suplementares, edite o arquivo .dinstrc.\n";
    exit;
} 

unless( -f "$ENV{HOME}/.dinstrc") {
    print "dinst: dinst nao configurado.\n";
    print "dinst: De um \"dinst --configure\".\n";
    exit;
}


open(DINSTRC, "$ENV{HOME}/.dinstrc");
chomp($line = <DINSTRC>);
@pathlist = split(/:/, $line);
while( defined ($line = <DINSTRC>) ) {
    chomp($line);
    unless ( $line =~ / *\#.*/ ) {
	$line =~ / *([^ ]*) *= *([^ ]*) */;
  	$alias{$1} = $2;
    }   
}
close(DINSTRC);


$dopt = " ";
while($ARGV[0] =~ /^-.*/) {
    $dopt = $dopt . " " . shift(@ARGV);
}


install "dinst: Instalando o pacote ", " ", @ARGV;

print "dinst: Fim da instalacao.\n";

foreach $item (keys %suggest) {
    if( defined($suggest{$item}) ) {
	print "dinst: $item sugere $suggest{$item}.\n";
    }
}
print "\n";

if(defined @problems) {
    print "dinst: Problemas foram encontrados durante o processamento de:";
    print join "\n       ", "", @problems;
}
print "\n";

Instrucoes para o uso de dinst v.0.60p.

Dinst instala pacotes debian e suas dependencias recursivamente.

USO: 

	dinst --configure <lista de caminhos>
	Criara um  arquivo .dinstrc no diretorio  home com os caminhos
	para todos os pacotes   debian e um  banco  de dados  de nomes
	genericos (aliases). 
	
	dinst [ <opcoes para dpkg> ] <lista de pacotes>
	Instalara todos os pacotes listados. Todas as opcoes para dpkg 
	sao passadas a dpkg durante a instalacao.


CONCEITOS:

"Pacote" e' a  parte do nome do arquivo  .deb antes do underscore (por
exemplo,  o "pacote" relativo a   emacs19_19.34-19.deb e' emacs19),  e
pode ser tambem um  nome generico,  listado  no arquivo  .dinstrc (por
exemplo, latex e' um nome generico para tetex-bin e c-shell e' um nome
generico simultaneamente para csh e tcsh).

Muitas vezes,  uma dependencia e'  especificada por um  nome generico,
portanto  e' importante   manter um  aruivo   .dinstrc atualizado  (na
pratica, dar o   comando dinst  --configure   sempre que a lista    de
arquivos .deb disponiveis muda). 


EXEMPLOS:

	dinst --configure /cdrom /usr/local/debpack 
	Configura  dinst  para operar usando  os pacotes  em  todos os
	subdiretorios de /cdrom e /usr/local/debpack.

	dinst xfntbase xbase fvwm
	Instalara os tres pacotes depois de suas dependencias.

	dinst -G xfntbase xbase fvwm
	O mesmo, mas passando a opcao -G para o instalador dpkg.
	

AUTOR:

	Joao Luis Meloni Assirati, <assirati@fma.if.usp.br>. 

--- End Message ---

Reply to: