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 :
- ZSH
- textproc/xmlstarlet pour faire des requête dans le xml
- textproc/html2text pour un peu de cosmétique dans la sortie
- fetch
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]}/>/>}/\<\/title\>/}/\<title\>} } } > portscout.txt
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}
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+
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 :

EDIT: Promis dès que ça sera plus propre ça ira dans zen
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)
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 "."
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.
La même chose est en cours depuis un moment pour Gentoo ici
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
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... :)
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