Отображение контрольных номеров версий CVS на Web страницах

  Автор: © Mark Nielsen
Перевод: © Иван Песин.


 

  1. Введение
  2. Perl скрипт для отображения номеров версий
  3. Безопасность
  4. Вывод
  5. Ссылки

Введение

Несколько лет я пишу статьи. Простой парень, имя которого Фил Хантер (Phil Hunter) из Central Ohio Linux User Group советовал мне несколько раз вести контроль версий моих статей. Конечно, это лишь еще один пункт в длинном списке того, что стоило бы сделать. Как обычно, при невероятном стечении обстоятельств, я решил воплотить разные идеи в жизнь. Предпосылки были следующими:
  1. После моей работы в Cisco (группы EMAN и INFOSEC), я изучил достаточно детально использование CVS. Распечатал руководство по CVS доступное с genericbooks.com. . Теперь я использую CVS для всего, что я делаю.
  2. После использования SSI, PHP, Mason, ASP, EmbPerl, ePerl, и других серверных включаемых модулей для Apache в течении нескольких лет, написание скрипта на Perl, который бы открывал файл CVS, читал его и выводил результат, становится совершенно тривиальной задачей.
  3. У меня множество документов, и вот пришло время вести контроль за их версиями.

Perl скрипт для отображения номеров версий

Для упрощения, так что бы каждый документ мог использовать одну и ту же команду, я использовал следующую серверную включаемую команду, которая работает с Apache. PHP, Perl ASP, Mason. Другие серверные скриптовые языки включают похожие команды:
<!--#include virtual="/ssi/cvs_version.pl"  -->

Также необходимо настроить сервер так, чтобы все страницы могли использовать серверные включаемые команды. Я это сделал, указав в файле httpd.conf следующие вещи:


<Directory "/usr/local/apache_gnujobs/htdocs">

    Options All Indexes FollowSymLinks MultiViews ExecCGI Includes 

    AllowOverride All

    Order allow,deny
    Allow from all
</Directory>

AddType text/html .shtml
AddHandler server-parsed .shtml .html .htm .shtm

Тут находится текстовая версия скрипта, а можно просто вырезать его из этого документа.

#!/usr/bin/perl

print "Content-type: text/html\n\n\n\n";

  ### Получаем имя затребованного файла.
my $Temp = $ENV{'REQUEST_URI'};
my $Cvs = $Temp;

  ### Разбиваем URL на части по "/".
my (@Junk) = split(/\//, $Cvs);

  ### Получаем конец URL, который является именем файла.
my $File = pop @Junk;
$Cvs =~ s/[^\/]+$//g;

  ### Присоединяем корневой каталог документов, так, что получаем полный путь к 
  ### файлу на нашем сервере. Так же подсоединяем имя CVS/Entries, что бы получить
  ### информацию CVS.
$Cvs = $ENV{'DOCUMENT_ROOT'} . $Cvs . "CVS/Entries"; 

  ### Открываем файл, и если находим соответствие, записываем в  $Match
my $Match = "";
open(FILE,$Cvs);
while (my $Line = <FILE>) 
  {
  if ($Line =~ /$File/) {$Match = $Line; chomp $Line}
  }
close FILE;

   ### если соответствие не найдено, печатаем "не найдено", иначе получаем информацию.
if ($Match eq "") {print "Информация CVS не найдена.  '$File'\n";}
else 
  {
     ### Получаем необходимую информацию и выводим ее.
  my ($Junk,$File,$Version,$Date,@Junk) = split(/\//, $Match);
  print "Версия <b>$Version</b> : Дата последнего изменения <b>$Date</b>\n";
  }

Безопасность

Есть потенциальная проблема с безопасностью при использовании моего скрипта. Кто угодно может получить доступ к вашим файлам, находящихся в каталоге CVS. Я не знаю, будет ли это сильно беспокоить большинство людей, и я совершенно точно знаю, что это не будет беспокоить меня, но на всякий случай я блокировал чтение файлов в каждом каталоге CVS, использовав нижеприведённые команды в моём httpd.conf файле. Это простой вариант. У меня нет и не будет файлов, имена которых будут заканчиваться на "Root", "CVS", "Repository" или "Entries", так что для меня всё подходит.
<Files ~ "CVS$">
    Order allow,deny
    Deny from all
</Files>
<Files ~ "Root$">
    Order allow,deny
    Deny from all
</Files>
<Files ~ "Repository$">
    Order allow,deny
    Deny from all
</Files>
<Files ~ "Entries$">
    Order allow,deny
    Deny from all
</Files>

Выводы

Применение CVS для управления версиями документов, программ и скриптов очень удобно. Использование CVS и моего скрипта на perl, выводящего версии, очень хороший и приятный путь для контроля версий ваших документов. У меня не было необходимости в более сложном контроле, и то, что я написал мне совершенно подходит.

Несколько простых вещей, которые стоило бы сделать:

  1. Проверять, существует ли каталог CVS и соответствующие файлы до их открытия. Не имеет значения, что я полагаю осознанность действий человека использующего серверные включаемые команды. И не имеет значения, что даже в случае отсутствия вышеупомянутых файлов, либо каталога ничего особенно плохого не произойдёт.
  2. Использовать улучшенное регулярное соответствие, которое бы не давало возможности получить файлы из каталога "/CVS/", если запрос пришёл от клиентского браузера. Это было бы лучше, чем запрет только на определённые файлы. Хотя мне, в общем-то, всё равно.
  3. Скрипт не работает с опцией Alias в файле httpd.conf. Во всяком случае, я не думаю, что работает
  4. Проверять соответствие между датой изменения файла и датой в CVS. Это даст возможность определять находится ли документ в соответствии с данными в хранилище CVS. Для меня это не важно.

Ссылки

  1. Если эта статья будет изменена, она будет доступна с http://www.gnujobs.com/Articles/15/CVS_SSI.html.
  2. CVS: Система согласования версий by Mark Nielsen

Марк (Mark) работает в качестве независимого консультанта, а свободное время использует для таких благих дел, как GNUJobs.com, написания статей, написания свободного ПО и работает добровольцем на eastmont.net.

Copyright © 1/2001 Mark Nielsen
Версия статьи 1.3 : Дата последнего изменения Воскресенье, Февраль 25 21:13:16 2001

 


Copyright © 2001, Mark Nielsen.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 64 of Linux Gazette, March 2001

Вернуться на главную страницу