[devel] Re: Q: Текущее состояние web policy (идеи для bugzilla)

Michael Shigorin =?iso-8859-1?q?mike_=CE=C1_osdn=2Eorg=2Eua?=
Чт Сен 1 18:12:34 MSD 2005


On Thu, Sep 01, 2005 at 04:02:32PM +0400, Aleksey Avdeev wrote:
> интересует текущее состояние web policy (и скриптов поддержки).

Так и не добрался посмотреть на farmer, но с тех пор подсунули
ещё кой-чего интересного и наведшего на мысли.

> 2. Иметь скрипты для установки (обновления) приложения 
> непосредственно на сайт его администратором.
> Помню разговор (в контексте web policy) о создании скриптов
> перемещения web приложений на нужное место через копирование
> файлов и/или выставление симлинков по списку. Немогу найти, чем
> он закончился. (Помню что-то про пакет их содержащий... Но
> немогу его найти.)

farmer? (так и не появился ни в Daedalus, ни в Sisyphus AFAICS)

http://lists.altlinux.ru/pipermail/devel/2005-March/018792.html
http://lists.altlinux.ru/pipermail/devel/2005-March/018785.html
http://lists.altlinux.ru/pipermail/devel/2005-March/018673.html


Мне тут местные гентуводы показывали на той неделе, как сделано
у них -- нарисован helper по имени webapp-config, который умеет
различать помеченное как "конфиг" ("индивидуальное") и копировать
(не симлинковать или ещё как, а именно тупо копировать) всё
остальное по виртхостам при обновлении.

http://www.gentoo.org/cgi-bin/viewcvs.cgi/net-www/webapp-config/


В дебиане (спасибо подсказавшим) тоже сдвинулось с мёртвой точки
где-то двухлетней давности:

http://alioth.debian.org/projects/webapps-common/
http://alioth.debian.org/projects/webapppolicy/
http://lists.alioth.debian.org/mailman/listinfo/webapps-common-discuss
http://lists.debian.org/debian-devel/2005/05/msg00075.html

Видимо, заинтересованным (или хотя бы одному из нас) имеет смысл
сходить в гости и натырить идей, коль скоро там они проросли
быстрее.


С другой стороны, у нас есть update_chrooted, который можно
попробовать приспособить для этой задачи.


> 3. Обеспечение работы приложения под обоими apache.
[...]
> 640 <админ>:apache <файл>
> Но у нас есть apache и apache2 и нет группы содержащей их
> обоих...  Как быть в таком случаи (без создания общей для веб
> серверов группы) -- я незнаю.

Создать группу, в которую входят оба апача (видимо, пригласить
apache2 в apache соответствующим FR).

> 4. Обеспечить работоспособность под mod_perl. (В перспективе:
> пока mod_perl для меня -- тёмный лес.)

Буду признателен за помощь, см. тж. README.ALT -- там ссылки 
на баги, их обсуждение и краткое описание выводов.

-- 
 ---- WBR, Michael Shigorin <mike на altlinux.ru>
  ------ Linux.Kiev http://www.linux.kiev.ua/
----------- следующая часть -----------
#!/usr/bin/perl

use strict;

my %config = (
		"confFiles"=> ["config/*php.dist","config/conf.xml"]
	);

my $debug = 1;

unless($#ARGV == 1) {
	DEBUG(1,"usage: $0 sourceDir destinationDir");
	exit;
}

unless (-e $ARGV[0] && -e $ARGV[1]) {
	DEBUG(0,"sourceDir $ARGV[0] or destinationDir $ARGV[1] not exist");
	exit(1);
}

unless (&farmer($ARGV[0],$ARGV[1])) {
	DEBUG(0,"Cloning failed");
}


