Fixing Broken Dependencies Entries in the PKGng Database
10:11 | 1 Comments
I moved to the new PKGng database format on FreeBSD for packages some time ago, I keep up-to-date with packages, but this one missing dependency about vulnerable www/libxul19 started to torture me for some time.
Lets start with portmaster --check-depends command, but say 'n' when asked for fix as it will downgrade a lot of packages needlessly.
# portmaster --check-depends (...) Checking dependencies: evince graphics/evince has a missing dependency: www/libxul19 (...) >>> Missing package dependencies were detected. >>> Found 1 issue(s) in total with your package database. The following packages will be installed: Downgrading perl: 5.14.2_3 -> 5.14.2_2 Downgrading glib: 2.34.3 -> 2.28.8_5 Downgrading gio-fam-backend: 2.34.3 -> 2.28.8_1 Downgrading libffi: 3.0.12 -> 3.0.11 Downgrading gobject-introspection: 1.34.2 -> 0.10.8_3 Downgrading atk: 2.6.0 -> 2.0.1 Downgrading gdk-pixbuf2: 2.26.5 -> 2.23.5_3 Downgrading pango: 1.30.1 -> 1.28.4_1 Downgrading gtk-update-icon-cache: 2.24.17 -> 2.24.6_1 Downgrading dbus: 1.6.8 -> 1.4.14_4 Downgrading gtk: 2.24.17 -> 2.24.6_2 Downgrading dbus-glib: 0.100.1 -> 0.94 Installing libxul: 1.9.2.28_1 The installation will require 66 MB more space 38 MB to be downloaded >>> Try to fix the missing dependencies [y/N]: n >>> Summary of actions performed: www/libxul19 dependency failed to be fixed >>> There are still missing dependencies. >>> You are advised to try fixing them manually. >>> Also make sure to check 'pkg updating' for known issues.
Lets see what we have installed.
% pkg info | grep libxul libxul-10.0.12 Mozilla runtime package that can be used to bootstrap XUL+XPCOM apps % pkg info -qoa | grep libxul www/libxul
So the problem is that we have installed www/libxul instead of www/libxul19 and that is why portmaster complains about it.
Before PKGng was introduced it was easy just to grep -r the entire /var/db/pkg directory, but now its quite more complicated as the package database is kept in SQLite database. Using pkg shell command You can connect to that database. Lets check what we can find there.
% pkg shell SQLite version 3.7.13 2012-06-11 02:05:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .databases seq name file --- --------------- ---------------------------------------------------------- 0 main /var/db/pkg/local.sqlite sqlite> .tables categories licenses pkg_directories scripts deps mtree pkg_groups shlibs directories options pkg_licenses users files packages pkg_shlibs groups pkg_categories pkg_users sqlite> .header on sqlite> .mode column sqlite> pragma table_info(deps); cid name type notnull dflt_value pk ---------- ---------- ---------- ---------- ---------- ---------- 0 origin TEXT 1 1 1 name TEXT 1 0 2 version TEXT 1 0 3 package_id INTEGER 0 1 sqlite> .quit
So now we know, that package database is kept as /var/db/pkg/local.sqlite file and that 'deps' table is probably what we are looking for ;).
As pkg shell is quite limited for SQLite 'browsing' I will use the sqlite3 command itself. By limited I mean that You can not type pkg shell "select * from deps;" query, You first need to start pkg shell and then You can type your query, which seems limited to me ;).
% sqlite3 -column /var/db/pkg/local.sqlite "select * from deps;" | grep libxul www/libxul19 libxul 1.9.2.28_1 104
The second column is name so lets try to use it.
sqlite3 -header -column /var/db/pkg/local.sqlite "select * from deps where name='libxul';" origin name version package_id ------------ ---------- ---------- ---------- www/libxul19 libxul 1.9.2.28_1 104
So now we have the 'problematic' dependency entry nailed, lets modify it a little to the real isntalled packages state.
# sqlite3 /var/db/pkg/local.sqlite "update deps set origin='www/libxul' where name='libxul';" # sqlite3 /var/db/pkg/local.sqlite "update deps set version='10.0.12' where name='libxul';"
You can of course use the 'official' way by using the pkg shell command.
# pkg shell SQLite version 3.7.13 2012-06-11 02:05:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> update deps set origin='www/libxul' where name='libxul'; sqlite> update deps set version='10.0.12' where name='libxul'; sqlite> .header on sqlite> .mode column sqlite> select * from deps where name='libxul'; origin name version package_id ---------- ---------- ---------- ---------- www/libxul libxul 10.0.12 104 sqlite> .quit
Now portmaster is happy and does not complain about any missing dependencies.
# portmaster --check-depends (...) Checking dependencies: zenity Checking dependencies: zip Checking dependencies: zsh #
Viola! Problem solved ;).
Anonymous | 10/16/2014 6:56 AM
pwr2srv
Post a Comment