2010/06/17

One-liner again

Je voulais pouvoir récupérer la liste complète des ports outdated de FreeBSD, pour ça nous disposons de portscout mais ce dernier ne présente que la liste par mainteneur, or je voulais la liste complète... mais portscout propose un flux rss qui, si il est appelé sans le paramètre ?m=, liste tous les ports outdated (attention le fichier est gros).

J'ai donc pris quelques armes :

le résultat :

feed=(${(f)"$(fetch -q -o - http://portscout.org/rss/rss.cgi)"}) && for item ({1..$(xml sel -t -v "count(//item)" =( print -lr $feed))}) { xml sel -t -v //item[$item]/title =( print -lr $feed) | html2text } > portscout.txt

avec cette ligne je récupère un fichier portscout.txt donc le contenu est :

categorie/port: ancienne_version -> nouvelle_version

tout simplement

UPDATE :

Voici une version plus zshienne (plus besoin de xmlstarlet ni de html2text) en revanche elle est moins souple mais plus rapide :

feed=(${(f)"$(fetch -q -o - http://portscout.org/rss/rss.cgi)"}) && for item ({0..$#feed}) { [[ -z ${feed[$item]:#\<item\>*} ]] && { print ${${${${feed[$item + 1]}/&#x3E;/>}/\<\/title\>/}/\<title\>} } } > portscout.txt

2009/08/28

Reconstruire les paquets cassés

Voici un petit script ZSH pour rechercher les binaires systèmes qui ne trouvent pas les bibliothèques dont ils dépendent et les reconstruire en utilisant portmaster.

#!/usr/local/bin/zsh

typeset -a torebuild

rep=(/usr/local/bin/**/*(.))
rep+=(/usr/local/lib/**/*.so(.))
rep+=(/usr/local/sbin/**/*(.))

for bin ($rep) {
    file $bin | grep -q "ELF" && {
        ldd =$bin | grep -q "not found" && {
            torebuild+=$(pkg_info -qoW $bin)
        }
    }
}
portmaster -f ${(u)torebuild}

2009/08/27

zcp un wrapper pour cp

L'autre jour sidh me demandait si je n'avais rien en zsh pour pouvoir suivre la progression d'un cp volumineux et je n'avais rien, mais j'ai trouvé l'idée intéressante. Un petit man cp plus tard, je me rend compte que le cp de FreeBSD il est beau et bien foutu, en lui envoyant un SIGINFO il nous dis ce qu'il fait et ou il en est. De là a wrapper tout dans un petit script zsh il n'y avait qu'un pas.

De plus zsh permet de créer un tty virtuel (zpty) dans lequel on peut exécuter des commandes et interagir, du coup, voici un petit script bien pratique :

#!/usr/local/bin/zsh
setopt extendedglob
zmodload zsh/zpty
zpty copy "cp $@ 2>&1"     
ZPTYPID=${${=${(M)${(f)"$(ps -o pid,ppid,command)"}:#[[:space:]]#[[:digit:]]##[[:space:]][[:space:]]#$$*zsh*}}[1]}
CPPID=${${=${(M)${(f)"$(ps -o pid,ppid,command)"}:#[[:space:]]#[[:digit:]]##[[:space:]][[:space:]]#${ZPTYPID}*cp*}}[1]}
line=""
while [ : ]
do
    zpty -rt copy out
    if [[ $#out -gt 0 ]]
    then
        newline=${${=${out}}[0,-2]}
        percent=${${=${out}}[-1]}
        if [[ -z $line || "x$newline" != "x$line" ]]
        then
            [[ -n $line ]] && print "${line}: done"
            line=$newline
            print "${line}: ${(l: ::4:)percent}\c"
        else
            print "\r${line}: ${(l: ::4:)percent}\c"
        fi
    fi
        kill -SIGINFO $CPPID 2>/dev/null || break
done
[[ -n $line ]] && print "${line}: done"
zpty -d copy

la sortie donne : # zcp toto.iso bla/ toto.iso -> bla/toto.iso: 48%

UPDATE: Apparemment ça ne fonctionne qu'avec zsh 4.3.10+

2009/06/11

Zsh avec Ncurses c'est beau

Depuis un moment déjà zsh a un nouveau module zsh/curses qui permet de faire de belles interface en ncurses directemet en script zsh. Depuis le temps que je voulais essayer, j'ai fini par me décider.

Pour mon premier bout de zsh/curses, j'ai décider de me faire un mixer tout joli utilisant mixer(8), je m'inspire donc de rexima dont j'aime bien l'ui et je suis donc parti pour me faire un zmixer.

De plus j'ai découvert que l'on pouvais faire du ZSH avec une syntaxe "un peu objet" alors voila le code obtenu :

#!/usr/bin/env zsh

zmodload zsh/curses

zmix()
{
    local mixer
    local -a zmix_dev
    integer y
    integer posy
    integer length
    #get list of devices
    zmix.draw()
    {
        zcurses addwin main $(( $LINES - 2 )) $(( $COLUMNS - 2 )) 1 1
        title="zmixer"
        zcurses move main 1 $(( ($COLUMNS - 2 - $#title) / 2 ))
        zcurses string main $title
        y=4
        for dev ($zmix_dev);do
            y+=1
            zcurses move main $y 5
            zcurses string main $dev
            zcurses move main $y 15
            zcurses string main ":"
            # Set the recording device
            if [[ "x$dev" = "x$record" ]]; then
                zcurses addwin record 1 1 $(( y + 1 )) 4 main
                zcurses attr record red/black bold
                zcurses string record "*"
            fi
            level=${${(f)"$(/usr/sbin/mixer -s $dev)"}[(w)2]}
            numlevel=${${(s#:#)level}[1]}
            zcurses move main $(( y )) 17
            line="|"
            zcurses string main "[${(r:$length::-:)${(l:$(( numlevel / 2))::=:)line}}] ($level)"
        done
        if (( posy == 0 ));then
            posy=5
        fi
        zmix.sel $posy
        zcurses refresh main
    }
    zmix.listen()
    {
        while true;do
            if [[ -z $key ]];then
                zcurses input main REPLY key
            fi
            newkey=$key
            key=
            case $newkey in
                (UP)
                if (( posy <= 5 )); then
                    zmix.sel $y
                else
                    zmix.sel $(( posy - 1 ))
                fi
                ;;
                (DOWN)
                if (( posy >= y )); then
                    zmix.sel 5
                else
                    zmix.sel $(( posy + 1 ))
                fi
                ;;
                (LEFT)
                dev=$zmix_dev[$(( posy - 4 ))]
                mixer $dev -1 2>&1 >/dev/null
                zmix.redraw $dev
                ;;
                (RIGHT)
                dev=$zmix_dev[$(( posy - 4 ))]
                mixer $dev +1 2>&1 >/dev/null
                zmix.redraw $dev
                ;;
                ("")
                if [[ -z $REPLY ]];then
                    zcurses delwin record
                    zcurses delwin main
                    zcurses clear stdscr redraw
                    zcurses refresh stdscr
                    zmix.draw
                else
                    break
                fi
                ;;
            esac
        done
    }
    zmix.sel()
    {
        zcurses move main $posy 0
        zcurses string main "  "
        posy=$1
        zcurses move main $posy  0
        zcurses string main "->"
        zcurses refresh main
    }
    zmix.redraw()
    {
        dev=$1
        level=${${(f)"$(/usr/sbin/mixer -s $dev)"}[(w)2]}
        numlevel=${${(s#:#)level}[1]}
        zcurses move main $posy 16
        zcurses clear main eol
        level=${${(f)"$(/usr/sbin/mixer -s $dev)"}[(w)2]}
        numlevel=${${(s#:#)level}[1]}
        zcurses move main $posy 17
        line="|"
        zcurses string main "[${(r:$length::-:)${(l:$(( numlevel / 2))::=:)line}}] ($level)"
        zcurses move main $posy 2
        zcurses refresh main
    }
    #Constructor
    {
        length=50
        mixer=(${=${(f)"$(/usr/sbin/mixer -S)"}})
        for line ($mixer);do
            [[ -n ${line:#*:*:*} ]] && continue
            zmix_dev+=${${(s#:#)line}[1]}
        done
        record=$mixer[$#mixer]
        zcurses init
        zmix.draw
        zmix.listen
    } always
    {
        #cleanup all windows
        for win ($zcurses_windows);do
            [[ -z ${win:#(main|stdscr)} ]] && continue
            zcurses delwin $win
        done
        zcurses delwin main
        zcurses end
    }
}
zmix

Je sais pas vous mais moi je trouve ça beau.

Le résultat en image :

zmixer

EDIT: Promis dès que ça sera plus propre ça ira dans zen

2008/11/10

ZSH 4.3.9 featuring completion improvements for freebsd

First of all from now this blog will be written in english (why? because I decided :))

the news now:

since 3 Nov 2008 zsh 4.3.9 is released it is mostly a bugfix release but for us, there is some interesting things: the inclusion of some of the new functions from our project including burncd, sockstat, fetch and others.

Sorry sbz still no portaudit, but I promise I'll send it soon and it will be in the next zsh release :) (along with _pfctl)

2008/08/25

ZSH les ports et l'arbre de dépendances

voila un petit script zsh qui permet d'afficher sous la forme d'un arbre l'ensemble des dépendances d'un ports donné, je trouve ça très pratique lorsque l'on crée un nouveau ports pour pouvoir vérifier ces dépendances, ou lorsque l'on est sur le point d'installer un ports pour affiner son installation en voyant qu'elle dépendance installe qu'elle dépendance.

Cerise sur le gâteau, comme ce script fait des appels make pour récupérer la liste des dépendance, il prends en compte les options et les knobs que vous avez pu choisir.

#!/usr/bin/env zsh
PORTSDIR=$(make -V PORTSDIR)
function showdep() {
    local level=$1
    cd $2
    all_dep=(${${=${(f)"$(make -V BUILD_DEPENDS)"}}#*:} ${${=${(f)"$(make -V LIB_DEPENDS)"}}#*:} ${${=${(f)"$(make -V RUN_DEPENDS)"}}#*:})
    for dep (${(ou)all_dep}){
        repeat $level print -n "  "
        print ${dep//${PORTSDIR}\//}
        (( newlevel = level + 1 ))
        showdep $newlevel $dep
    }
}
showdep 0 "."

2008/08/07

Amélioration de la completion ZSH sous FreeBSD

Je me lance dans l'amélioration de la completion ZSH sous FreeBSD, N'hésitez pas à venir me faire part de ce que vous souhaiteriez voir améliorer, ajouter.

Seule limitation, l'amélioration ne concernera que ce qui fait parti du userland ou ce qui est spécifique à FreeBSD (portmaster/portupgrade par exemple).

J'ai mis en place en 1s un wiki pour que vous puissiez me faire vos retours/attentes.

Tout ce passe ici

La même chose est en cours depuis un moment pour Gentoo ici

2008/08/07

Amélioration de la completion ZSH sous FreeBSD la suite

Voila ça a commencé, tout est disponible sur ce git pour le moment il n'y a pas grand chose (powerd et fetch) mais ça va grossir, n'hésitez pas à venir m'aider, en codant ou en testant les différentes fonctions de completion.

Vous pouvez suivre l'état d'avancement et me faire des retours ici

2008/07/18

Merise en console tout simplement

Toi aussi tu dois faire un diagramme merise ? toi aussi tu ne trouve pas d'éditeur correcte pour faire ça.

Par contre du aime les trucs simple bien foutu et qui marchent. Donc ton shell de prédilection c'est forcément zsh, tu utilises latex pour rédiger des documents, du utilises metauml pour faire de beaux diagrammes UML, tes superbes diagrammes sont fait avec pgf et tikz mais tu n'as rien pour le merise.

sbz (sur #freebsd-fr) vient de me donner un lien qui va surement te raviré : merisedot, il s'agit la d'un beau script zsh utilisant Graphviz. c'est beau, c'est simple, ça fait plaisir.

Cerise sur le gateau, ceux qui sont sur #zsh-fr connaissent l'auteur, il s'agit de khatar

EDIT : gros méa culpa sbz de t'avoir confondu avec kimelto, mais il faut dire que kimelto parle tout le temps sur le chan aussi... :)

2008/06/11

Retrouver les paquets installés concernés par un KNOB donné

Pour retrouver les paquets concernés par un KNOB donné sous FreeBSD, il n'y a pas de méthode propre

Heureusement, ce n'es pas très compliqué, trois coup de zsh plus tard et on obtiens la liste. Dans mon cas je cherhais la liste des paquets qui sont concernés par le KNOBS WITHOUT_NLS :

#!/usr/bin/env zsh

autoload -U zargs
bla=($(zargs ${${(f)"$(pkg_info)"}// */} -- pkg_info -qo ))
for file ($bla) grep -q WITHOUT_NLS /usr/ports/$file/Makefile* && print $file

Pages : 1 2