Pkg_info corrupt for some packages

Aijaz Baig aijaz.abaig at gmail.com
Mon Apr 14 20:47:02 UTC 2008


Hello,

I tried running the script suggested by mel and after that I was able to see
that some of those packages got registered as installed.

However some of the packages were not being found and as an example I saw
the following:

Restoring doodle-0.6.6_1
Failed: cannot find doodle-0.6.6_1 in /usr/ports/INDEX-7*

*Then as suggested by andrew I tried to see just how many packages have been
messed and to my shock the figure for the first command was 336 and for the
second command was 326.

Well...how do I 'extract the port origins' from pkgdb.db?I am sorry if I
sound naive but im a bit new to freebsd.

Hope to hear from you guys,

On Sun, Apr 13, 2008 at 11:01 PM, Mel <fbsd.questions at rachie.is-a-geek.net>
wrote:

> On Sunday 13 April 2008 11:41:19 Aijaz Baig wrote:
> > Hi,
> >
> > Well...I tried to cut and paste the command as is by mel (though It
> would
> > have been better if you explained what that cryptic looking command
> > actually meant) and I got the followinfg output:
> >
> > 'grep: /var/db/pkg/xorg-server-1.4_4,1/+CONTENTS: No such file or
> directory
>
> Well, that explaines it right there. It wasn't installed properly, because
> every installed port should have a +CONTENTS file.
> You can grab the files from 'pkgdb.db' like Andrew suggested, but I
> personally
> wouldn't trust those if portupgrade was the one that did this in the first
> place.
> This is where daily backups rock :).
>
> If your /usr/ports/INDEX-6 (or -7) is in sync with your installed
> packages,
> then maybe the following script will work. It worked for me testing it,
> but I
> can't guarentee it will work in all cases.
>
> If you're on FreeBSD 6, change INDEXFILE to /usr/ports/INDEX-6. Rest
> should
> work without changes.
>
> #!/bin/sh
>
>
> INDEXFILE='/usr/ports/INDEX-7'
> for dir in /var/db/pkg/*; do
>    if test ! -e ${dir}/+CONTENTS -a -d ${dir}; then
>        pkgname=${dir##*pkg/}
>        echo "Restoring ${pkgname}"
>        IDX=$(grep "^${pkgname}|" ${INDEXFILE} 2>/dev/null)
>        if test -z "${IDX}"; then
>            echo "Failed: cannot find ${pkgname} in ${INDEXFILE}"
>        else
>            _origin=${IDX#*|}
>            origin=${_origin%%|*}
>            echo "---> ${origin}"
>            cd ${origin}
>            mv ${dir} /tmp/
>            make -DFORCE_PKG_REGISTER generate-plist fake-pkg
>            for file in /tmp/${pkgname}/*; do
>                f=${file##*/}
>                if test ! -f ${dir}/${f}; then
>                    echo "--> Restoring ${pkgname}/${f}"
>                    mv ${file} ${dir}/
>                fi
>            done
>        fi
>    fi
> done
>
>
> --
> Mel
>
> Problem with today's modular software: they start with the modules
>    and never get to the software part.
>


More information about the freebsd-questions mailing list