xref: /dragonfly/usr.bin/locate/locate/updatedb.sh (revision 3851e4b8)
1#!/bin/sh
2#
3# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4#
5# Copyright (c) September 1995 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
6# All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions
10# are met:
11# 1. Redistributions of source code must retain the above copyright
12#    notice, this list of conditions and the following disclaimer.
13# 2. Redistributions in binary form must reproduce the above copyright
14#    notice, this list of conditions and the following disclaimer in the
15#    documentation and/or other materials provided with the distribution.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27# SUCH DAMAGE.
28#
29# updatedb - update locate database for local mounted filesystems
30#
31# $FreeBSD: head/usr.bin/locate/locate/updatedb.sh 326276 2017-11-27 15:37:16Z pfg $
32
33if [ "$(id -u)" = "0" ]; then
34	echo ">>> WARNING" 1>&2
35	echo ">>> Executing updatedb as root.  This WILL reveal all filenames" 1>&2
36	echo ">>> on your machine to all login users, which is a security risk." 1>&2
37fi
38: ${LOCATE_CONFIG="/etc/locate.rc"}
39if [ -f "$LOCATE_CONFIG" -a -r "$LOCATE_CONFIG" ]; then
40	. $LOCATE_CONFIG
41fi
42
43# The directory containing locate subprograms
44: ${LIBEXECDIR:=/usr/libexec}; export LIBEXECDIR
45: ${TMPDIR:=/tmp}; export TMPDIR
46if ! TMPDIR=`mktemp -d $TMPDIR/locateXXXXXXXXXX`; then
47	exit 1
48fi
49
50PATH=$LIBEXECDIR:/bin:/usr/bin:$PATH; export PATH
51
52
53: ${mklocatedb:=locate.mklocatedb}	 # make locate database program
54: ${FCODES:=/var/db/locate.database}	 # the database
55: ${PRUNEPATHS:="/tmp /usr/tmp /var/tmp"} # unwanted directories
56: ${PRUNEDIRS:=".git"}	# unwanted directories, in any parent
57# allowed filesystems
58: ${FILESYSTEMS:="$(lsvfs | tail -n +3 | \
59	egrep -vw 'loopback|network|synthetic|read-only|0' | \
60	cut -d ' ' -f1)"}
61# directories to be searched to create the database
62: ${SEARCHPATHS:="/"}
63# the find program and its options
64: ${FIND:="find"}
65
66if [ -z "$SEARCHPATHS" ]; then
67	echo "$0: empty variable SEARCHPATHS" >&2; exit 1
68fi
69if [ -z "$FILESYSTEMS" ]; then
70	echo "$0: empty variable FILESYSTEMS" >&2; exit 1
71fi
72ROOTFS="$(df -T / | awk '$NF=="/" { print $2 }')"
73if ! echo "$FILESYSTEMS" | grep -qw "$ROOTFS"; then
74	echo "WARNING: root filesystem '$ROOTFS' was excluded" >&2
75fi
76
77# Make a list a paths to exclude in the locate run
78excludes="! ("
79or=""
80for fstype in $FILESYSTEMS; do
81	excludes="$excludes $or -fstype $fstype"
82	or="-or"
83done
84excludes="$excludes ) -prune"
85
86if [ -n "$PRUNEPATHS" ]; then
87	for path in $PRUNEPATHS; do
88		excludes="$excludes -or -path $path -prune"
89	done
90fi
91
92if [ -n "$PRUNEDIRS" ]; then
93	for dir in $PRUNEDIRS; do
94		excludes="$excludes -or -name $dir -type d -prune"
95	done
96fi
97
98tmp=$TMPDIR/_updatedb$$
99trap 'rm -f $tmp; rmdir $TMPDIR' 0 1 2 3 5 10 15
100
101# search locally
102echo $FIND $SEARCHPATHS $excludes -or -print
103if $FIND $SEARCHPATHS $excludes -or -print 2>/dev/null | \
104	sort | uniq | $mklocatedb -presort > $tmp
105then
106	if [ "$(stat -f '%z' $tmp)" -lt "257" ]; then
107		echo "updatedb: locate database $tmp is empty" >&2
108		exit 1
109	else
110		# Use "cat" instead of "cp", since the permission of the
111		# database is set up the by caller (i.e., peridoic task)
112		# which has privilege, while this tool should be run as
113		# a non-privilege user.
114		cat $tmp > $FCODES
115		echo "updatedb: built new locate database: $FCODES"
116	fi
117fi
118