sub farmer {

	my $from = shift;
	my $to = shift;
	my %FROM = ();
	
	unless ( -d $from ) {
		&DEBUG($from." not exist or not directory");
		return undef;
	}
	
	if (! -e $to ) {
		unless ($config{"confFiles"}) {
			symlink $from,$to;
			return "true";
		} else {
			mkdir $to,0755;
		}
	} elsif (! -d $to) {
		DEBUG(0,"$to exist but not directory");
		return undef;
	}

	foreach my $conf (@{$config{confFiles}}) {
		$conf =~ s/\*/[^\/]*/g;
		$conf =~ s/(\.|\?)/\\$1/g;
		$conf =~ s/^\///;
		$conf =~ s/\/$//;
	}

	my $dir = "";
	my %cdir = ();
	my @dirs = ();
	
	do {
		unless ( opendir(DIR,$from."/".$dir) ){
			DEBUG(0, "Can not open dir $from.$dir: $!");
			return undef;
		}
		foreach ( grep {! /\.{1,2}$/ } readdir(DIR)) {
			if ( -f $from."/".$dir."/".$_ ){
				$FROM{$dir."/".$_} = "f". &checkCf($dir."/".$_,\%cdir);
			} elsif ( -d $from."/".$dir."/".$_ ) {
				$FROM{$dir."/".$_} = "d". &checkCf($dir."/".$_,\%cdir);
				push @dirs,$dir."/".$_;
			} else {
				DEBUG(1, "$_ not file or directory. Skip it.");
			}
		}
		close(DIR);
		$dir = shift @dirs;
	} while ($dir);

	my @list = sort keys %FROM;

	foreach my $file (@list) {

		if (exists $cdir{$file} || $FROM{$file} eq "dc"){
			if ( -e $to.$file ) {
				if ( -l $to.$file ) {
					unlink $to.$file;
				} elsif (! -d $to.$file) {
					DEBUG(1,"$file is not a dir. Something wrong. Try to backUp");
					unless (&backUp($to.$file)) {
						return undef;
					};
				}
			}
			my ($mode,$uid,$gid) = (stat($from.$file))[2,4,5];
			mkdir $to.$file, $mode;
			chown $uid,$gid,$to.$file;
		} elsif ($FROM{$file} eq "fc") {
			if ( -l $to.$file ) {
				unlink $to.$file;
			} elsif ( -e $to.$file ) {
				next;
			}
			system("cp","-p",$from.$file,$to.$file);
		} elsif ($FROM{$file} eq "d") {
			if ( -l $to.$file ) {
				unlink $to.$file;
			} elsif ( -d $to.$file ) {
				DEBUG(1, "$file is a dir. Can not link it. Try to backUp");
				next unless (&backUp($to.$file));
			} elsif (-e $to.$file ) {
				DEBUG(1,"$file not dir. Try to backUp");
				unless (&backUp($to.$file)) {
					return undef;
				}
			}
			symlink($from.$file,$to.$file);
			foreach my $empty ( grep { /^$file\/.+/ } @list ){
				$FROM{$empty} = "empty";
			}

		} elsif ($FROM{$file} eq "f") {
			if (-l $to.$file) {
				unlink($from.$to);
			} elsif ( -e $to.$file) {
				next unless (&backUp($to.$file));
			}
			symlink($from.$file,$to.$file);
		}
	}

	return "ok";

}

sub checkCf {
	my $file = shift;
	my $dir = shift;
	my $ret = undef;
	my @tmp = ();
	foreach my $cnf (@{$config{confFiles}}) {
		next unless ($file =~ /^\/$cnf$/ || $file =~ /^\/$cnf\/.+$/ );
		$ret = "c";
		@tmp = split(/\//, $file);
		shift @tmp; pop @tmp;
		foreach (@tmp) {
			next if (exists ${$dir}{"/".$_});
			${$dir}{"/".$_} = "c";
		}
	}
	return $ret;
}

sub DEBUG {
	my $level = shift;
	my $message = shift;

        if ($level == 0) {
		print STDERR $message."\n";
	} elsif ($level <= $debug) {
		print $message."\n";
	}
}

sub backUp {
	my $file = shift;
	my $backup = $file.".farmer-save";
	
	if (-d $backup) {
		system("rm","-rf",$backup);
	} elsif ( -f $backup || -l $backup) {
		unlink $backup;
	} elsif ( -e $backup) {
		return undef;	
	}

	system("mv",$file,$backup);

	return "ok";	
}
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20050901/458e6052/attachment-0001.bin>


Подробная информация о списке рассылки Devel