2022-11-03 12:15:19 +01:00
#!/bin/bash
2022-11-07 16:21:53 +01:00
# Erlang modules in ejabberd use a custom module attribute [1]
# named -protocol to define what XEPs and RFCs that module implements.
# General protocols are defined in ejabberd.erl
#
# The supported syntax is:
# -protocol({rfc, RFC-NUMBER}).
# -protocol({xep, XEP-NUMBER, XEP-VERSION}).
# -protocol({xep, XEP-NUMBER, XEP-VERSION, EJABBERD-VERSION, STATUS, COMMENTS}).
# Where
# RFC-NUMBER, XEP-NUMBER :: integer()
# XEP-VERSION, EJABBERD-VERSION :: atom()
# STATUS, COMMENTS :: string()
# For example:
# -protocol({rfc, 5766}).
# -protocol({xep, 111, '0.2'}).
# -protocol({xep, 222, '1.2.0', '17.09', "", ""}).
# -protocol({xep, 333, '1.11.2', '21.09', "complete", ""}).
# -protocol({xep, 333, '0.2.0', '21.09', "partial", "Only client X is supported"}).
#
# [1] https://www.erlang.org/doc/reference_manual/modules.html#module-attributes
2022-11-03 12:15:19 +01:00
write_doap_head( )
{
cat >" $1 " <<-'EOF'
<?xml version = "1.0" encoding = "UTF-8" ?>
<rdf:RDF xmlns:rdf= "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns = "http://usefulinc.com/ns/doap#"
2022-11-07 09:18:08 +01:00
xmlns:xmpp= "https://linkmauve.fr/ns/xmpp-doap#"
xmlns:schema= "https://schema.org/" >
2022-11-03 12:15:19 +01:00
<Project>
<name>ejabberd</name>
<shortdesc>XMPP Server with MQTT Broker and SIP Service</shortdesc>
<description>Robust, Ubiquitous and Massively Scalable Messaging Platform ( XMPP Server, MQTT Broker, SIP Service) </description>
<created>2002-11-16</created>
<os>BSD</os>
<os>Linux</os>
<os>macOS</os>
<os>Windows</os>
<programming-langauge>Erlang</programming-langauge>
<programming-langauge>C</programming-langauge>
<category rdf:resource= "https://linkmauve.fr/ns/xmpp-doap#category-jabber" />
<category rdf:resource= "https://linkmauve.fr/ns/xmpp-doap#category-server" />
<category rdf:resource= "https://linkmauve.fr/ns/xmpp-doap#category-xmpp" />
<homepage rdf:resource= "https://www.ejabberd.im" />
<download-page rdf:resource= "https://www.process-one.net/en/ejabberd/downloads/" />
<download-mirror rdf:resource= "https://github.com/processone/ejabberd/tags" />
<license rdf:resource= "https://raw.githubusercontent.com/processone/ejabberd/master/COPYING" />
2022-11-07 09:18:08 +01:00
<schema:logo rdf:resource= "https://docs.ejabberd.im/static/shared/images/footer_logo_e@2x.png" />
2022-11-03 12:15:19 +01:00
<bug-database rdf:resource= "https://github.com/processone/ejabberd/issues" />
<support-forum rdf:resource= "xmpp:ejabberd@conference.process-one.net?join" />
<repository>
<GitRepository>
<location rdf:resource= "https://github.com/processone/ejabberd.git" />
<browse rdf:resource= "https://github.com/processone/ejabberd" />
</GitRepository>
</repository>
EOF
}
write_doap_tail( )
{
cat >>" $1 " <<-'EOF'
</Project>
</rdf:RDF>
EOF
}
write_rfcs( )
{
rfc = rfc$1
out = $2
int = $( echo $1 | sed 's/^0*//' )
imp = $( grep " \-protocol({rfc, $int , " $BASE /src/* | sed "s/.*src\/\(.*\).erl.*'\([0-9.-]*\)'.*/\1 \2/" )
[ " $imp " = = "" ] && imp = "NA 0.0"
echo " <implements rdf:resource=\"https://www.rfc-editor.org/info/ $rfc \"/> " >>$out
}
write_xeps( )
{
xep = xep-$1
out = $2
2022-11-07 16:21:53 +01:00
comments2 = ""
2022-11-03 12:15:19 +01:00
int = $( echo $1 | sed 's/^0*//' )
imp = $( grep " \-protocol({xep, $int , " $BASE /src/* | sed "s/.*src\/\(.*\).erl.*'\([0-9.-]*\)'.*/\1 \2/" )
[ " $imp " = = "" ] && imp = "NA 0.0"
sourcefiles = $( grep " \-protocol({xep, $int , " $BASE /src/* | sed "s/.*src\/\(.*\).erl.*'\([0-9.-]*\)'.*/\1/" | tr '\012' ',' | sed 's|,$||' | sed 's|,|, |g' | sed 's|^ejabberd$||' )
2022-11-07 16:21:53 +01:00
versionsold = $( grep " \-protocol({xep, $int , .*'})\. " $BASE /src/* | sed "s/.*'\([0-9.-]*\)'.*/\1/" | head -1)
versionsnew = $( grep " \-protocol({xep, $int , .*\"})\. " $BASE /src/* | sed "s/.*'\([0-9.-]*\)', '.*/\1/" | head -1)
versions = " $versionsold $versionsnew "
since = $( grep " \-protocol({xep, $int , .*\"})\. " $BASE /src/* | sed "s/.*', '\([0-9.-]*\)',.*/\1/" | head -1)
status = $( grep " \-protocol({xep, $int , .*\"})\. " $BASE /src/* | sed "s/.*', \"\([a-z]*\)\", \".*/\1/" | head -1)
comments = $( grep " \-protocol({xep, $int , .*\"})\. " $BASE /src/* | sed "s/.*\", \"\(.*\)\"}.*/\1/" | head -1)
[ -n " $comments " ] && comments2 = " , $comments "
note = " $sourcefiles $comments2 "
2022-11-03 12:15:19 +01:00
echo " <implements>" >>$out
echo " <xmpp:SupportedXep>" >>$out
echo " <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/ $xep .html\"/> " >>$out
echo " <xmpp:version> $versions </xmpp:version> " >>$out
2022-11-07 16:21:53 +01:00
echo " <xmpp:since> $since </xmpp:since> " >>$out
echo " <xmpp:status> $status </xmpp:status> " >>$out
echo " <xmpp:note> $note </xmpp:note> " >>$out
2022-11-03 12:15:19 +01:00
echo " </xmpp:SupportedXep>" >>$out
echo " </implements>" >>$out
}
[ $# -eq 1 ] && BASE = " $1 " || BASE = " $PWD "
[ -d $BASE /doc ] || mkdir $BASE /doc
temp = tools/ejabberd.temp
final = ejabberd.doap
write_doap_head $final
for x_num in $( grep "\-protocol({rfc" $BASE /src/* | sed "s/,//" | awk '{printf("%04d\n", $2)}' | sort -u)
do
write_rfcs $x_num $temp
done
echo "" >>$temp
for x_num in $( grep "\-protocol({xep" $BASE /src/* | sed "s/,//" | awk '{printf("%04d\n", $2)}' | sort -u)
do
write_xeps $x_num $temp
done
cat $temp >>$final
rm $temp
write_doap_tail $final