mirror of
https://github.com/pi-hole/pi-hole.git
synced 2024-11-15 02:42:58 +00:00
Store status of downloaded list (downloaded, using cache, some error, ...) and number of (in-)valid domains on this list in the gravity database. This updates the gravity databaes to version 14.
Signed-off-by: DL6ER <dl6er@dl6er.de>
This commit is contained in:
parent
ae1a59285d
commit
6b33b8b4c0
4 changed files with 92 additions and 10 deletions
|
@ -111,9 +111,15 @@ upgrade_gravityDB(){
|
||||||
version=12
|
version=12
|
||||||
fi
|
fi
|
||||||
if [[ "$version" == "12" ]]; then
|
if [[ "$version" == "12" ]]; then
|
||||||
# Add column date_updated to alist table
|
# Add column date_updated to adlist table
|
||||||
echo -e " ${INFO} Upgrading gravity database from version 12 to 13"
|
echo -e " ${INFO} Upgrading gravity database from version 12 to 13"
|
||||||
sqlite3 "${database}" < "${scriptPath}/12_to_13.sql"
|
sqlite3 "${database}" < "${scriptPath}/12_to_13.sql"
|
||||||
version=13
|
version=13
|
||||||
fi
|
fi
|
||||||
|
if [[ "$version" == "13" ]]; then
|
||||||
|
# Add columns number and status to adlist table
|
||||||
|
echo -e " ${INFO} Upgrading gravity database from version 13 to 14"
|
||||||
|
sqlite3 "${database}" < "${scriptPath}/13_to_14.sql"
|
||||||
|
version=14
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
13
advanced/Scripts/database_migration/gravity/13_to_14.sql
Normal file
13
advanced/Scripts/database_migration/gravity/13_to_14.sql
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
.timeout 30000
|
||||||
|
|
||||||
|
PRAGMA FOREIGN_KEYS=OFF;
|
||||||
|
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
ALTER TABLE adlist ADD COLUMN number INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE adlist ADD COLUMN invalid_domains INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE adlist ADD COLUMN status INTEGER NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
UPDATE info SET value = 14 WHERE property = 'version';
|
||||||
|
|
||||||
|
COMMIT;
|
|
@ -32,7 +32,10 @@ CREATE TABLE adlist
|
||||||
date_added INTEGER NOT NULL DEFAULT (cast(strftime('%s', 'now') as int)),
|
date_added INTEGER NOT NULL DEFAULT (cast(strftime('%s', 'now') as int)),
|
||||||
date_modified INTEGER NOT NULL DEFAULT (cast(strftime('%s', 'now') as int)),
|
date_modified INTEGER NOT NULL DEFAULT (cast(strftime('%s', 'now') as int)),
|
||||||
comment TEXT,
|
comment TEXT,
|
||||||
date_updated INTEGER
|
date_updated INTEGER,
|
||||||
|
number INTEGER NOT NULL DEFAULT 0,
|
||||||
|
invalid_domains INTEGER NOT NULL DEFAULT 0,
|
||||||
|
status INTEGER NOT NULL DEFAULT 0
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE adlist_by_group
|
CREATE TABLE adlist_by_group
|
||||||
|
@ -54,7 +57,7 @@ CREATE TABLE info
|
||||||
value TEXT NOT NULL
|
value TEXT NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO "info" VALUES('version','13');
|
INSERT INTO "info" VALUES('version','14');
|
||||||
|
|
||||||
CREATE TABLE domain_audit
|
CREATE TABLE domain_audit
|
||||||
(
|
(
|
||||||
|
|
74
gravity.sh
74
gravity.sh
|
@ -217,6 +217,48 @@ database_adlist_updated() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Check if a column with name ${2} exists in gravity table with name ${1}
|
||||||
|
gravity_column_exists() {
|
||||||
|
output=$( { printf ".timeout 30000\\nSELECT EXISTS(SELECT * FROM pragma_table_info('%s') WHERE name='%s');\\n" "${1}" "${2}" | sqlite3 "${gravityDBfile}"; } 2>&1 )
|
||||||
|
if [[ "${output}" == "1" ]]; then
|
||||||
|
return 0 # Bash 0 is success
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1 # Bash non-0 is failure
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update number of domain on this list. We store this in the "old" database as all values in the new database will later be overwritten
|
||||||
|
database_adlist_number() {
|
||||||
|
# Only try to set number of domains when this field exists in the gravity database
|
||||||
|
if ! gravity_column_exists "adlist" "number"; then
|
||||||
|
return;
|
||||||
|
fi
|
||||||
|
|
||||||
|
output=$( { printf ".timeout 30000\\nUPDATE adlist SET number = %i, invalid_domains = %i WHERE id = %i;\\n" "${total_num}" "${invalid_num}" "${1}" | sqlite3 "${gravityDBfile}"; } 2>&1 )
|
||||||
|
status="$?"
|
||||||
|
|
||||||
|
if [[ "${status}" -ne 0 ]]; then
|
||||||
|
echo -e "\\n ${CROSS} Unable to update number of domains in adlist with ID ${1} in database ${gravityDBfile}\\n ${output}"
|
||||||
|
gravity_Cleanup "error"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update status of this list. We store this in the "old" database as all values in the new database will later be overwritten
|
||||||
|
database_adlist_status() {
|
||||||
|
# Only try to set the status when this field exists in the gravity database
|
||||||
|
if ! gravity_column_exists "adlist" "status"; then
|
||||||
|
return;
|
||||||
|
fi
|
||||||
|
|
||||||
|
output=$( { printf ".timeout 30000\\nUPDATE adlist SET status = %i WHERE id = %i;\\n" "${2}" "${1}" | sqlite3 "${gravityDBfile}"; } 2>&1 )
|
||||||
|
status="$?"
|
||||||
|
|
||||||
|
if [[ "${status}" -ne 0 ]]; then
|
||||||
|
echo -e "\\n ${CROSS} Unable to update status of adlist with ID ${1} in database ${gravityDBfile}\\n ${output}"
|
||||||
|
gravity_Cleanup "error"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Migrate pre-v5.0 list files to database-based Pi-hole versions
|
# Migrate pre-v5.0 list files to database-based Pi-hole versions
|
||||||
migrate_to_database() {
|
migrate_to_database() {
|
||||||
# Create database file only if not present
|
# Create database file only if not present
|
||||||
|
@ -439,6 +481,7 @@ gravity_DownloadBlocklists() {
|
||||||
}
|
}
|
||||||
|
|
||||||
total_num=0
|
total_num=0
|
||||||
|
invalid_num=0
|
||||||
parseList() {
|
parseList() {
|
||||||
local adlistID="${1}" src="${2}" target="${3}" incorrect_lines
|
local adlistID="${1}" src="${2}" target="${3}" incorrect_lines
|
||||||
# This sed does the following things:
|
# This sed does the following things:
|
||||||
|
@ -456,11 +499,11 @@ parseList() {
|
||||||
num_target_lines="$(grep -c "^" "${target}")"
|
num_target_lines="$(grep -c "^" "${target}")"
|
||||||
num_correct_lines="$(( num_target_lines-total_num ))"
|
num_correct_lines="$(( num_target_lines-total_num ))"
|
||||||
total_num="$num_target_lines"
|
total_num="$num_target_lines"
|
||||||
num_invalid="$(( num_lines-num_correct_lines ))"
|
invalid_num="$(( num_lines-num_correct_lines ))"
|
||||||
if [[ "${num_invalid}" -eq 0 ]]; then
|
if [[ "${invalid_num}" -eq 0 ]]; then
|
||||||
echo " ${INFO} Received ${num_lines} domains"
|
echo " ${INFO} Analyzed ${num_lines} domains"
|
||||||
else
|
else
|
||||||
echo " ${INFO} Received ${num_lines} domains, ${num_invalid} domains invalid!"
|
echo " ${INFO} Analyzed ${num_lines} domains, ${invalid_num} domains invalid!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Display sample of invalid lines if we found some
|
# Display sample of invalid lines if we found some
|
||||||
|
@ -554,31 +597,48 @@ gravity_DownloadBlocklistFromUrl() {
|
||||||
esac;;
|
esac;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
local done="false"
|
||||||
# Determine if the blocklist was downloaded and saved correctly
|
# Determine if the blocklist was downloaded and saved correctly
|
||||||
if [[ "${success}" == true ]]; then
|
if [[ "${success}" == true ]]; then
|
||||||
if [[ "${httpCode}" == "304" ]]; then
|
if [[ "${httpCode}" == "304" ]]; then
|
||||||
# Add domains to database table file
|
# Add domains to database table file
|
||||||
parseList "${adlistID}" "${saveLocation}" "${target}"
|
parseList "${adlistID}" "${saveLocation}" "${target}"
|
||||||
|
database_adlist_status "${adlistID}" "2"
|
||||||
|
database_adlist_number "${adlistID}"
|
||||||
|
done="true"
|
||||||
# Check if $patternbuffer is a non-zero length file
|
# Check if $patternbuffer is a non-zero length file
|
||||||
elif [[ -s "${patternBuffer}" ]]; then
|
elif [[ -s "${patternBuffer}" ]]; then
|
||||||
# Determine if blocklist is non-standard and parse as appropriate
|
# Determine if blocklist is non-standard and parse as appropriate
|
||||||
gravity_ParseFileIntoDomains "${patternBuffer}" "${saveLocation}"
|
gravity_ParseFileIntoDomains "${patternBuffer}" "${saveLocation}"
|
||||||
# Add domains to database table file
|
# Add domains to database table file
|
||||||
parseList "${adlistID}" "${saveLocation}" "${target}"
|
parseList "${adlistID}" "${saveLocation}" "${target}"
|
||||||
# Update date_updated field in gravity database table
|
# Update gravity database table
|
||||||
|
database_adlist_status "${adlistID}" "1"
|
||||||
database_adlist_updated "${adlistID}"
|
database_adlist_updated "${adlistID}"
|
||||||
|
database_adlist_number "${adlistID}"
|
||||||
|
done="true"
|
||||||
else
|
else
|
||||||
# Fall back to previously cached list if $patternBuffer is empty
|
# Fall back to previously cached list if $patternBuffer is empty
|
||||||
echo -e " ${INFO} Received empty file: ${COL_LIGHT_GREEN}using previously cached list${COL_NC}"
|
echo -e " ${INFO} Received empty file"
|
||||||
fi
|
fi
|
||||||
else
|
fi
|
||||||
|
|
||||||
|
# Do we need to fall back to a cached list (if available)?
|
||||||
|
if [[ "${done}" != "true" ]]; then
|
||||||
# Determine if cached list has read permission
|
# Determine if cached list has read permission
|
||||||
if [[ -r "${saveLocation}" ]]; then
|
if [[ -r "${saveLocation}" ]]; then
|
||||||
echo -e " ${CROSS} List download failed: ${COL_LIGHT_GREEN}using previously cached list${COL_NC}"
|
echo -e " ${CROSS} List download failed: ${COL_LIGHT_GREEN}using previously cached list${COL_NC}"
|
||||||
# Add domains to database table file
|
# Add domains to database table file
|
||||||
parseList "${adlistID}" "${saveLocation}" "${target}"
|
parseList "${adlistID}" "${saveLocation}" "${target}"
|
||||||
|
database_adlist_number "${adlistID}"
|
||||||
|
database_adlist_status "${adlistID}" "3"
|
||||||
else
|
else
|
||||||
echo -e " ${CROSS} List download failed: ${COL_LIGHT_RED}no cached list available${COL_NC}"
|
echo -e " ${CROSS} List download failed: ${COL_LIGHT_RED}no cached list available${COL_NC}"
|
||||||
|
# Total number == -1 means there was no cached list that could have been used
|
||||||
|
total_num=-1
|
||||||
|
invalid_num=0
|
||||||
|
database_adlist_number "${adlistID}"
|
||||||
|
database_adlist_status "${adlistID}" "4"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue