Installer protocol

This document describes the protocol used by the daemon afmpkg-installer.

The two main clients of the protocol are:

  • the redpesk plugin for RPM that triggers installation and removal of packages
  • the program afmpkg-status that gets the status of a previous installation

When dnf is called, it resolves dependencies and install all the packages required. This leads to installing possibly more than one package. The daemon afmpkg-installer handles it with the concept of transaction.

So installation can take places

The protocol specifies that only one request is served by afmpkg-installer. So the client connects, put an order, wait the answer and disconnect.

So the connection can be summarized by the below synopsis:

REQUEST  (C->S)
REPLY    (S->C)

The protocol is made of lines of text.

At any time, on any line, if afmpkg-installer detects a protocol error, it sends an error reply and closes the connection.

There is two kinds of requests:

  • the package request that request to install or remove packages
  • the status request that gets the final status of a transaction
REQUEST ::= PACKAGE-REQUEST | STATUS-REQUEST

PACKAGE-REQUEST

A PACKAGE-REQUEST is made of several lines, starting with a beginning line and stopping with an ending line.

PACKAGE-REQUEST ::=  BEGIN-LINE [BODY-LINE]... END-LINE

BEGIN-LINE ::= 'BEGIN' SP OPERATION EOL
END-LINE   ::= 'END' SP OPERATION EOL
OPERATION  ::= 'ADD' | 'REMOVE'

It is an error if the OPERATION given at end line doesn’t match the operation given at begin line.

The operation INSTALL is used for installing packages, the operation REMOVE for removing it.

The lines of the body can be send in unspecified order. Except lines for FILE, lines can occur only once.

Body lines are of 2 main kinds:

  • lines related to the package
  • lines related to the transaction
BODY-LINE ::= PACK-LINE | TRANS-LINE

The lines related to the package are giving the name of the package and the paths of the installed files.

PACK-LINE ::= PACKAGE-LINE | ROOT-LINE | FILE-LINE | REDPAKID-LINE

PACKAGE-LINE  ::= 'PACKAGE' SP NAME EOL
ROOT-LINE     ::= 'ROOT' SP PATH EOL
FILE-LINE     ::= 'FILE' SP PATH EOL
REDPAKID-LINE ::= 'REDPAKID' SP ID EOL

The lines related to the transaction are giving the identifier of the transaction, the index of the package within the given count.

TRANS-LINE    ::= COUNT-LINE | INDEX-LINE | TRANSID-LINE

COUNT-LINE    ::= 'COUNT' SP NUMBER EOL
INDEX-LINE    ::= 'INDEX' SP NUMBER EOL
TRANSID-LINE  ::= 'TRANSID' SP ID EOL

STATUS-REQUEST

A STATUS-REQUEST is made of exctly one status line.

STATUS-REQUEST ::= 'STATUS' SP TRANSID EOL

REPLY

The reply is made of a single line of text

REPLY       ::= OK-REPLY | ERROR-REPLY
OK-REPLY    ::= 'OK' [SP ANY-TEXT] EOL
ERROR-REPLY ::= 'ERROR' [SP ANY-TEXT] EOL

For ok reply to the the STATUS request, the text is made of 3 numbers:

  1. the count of package of the transaction
  2. the count of packages of the transaction processed successfully
  3. the count of packages of the transaction processed with error