#! /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.5"
   DATE       = "2011-06-15"

   # 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/"
   TIMEOUT   = 30

   # 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")

   # msg
   RED=31
   GREEN=32
   YELLOW=33
#  BLUE=34
#  MAGENTA=35
   CYAN=36
#  WHITE=37

   tbColor["OK"] = GREEN
   tbColor["ERR"] = RED
   tbColor["INFO"] = CYAN

#  COL = system("exit $(stty size | cut -d' ' -f2)") - 6
   COL = 24
}


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[tb_PKG[1]],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 --connect-timeout=" TIMEOUT " --directory-prefix="tb_PKGDIR[a[1]] " " WEBREPO pakw " >/dev/null 2>&1"
      if ("--dry" in tb_OPT) {
         print " " cmd
         return 8
      } else {
         rc=system(cmd) 
         if (rc>0) {
            return 1
         }
         if (!("-im" in tb_OPT))
            verif_md5sum(tb_PKGDIR[a[1]], pak)
         return 0
      }
   } else
     return 9
}


function dsearch(   old_FS, j, FILE, trt)
{
   old_FS = FS
   FS="[:#]"
   for (j=0; j<NPKGDIR; j++) {
      FILE=PKGDIR[j] REPO
      while ((getline < FILE) >0) {
         if ( !($1 in trt) && (index($1,ARGV[2]) || index($5,ARGV[2]))) {
            print $1
            trt[$1]="y"
         } 
      }
   }
   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, rc, st)
{
   printPkg(Pkg"#"tb_REPO[Pkg])

   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"
      printOper("Téléchargement")
      rc = download(pak)
      if (!("--dry" in tb_OPT)) {
         if (rc==0)      st="OK"
         else if (rc==1) st="ERR"
         else if (rc==9) st="OLD"
         else            st=""
         printStatus(st)
      }
   }
   if ("-do" in tb_OPT)
      return

   if (PRE=="y" && tb_PRE[Pkg]=="yes") {
      printOper("Pré-installation")
      cmd = "/bin/bash " tb_PKGDIR[Pkg] "PKGINST " Pkg "_pre_install"
      if ("--dry" in tb_OPT) {
         print " " cmd
      } else {
         rc = system(cmd)
#        while ((cmd | getline) >0)
#           print
#        close(cmd)
         st = (rc==0) ? "OK" : "ERR"
         printStatus(st)
      }
   }

   printOper("Installation")
   cmd = "pkgadd " AARGS " " Oper " " tb_PKGDIR[Pkg] pak   # Oper==" " : insert ; Oper=="-u" : update
   if ("--dry" in tb_OPT) {
      print " " cmd
   } else {
      rc = system(cmd)
#     while ((cmd | getline) >0)
#        print
#     close(cmd)
      st = (rc==0) ? "OK" : "ERR"
      printStatus(st)
   } 

   tb_DB[Pkg]=tb_REPO[Pkg]

   if (POST=="y" && tb_POST[Pkg]=="yes") { 
      printOper("Post-installation")
      cmd = "/bin/bash " tb_PKGDIR[Pkg] "PKGINST " Pkg "_post_install"
      if ("--dry" in tb_OPT) {
         print " " cmd
      } else {
         rc = system(cmd)
#        while ((cmd | getline) >0)
#           print
#        close(cmd)
         st = (rc==0) ? "OK" : "ERR"
         printStatus(st)
      } 
   }
}


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, trt)
{
   old_FS = FS
   FS="#"
   for (j=0; j<NPKGDIR; j++) {
      FILE = PKGDIR[j] REPO
      while ((getline < FILE) >0) {
         if (!($1 in trt)) {
            print $1
            trt[$1]="y"
         }
      }
      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 printOper(texte) {
   printf "   %-" COL-4 "s%s", texte, "..."
}


function printPkg(pkg) {
   printf "\033[1;%dm%s\033[0m\n", YELLOW, pkg
}


function printStatus(status) {
   printf "\033[%dG\033[1;%dm%-4s\033[0m\n", COL, tbColor[status], status
}


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, trt)
{
   old_FS = FS
   FS="[:#]"
   for (j=0; j<NPKGDIR; j++) {
      FILE=PKGDIR[j] REPO
      while ((getline < FILE) >0) {
         if (!($1 in trt) && index($1,ARGV[2])) {
            print $1
            trt[$1]="y"
         }
      }
      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++) {
            print PKGDIR[j] pak[i]
            cmd="wget -q --connect-timeout=" TIMEOUT " -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
}