scripts / upgrade_status /
Sébastien MARQUE ajout
e9ded39 7 years ago
1 contributor
113 lines | 3.084kb
#!/usr/bin/awk -f
function list_pkgs (type, label, test) {
    count = 0
    for (p in pkg)
        if (pkg[p][type]) {
            count++
        }
    if (count) {
        if (label) print count " paquets " label
        n = asorti(pkg, pkg_sorted)
        for (i = 1; i <= n; i++) {
            p = pkg_sorted[i]
            pkg_ok = 0
            if (test) {
                if (pkg[p][type] && pkg[p][test])
                    pkg_ok = 1
            }
            else {
                if (pkg[p][type])
                    pkg_ok = 1
            }
            if (pkg_ok) {
                if (label) print " -> " p
                delete pkg[p]
            }
        }
    }
}

function show_help_and_exit (exitcode) {
    print "USAGE"
    print ENVIRON["_"] " [date formattée] [[-]stdin] [help]\n"
    print "OPTIONS"
    print "  date          : format 20AA-MM-JJ"
    print "                  défaut: date du jour\n"
    print "  -stdin, stdin : lit depuis l'entrée standard"
    print "                  défaut: lit /var/log/dpkg.log\n"
    print "  help          : affiche cette aide et quitte"
    exit exitcode
}

BEGIN {
    installed = "installed"
    remove = "remove"
    upgrade = "upgrade"
    notinstalled = "not-installed"
    trigproc = "trigproc"
    errors = 0
    datefound = 0
    filename = "/var/log/dpkg.log"

    for (i = 1; i < ARGC; i++)
        switch (ARGV[i]) {
            case /^-?stdin$/:
                filename = "-"
                break
            case /^20[0-9]{2}-[0-9]{2}-[0-9]{2}$/:
                date = ARGV[i]
                break
            case "help":
                show_help_and_exit(0)
            default:
                print ARGV[i] " : option inconnue"
                show_help_and_exit(1)
        }

    if (date == "")
        date = strftime("%F")

    while ((getline < filename) == 1) {
        if ($1 == date) {
            datefound = 1
            switch ($3) {
                case "status":
                    pkg[$5][$4] = $NF
                    break
                case "upgrade":
                    pkg[$4][upgrade] = $NF
                    break
                case "remove":
                    pkg[$4][remove]++
                    break
                case "trigproc":
                    pkg[$4][trigproc]++
                    break
                case "configure":
                default:
                    break
            }
        }
    }

    if (! datefound) {
        printf("date %s non trouvée %s\n", date, filename != "-" ? "dans " filename : "")
        exit 1
    }

    list_pkgs(trigproc,  "",         installed) # pas d'affichage si OK
    list_pkgs(upgrade,   "mis à jour", installed)
    list_pkgs(remove,    "supprimés",  notinstalled)
    list_pkgs(installed, "nouvellement installés")

    count = 0
    for (p in pkg)
        count++
    if (count)
        print count " erreurs"
    for (p in pkg) {
        status = ""
        for (s in pkg[p]) if (pkg[p][s]) status = status " " s
        print " -> " p " (" gensub(" ", "", 1, status) ")"
    }
}