воскресенье, 24 октября 2010 г.

Скрипт для добавления ppa репозитория

Думаю, что все знают про утилиту (точнее питоновый скрипт) add-apt-repository. Так вот, мне она не нравится, так как, как уже говорил в предыдущем посте, предпочитаю хранить все репозитории в одном файле, а не разбрасывать их по разным файлам в каталоге /etc/apt/sources.list.d/. Поэтому решил наваять свой скрипт для добавления PPA репозиториев.

Собственно сам код скрипта:

#!/bin/bash 

# Скрипт может принимать:
# 1. URL страницы репозитория (например, https://launchpad.net/~troorl/+archive/pino)
# 2. URL хранилища репозитория (например, http://ppa.launchpad.net/troorl/pino/ubuntu)
# 3. спец. URL, в формате add-apt-repository (например, ppa:troorl/pino)

[ -z "$1" ] && echo "usage: `basename $0` [-i|--import-key] url [url ...]" 1>&2 && exit 1
isEXEC=0
[ "$1" = "-i" -o "$1" = "--import-key" ] && isEXEC=1 && shift

CMD='sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys'
reEXEC=''

for i in $@ ; do

 if [[ x"${i:0:4}" = x"ppa:" ]]; then 
  URL=`echo "$i" | sed 's/^ppa:\(.\+\)\/\(.\+\)$/https:\/\/launchpad.net\/~\1\/+archive\/\2/'`
 else
  if [[ x"${i:0:11}" = x"http://ppa." ]]; then
   URL=`echo "$i" | sed -e 's/ppa\.//' | awk -F'/' '{print "https://"$3"/~"$4"/+archive/"$5}'`
  else
   URL=$i
  fi
 fi

 HTML=`wget -qO- "$URL"`

 TITLE=`echo "$HTML" | sed -ne 's/^.\+<title>\(.\+\):\ .\+$/\1/p'`
 DESC=`echo "$HTML" | sed -ne 's/^.\+text\"><p>\(.\+\)<\/p.\+$/\1/p'`
 CODE=`echo "$HTML" | sed -ne 's/^.\+<code>.\+\/\(.\+\)<\/.\+$/\1/p'`
 PPA=`echo "$HTML" | sed -ne 's/^\ *\(deb \)<a href=\"\(.\+\)\">.\+$/printf "%-1s %s %s %s" \1 \2 $(lsb_release -cs) main/ep'`

 if [ $isEXEC -eq 1 ]; then
  $CMD $CODE &>/dev/null
  if [ $? -eq 0 ]; then
   reEXEC=' [ADDED]'
  else
   reEXEC=' [FAIL]'
  fi
 fi

 echo -e "
### $TITLE :: $DESC
## $URL
# Add key$reEXEC: $CMD $CODE
$PPA\t\t# $TITLE"
 
 reEXEC=''

done

Скрипт выводит на stdout 4 строки:
1. Название репозитория :: Описание репозитория
2. Страница репозитория
3. Команда для добавления ключа
4. Строка необходимая для /etc/apt/sources.list

Взгляните сами, так будет понятнее:
$ ppaadd -i ppa:troorl/pino https://launchpad.net/~troorl/+archive/pino http://ppa.launchpad.net/troorl/pino/ubuntu

### pino  :: Pino is Twitter client for Linux desktop. It's simple and fast. Pino is written in Vala language and compiled to the native binary code.
## https://launchpad.net/~troorl/+archive/pino
# Add key [ADDED]: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECF4C854
deb http://ppa.launchpad.net/troorl/pino/ubuntu lucid main  # pino 

### pino  :: Pino is Twitter client for Linux desktop. It's simple and fast. Pino is written in Vala language and compiled to the native binary code.
## https://launchpad.net/~troorl/+archive/pino
# Add key [ADDED]: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECF4C854
deb http://ppa.launchpad.net/troorl/pino/ubuntu lucid main  # pino 

### pino  :: Pino is Twitter client for Linux desktop. It's simple and fast. Pino is written in Vala language and compiled to the native binary code.
## https://launchpad.net/~troorl/+archive/pino
# Add key [ADDED]: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECF4C854
deb http://ppa.launchpad.net/troorl/pino/ubuntu lucid main  # pino
Как видите, скрипт понимает как "спец. урл" (в формате add-apt-repository), так и урлы страницы и хранилища репозитория. А параметр "-i" позволяет сразу импортировать ключ репозитория в систему, при этом, если при импорте не возникнет ошибок, то в третьих строках вывода появится надпись (без ключа ее не будет) "[ADDED]", а если произойдет ошибка, то - "[FAIL]".

На последок приведу пример использования:
$ ppaadd -i ppa:troorl/pino | sudo tee -a /etc/apt/sources.list

### pino  :: Pino is Twitter client for Linux desktop. It's simple and fast. Pino is written in Vala language and compiled to the native binary code.
## https://launchpad.net/~troorl/+archive/pino
# Add key [ADDED]: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECF4C854
deb http://ppa.launchpad.net/troorl/pino/ubuntu lucid main  # pino 
Результат был выведен на экран и добавлен в /etc/apt/sources.list, а так же был импортирован ключ репозитория:
$ grep -A 3 '### pino' /etc/apt/sources.list
### pino  :: Pino is Twitter client for Linux desktop. It's simple and fast. Pino is written in Vala language and compiled to the native binary code.
## https://launchpad.net/~troorl/+archive/pino
# Add key [ADDED]: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECF4C854
deb http://ppa.launchpad.net/troorl/pino/ubuntu lucid main  # pino 
Т.ж. мне лично скрипт полезен тем, что бывает на просторах сети встречаешь статью, в которой рассказывается о какой-то софтине, и показано как ее ставить, но приведен не URL репозитория, а "спец. урл" (в формате add-apt-repository) или урл хранилища репозитория, а хочется получить URL страницы репозитория. Тут данный скрипт экономит время :)




Информация с сайта http://angel2s2.blogspot.com/.

3 комментария:

  1. нет, ну, правда, зачем писать новый а не поправить старый, тем паче, что он все одно на питоне, который вполне себе ничего в плане правки?

    ОтветитьУдалить
  2. Не угодил тем, что, как я уже писал, "предпочитаю хранить все репозитории в одном файле, а не разбрасывать их по разным файлам в каталоге /etc/apt/sources.list.d/", что и делает add-apt-repository. К тому же add-apt-repository не записывает "дополнительную" информацию в файл-настройку репозитория, например, как добавить ключ вручную и страница репозитория, что может быть полезно, когда нужно переустановить систему (ну мало ли что) или хочется этот же файл-настройку кинуть на другую машину.

    Нуууууу... просто так, захотелось :)))
    Питон я только не давно начал изучать, пока особо и не знаю его %)

    ОтветитьУдалить