2021-08-10 01:37:46 +05:30
# Function to try to set ubuntu or debian version.
set_base_version_id( ) {
[ [ " $ID " = ~ ubuntu| debian ] ] && return ;
if ! [ -d " $dist_info_dir " ] ; then
sudo mkdir -p " $dist_info_dir "
get -q -n " $dist_info_dir " /os_releases.csv https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/os_releases.csv
fi
for base in ubuntu debian; do
[ [ " $ID_LIKE " = ~ $base ] ] && ID = " $base " && VERSION_ID = " $( grep -hr -m 1 " $VERSION_CODENAME " /usr/share/distro-info | cut -d ',' -f 1 | cut -d ' ' -f 1) " && break
done
}
# Function to try to set ubuntu or debian codename.
set_base_version_codename( ) {
[ [ " $ID " = ~ ubuntu| debian ] ] && return ;
if [ [ " $ID_LIKE " = ~ ubuntu ] ] ; then
[ [ -n " $UBUNTU_CODENAME " ] ] && VERSION_CODENAME = " $UBUNTU_CODENAME " && return ;
[ -e " $upstream_lsb " ] && VERSION_CODENAME = $( grep 'CODENAME' " $upstream_lsb " | cut -d '=' -f 2) && return ;
VERSION_CODENAME = $( grep -E -m1 'deb .*ubuntu.com' " $list_file " | cut -d ' ' -f 3) && VERSION_CODENAME = ${ VERSION_CODENAME %-* }
elif [ [ " $ID_LIKE " = ~ debian ] ] || command -v dpkg >/dev/null; then
ID_LIKE = debian
[ [ -n " $DEBIAN_CODENAME " ] ] && VERSION_CODENAME = " $DEBIAN_CODENAME " && return ;
update_lists && VERSION_CODENAME = $( apt-cache show tzdata | grep -m 1 Provides | cut -d '-' -f 2)
fi
}
# Function to set base os details
set_base_version( ) {
if [ -e /tmp/os-release ] ; then
. /tmp/os-release
else
set_base_version_codename
set_base_version_id
printf "ID=%s\nVERSION_ID=%s\nVERSION_CODENAME=%s\n" " $ID " " $VERSION_ID " " $VERSION_CODENAME " | tee /tmp/os-release >/dev/null 2>& 1
fi
}
# Helper function to update package lists.
update_lists_helper( ) {
list = $1
command -v sudo >/dev/null && SUDO = sudo
if [ [ -n " $list " ] ] ; then
${ SUDO } apt-get update -o Dir::Etc::sourcelist= " $list " -o Dir::Etc::sourceparts= "-" -o APT::Get::List-Cleanup= "0"
else
${ SUDO } apt-get update
fi
}
# Function to update the package lists.
update_lists( ) {
local ppa = ${ 1 :- }
local ppa_search = ${ 2 :- }
2022-01-02 22:05:57 +05:30
local list =
status_file = /tmp/os_lists
if [ [ -n " $ppa " && -n " $ppa_search " ] ] ; then
list = " $list_dir " /" $( basename " $( grep -lr " $ppa_search " " $list_dir " ) " ) "
2024-11-04 07:45:52 +05:30
status_file = /tmp/" $( echo -n " $ppa_search " | shasum -a 256 | cut -d ' ' -f 1) "
2024-04-27 21:04:56 +05:30
elif [ -e " $list_file " ] && grep -Eq '^deb |^Types deb' " $list_file " ; then
2022-01-02 22:05:57 +05:30
list = " $list_file "
fi
if [ ! -e " $status_file " ] ; then
2021-08-24 19:29:33 +05:30
update_lists_helper " $list " >/dev/null 2>& 1
2022-01-02 22:05:57 +05:30
echo '' | tee " $status_file " >/dev/null 2>& 1
2021-08-10 01:37:46 +05:30
fi
}
# Function to get fingerprint from an Ubuntu PPA.
ubuntu_fingerprint( ) {
ppa = $1
2025-02-10 16:57:17 +05:30
get -s -n "" " ${ lp_api [@]/%//~ ${ ppa %/* } /+archive/ ${ ppa ##*/ } } " | jq -r '.signing_key_fingerprint'
2021-08-10 01:37:46 +05:30
}
# Function to get fingerprint from a Debian PPA.
debian_fingerprint( ) {
ppa = $1
ppa_url = $2
package_dist = $3
release_pub = /tmp/" ${ ppa / \/ /- } " .gpg
get -q -n " $release_pub " " $ppa_url " /dists/" $package_dist " /Release.gpg
gpg --list-packets " $release_pub " | grep -Eo 'fpr\sv4\s.*[a-zA-Z0-9]+' | head -n 1 | cut -d ' ' -f 3
}
# Function to add a GPG key.
add_key( ) {
ppa = ${ 1 :- ondrej /php }
ppa_url = $2
package_dist = $3
key_source = $4
key_file = $5
key_urls = ( " $key_source " )
2025-03-14 13:31:13 +01:00
if [ [ " $key_source " = ~ launchpadcontent.net| debian.org ] ] ; then
2021-08-10 01:37:46 +05:30
fingerprint = " $( " ${ ID } " _fingerprint " $ppa " " $ppa_url " " $package_dist " ) "
sks_params = " op=get&options=mr&exact=on&search=0x $fingerprint "
key_urls = ( " ${ sks [@]/%/ \/ pks \/ lookup \? " $sks_params " } " )
fi
[ ! -e " $key_source " ] && get -q -n " $key_file " " ${ key_urls [@] } "
if [ [ " $( file " $key_file " ) " = ~ .*( 'Public-Key (old)' | 'Secret-Key' ) ] ] ; then
sudo gpg --batch --yes --dearmor " $key_file " >/dev/null 2>& 1 && sudo mv " $key_file " .gpg " $key_file "
fi
}
2021-09-15 00:25:36 +05:30
# Function to check if a PPA and its lists exist
check_lists( ) {
ppa = $1
ppa_search = $2
if grep -Eqr " $ppa_search " " $list_dir " ; then
2021-10-15 15:56:58 +05:30
list_count = " $( sudo find /var/lib/apt/lists -type f -name " * ${ ppa / \/ /_ } * " | wc -l) "
2021-09-15 00:25:36 +05:30
if [ " $list_count " = "0" ] ; then
update_lists " $ppa " " $ppa_search "
fi
return 0;
else
return 1;
fi
}
2021-08-10 01:37:46 +05:30
# Function to add a sources list.
add_list( ) {
ppa = ${ 1 -ondrej/php }
2025-03-14 13:31:13 +01:00
ppa_url = ${ 2 :- " $lpc_ppa / $ppa /ubuntu " }
2021-08-10 01:37:46 +05:30
key_source = ${ 3 :- " $ppa_url " }
package_dist = ${ 4 :- " $VERSION_CODENAME " }
branches = ${ 5 :- main }
2024-11-04 07:45:52 +05:30
ppa_search = " deb .* $ppa_url $package_dist .* $branches $"
2021-09-15 00:25:36 +05:30
if check_lists " $ppa " " $ppa_search " ; then
echo " Repository $ppa already exists " ;
2021-10-15 17:53:09 +05:30
return 1;
2021-09-15 00:25:36 +05:30
else
arch = $( dpkg --print-architecture)
[ -e " $key_source " ] && key_file = $key_source || key_file = " $key_dir " /" ${ ppa / \/ /- } " -keyring.gpg
add_key " $ppa " " $ppa_url " " $package_dist " " $key_source " " $key_file "
2025-06-10 04:51:11 +05:30
sudo rm -rf " $list_dir " /" ${ ppa / \/ /- } " .list || true
echo " deb [arch= $arch signed-by= $key_file ] $ppa_url $package_dist $branches " | sudo tee -a " $list_dir " /" ${ ppa %%/* } " -" $ID " -" ${ ppa #*/ } " -" $package_dist " .list >/dev/null 2>& 1
2021-09-15 00:25:36 +05:30
update_lists " $ppa " " $ppa_search "
. /etc/os-release
fi
2021-10-15 17:53:09 +05:30
return 0;
2021-08-10 01:37:46 +05:30
}
2022-10-28 12:24:37 +05:30
# Function to check if a PPA exists
check_ppa( ) {
ppa = $1
2025-03-14 13:31:13 +01:00
ppa_url = ${ 2 :- " $lpc_ppa / $ppa /ubuntu " }
2022-10-28 12:24:37 +05:30
package_dist = ${ 3 :- " $VERSION_CODENAME " }
branches = ${ 4 :- main }
2024-11-04 07:45:52 +05:30
ppa_search = " deb .* $ppa_url $package_dist .* $branches $"
2022-10-28 12:24:37 +05:30
if check_lists " $ppa " " $ppa_search " ; then
return 0;
else
return 1;
fi
}
2021-08-10 01:37:46 +05:30
# Function to remove a PPA.
remove_list( ) {
ppa = ${ 1 -ondrej/php }
2024-06-24 02:56:51 +05:30
[ -n " $2 " ] && ppa_urls = ( " $2 " ) || ppa_urls = ( " $lp_ppa / $ppa /ubuntu " " $lpc_ppa / $ppa /ubuntu " )
for ppa_url in " ${ ppa_urls [@] } " ; do
grep -lr " $ppa_url " " $list_dir " | xargs -n1 sudo rm -f
done
2021-08-10 01:37:46 +05:30
sudo rm -f " $key_dir " /" ${ ppa / \/ /- } " -keyring || true
}
2024-06-24 02:56:51 +05:30
# Function to check if ubuntu ppa is up
is_ubuntu_ppa_up( ) {
ppa = ${ 1 :- ondrej /php }
2025-07-17 04:49:47 +05:30
curl -s --connect-timeout 10 --max-time 10 --head --fail " $lpc_ppa / $ppa /ubuntu/dists/ $VERSION_CODENAME /Release " > /dev/null
2024-06-24 02:56:51 +05:30
}
# Function to add the PPA mirror.
add_ppa_sp_mirror( ) {
ppa = $1
ppa_name = " $( basename " $ppa " ) "
remove_list " $ppa " || true
2025-07-17 04:49:47 +05:30
[ " ${ debug : ? } " = "debug" ] && add_list sp/" $ppa_name " " $ppa_sp / $ppa /ubuntu " " $ppa_sp / $ppa /ubuntu/key.gpg " " $VERSION_CODENAME " "main/debug"
add_list sp/" $ppa_name " " $ppa_sp / $ppa /ubuntu " " $ppa_sp / $ppa /ubuntu/key.gpg "
2024-06-24 02:56:51 +05:30
}
2021-08-10 01:37:46 +05:30
# Function to add a PPA.
add_ppa( ) {
set_base_version
ppa = ${ 1 :- ondrej /php }
if [ [ " $ID " = "ubuntu" || " $ID_LIKE " = ~ ubuntu ] ] && [ [ " $ppa " = ~ "ondrej/" ] ] ; then
2024-06-24 02:56:51 +05:30
if is_ubuntu_ppa_up " $ppa " ; then
2025-07-17 04:49:47 +05:30
[ " ${ runner : ? } " = "self-hosted" ] && find " $list_dir " -type f -name 'sp*' -exec grep -qF " ${ sp /https : \/ \/ } " { } \; -delete
2025-03-14 13:31:13 +01:00
[ " ${ debug : ? } " = "debug" ] && add_list " $ppa " " $lpc_ppa / $ppa /ubuntu " " $lpc_ppa / $ppa /ubuntu " " $VERSION_CODENAME " "main/debug"
2024-06-24 02:56:51 +05:30
add_list " $ppa "
2025-07-20 02:00:10 +05:30
elif [ " $ppa " = "ondrej/php" ] ; then
2024-06-24 02:56:51 +05:30
add_ppa_sp_mirror " $ppa "
2025-07-20 02:00:10 +05:30
else
add_log " ${ cross : ? } " " $ppa " " PPA $ppa is not available "
2024-06-24 02:56:51 +05:30
fi
2021-08-10 01:37:46 +05:30
elif [ [ " $ID " = "debian" || " $ID_LIKE " = ~ debian ] ] && [ [ " $ppa " = ~ "ondrej/" ] ] ; then
2022-09-26 09:42:27 +05:30
[ " ${ debug : ? } " = "debug" ] && add_list " $ppa " " $sury " /" ${ ppa ##*/ } " / " $sury " /" ${ ppa ##*/ } " /apt.gpg " $VERSION_CODENAME " "main/debug"
2022-10-24 10:28:08 +05:30
add_list " $ppa " " $sury " /" ${ ppa ##*/ } " / " $sury " /" ${ ppa ##*/ } " /apt.gpg
2021-08-10 01:37:46 +05:30
else
add_list " $ppa "
fi
2022-01-31 21:27:36 +05:30
exit_code = " $? "
2021-10-15 17:53:09 +05:30
. /etc/os-release
2022-01-31 21:27:36 +05:30
return $exit_code
2021-10-15 17:53:09 +05:30
}
# Function to update a PPA.
update_ppa( ) {
set_base_version
ppa = ${ 1 :- ondrej /php }
2025-03-14 13:31:13 +01:00
ppa_url = ${ 2 :- " $lpc_ppa / $ppa /ubuntu " }
2021-10-15 17:53:09 +05:30
package_dist = ${ 4 :- " $VERSION_CODENAME " }
branches = ${ 5 :- main }
ppa_search = " deb .* $ppa_url $package_dist .* $branches "
update_lists " $ppa " " $ppa_search "
2021-08-10 01:37:46 +05:30
. /etc/os-release
}
# Variables
2024-04-27 21:04:56 +05:30
list_dir = '/etc/apt/sources.list.d'
list_file = " /etc/apt/sources.list.d/ $ID .sources "
[ -e " $list_file " ] || list_file = '/etc/apt/sources.list'
2021-08-10 01:37:46 +05:30
upstream_lsb = '/etc/upstream-release/lsb-release'
2025-02-10 16:57:17 +05:30
lp_api = (
'https://api.launchpad.net/1.0'
'https://api.launchpad.net/devel'
)
2021-08-10 01:37:46 +05:30
lp_ppa = 'http://ppa.launchpad.net'
2024-06-24 02:56:51 +05:30
lpc_ppa = 'https://ppa.launchpadcontent.net'
2021-08-10 01:37:46 +05:30
key_dir = '/usr/share/keyrings'
dist_info_dir = '/usr/share/distro-info'
sury = 'https://packages.sury.org'
2025-07-17 04:49:47 +05:30
ppa_sp = 'https://ppa.setup-php.com'
2024-06-24 02:56:51 +05:30
sp = 'https://setup-php.com'
2021-08-10 01:37:46 +05:30
sks = (
'https://keyserver.ubuntu.com'
'https://pgp.mit.edu'
'https://keys.openpgp.org'
)