Merge remote-tracking branch 'ni/master'
This commit is contained in:
commit
9a855d50a7
@ -1,18 +1,8 @@
|
|||||||
{ pkgs, lib, ... }:
|
{ pkgs, lib, ... }:
|
||||||
|
|
||||||
with lib;
|
|
||||||
|
|
||||||
pkgs.writeDashBin "irc-announce" ''
|
pkgs.writeDashBin "irc-announce" ''
|
||||||
set -euf
|
set -euf
|
||||||
|
|
||||||
export PATH=${makeSearchPath "bin" (with pkgs; [
|
|
||||||
coreutils
|
|
||||||
gawk
|
|
||||||
gnused
|
|
||||||
netcat
|
|
||||||
nettools
|
|
||||||
])}
|
|
||||||
|
|
||||||
IRC_SERVER=$1
|
IRC_SERVER=$1
|
||||||
IRC_PORT=$2
|
IRC_PORT=$2
|
||||||
IRC_NICK=$3_$$
|
IRC_NICK=$3_$$
|
||||||
@ -20,57 +10,15 @@ pkgs.writeDashBin "irc-announce" ''
|
|||||||
IRC_TLS=$5
|
IRC_TLS=$5
|
||||||
message=$6
|
message=$6
|
||||||
|
|
||||||
export IRC_CHANNEL # for privmsg_cat
|
if test "$IRC_TLS" != 1; then
|
||||||
|
unset IRC_TLS
|
||||||
|
fi
|
||||||
|
|
||||||
# echo2 and cat2 are used output to both, stdout and stderr
|
printf %s "$message" |
|
||||||
# This is used to see what we send to the irc server. (debug output)
|
${pkgs.ircaids}/bin/ircsink \
|
||||||
echo2() { echo "$*"; echo "$*" >&2; }
|
--nick="$IRC_NICK" \
|
||||||
cat2() {
|
--port="$IRC_PORT" \
|
||||||
awk '{
|
--server="$IRC_SERVER" \
|
||||||
print $0
|
--target="$IRC_CHANNEL" \
|
||||||
print $0 > "/dev/stderr"
|
''${IRC_TLS:+--secure}
|
||||||
}'
|
|
||||||
}
|
|
||||||
|
|
||||||
# privmsg_cat transforms stdin to a privmsg
|
|
||||||
privmsg_cat() { awk '{ print "PRIVMSG "ENVIRON["IRC_CHANNEL"]" :"$0 }'; }
|
|
||||||
|
|
||||||
tls_flag() { if [ "$IRC_TLS" -eq 1 ]; then echo "-c"; fi }
|
|
||||||
|
|
||||||
# ircin is used to feed the output of netcat back to the "irc client"
|
|
||||||
# so we can implement expect-like behavior with sed^_^
|
|
||||||
# XXX mkselfdestructingtmpfifo would be nice instead of this cruft
|
|
||||||
tmpdir=$(mktemp --tmpdir -d irc-announce_XXXXXXXX)
|
|
||||||
cd "$tmpdir"
|
|
||||||
mkfifo ircin
|
|
||||||
trap "
|
|
||||||
rm ircin
|
|
||||||
cd '$OLDPWD'
|
|
||||||
rmdir '$tmpdir'
|
|
||||||
trap - EXIT INT QUIT
|
|
||||||
" EXIT INT QUIT
|
|
||||||
|
|
||||||
{
|
|
||||||
echo2 "USER $LOGNAME 0 * :$LOGNAME@$(hostname)"
|
|
||||||
echo2 "NICK $IRC_NICK"
|
|
||||||
|
|
||||||
awk 'match($0, /PING(.*)/, m) {print "PONG", m[1]; exit}'
|
|
||||||
|
|
||||||
# wait for MODE message
|
|
||||||
sed -n '/^:[^ ]* MODE /q'
|
|
||||||
|
|
||||||
echo2 "JOIN $IRC_CHANNEL"
|
|
||||||
|
|
||||||
printf '%s' "$message" \
|
|
||||||
| privmsg_cat \
|
|
||||||
| cat2
|
|
||||||
|
|
||||||
echo2 "PART $IRC_CHANNEL"
|
|
||||||
|
|
||||||
# wait for PART confirmation
|
|
||||||
sed -n '/:'"$IRC_NICK"'![^ ]* PART /q'
|
|
||||||
|
|
||||||
echo2 'QUIT :Gone to have lunch'
|
|
||||||
} < ircin \
|
|
||||||
| nc $(tls_flag) "$IRC_SERVER" "$IRC_PORT" | tee -a ircin
|
|
||||||
''
|
''
|
||||||
|
32
krebs/5pkgs/simple/ircaids.nix
Normal file
32
krebs/5pkgs/simple/ircaids.nix
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
{ lib, pkgs, stdenv }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
pname = "ircaids";
|
||||||
|
version = "1.0.0";
|
||||||
|
|
||||||
|
src = pkgs.fetchgit {
|
||||||
|
url = "https://cgit.krebsco.de/ircaids";
|
||||||
|
rev = "refs/tags/${version}";
|
||||||
|
sha256 = "13z9pc9vq2xq2qpavwmh7fvzvvjkc495ssxsh8cs044qflvj54b2";
|
||||||
|
};
|
||||||
|
|
||||||
|
buildPhase = null;
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
|
||||||
|
cp $src/bin/ircsink $out/bin/ircsink
|
||||||
|
sed -i '
|
||||||
|
s;^#! /bin/sh;#! ${pkgs.dash}/bin/dash;
|
||||||
|
s;^#!.*;&\nexport PATH=${lib.makeBinPath [
|
||||||
|
pkgs.coreutils
|
||||||
|
pkgs.gawk
|
||||||
|
pkgs.gnused
|
||||||
|
pkgs.netcat
|
||||||
|
pkgs.nettools
|
||||||
|
pkgs.openssl
|
||||||
|
pkgs.utillinux
|
||||||
|
]};
|
||||||
|
' $out/bin/ircsink
|
||||||
|
'';
|
||||||
|
}
|
@ -60,6 +60,11 @@ in {
|
|||||||
|
|
||||||
proxy_pass $new_uri;
|
proxy_pass $new_uri;
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
locations."/search.json".extraConfig = ''
|
||||||
|
proxy_pass http://127.0.0.1:${toString config.krebs.htgen.elm-packages-proxy.port};
|
||||||
|
proxy_pass_header Server;
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
krebs.htgen.elm-packages-proxy = {
|
krebs.htgen.elm-packages-proxy = {
|
||||||
@ -192,6 +197,36 @@ in {
|
|||||||
|
|
||||||
exit
|
exit
|
||||||
;;
|
;;
|
||||||
|
'DELETE /packages/'*)
|
||||||
|
|
||||||
|
author=$req_x_author
|
||||||
|
pname=$req_x_package
|
||||||
|
user=$req_x_user
|
||||||
|
version=$req_x_version
|
||||||
|
|
||||||
|
zipball=${cfg.packageDir}/$author/$pname/$version/zipball
|
||||||
|
elmjson=$HOME/cache/$author%2F$pname%2F$version%2Felm.json
|
||||||
|
endpointjson=$HOME/cache/$author%2F$pname%2F$version%2Fendpoint.json
|
||||||
|
|
||||||
|
if test -e "$zipball"; then
|
||||||
|
zipball_owner=$(attr -q -g X-User "$zipball" || :)
|
||||||
|
if test "$zipball_owner" = "$req_x_user"; then
|
||||||
|
echo "user $user is deleting package $author/$pname@$version" >&2
|
||||||
|
rm -f "$elmjson"
|
||||||
|
rm -f "$endpointjson"
|
||||||
|
rm "$zipball"
|
||||||
|
string_response 200 OK \
|
||||||
|
"package deleted: $author/$pname@$version" \
|
||||||
|
text/plain
|
||||||
|
exit
|
||||||
|
else
|
||||||
|
string_response 403 Forbidden \
|
||||||
|
"package already exists: $author/$pname@$version" \
|
||||||
|
text/plain
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
'GET /all-packages'|'POST /all-packages')
|
'GET /all-packages'|'POST /all-packages')
|
||||||
|
|
||||||
response=$(mktemp -t htgen.$$.elm-packages-proxy.all-packages.XXXXXXXX)
|
response=$(mktemp -t htgen.$$.elm-packages-proxy.all-packages.XXXXXXXX)
|
||||||
@ -245,6 +280,76 @@ in {
|
|||||||
} |
|
} |
|
||||||
jq -cs add > $response
|
jq -cs add > $response
|
||||||
|
|
||||||
|
file_response 200 OK "$response" 'application/json; charset=UTF-8'
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
'GET /search.json')
|
||||||
|
|
||||||
|
searchjson=$HOME/cache/search.json
|
||||||
|
mkdir -p "$HOME/cache"
|
||||||
|
|
||||||
|
# update cached search.json
|
||||||
|
(
|
||||||
|
last_modified=$(
|
||||||
|
if test -f "$searchjson"; then
|
||||||
|
date -Rr "$searchjson"
|
||||||
|
else
|
||||||
|
date -R -d @0
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
tempsearchjson=$(mktemp "$searchjson.XXXXXXXX")
|
||||||
|
trap 'rm "$tempsearchjson" >&2' EXIT
|
||||||
|
curl -fsS --compressed https://package.elm-lang.org/search.json \
|
||||||
|
-H "If-Modified-Since: $last_modified" \
|
||||||
|
-o "$tempsearchjson"
|
||||||
|
if test -s "$tempsearchjson"; then
|
||||||
|
mv "$tempsearchjson" "$searchjson"
|
||||||
|
trap - EXIT
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
|
||||||
|
response=$(mktemp -t htgen.$$.elm-packages-proxy.search.XXXXXXXX)
|
||||||
|
trap 'rm "$response" >&2' EXIT
|
||||||
|
|
||||||
|
{
|
||||||
|
printf '{"upstream":'; cat "$searchjson"
|
||||||
|
printf ',"private":'; (cd ${cfg.packageDir}; find -mindepth 3 -maxdepth 3) |
|
||||||
|
jq -Rs '
|
||||||
|
split("\n") |
|
||||||
|
map(
|
||||||
|
select(.!="") |
|
||||||
|
match("^\\./(?<author>[^/]+)/(?<pname>[^/]+)/(?<version>[^/]+)$").captures |
|
||||||
|
map({key:.name,value:.string}) |
|
||||||
|
from_entries
|
||||||
|
) |
|
||||||
|
map({
|
||||||
|
key: "\(.author)/\(.pname)",
|
||||||
|
value: .version,
|
||||||
|
}) |
|
||||||
|
from_entries
|
||||||
|
'
|
||||||
|
printf '}'
|
||||||
|
} |
|
||||||
|
jq -c '
|
||||||
|
reduce .upstream[] as $upstreamItem ({ private, output: [] };
|
||||||
|
.private[$upstreamItem.name] as $privateItem |
|
||||||
|
if $privateItem then
|
||||||
|
.output += [$upstreamItem * { version: $privateItem.version }] |
|
||||||
|
.private |= del(.[$upstreamItem.name])
|
||||||
|
else
|
||||||
|
.output += [$upstreamItem]
|
||||||
|
end
|
||||||
|
) |
|
||||||
|
|
||||||
|
.output + (.private | to_entries | sort_by(.key) | map({
|
||||||
|
name: .key,
|
||||||
|
version: .value,
|
||||||
|
summary: "dummy summary",
|
||||||
|
license: "dummy license",
|
||||||
|
}))
|
||||||
|
' \
|
||||||
|
> $response
|
||||||
|
|
||||||
file_response 200 OK "$response" 'application/json; charset=UTF-8'
|
file_response 200 OK "$response" 'application/json; charset=UTF-8'
|
||||||
exit
|
exit
|
||||||
;;
|
;;
|
||||||
|
@ -83,6 +83,9 @@ let {
|
|||||||
htgen = {
|
htgen = {
|
||||||
cgit.desc = "toy HTTP server";
|
cgit.desc = "toy HTTP server";
|
||||||
};
|
};
|
||||||
|
ircaids = {
|
||||||
|
cgit.desc = "Assortment of aids for working with Internet relay chat";
|
||||||
|
};
|
||||||
krops = {
|
krops = {
|
||||||
cgit.desc = "deployment tools";
|
cgit.desc = "deployment tools";
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user