function getTestIndex(domain, string) {
const regex = new RegExp(`^(?:@|(?:https?://)?(?:www\\.)?${domain}/?(\\w+)?)$`);
const result = regex.exec(string);
return result ? result[1] : null;
}
console.log(getTestIndex('testdomain.com', 'https://testdomain.com/testindex'));
update "notifications"
set "is_read" = 1,
"updated_at" = 2023 - 02 - 01 12:26:05
from ( select id from "notifications" where “client_id” = 126473 and "notifications"."client_id" is not null order by id for update) as t
where "notifications"."id" = t.id ;
(\w+) (\d+)
в ('$1', $2),
.$ curl -s "http://www.cbr.ru/scripts/XML_daily.asp" | enconv -x UTF-8 | xq -r '.ValCurs.Valute[] | select(.CharCode == "USD" or .CharCode == "EUR") |.CharCode + " " + .Value'
USD 74,7087
EUR 79,5716
curl -s "http://www.cbr.ru/scripts/XML_daily.asp" | enconv -x UTF-8 | xq -r '.ValCurs.Valute[] | .CharCode + " " + .Nominal + " " + .Value' | sort | awk 'BEGIN{print "Code Nominal Value"}{print}' | csview -d' '
┌──────┬─────────┬─────────┐
│ Code │ Nominal │ Value │
├──────┼─────────┼─────────┤
│ AED │ 1 │ 20,3400 │
│ AMD │ 100 │ 19,1325 │
│ AUD │ 1 │ 51,0933 │
│ AZN │ 1 │ 43,9463 │
│ BGN │ 1 │ 40,7332 │
│ BRL │ 1 │ 14,3646 │
│ BYN │ 1 │ 26,6998 │
│ CAD │ 1 │ 55,2743 │
│ CHF │ 1 │ 80,5485 │
│ CNY │ 1 │ 10,8398 │
│ CZK │ 10 │ 33,5739 │
│ DKK │ 1 │ 10,7002 │
│ EGP │ 10 │ 24,4263 │
│ EUR │ 1 │ 79,5716 │
│ GBP │ 1 │ 90,6889 │
│ GEL │ 1 │ 28,3363 │
│ HKD │ 10 │ 95,3890 │
│ HUF │ 100 │ 20,7001 │
│ IDR │ 10000 │ 49,2185 │
│ INR │ 100 │ 90,1603 │
│ JPY │ 100 │ 55,4219 │
│ KGS │ 100 │ 85,4595 │
│ KRW │ 1000 │ 57,2524 │
│ KZT │ 100 │ 16,7640 │
│ MDL │ 10 │ 39,8181 │
│ NOK │ 10 │ 72,3823 │
│ NZD │ 1 │ 46,5734 │
│ PLN │ 1 │ 16,7565 │
│ QAR │ 1 │ 20,5244 │
│ RON │ 1 │ 16,1333 │
│ RSD │ 100 │ 67,8622 │
│ SEK │ 10 │ 72,2507 │
│ SGD │ 1 │ 55,7819 │
│ THB │ 10 │ 21,5775 │
│ TJS │ 10 │ 69,2908 │
│ TMT │ 1 │ 21,3453 │
│ TRY │ 10 │ 39,6051 │
│ UAH │ 10 │ 20,2313 │
│ USD │ 1 │ 74,7087 │
│ UZS │ 10000 │ 66,0995 │
│ VND │ 10000 │ 31,6013 │
│ XDR │ 1 │ 99,6569 │
│ ZAR │ 10 │ 40,6808 │
└──────┴─────────┴─────────┘
$ curl -s "http://www.cbr.ru/scripts/XML_daily.asp" | enconv -x UTF-8 | xq -r '.ValCurs.Valute[] | select(.CharCode == "USD" or .CharCode == "EUR") |.CharCode + " " + .Nominal + " " + .Value' | awk 'BEGIN{print "Code Nominal Value"}{print}' | csview -d' '
┌──────┬─────────┬─────────┐
│ Code │ Nominal │ Value │
├──────┼─────────┼─────────┤
│ EUR │ 1 │ 79,5716 │
│ USD │ 1 │ 74,7087 │
└──────┴─────────┴─────────┘
#!/bin/bash
DNS_SERVER=8.8.8.8
BLACKLIST_URL="http://antizapret.prostovpn.org/iplist.txt"
#куда класть файл proxy.pac
PACDIR=/var/www/html
TMPLIST=/tmp/iplist.txt
#домены, которые нужно пускать через прокси независимо от содержимого iplist.txt
DOMAINS=(\
rutracker.org \
facebook.com \
facebook.net \
fbcdn.net \
twitter.com \
twitter.co \
t.co \
twimg.com \
twitpic.com \
periscope.tv \
pscp.tv \
)
#качаем чёрный список
wget -q --tries=10 -O "$TMPLIST" "$BLACKLIST_URL"
# вытаскиваем IP наших прописанных доменов
declare -a EXTRAIPS=()
for domain in "${DOMAINS[@]}"
do
dig A "$domain" +short @$DNS_SERVER | grep -v '\.$' >>"$TMPLIST"
done
#в чёрном списке есть отдельные IP и есть подсети
#также чёрный список очень длинный, поэтому кодируем его более компактно.
IPLIST=`grep -Ex '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' "$TMPLIST" | awk '/^[0-9]+/ {split($1,b,/\./); printf("0x%02x%02x%02x%02x,", b[1],b[2],b[3],b[4]);}'`
SUBNETLIST=`awk '/[0-9.]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+/ {split($1,p,/\//); printf("[\"%s\", %s], ", p[1], p[2]);}' <"$TMPLIST"`
#генерируем proxy.pac по шаблону
#он проверяет домен на вхождение в фиксированные домены, а потом IP по списку.
function templatePAC {
NAME=$1
shift
DMNLIST=("$@")
cat >"$PACDIR/$NAME" <<EOF
function FindProxyForURL(url, host) {
var domainblacklist = [
EOF
for d in "${DMNLIST[@]}"
do
echo " '$d'," >>"$PACDIR/$NAME"
done
cat >>"$PACDIR/$NAME" <<EOF
];
var ipblacklist = [ $IPLIST ];
var subnetblacklist = [ $SUBNETLIST ];
function endsWith(str, suffix) {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
function numberToMask(n) {
var m=[0,128,192,224,240,248,252,254,255];
var r=[];
for (var i=0; i<4; i++) {
var p = (n > 8) ? 8 : n;
r[i] = m[p];
n -= p;
}
return r.join(".");
}
function maskMatch(ip, mask) {
var m = numberToMask(mask[1]);
return isInNet(ip, mask[0], m);
}
var blocked = false;
for (var i=0; !blocked && (i<domainblacklist.length); i++)
blocked = blocked || ((host == domainblacklist[i]) || endsWith(host, '.'+domainblacklist[i]));
if (!blocked) {
var ip = dnsResolve(host);
for (var i=0; !blocked && (i<subnetblacklist.length); i++)
blocked = blocked || maskMatch(ip, subnetblacklist[i]);
blocked = blocked || (ipblacklist.indexOf(convert_addr(ip)) != -1);
}
if (blocked)
return "PROXY ТУТ_ТВОЙ_ПРОКСИ:ПОРТ";
else
return "DIRECT";
}
EOF
}
# генерируем файл
templatePAC proxy.pac "${DOMAINS[@]}"
rm -f "$TMPLIST"