A command line tool that creates BibTex
entries for IETF RFC
s and Internet Drafts
.
It can read the list of RFC
s and Internet Drafts
to parse from various sources:
- directly from
.tex
files - directly from
.aux
files - from a text file (one ID per line)
- from command-line arguments
Duplicate entires are filtered out.
You can use pip
to install this command-line tool:
pip install rfcbibtex
or pipenv
:
pipenv install rfcbibtex
Alternatively, you can clone this repository or download the rfc-bibtex.py
. This tool has no
external dependencies, so as long as you have Python 3.x
installed, everything
should work fine.
Requirements:
Python 3.x
- Internet connection
First, install the test dependencies:
pipenv install --dev
or
pip install -r dev-requirements.txt
and then run:
python -m unittest discover tests
from the project root.
This tool automates the requests to the https://datatracker.ietf.org/doc/<id>/<version>/bibtex/
and https://datatracker.ietf.org/doc/<id>/bibtex/
endpoints.
usage: rfcbibtex [-h] [-f FILE_NAME] [-o FILE_NAME]
[inline_args [inline_args ...]]
Generate BibTex entries for IETF RFCs and Internet Drafts. The list of IDs can
be read from a file (including .tex and .aux) or directly from command-line
arguments.
positional arguments:
inline_args list of RFC and/or Internet Draft IDs, in any order.
optional arguments:
-h, --help show this help message and exit
-f FILE_NAME, --file FILE_NAME
read list of RFC and/or Internet Draft IDs from a
file. Supported file formats are the following: .tex,
.aux and .txt (one ID per line). If a file with any
other extension is provided, the tool attempts to read
it as a .txt file, containing one ID per line.
-o FILE_NAME, --output FILE_NAME
output the resulting BibTex to a file
The identifier format of RFCs is rfc<rfc_num>
, where <rfc_num>
is the RFC number.
For example, for the RFC specifying TLS 1.2 you
would write rfc5246
(NOTE: the identifiers are case-insensitive, so RFC5246
and rFc5246
are also accepted).
The input format of Internet-Drafts(I-Ds) is draft-<rest>
, where <rest>
is the rest of
the draft's name (all Internet-Drafts begin with "draft"). For example, for the
TLS 1.3 Draft 21 you would write draft-ietf-tls-tls13-21
.
Example command:
rfcbibtex RFC5246 draft-ietf-tls-tls13-21
Output:
@misc{rfc5246,
series = {Request for Comments},
number = 5246,
howpublished = {RFC 5246},
publisher = {RFC Editor},
doi = {10.17487/RFC5246},
url = {https://rfc-editor.org/rfc/rfc5246.txt},
author = {Eric Rescorla and Tim Dierks},
title = {{The Transport Layer Security (TLS) Protocol Version 1.2}},
pagetotal = 104,
year = 2008,
month = aug,
abstract = {This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol. The TLS protocol provides communications security over the Internet. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. {[}STANDARDS-TRACK{]}},
}
@techreport{draft-ietf-tls-tls13-21,
number = {draft-ietf-tls-tls13-21},
type = {Internet-Draft},
institution = {Internet Engineering Task Force},
publisher = {Internet Engineering Task Force},
note = {Work in Progress},
url = {https://datatracker.ietf.org/doc/html/draft-ietf-tls-tls13-21},
author = {Eric Rescorla},
title = {{The Transport Layer Security (TLS) Protocol Version 1.3}},
pagetotal = 143,
year = ,
month = ,
day = ,
abstract = {This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.},
}
Option: -f <file_name_1> ... <file_name_N>
Alternatively, identifiers can be specified in a file. The following input formats are accepted:
.tex
: if you specify an.tex
file, the program will search for \cite{} commands in the file and extract those that appear to contain RFCs or Internet Drafts identifiers..aux
: if you specify an.aux
file, the program will search for \citation{} commands in the file and extract those that appear to contain RFCs or Internet Drafts identifiers..txt
: the program defaults to this file type if the file's extension is neither.tex
, nor.aux
. This file type must contain a list of RFCs or Internet Drafts identifiers, one per line.
Please note that the identifiers must be in the format specified in the Identifier Format seciton.
Consider that you have a file called rfcs_and_ids.tex
with the following content:
\documentclass{article}
\usepackage[utf8]{inputenc}
\title{This Is A Simple Tex File For The RFCBibtex Project Demo}
\author{Illya Gerasymchuk}
\date{March 2019}
\usepackage{natbib}
\usepackage{graphicx}
\begin{document}
\maketitle
\section{Introduction}
There is nothing special here, nothing fancy, just a document with a few citations, like
\cite{RFC5246} this one. This one here \cite{the-documentary-2005} should not be parsed.
While this one \cite{draft-ietf-tls-tls13-21} should. And finally, let's cite the
TLS 1.3 RFC \cite{RFC8446}. Well, that's it folks. At least for now... This is a very basic
file, just to test if \textbf{the basic} latex parsing is working.
You can find the RFCBitex project here: https://github.com/iluxonchik/rfc-bibtex
\begin{figure}[h!]
\centering
\includegraphics[scale=1.7]{universe}
\caption{The Universe}
\label{fig:universe}
\end{figure}
\section{Conclusion}
As you can see, your .tex file may have various citations, but only the ones that are RFCs
and/or Internet Draft IDs are parsed.
\bibliographystyle{plain}
\bibliography{references}
\end{document}
If you run:
rfcbibtex -f rfcs_and_ids.tex
You will get the following output:
@misc{rfc5246,
series = {Request for Comments},
number = 5246,
howpublished = {RFC 5246},
publisher = {RFC Editor},
doi = {10.17487/RFC5246},
url = {https://rfc-editor.org/rfc/rfc5246.txt},
author = {Eric Rescorla and Tim Dierks},
title = {{The Transport Layer Security (TLS) Protocol Version 1.2}},
pagetotal = 104,
year = 2008,
month = aug,
abstract = {This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol. The TLS protocol provides communications security over the Internet. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. {[}STANDARDS-TRACK{]}},
}
@techreport{draft-ietf-tls-tls13-21,
number = {draft-ietf-tls-tls13-21},
type = {Internet-Draft},
institution = {Internet Engineering Task Force},
publisher = {Internet Engineering Task Force},
note = {Work in Progress},
url = {https://datatracker.ietf.org/doc/html/draft-ietf-tls-tls13-21},
author = {Eric Rescorla},
title = {{The Transport Layer Security (TLS) Protocol Version 1.3}},
pagetotal = 143,
year = ,
month = ,
day = ,
abstract = {This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.},
}
@misc{rfc8446,
series = {Request for Comments},
number = 8446,
howpublished = {RFC 8446},
publisher = {RFC Editor},
doi = {10.17487/RFC8446},
url = {https://rfc-editor.org/rfc/rfc8446.txt},
author = {Eric Rescorla},
title = {{The Transport Layer Security (TLS) Protocol Version 1.3}},
pagetotal = 160,
year = 2018,
month = aug,
abstract = {This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery. This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.},
}
Consider that you have a file called rfcs_and_ids.aux
with the following content:
\relax
\citation{RFC5246}
\citation{the-documentary-2005}
\citation{draft-ietf-tls-tls13-21}
\citation{RFC8446}
\bibstyle{plain}
\bibdata{references}
\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}}
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces The Universe}}{1}}
\newlabel{fig:universe}{{1}{1}}
\@writefile{toc}{\contentsline {section}{\numberline {2}Conclusion}{1}}
If you run:
rfcbibtex -f rfcs_and_ids.aux
You will get the same output as in the previous section.
Consider that you have a file called rfcs_and_ids.txt
with the following content:
RFC5246
the-documentary-2005
draft-ietf-tls-tls13-21
RFC8446
If you run:
rfcbibtex -f rfcs_and_ids.aux
You will get the same output as in the previous section.
You can also combine multiple files with different types. You can even combine files and command line arguments.
Let's assume you have a file called rfcs.txt
with the following content:
RFC5246
rFc7231
We will also use the rfcs_and_ids.tex from a previous example. If you run:
rfcbibtex rfc1234 -f rfcs.txt rfcs_and_ids.tex
You will get the following output:
@misc{rfc7231,
series = {Request for Comments},
number = 7231,
howpublished = {RFC 7231},
publisher = {RFC Editor},
doi = {10.17487/RFC7231},
url = {https://rfc-editor.org/rfc/rfc7231.txt},
author = {Roy T. Fielding and Julian Reschke},
title = {{Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content}},
pagetotal = 101,
year = 2014,
month = jun,
abstract = {The Hypertext Transfer Protocol (HTTP) is a stateless \textbackslash{}\%application- level protocol for distributed, collaborative, hypertext information systems. This document defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.},
}
@techreport{draft-ietf-tls-tls13-21,
number = {draft-ietf-tls-tls13-21},
type = {Internet-Draft},
institution = {Internet Engineering Task Force},
publisher = {Internet Engineering Task Force},
note = {Work in Progress},
url = {https://datatracker.ietf.org/doc/html/draft-ietf-tls-tls13-21},
author = {Eric Rescorla},
title = {{The Transport Layer Security (TLS) Protocol Version 1.3}},
pagetotal = 143,
year = ,
month = ,
day = ,
abstract = {This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.},
}
@misc{rfc1234,
series = {Request for Comments},
number = 1234,
howpublished = {RFC 1234},
publisher = {RFC Editor},
doi = {10.17487/RFC1234},
url = {https://rfc-editor.org/rfc/rfc1234.txt},
author = {Don Provan},
title = {{Tunneling IPX traffic through IP networks}},
pagetotal = 6,
year = 1991,
month = jun,
abstract = {This memo describes a method of encapsulating IPX datagrams within UDP packets so that IPX traffic can travel across an IP internet. {[}STANDARDS-TRACK{]} This memo defines objects for managing DS1 Interface objects for use with the SNMP protocol. {[}STANDARDS-TRACK{]}},
}
@misc{rfc5246,
series = {Request for Comments},
number = 5246,
howpublished = {RFC 5246},
publisher = {RFC Editor},
doi = {10.17487/RFC5246},
url = {https://rfc-editor.org/rfc/rfc5246.txt},
author = {Eric Rescorla and Tim Dierks},
title = {{The Transport Layer Security (TLS) Protocol Version 1.2}},
pagetotal = 104,
year = 2008,
month = aug,
abstract = {This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol. The TLS protocol provides communications security over the Internet. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. {[}STANDARDS-TRACK{]}},
}
@misc{rfc8446,
series = {Request for Comments},
number = 8446,
howpublished = {RFC 8446},
publisher = {RFC Editor},
doi = {10.17487/RFC8446},
url = {https://rfc-editor.org/rfc/rfc8446.txt},
author = {Eric Rescorla},
title = {{The Transport Layer Security (TLS) Protocol Version 1.3}},
pagetotal = 160,
year = 2018,
month = aug,
abstract = {This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery. This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.},
}
Note that duplicate entries have been removed.
Option: -o <file_name>
Considering rfcs.txt
and rfcs_and_ids.tex
from the above above.
If you run:
rfcbibtex rfc1234 -f rfcs.txt rfcs_and_ids.tex -o output.bib
A file output.bib
would be created or overridden with the the same content as in the above output.
The tool will print a warning in the following cases:
- no explicit version defined for a draft id
- drafts which have a new draft version update
- drafts which have been assigned an
RFC
number - invalid identifier name provided as a command-line argument (invalid identifier names from files are simply not parsed)
- errors in fetching from URLs
It's important to note, that such errors DO NOT break the correct functionality of the tool. Those errors and warnings are printed out,
but IGNORED. The generated BibTex files are valid, even when errors are found. Errors and warnings are only printed on the console
(into the standard error output stream) and never to the output files (-o
option).
Here is an example of an output of errors and warnings: