diff options
Diffstat (limited to 'base/pkg-get/pkg-get.awk')
-rwxr-xr-x | base/pkg-get/pkg-get.awk | 829 |
1 files changed, 829 insertions, 0 deletions
diff --git a/base/pkg-get/pkg-get.awk b/base/pkg-get/pkg-get.awk new file mode 100755 index 000000000..d8e526a80 --- /dev/null +++ b/base/pkg-get/pkg-get.awk @@ -0,0 +1,829 @@ +#! /usr/bin/awk -f +# _ _ _ +# _ __ | | ____ _ __ _ ___| |_ __ ___ _| | __ +# | '_ \| |/ / _` |___ / _` |/ _ \ __| / _` \ \ /\ / / |/ / +# | |_) | < (_| |___| (_| | __/ |_ _ | (_| |\ V V /| < +# | .__/|_|\_\__, | \__, |\___|\__| (_) \__,_| \_/\_/ |_|\_\ +# |_| |___/ |___/ +# +# A binary package management utility + + +function configs( a, i, k, n, old_FS) +{ + n=split(ENVIRON["_"],a,"/") + NPKG = a[n] + VERSION = "0.3.2" + DATE = "2011-03-11" + + # defauts + CONF = "/etc/pkg-get.conf" + VERSFILE = "/var/lib/pkg/nutyx-version" + DB = "/var/lib/pkg/db" + LOCKER = "/var/lib/pkg/pkg-get.locker" + PRE = "n" + POST = "n" + PKGDIR[0] = "/srv/NuTyX/release/" + load_NUTYX_VERSION() + "uname -p " | getline ENV; close("uname -p") + WEBDIR[0] = "http://nutyx.meticul.eu/" NUTYX_VERSION "/" ENV "/release/" + + # arguments + OPER=(ARGC>1) ? ARGV[1] : "" + PKG =(ARGC>2) ? ARGV[2] : "" + for (i=2; i<ARGC; i++) { + if (ARGV[i]=="-r") { + tb_OPT[ARGV[i]]=ARGV[i+1] + i++ + } else if (substr(ARGV[i],1,1)=="-") { + split(ARGV[i],a,"=") + tb_OPT[a[1]]=a[2] + } else + tb_PKG[++nPKG]=ARGV[i] + } + + # divers + cmd="uname -m" + cmd | getline ARCH + close(cmd) + + # fichier pkg-get.conf + if ("--config" in tb_OPT) + CONF = tb_OPT["--config"] + old_FS=FS + FS="|" + NPKGDIR=0 + while (getline < CONF) { + n=split($1,a," ") + if (a[1]=="pkgdir") { + PKGDIR[NPKGDIR]=a[2]"/" + if (NF<2) { + WEBDIR[NPKGDIR]="" + } else { + sub(" ","",$2) + sub("/uname-m/", "/"ARCH"/", $2) + WEBDIR[NPKGDIR]=$2"/" + } + NPKGDIR++ + } + if (a[1]=="runscripts") { + PRE = (a[2]=="yes") ? "y" : "n" + POST = (a[2]=="yes") ? "y" : "n" + } + } + FS=old_FS + + # options + if ("-r" in tb_OPT) + AARGS = AARGS " -r " tb_OPT["-r"] + if ("-do" in tb_OPT) + {} + if ("-f" in tb_OPT) + AARGS = AARGS " -f" + if ("-im" in tb_OPT) + AARGS = AARGS " -im" + if ("--aargs" in tb_OPT) + AARGS = AARGS " " tb_OPT["--aargs"] + if (("--install-scripts" in tb_OPT) || ("--pre-install" in tb_OPT)) + PRE = "y" + if (("--install-scripts" in tb_OPT) || ("--post-install" in tb_OPT)) + POST = "y" + DEPS = "PKGDEPS" + READ = "PKGREAD" + REPO = "PKGREPO" + GRP = "PKGGRP" + + # i18n + TEXTDOMAIN = "pkg-get" + bindtextdomain("/usr/share/locale") +} + + +function current() +{ + load_DB() + if (PKG in tb_DB) + print tb_DB[PKG] + else + print _"Paquet" " " PKG " " _"non installé" +} + + +function dependent( a, i, n) +{ + load_RDEPS() + load_DB() + n=split(tb_RDEPS[PKG],a,",") + for (i=1; i<=n; i++) + if ((a[i] in tb_DB) || ("--all" in tb_OPT)) + print a[i] +} + + +function depends( c) +{ + load_DB() + load_DEPS() + load_REPO() + print _"- dépendences ([i] = installé, [u] = mise à jour possible)" + depends2(PKG,ARGV[3]) + if (PKG in tb_DB) + c= (tb_REPO[PKG]==tb_DB[PKG]) ? "i" : "u" + else + c=" " + printf("[%c] %s\n", c, PKG) +} + + +function depends2(Pkg, Fl, a, i, n, c) +{ + S = (Fl=="--d") ? S "-- " : "" + n=split(tb_DEPS[Pkg],a,",") + for (i=1; i<=n; i++) { + if (tb_DEP_TRT[a[i]]==0) { + tb_DEP_TRT[a[i]]++ + if (a[i] in tb_DEPS) + depends2(a[i],Fl) + if (a[i] in tb_DB) + c= (tb_DB[a[i]]==tb_REPO[a[i]]) ? "i" : "u" + else + c=" " + printf("[%c] %s%s\n", c, S, a[i]) + } + } + S = (Fl=="--d") ? substr(S,4) : "" +} + + +function depinst( i) +{ + verif_if_root() + load_REPO() + if (!(PKG in tb_REPO)) { + print _"Paquet" " " _"indisponible" ": "PKG + exit 1 + } + load_DB() + load_DEPS() + for (i=1; i<=nPKG; i++) { + if (tb_PKG[i] in tb_DB) + print _"Le paquet" " " tb_PKG[i] " " _"est déjà installé" + else + depinst2(tb_PKG[i]) + } + return rc +} + + +function depinst2(Pkg, a, i, n) +{ + n=split(tb_DEPS[Pkg],a,",") + for (i=1; i<=n; i++) { + if (tb_DEP_TRT[a[i]]==0) { + tb_DEP_TRT[a[i]]++ + if (a[i] in tb_DEPS) + depinst2(a[i]) + if (!(a[i] in tb_DB)) { + install2_update2(a[i], "") + } + } + } + if (!(Pkg in tb_DB)) { + install2_update2(Pkg, "") + } +} + + +function diff( a, i, n, pak) +{ + load_DB() + load_LOCKER() + load_REPO() + print _"Différences entre paquets installés et paquets disponibles dans le dépôts:\n" + printf("%-30s %-20s %-20s\n", _"Paquet", _"Installé", _"Disponible dans les dépôts\n") + for (pak in tb_DB) + a[pak]=pak + n=asort(a) + for (i=1;i<=n;i++) { + pak=a[i] + if ((pak in tb_REPO) && ((!(pak in tb_LOCK)) || ("--all" in tb_OPT)) && (tb_DB[pak]!=tb_REPO[pak])) { + printf("%-30s %-20s %-20s\n", pak, tb_DB[pak], tb_REPO[pak]) + } + } +} + + +function download(pak, a, WEBREPO, fnPak, cmd, rc, pakw) +{ + split(pak,a,"#") + WEBREPO = tb_WEBDIR[a[1]] + fnPak = tb_PKGDIR[a[1]] pak + if ((getline < fnPak) <=0) { + pakw = pak + sub("#", "%23", pakw) + cmd="wget --no-directories --tries=3 --waitretry=3 -nv --directory-prefix="tb_PKGDIR[a[1]] " " WEBREPO pakw + if ("--dry" in tb_OPT) { + print "\033[1;34m" cmd "\033[1;0m" + } else { + rc=system(cmd) + if (rc>0) { + print "ERREUR", rc + exit 1 + } + if (!("-im" in tb_OPT)) + verif_md5sum(tb_PKGDIR[a[1]], pak) + } + } +} + + +function dsearch( old_FS, j, FILE) +{ + old_FS = FS + FS="[:#]" + for (j=0; j<NPKGDIR; j++) { + FILE=PKGDIR[j] REPO + while ((getline < FILE) >0) { + if (index($1,ARGV[2]) || index($5,ARGV[2])) + print $1 + } + } + close(FILE) + FS = old_FS +} + + +function help() +{ + version() + print "\033[1;33m" _"Usage:" "\033[1;0m" + print " " NPKG " current <paquet> - " _"affiche la version installée de <paquet>" + print " " NPKG " dependent <paquet> - " _"affiche la liste des paquets dépendants de <paquet>" + print " " NPKG " depends <paquet> - " _"affiche la liste des dépendances de <paquet>" + print " " NPKG " depinst <paquet(s)> - " _"installe <paquet(s)> et ses(leurs) dépendances" + print " " NPKG " diff - " _"affiche la liste des paquets obsolètes" + print " " NPKG " dsearch <chaine> - " _"cherche les paquets dont le nom/la description contient <chaine>" + print " " NPKG " help - " _"affiche cette aide" + print " " NPKG " info <paquet> - " _"affiche les informations concernant <paquet>" + print " " NPKG " isinst <paquet> - " _"affiche si <paquet> est installé" + print " " NPKG " install <paquet(s)> - " _"installe <paquet(s)>" + print " " NPKG " list - " _"affiche la liste des paquets disponibles dans les dépôts" + print " " NPKG " listinst - " _"affiche la liste des paquets installés" + print " " NPKG " listlocked - " _"affiche la liste des paquets verrouillés" + print " " NPKG " lock <paquet(s)> - " _"verrouille <paquet(s)> (empêche la mise à jour)" + print " " NPKG " path <paquet> - " _"affiche le répertoire d'installtion de <paquet>" + print " " NPKG " quickdep <paquet> - " _"affiche la liste abrégée des dépendances de <paquet>" + print " " NPKG " quickdiff - " _"affiche la liste abrégée des paquets obsolètes" + print " " NPKG " readme <paquet> - " _"affiche les informations README de <paquet> si existantes" + print " " NPKG " search <chaine> - " _"cherche les paquets dont le nom contient <chaine>" + print " " NPKG " sync - " _"synchronise avec le dépôt" + print " " NPKG " sysup - " _"met à jour les paquets obsolètes, télécharge si nécessaire" + print " " NPKG " unlock <paquet(s)> - " _"déverrouille <paquet(s)> (permet la mise à jour)" + print " " NPKG " update <paquet(s)> - " _"met à jour <paquet(s)>, télécharge si nécessaire" + print " " NPKG " version - " _"affiche la version de ce script" + print "\033[1;33m" _"Exemple:" "\033[1;0m" + print " " NPKG " depends k3b" +} + + +function info( a, b, c, cmd, g, gline, n, rline, out) +{ + load_REPO() + cmd = "grep ^" PKG " " tb_PKGDIR[PKG] REPO + cmd | getline rline + if (rline) { + close(cmd) + split (rline, a, ":") + split (a[1], b, "#") + print _"Nom " " : " PKG + cmd = "grep " PKG " " tb_PKGDIR[PKG] GRP " 2>&1" + cmd | getline gline + close(cmd) + split (gline, g, ":") + if (g[1]=="grep") + print _"Groupe" " : " + else + print _"Groupe" " : " g[1] + split(b[2], c, "-") + print "Version" " : " c[1] + sub(".pkg.tar.xz","",c[2]) + print "Release" " : " c[2] + print "Description" " : " a[4] + print "URL" " : " tb_WEBDIR[PKG] a[1] + print "Md5sum" " : " a[3] + print _"Taille" " : " a[2] + load_DEPS() + print _"Dépend de " " : " tb_DEPS[PKG] + out="" + if (tb_PRE[PKG]=="yes") + out = out "pre-install " + if (tb_POST[PKG]=="yes") + out = out "post-install " + if (tb_READ[PKG]=="yes") + out = out "readme" + print _"Fichiers" " : " out + } else + print _"Paquet" " '" PKG "' " _"non trouvé" +} + + +function install( i) +{ + verif_if_root() + load_REPO() + if (!(PKG in tb_REPO)) { + print _"Paquet" " " _"indisponible" ": "PKG + exit 1 + } + load_DB() + for (i=1; i<=nPKG; i++) { + if (tb_PKG[i] in tb_DB) + print _"Le paquet" " " tb_PKG[i] " " _"est déjà installé" + else + install2_update2(tb_PKG[i], " ") + } +} + + +function install2_update2(Pkg, Oper, cmd, i, pak) +{ + if (!(Pkg in tb_REPO)) { + print "\033[1;31m" _"Paquet" " " Pkg " " _"indisponible" "\033[1;0m" + return + } + if (tb_REPO[Pkg] != "" ) { + pak=Pkg"#"tb_REPO[Pkg] ".pkg.tar.xz" + download(pak) + } + if ("-do" in tb_OPT) + return + print _"Installation de" " " Pkg + if (PRE=="y" && tb_PRE[Pkg]=="yes") { # pre-install + cmd = "/bin/bash " tb_PKGDIR[Pkg] "/PKGINST " Pkg "_pre_install" + if ("--dry" in tb_OPT) { + print "\033[1;33m" cmd "\033[1;0m" + } else { + while ((cmd | getline) >0) + print + close(cmd) + } + } + cmd = "pkgadd " AARGS " " Oper " " tb_PKGDIR[Pkg] pak # Oper==" " : insert ; Oper=="-u" : update + if ("--dry" in tb_OPT) { + print "\033[1;37m" cmd "\033[1;0m" + } else { + while ((cmd | getline) >0) + print + close(cmd) + } + + tb_DB[Pkg]=tb_REPO[Pkg] + + if (POST=="y" && tb_POST[Pkg]=="yes") { # post-install + cmd = "/bin/bash " tb_PKGDIR[Pkg] "/PKGINST " Pkg "_post_install" + if ("--dry" in tb_OPT) { + print "\033[1;33m" cmd "\033[1;0m" + } else { + while ((cmd | getline) >0) + print + close(cmd) + } + } +} + + +function isinst() +{ + load_DB() + if (PKG in tb_DB) + print _"Le paquet" " " PKG " " _"est installé" + else + print _"Le paquet" " " PKG " " _"n'est pas installé" +} + + +function list( old_FS, FILE, j, prev) +{ + old_FS = FS + FS="#" + for (j=0; j<NPKGDIR; j++) { + FILE = PKGDIR[j] REPO + while ((getline < FILE) >0) { + if ($1 != prev) { + print $1 + prev = $1 + } + } + close(FILE) + } + FS = old_FS +} + + +function listinst( old_FS, old_RS, fl) +{ + old_FS = FS; FS = "\t" + old_RS = RS; RS = "" + while (getline < DB) + print $1 + close(DB) + FS = old_FS + RS = old_RS +} + + +function listlocked() +{ + while (getline < LOCKER) + print $1 + close(LOCKER) +} + + +function load_DB( old_FS, old_RS, fl, pak) +{ + old_FS=FS; FS="\n" + old_RS=RS; RS="" + while (getline < DB) + tb_DB[$1]=$2 + close(DB) + FS=old_FS + RS=old_RS +} + + +function load_DEPS( j, FILE) +{ + for (j=0; j<NPKGDIR; j++) { + FILE=PKGDIR[j] DEPS + while ((getline < FILE) >0) { + if (!($1 in tb_DEPS)) { + tb_DEPS[$1] = $3 + tb_DEP_TRT[$1] = 0 + tb_DEP_DIR[$1] = PKGDIR[j] + } + } + close(FILE) + } +} + + +function load_LOCKER() +{ + while (getline < LOCKER) + tb_LOCK[$1] = 1 + close(LOCKER) +} + + +function load_NUTYX_VERSION( old_FS) +{ + old_FS = FS + FS = "-" + getline < VERSFILE + if ($1=="2010") NUTYX_VERSION = "attapu" + else if ($1=="2011") NUTYX_VERSION = "pakxe" + close(VERSFILE) + FS = old_FS +} + + +function load_RDEPS( a, FILE, i, j, n) +{ + for (j=0; j<NPKGDIR; j++) { + FILE=PKGDIR[j] DEPS + while ((getline < FILE) >0) { + n=split($3, a, ",") + for (i=1; i<=n; i++) { + if (a[i] in tb_RDEPS) { + if (!index(tb_RDEPS[a[i]],$1)) + tb_RDEPS[a[i]] = tb_RDEPS[a[i]] "," $1 + } else { + tb_RDEPS[a[i]] = $1 + } + } + } + close(FILE) + } +} + + +function load_REPO( FILE, j, old_FS) +{ + old_FS = FS + FS="[:#]" + for (j=0; j<NPKGDIR; j++) { + FILE = PKGDIR[j] REPO + while (getline < FILE) { + if (!($1 in tb_REPO)) { + sub(".pkg.tar.xz","",$2) + tb_REPO[$1] = $2 + tb_MD5[$1] = $4 + tb_PRE[$1] = $6 + tb_POST[$1] = $7 + tb_READ[$1] = $8 + tb_PKGDIR[$1] = PKGDIR[j] + tb_WEBDIR[$1] = WEBDIR[j] + } + } + close(FILE) + } + FS = old_FS +} + + +function lock( i) +{ + verif_if_root() + for (i=1; i<=nPKG; i++) { + print tb_PKG[i] >>LOCKER + } + close(LOCKER) +} + + +function path( a, cmd, j) +{ + load_REPO() + if (!PKG) + print NPKG ": 'path' " _"demande un argument" + else + print tb_PKGDIR[PKG] +} + + +function printff() +{ + print _"Désolé, fonction" " " OPER " " _"indisponible" "..." + exit 1 +} + + +function quickdep() +{ + load_DB() + load_DEPS() + load_REPO() + quickdep2(PKG) + printf ("%s\n",PKG) +} + + +function quickdep2(Pkg, a, i, n) +{ + n=split(tb_DEPS[Pkg],a,",") + for (i=1; i<=n; i++) { + if (tb_DEP_TRT[a[i]]==0) { + tb_DEP_TRT[a[i]]++ + if (a[i] in tb_DEPS) + quickdep2(a[i]) + printf("%s ", a[i]) + } + } +} + + +function quickdiff(Dest, a, i, n, pak) +{ + load_DB() + load_LOCKER() + load_REPO() + for (pak in tb_DB) + a[pak]=pak + n=asort(a) + delete tb_PKG + nPKG=0 + for (i=1;i<=n;i++) { + pak=a[i] + if ((pak in tb_REPO) && (!(pak in tb_LOCK)) && (tb_DB[pak]!=tb_REPO[pak])) { + if (Dest=="tb") + tb_PKG[++nPKG] = pak + else + printf("%s ", pak) + } + } + printf("\n") +} + + +function quickhelp() { + print "\033[1;33m" _"Usage" "\033[1;0m: " NPKG " command <package1> [package2 ... packageN] [options]" + print "\033[1;33m" _"Quelques commandes" "\033[1;0m:" + print " sync " _"synchronise avec le dépôt" + print " depinst " _"installe package(s) et ses(leurs) dépendances" + print " info " _"informations concernant le package" + print " sysup " _"met à jour les paquets obsolètes" + print " diff " _"affiche la liste des paquets obsolètes" + print "\033[1;33m" _"Quelques options:" "\033[1;0m" + print " -do " _"télécharge seulement" + print " --install-scripts " _"utilise les scripts install" + print " -r <root> " _"utilise" " <root> " _"pour" " pkgadd" + print "\033[1;33m" _"Examples" "\033[1;0m:" + print " " NPKG " install sqlite pysqlite" + print " " NPKG " help" + print _"Pour d'autres commandes et examples, voir la page de manuel" +} + + +function readme( fl, j, FILE) +{ + for (j=0; j<NPKGDIR; j++) { + FILE=PKGDIR[j] READ + while ((getline < FILE) >0) { + if (fl==1) { + if (index($0,"##### PKGREADME: ")) + exit + print $0 + } + if (index($0,"##### PKGREADME: "PKG)) + fl=1 + } + close(FILE) + } +} + + +function search( j, FILE, old_FS) +{ + old_FS = FS + FS="[:#]" + for (j=0; j<NPKGDIR; j++) { + FILE=PKGDIR[j] REPO + while ((getline < FILE) >0) { + if (index($1,ARGV[2])) + print $1 + } + close(FILE) + } + FS = old_FS +} + + +function sync( cmd, i, j, pak, rc) +{ + verif_if_root() + pak[1]="PKGREPO" + pak[2]="PKGDEPS" + pak[3]="PKGREAD" + pak[4]="PKGINST" + pak[5]="PKGGRP" + for (j=0; j<NPKGDIR; j++) { + if (WEBDIR[j] > "") { + for (i=1; i<=4; i++) { + cmd="wget -q -O "PKGDIR[j] pak[i] " " WEBDIR[j] pak[i] + if ("--dry" in tb_OPT) { + print "\033[1;34m" cmd "\033[1;0m" + } else { + rc=system(cmd) + if (rc>0) { + print "ERREUR", rc + exit 1 + } + } + } + } + } +} + + +function sysup( i) +{ + quickdiff("tb") + update() +} + + +function unlock( i, n, fl, tb_LCK) +{ + verif_if_root() + while (getline < LOCKER) { + fl="y" + for (i=1; i<=nPKG; i++) + if ($1==tb_PKG[i]) + fl = "n" + if (fl=="y") + tb_LCK[++n] = $1 + } + close(LOCKER) + printf("") > LOCKER + for (i=1; i<=n; i++) + print tb_LCK[i] >> LOCKER + close(LOCKER) +} + + +function update( i, pak) +{ + verif_if_root() + load_LOCKER() + load_REPO() + load_DB() + for (i=1; i<=nPKG; i++) { + pak = tb_PKG[i] + if (pak in tb_LOCK) + print pak ": " _"paquet verouillé !" + else + if (!(pak in tb_DB)) + print pak ": " _"pas de mise à jour d'un paquet non installé !" + else + if (tb_DB[pak]==tb_REPO[pak]) + print pak ": " _"paquet déjà à la dernière version" + else { + print _"paquet à mettre à jour:" " " pak + install2_update2(pak, "-u") + } + } +} + + +function verif_if_root( cmd) +{ + if (!("--dry" in tb_OPT)) { + cmd="whoami" + cmd | getline + if ($1 !="root") { + print "\033[1;31m" _"Veuillez exécuter ce programme en tant que root !" "\033[1;0m" + exit 1 + } + close(cmd) + } +} + + +function verif_md5sum(dir, pk, cmd, md5, a, rep) +{ + cmd="md5sum " dir pk + cmd | getline + split($0,md5," ") + close(cmd) + split(pk,a,"#") + if (md5[1]!=tb_MD5[a[1]]) { + print "-------> " _"ERREUR" ": " _"md5sum erroné pour " a[1] + print _"requis" ": " tb_MD5[a[1]] + print _"trouvé" ": " md5[1] + print "Supprimer " dir pk " <y/n> ?" + getline rep + if (rep=="y") { + cmd = "rm " dir pk + while ((cmd | getline) > 0) + print + close(cmd) + } + exit 1 + } +} + + +function version() +{ + print NPKG " " VERSION " (" DATE ")" +} + + +function wrongparm() +{ + version() + print _"Paramètre" " '" OPER "' " _"erroné" + exit 1 +} + + +#------------------------------------------------ +# +# M A I N +# +#------------------------------------------------ + +BEGIN { + configs() + + if (OPER=="") quickhelp() + else if (OPER=="current") current() + else if (OPER=="dependent") dependent() + else if (OPER=="depends") depends() + else if (OPER=="depinst") rc=depinst() + else if (OPER=="diff") diff() + else if (OPER=="dsearch") dsearch() + else if (OPER=="help") help() + else if (OPER=="info") info() + else if (OPER=="install") install() + else if (OPER=="isinst") isinst() + else if (OPER=="list") list() + else if (OPER=="listinst") listinst() + else if (OPER=="listlocked") listlocked() + else if (OPER=="lock") lock() + else if (OPER=="path") path() + else if (OPER=="printf") printff() + else if (OPER=="quickdep") quickdep() + else if (OPER=="quickdiff") quickdiff() + else if (OPER=="readme") readme() + else if (OPER=="search") search() + else if (OPER=="sync") sync() + else if (OPER=="sysup") sysup() + else if (OPER=="unlock") unlock() + else if (OPER=="update") update() + else if (OPER=="version") version() + else wrongparm() + + exit +} |