#!/bin/bash unset LANG if [ -z "$1" ];then echo " Usage: $0 [ -q ] where repository_url is a full url of a slackware repository (supported http only) Or: $0 [ -q ] where filename is the name of a file containing one or more repositories. It can contain also text. The script extract urls and check if it is a repository. -q print non-verbose progress -v print more verbose info The repository url can use the syntax '{ ... }' to specify multiple repository in one row. The script expand it and check if the expanded repository exists. Example: http://slackware.osuosl.org/slackware{,64}-{12.2,15.0,current}/ will be expanded as http://slackware.osuosl.org/slackware-12.2/ http://slackware.osuosl.org/slackware-15.0/ http://slackware.osuosl.org/slackware-current/ http://slackware.osuosl.org/slackware64-12.2/ http://slackware.osuosl.org/slackware64-15.0/ http://slackware.osuosl.org/slackware64-current/ Next, when the script will validate the repositories, it will remove slackware64-12.2 that does NOT exists. You can use this script to expand all repositories in /usr/doc/slackpkg+-*/repositories.txt " exit fi V=1 if [ "$1" == "-q" ];then V="" shift fi if [ "$1" == "-v" ];then V=2 shift fi if [ -f "$1" ];then REPOS=$(cat $1|grep -E -o -e 'http://[^ ]*' -e 'https://[^ ]*') else REPOS=$(echo $*|grep -E -o -e 'http://[^ ]*' -e 'https://[^ ]*') fi REPOS=$(eval echo $REPOS|sed -e 's/{//g' -e 's/}//g') [ $V ]&&echo "Expanded repositories" >&2 [ $V ]&&echo $REPOS|sed 's/ /\n/g' >&2 TMP=$(mktemp -d) cd $TMP ( echo echo "Check repositories" for R in $REPOS;do [ $V ]&&echo REPO=${R%/} echo -n "Repository: $REPO/ " HOST=$(echo $REPO|cut -f3 -d/) [ $V ]&&echo -en "\n Host: $HOST\n Check IP: "||echo -n . if echo $HOST|grep -E -q '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$';then IP=$HOST else IP=$(host $HOST 2>/dev/null|grep 'has address'|head -1|awk '{print $NF}') fi echo $IP|grep -E -q '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' if [ $? -ne 0 ];then [ $V ]&&echo -e " unable to resolve\nInvalid repository"|grep --color .||echo " Invalid (unable to resolve address)"|grep --color . continue fi [ $V ]&&echo -en " $IP\n Check connection: "||echo -n . echo |timeout 10 telnet $IP 80 > telnet.out 2>&1 ERR=$? if grep -q "Escape character is" telnet.out;then [ $V ]&&echo "OK "||echo -n . elif grep -q "Connection refused" telnet.out;then [ $V ]&&echo -e " Connection refused\nInvalid repository"|grep --color .||echo " Invalid (connection refused)"|grep --color . continue elif [ $ERR -eq 124 ];then [ $V ]&&echo -e " Timeout\nInvalid repository"|grep --color .||echo " Invalid (timeout)"|grep --color . continue else [ $V ]&&echo -e " Failed\nInvalid repository"|grep --color .||echo " Invalid (connection failed)"|grep --color . continue fi SIZE=0 DATE="" MD5=no [ $V ]&&echo -en " CHECKSUMS.md5: "||echo -n . curl --location --head $REPO/CHECKSUMS.md5 > CHECKSUMS.md5.R 2>/dev/null ERR=$? if grep -q "^HTTP.*200" CHECKSUMS.md5.R;then [ $V ]&&echo -n "OK "||echo -n . if grep -q -i Content-Length: CHECKSUMS.md5.R;then [ $V ]&&echo -n "$(grep -i Content-Length: CHECKSUMS.md5.R|tail -1|awk '{print $2}'|sed $'s/\r//') bytes " fi if grep -q -i Last-Modified: CHECKSUMS.md5.R;then [ $V ]&&echo -n "($(grep -i Last-Modified: CHECKSUMS.md5.R|tail -1|cut -f2- -d:|sed $'s/\r//') ) " DATE="$(grep -i Last-Modified: CHECKSUMS.md5.R|tail -1|cut -f2- -d:|sed $'s/\r//')" fi [ $V ]&&echo MD5=yes elif grep -q "^HTTP.*404" CHECKSUMS.md5.R;then [ $V ]&&echo -e " not present\nInvalid repository"|grep --color .||echo " Invalid (CHECKSUMS.md5 not present)"|grep --color . continue else [ $V ]&&echo -e " unable to retrieve\nInvalid repository"|grep --color .||echo " Invalid (unable to retrieve CHECKSUMS.md5)"|grep --color . continue fi PACK=no [ $V ]&&echo -en " PACKAGES.TXT: "||echo -n . curl --location --head $REPO/PACKAGES.TXT > PACKAGES.TXT.R 2>/dev/null ERR=$? if grep -q "HTTP.*200" PACKAGES.TXT.R;then [ $V ]&&echo -n "OK "||echo -n . if grep -q -i Content-Length: PACKAGES.TXT.R;then [ $V ]&&echo -n "$(grep -i Content-Length: PACKAGES.TXT.R|tail -1|awk '{print $2}'|sed $'s/\r//') bytes " SIZE="$(grep -i Content-Length: PACKAGES.TXT.R|tail -1|awk '{print $2}'|sed $'s/\r//')" fi if grep -q -i Last-Modified: PACKAGES.TXT.R;then [ $V ]&&echo -n "($(grep -i Last-Modified: PACKAGES.TXT.R|tail -1|cut -f2- -d:|sed $'s/\r//') ) " fi [ $V ]&&echo PACK=yes elif grep -q "HTTP.*404" PACKAGES.TXT.R;then [ $V ]&&echo -e " not present\nInvalid repository"|grep --color .||echo " Invalid (PACKAGES.TXT not present)"|grep --color . continue else [ $V ]&&echo -e " unable to retrieve\nInvalid repository"|grep --color .||echo " Invalid (unable to retrieve PACKAGES.TXT)"|grep --color . continue fi [ $V ]&&echo -n " GPG-KEY: "||echo -n . wget -o wget.log --timeout=10 --wait=2 --tries=2 -O GPG-KEY $REPO/GPG-KEY ERR=$? if [ $ERR -eq 0 ];then if [ ! -s GPG-KEY ];then [ $V ]&&echo "empty"|grep --color . GPG=bad elif ! grep -q -- "-----END" GPG-KEY;then [ $V ]&&echo "invalid"|grep --color . GPG=bad else ID=$(gpg --list-packets GPG-KEY|grep ":user ID packet:"|head -1|cut -f2 -d'"') if [ -z "$ID" ];then [ $V ]&&echo "Unable to get UID"|grep --color . GPG=yes else [ $V ]&&echo $ID GPG=$ID fi if [ "$V" == "2" ];then ( gpg --list-packets GPG-KEY cat GPG-KEY )|sed 's/^/ /' fi fi elif grep -q "404 Not Found" wget.log;then [ $V ]&&echo "not present"|grep --color . GPG=no else [ $V ]&&echo "unable to retrieve"|grep --color . GPG=no fi if [ "$GPG" = "bad" ];then [ $V ]&&echo -e " invalid GPG key\nInvalid repository"|grep --color .||echo " Invalid (GPG-KEY failure)"|grep --color . continue fi if [ ! $V ];then echo -n " OK" if [ "$GPG" != "yes" ];then echo -n " ( $GPG gpg )" fi echo else echo "Done" fi if ! echo $SIZE|grep -q "^[1-9][0-9]*$";then SIZE="-" fi SIZE="$(printf "%8d" $SIZE)" if date -d "$DATE" >/dev/null 2>&1;then DATE=$(date -d "$DATE" "+%Y/%m/%d %H:%M:%S") else DATE="-" fi echo -e "$REPO#$SIZE#$DATE#$GPG" >> repositories.tmp done echo echo "========================================================" ) >&2 date echo ( echo -e "url# size#date#gpg" echo cat repositories.tmp|sort )|LANG=C.utf8 column -t -s '#' cd #rm -rf $TMP