Compare commits
21 Commits
Author | SHA1 | Date |
---|---|---|
Leonid Pliushch | db3a7d3d7b | |
Leonid Pliushch | 99aa49cdfd | |
Leonid Pliushch | c0afb9d22d | |
Lucy Phipps | 5e163c1518 | |
Lucy Phipps | 83d3c35496 | |
Leonid Pliushch | e141b80b6f | |
Lucy Phipps | c1a702eeb7 | |
Lucy Phipps | 074df540d7 | |
Lucy Phipps | 8fdd508949 | |
Lucy Phipps | 96a9fd100a | |
Lucy Phipps | 9afbbb72de | |
Leonid Pliushch | 78b19eef01 | |
Lucy Phipps | c372df97f6 | |
Leonid Pliushch | f93bad1cfc | |
Krishna Kanhaiya | 8078679e7a | |
Lucy Phipps | b9bd4408db | |
Krishna Kanhaiya | 3d40821f10 | |
Leonid Pliushch | 451422bc8f | |
Krishna Kanhaiya | 2ebb0d3b2f | |
Leonid Pliushch | fdcf1f8417 | |
Leonid Pliushch | 712f54797f |
90
README.md
90
README.md
|
@ -1,3 +1,58 @@
|
|||
# Deprecation notice
|
||||
|
||||
This project is deprecated in favor of `apt-file` utility. Package `whatprovides` and database file will be removed.
|
||||
|
||||
You can install `apt-file` package with next command:
|
||||
```
|
||||
pkg install apt-file
|
||||
```
|
||||
|
||||
Depending on Termux version (< 0.118), you may need to fix permission of one file in $PREFIX (known issue):
|
||||
```
|
||||
chmod +x $PREFIX/lib/apt/apt-helper
|
||||
```
|
||||
|
||||
Usage example:
|
||||
```
|
||||
~ $ apt-file update
|
||||
~ $ apt-file list termux-tools
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/chsh
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/cmd
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/dalvikvm
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/df
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/getprop
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/ip
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/logcat
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/login
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/mount
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/ping
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/ping6
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/pkg
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/pm
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/settings
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/su
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/termux-change-repo
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/termux-fix-shebang
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/termux-info
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/termux-open
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/termux-open-url
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/termux-reload-settings
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/termux-reset
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/termux-setup-storage
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/termux-wake-lock
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/termux-wake-unlock
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/top
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/umount
|
||||
termux-tools: /data/data/com.termux/files/usr/bin/xdg-open
|
||||
termux-tools: /data/data/com.termux/files/usr/etc/motd
|
||||
termux-tools: /data/data/com.termux/files/usr/etc/profile.d/init-termux-properties.sh
|
||||
termux-tools: /data/data/com.termux/files/usr/share/doc/termux-tools/LICENSE
|
||||
termux-tools: /data/data/com.termux/files/usr/share/examples/termux/termux.properties
|
||||
termux-tools: /data/data/com.termux/files/usr/share/man/man1/termux.1.gz
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
# whatprovides
|
||||
yum --whatprovides utility for termux.
|
||||
|
||||
|
@ -15,10 +70,10 @@ pkg install whatprovides
|
|||
### Manual Installation:
|
||||
|
||||
```
|
||||
pkg install git build-esssential
|
||||
pkg install git gawk gzip make sqlite
|
||||
git clone https://github.com/termux/whatprovides
|
||||
cd whatprovides
|
||||
make or make install
|
||||
make install
|
||||
```
|
||||
|
||||
### Usage:
|
||||
|
@ -27,37 +82,22 @@ make or make install
|
|||
|
||||
```sh
|
||||
$ whatprovides -p aapt
|
||||
aapt: /.
|
||||
aapt: /data
|
||||
aapt: /data/data
|
||||
aapt: /data/data/com.termux
|
||||
aapt: /data/data/com.termux/files
|
||||
aapt: /data/data/com.termux/files/usr
|
||||
aapt: /data/data/com.termux/files/usr/share
|
||||
aapt: /data/data/com.termux/files/usr/share/aapt
|
||||
aapt: /data/data/com.termux/files/usr/share/aapt/android.jar
|
||||
aapt: /data/data/com.termux/files/usr/share/doc
|
||||
aapt: /data/data/com.termux/files/usr/share/doc/aapt
|
||||
aapt: /data/data/com.termux/files/usr/lib
|
||||
aapt: /data/data/com.termux/files/usr/lib/libandroid-cutils.so
|
||||
aapt: /data/data/com.termux/files/usr/lib/libandroid-ziparchive.so
|
||||
aapt: /data/data/com.termux/files/usr/lib/libandroid-base.so
|
||||
aapt: /data/data/com.termux/files/usr/lib/libandroid-fw.so
|
||||
aapt: /data/data/com.termux/files/usr/lib/libandroid-utils.so
|
||||
aapt: /data/data/com.termux/files/usr/bin
|
||||
aapt: /data/data/com.termux/files/usr/bin/aapt
|
||||
aapt: /data/data/com.termux/files/usr/bin/zipalign
|
||||
aapt: /data/data/com.termux/files/usr/lib/libandroid-base.so
|
||||
aapt: /data/data/com.termux/files/usr/lib/libandroid-cutils.so
|
||||
aapt: /data/data/com.termux/files/usr/lib/libandroid-fw.so
|
||||
aapt: /data/data/com.termux/files/usr/lib/libandroid-utils.so
|
||||
aapt: /data/data/com.termux/files/usr/lib/libandroid-ziparchive.so
|
||||
aapt: /data/data/com.termux/files/usr/share/aapt/android.jar
|
||||
aapt: /data/data/com.termux/files/usr/share/doc/aapt/LICENSE
|
||||
```
|
||||
[![asciicast](https://cdn.jsdelivr.net/gh/termux/whatprovides@master/static/screenshot.jpg)](https://asciinema.org/a/373670)
|
||||
[Asciinema preview ](https://asciinema.org/a/373670)
|
||||
|
||||
* search for files. Have you ever used `dpkg -S filepath`.
|
||||
Here you need to use like `whatprovides filepath`.
|
||||
You can search for any files which even not exist in your termux.
|
||||
it will show you which package provide that file.
|
||||
```sh
|
||||
$ whatprovides $PREFIX/bin/aapt
|
||||
aapt: data/data/com.termux/files/usr/bin/aapt
|
||||
|
||||
$ whatprovides $PREFIX/share/aapt
|
||||
aapt: /data/data/com.termux/files/usr/share/aapt
|
||||
```
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 295 KiB |
|
@ -0,0 +1,83 @@
|
|||
#!/usr/bin/env bash
|
||||
##
|
||||
## Script that generates or updates a Whatprovides
|
||||
## database for Termux.
|
||||
##
|
||||
|
||||
set -e -u
|
||||
|
||||
list_files() {
|
||||
FILES=$(dpkg-deb --fsys-tarfile "${1}" | tar -t | cut -b2- \
|
||||
| xargs -rd\\n realpath -sm --relative-base="/data/data/com.termux/files/usr" -- \
|
||||
| grep -vEx '[./]|/data(/data(/com\.termux(/files)?)?)?')
|
||||
SORTKEYS='-k1,1'
|
||||
MAXKEY=$(awk -F/ 'BEGIN { x=0 } { if (NF > x) x = NF } END { print x }' <<< "${FILES}")
|
||||
for ((x=2; x<=$MAXKEY; x++)); do
|
||||
SORTKEYS="$SORTKEYS -k$x,$x"
|
||||
done
|
||||
sort -t/ $SORTKEYS <<< "$FILES" \
|
||||
| awk 'NR == 1 { p=$0; next } substr($0, 1, length(p) +1 ) != p"/" { print p } { p=$0 } END { print p }'
|
||||
}
|
||||
|
||||
write_sql_script() {
|
||||
local debfile_dir=$1
|
||||
local debfile_path
|
||||
|
||||
# SQL statements should be executed within a single
|
||||
# transaction, otherwise execution performance would
|
||||
# be very slow.
|
||||
echo "BEGIN TRANSACTION;" >> "$SQLSCRIPT_TMPFILE"
|
||||
|
||||
while read -r debfile_path; do
|
||||
# .deb files are named package-name_version-revision_cpuarch.deb
|
||||
local package_name
|
||||
package_name=$(basename "$debfile_path" | cut -d_ -f1)
|
||||
|
||||
echo "[*] Processing '${debfile_path}'..." >&2
|
||||
|
||||
# Delete content of processed package to ensure there will not be any
|
||||
# duplicates and stale entries.
|
||||
echo "DELETE FROM whatprovides WHERE package_name == \"${package_name}\";" >> "$SQLSCRIPT_TMPFILE"
|
||||
|
||||
# Add row with matching package-name and file-name.
|
||||
while read -r file_path; do
|
||||
echo "${package_name}: adding '${file_path}'" >&2
|
||||
echo "INSERT INTO whatprovides (package_name, owned_file) VALUES (\"${package_name}\", \"${file_path}\");" >> "$SQLSCRIPT_TMPFILE"
|
||||
done < <(list_files "$debfile_path")
|
||||
# Note: searching only for ARCH "all" (platform-independent) and "aarch64" which
|
||||
# has 100% support by Termux packages.
|
||||
done < <(find "$debfile_dir" -type f \( -name "*_all.deb" -o -name "*_aarch64.deb" \) -print)
|
||||
|
||||
echo "COMMIT;" >> "$SQLSCRIPT_TMPFILE"
|
||||
|
||||
# Databases which were not generated from scratch needs
|
||||
# to be compacted.
|
||||
echo "VACUUM;" >> "$SQLSCRIPT_TMPFILE"
|
||||
echo "REINDEX;" >> "$SQLSCRIPT_TMPFILE"
|
||||
}
|
||||
|
||||
if [ $# -ge 2 ]; then
|
||||
SQLSCRIPT_TMPFILE=$(mktemp -t "whatprovides.XXXXXX.sql")
|
||||
|
||||
if [ ! -e "${1}" ]; then
|
||||
echo "[*] Creating new database." >&2
|
||||
sqlite3 "$1" "CREATE TABLE whatprovides ( id INTEGER PRIMARY KEY, package_name TEXT NOT NULL, owned_file TEXT NOT NULL);"
|
||||
fi
|
||||
|
||||
echo "[*] Generating SQL script..." >&2
|
||||
write_sql_script "$2" "$SQLSCRIPT_TMPFILE"
|
||||
|
||||
echo "[*] Rebuilding database..." >&2
|
||||
sqlite3 "$1" < "$SQLSCRIPT_TMPFILE"
|
||||
|
||||
rm -f "${SQLSCRIPT_TMPFILE}"
|
||||
|
||||
echo "[*] Done." >&2
|
||||
else
|
||||
echo
|
||||
echo "Usage: update-whatprovides-db.sh [db path] [directory with .deb files]"
|
||||
echo
|
||||
echo "Regenerate a database for Termux Whatprovides utility."
|
||||
echo
|
||||
exit 1
|
||||
fi
|
198
whatprovides
198
whatprovides
|
@ -3,59 +3,185 @@ set -e
|
|||
|
||||
SCRIPT_NAME=$(basename "$(realpath "$0")")
|
||||
DB_PATH="/data/data/com.termux/files/usr/var/lib/whatprovides/whatprovides.db"
|
||||
DB_UPDATES_URL="https://dl.bintray.com/termux/metadata/whatprovides-db/whatprovides.db.gz"
|
||||
DB_UPDATES_URL="https://packages.termux.org/whatprovides/whatprovides.db.gz"
|
||||
|
||||
show_usage () {
|
||||
echo
|
||||
echo "Usage: $SCRIPT_NAME [options] path/to/file"
|
||||
echo
|
||||
echo "Find out packages using specific files."
|
||||
echo
|
||||
echo "Options:"
|
||||
echo
|
||||
echo " -h Show this help."
|
||||
echo " -p [package] List files of package."
|
||||
echo " -u Update the database."
|
||||
echo
|
||||
{
|
||||
echo
|
||||
echo "Usage: $SCRIPT_NAME [-u|-U] path/to/file"
|
||||
echo " $SCRIPT_NAME -p [-u|-U] package"
|
||||
echo
|
||||
echo "Find out packages using specific files."
|
||||
echo
|
||||
echo "Options:"
|
||||
echo
|
||||
echo " -h Show this help."
|
||||
echo
|
||||
echo " -p Reverse mode. List all files owned by specified"
|
||||
echo " package."
|
||||
echo
|
||||
echo " -u Update the database."
|
||||
echo
|
||||
echo " -U Redownload the database even if it's not updated."
|
||||
echo
|
||||
echo " -q Quiet mode. Suppress informational messages."
|
||||
echo
|
||||
} >&2
|
||||
}
|
||||
|
||||
update_database() {
|
||||
if [ -e "${DB_PATH}.gz" ]; then
|
||||
echo "[*] Cleaning up the remaining temporary files..."
|
||||
if ! ${QUIET}; then
|
||||
echo "[*] Cleaning up the remaining temporary files..." >&2
|
||||
fi
|
||||
rm -f "${DB_PATH}.gz"
|
||||
fi
|
||||
|
||||
echo "[*] Downloading the new database..."
|
||||
echo
|
||||
curl --fail --retry 5 --retry-connrefused --retry-delay 5 --location \
|
||||
--output "${DB_PATH}.gz" "${DB_UPDATES_URL}"
|
||||
echo
|
||||
if ! ${FORCE_UPDATE} && [ -e "${DB_PATH}" ]; then
|
||||
NEWER=(--time-cond "${DB_PATH}")
|
||||
else
|
||||
NEWER=()
|
||||
fi
|
||||
|
||||
echo "[*] Installing..."
|
||||
rm -f "${DB_PATH}"
|
||||
zcat "${DB_PATH}.gz" > "${DB_PATH}"
|
||||
rm -f "${DB_PATH}.gz"
|
||||
if ! ${QUIET}; then
|
||||
echo "[*] Downloading the new database..." >&2
|
||||
echo >&2
|
||||
|
||||
echo "[*] Finished."
|
||||
curl --fail --retry 3 --retry-connrefused --retry-delay 1 --location \
|
||||
"${NEWER[@]}" --output "${DB_PATH}.gz" "${DB_UPDATES_URL}"
|
||||
|
||||
echo >&2
|
||||
else
|
||||
curl --silent --fail --retry 3 --retry-connrefused --retry-delay 1 \
|
||||
--location "${NEWER[@]}" --output "${DB_PATH}.gz" "${DB_UPDATES_URL}"
|
||||
fi
|
||||
|
||||
if [ -e "${DB_PATH}.gz" ]; then
|
||||
if ! ${QUIET}; then
|
||||
echo "[*] Installing..." >&2
|
||||
fi
|
||||
zcat "${DB_PATH}.gz" > "${DB_PATH}"
|
||||
rm -f "${DB_PATH}.gz"
|
||||
if ! ${QUIET}; then
|
||||
echo "[*] Finished." >&2
|
||||
fi
|
||||
elif ! ${QUIET}; then
|
||||
echo "[*] No update done." >&2
|
||||
fi
|
||||
}
|
||||
|
||||
while getopts :hp:u option; do
|
||||
case "$option" in
|
||||
p)
|
||||
echo "SELECT owned_file FROM 'whatprovides' WHERE package_name == '${OPTARG}' ORDER BY owned_file;" | \
|
||||
sqlite3 "${DB_PATH}" | awk "{ print \"${OPTARG}: \"\$0 }"
|
||||
exit 0
|
||||
check_database() {
|
||||
if [ ! -e "${DB_PATH}" ]; then
|
||||
{
|
||||
echo "Error: database is not available."
|
||||
echo "Please run '${SCRIPT_NAME} -u' to create it."
|
||||
} >&2
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
REVERSE_MODE=false
|
||||
DO_UPDATE=false
|
||||
FORCE_UPDATE=false
|
||||
QUIET=false
|
||||
while (($# > 0)); do
|
||||
case "$1" in
|
||||
-h) show_usage; exit 0;;
|
||||
-p) REVERSE_MODE=true;;
|
||||
-q) QUIET=true;;
|
||||
-U) FORCE_UPDATE=true;& # fall-through
|
||||
-u)
|
||||
if ${DO_UPDATE}; then
|
||||
echo "-u and -U are mutually exclusive." >&2
|
||||
show_usage
|
||||
exit 1
|
||||
fi
|
||||
DO_UPDATE=true
|
||||
;;
|
||||
-*)
|
||||
echo >&2
|
||||
echo "Unknown option '$1'." >&2
|
||||
show_usage
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
u) update_database; exit 0;;
|
||||
h) show_usage; exit 0;;
|
||||
*) show_usage; exit 1;;
|
||||
esac
|
||||
shift 1
|
||||
done
|
||||
|
||||
if [ $# -ge 1 ]; then
|
||||
echo "SELECT package_name FROM 'whatprovides' WHERE owned_file == '${1}' ORDER BY package_name;" | \
|
||||
sqlite3 "${DB_PATH}" | awk "{ print \$0\": ${1}\" }"
|
||||
if ${DO_UPDATE}; then
|
||||
update_database
|
||||
[ $# -lt 1 ] && exit 0
|
||||
else
|
||||
show_usage
|
||||
check_database
|
||||
fi
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
{
|
||||
echo
|
||||
echo "Error: you have not specified the file or package."
|
||||
echo
|
||||
} >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ${REVERSE_MODE}; then
|
||||
if ! grep -qx '[a-z0-9_+-]\+' <<< "$1"; then
|
||||
{
|
||||
echo
|
||||
echo "Error: package name '${1}' is not valid."
|
||||
echo
|
||||
} >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! sqlite3 "${DB_PATH}" \
|
||||
"SELECT owned_file FROM 'whatprovides' WHERE package_name == '${1}' ORDER BY owned_file" \
|
||||
| awk "{ if (substr(\$0, 1, 1) == \"/\") print \"${1}: \"\$0; else print \"${1}: ${PREFIX}/\"\$0 } END { if (NR == 0) exit 1 }"
|
||||
then
|
||||
{
|
||||
echo
|
||||
echo "Error: package '$1' is not found."
|
||||
echo
|
||||
} >&2
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
NEWPREFIX=
|
||||
FILE="$(realpath -sm "$1")"
|
||||
|
||||
if [[ "${PREFIX}/" = "${FILE}/"* || "${FILE}" = / ]]; then
|
||||
# FILE is (((great...)grand)parent of) PREFIX, including root
|
||||
if [ "${FILE}" = / ]; then
|
||||
FILE=/.
|
||||
fi
|
||||
|
||||
sqlite3 "${DB_PATH}" \
|
||||
"SELECT DISTINCT package_name FROM 'whatprovides' ORDER BY package_name" \
|
||||
| awk "{ print \$0\": ${FILE}\" }"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "${FILE}" = "${PREFIX}/"* ]]; then
|
||||
# FILE is in PREFIX
|
||||
FILE="${FILE##${PREFIX}/}"
|
||||
NEWPREFIX="${PREFIX}/"
|
||||
fi # else FILE is entirely separate from PREFIX (unlikely to be in DB)
|
||||
|
||||
FILE_ESC="${FILE//\'/\'\'}"
|
||||
if ! sqlite3 "${DB_PATH}" \
|
||||
"SELECT DISTINCT package_name FROM 'whatprovides' WHERE owned_file == '${FILE_ESC}' OR substr(owned_file, 1, ${#FILE} +1) == '${FILE_ESC}/' ORDER BY package_name" \
|
||||
| awk "{ print \$0\": ${NEWPREFIX}${FILE}\" } END { if (NR == 0) exit 1 }"
|
||||
then
|
||||
{
|
||||
echo
|
||||
echo "Error: file '$1' is not found."
|
||||
echo
|
||||
} >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
Loading…
Reference in New Issue