Command Line Interface#

pyreports has a command line interface which takes a configuration file in YAML format as an argument.

Command arguments#

The only mandatory argument is the YAML language configuration file.

Optional arguments#

Here are all the optional flags that the command line interface has.

flags

description

-v/–verbose

Enable verbose mode

-e/–exclude

Exclude reports

-V/–version

Print version

-h/–help

Print help

Report configuration#

The YAML file representing your reports begins with a reports key.

reports:
    # ...

Each report you want to define is a report key inside reports.

# My reports collection
reports:
# My single report
- report:

input section#

The report section must have a data input, which can be file, sql database or LDAP.

FileManager#
 reports:
 - report:
     # My input
     input:
       manager: 'log'
       filename: '/tmp/test_log.log'
       # Apache http log format
       params:
         pattern: '([(\d\.)]+) (.*) \[(.*?)\] (.*?) (\d+) (\d+) (.*?) (.*?) (\(.*?\))'
         headers: ['ip', 'user', 'date', 'req', 'ret', 'size', 'url', 'browser', 'host']

Note

Only log type has a pattern params.

DatabaseManager#
 reports:
 - report:
     # My input
     input:
       manager: 'mysql'
       source:
       # Connection parameters of my mysql database
         host: 'mysql1.local'
         database: 'cars'
         user: 'admin'
         password: 'dba0000'
       params:
         query: 'SELECT * FROM cars WHERE brand = %s AND color = %s'
         params: ['ford', 'red']

Attention

For complete list of source parameters see the various python package for the providers databases.

LdapManager#
 reports:
 - report:
     # My input
     input:
       manager: 'ldap'
       source:
       # Connection parameters of my ldap server
         server: 'ldap.local'
         username: 'user'
         password: 'password'
         ssl: False
         tls: True
       params:
         base_search: 'DC=test,DC=local'
         search_filter: '(&(objectClass=user)(objectCategory=person))'
         attributes: ['name', 'mail', 'phone']

output section#

output is a Manager object where save your report data, is same of input data.

Attention

If output is null or absent, the output of data is stdout.

FileManager#
 reports:
 - report:
     # My input
     input:
       # ...
     output:
       manager: 'csv'
       filename: '/tmp/test_csv.csv'
DatabaseManager#
 reports:
 - report:
     # My input
     input:
       # ...
     output:
       manager: 'mysql'
       source:
       # Connection parameters of my mysql database
         host: 'mysql1.local'
         database: 'cars'
         user: 'admin'
         password: 'dba0000'

other section#

report section has multiple key/value.

reports:
- report:
    # My input
    input:
      # ...
    output:
      # ...
    title: "One report"
    filters: ['string_filter', 42]
    map: |
      def map_func(integer):
          if isinstance(integer, int):
              return str(integer)
    negation: true
    column: "column_name"
    count: True

Warning

map section accept any python code. Specify only a function that accept only one argument and with name map_func.

Note

filters could accept also a function that accept only one argument and return a bool value.

data tools#

report section has also some datatools.

reports:
- report:
    # My input
    input:
      # ...
    output:
      # ...
    sort:
      column: age
      reverse: true
    deduplicate: true
    subset:
      - name
      - surname

mail settings#

Reports can also be sent by email. Just specify the mail section.

reports:
- report:
    # My input
    input:
      # ...
    output:
      # ...
    # Other sections
    mail:
      server: 'smtp.local'
      from: 'ARTHUR DENT <arthur.dent@hitchhikers.com>'
      to: 'ford.prefect@hitchhikers.com'
      cc: 'startiblast@hitchhikers.com'
      bcc: 'allmouse@hitchhikers.com'
      subject: 'New report mail'
      body: 'Report in attachment'
      auth: ['user', 'password']
      ssl: true
      headers: ['key', 'value']

Warning

mail settings required output settings.

Report examples#

Here are some report configurations ranging from the case of reading from a database and writing to a file up to an LDAP server.

Database example#

Below is an example of a report with data taken from a mysql database and save it into csv file.

reports:
- report:
    title: 'Red ford machine'
    input:
      manager: 'mysql'
      source:
      # Connection parameters of my mysql database
        host: 'mysql1.local'
        database: 'cars'
        user: 'admin'
        password: 'dba0000'
      params:
        query: 'SELECT * FROM cars WHERE brand = %s AND color = %s'
        params: ['ford', 'red']
    # Filter km
    filters: [40000, 45000]
    output:
      manager: 'csv'
      filename: '/tmp/car_csv.csv'

LDAP example#

Reports of users who have passwords without expiration by saving it in an excel file and sending it by email.

reports:
- report:
    title: 'Users who have passwords without expiration'
    input:
      manager: 'ldap'
      source:
       # Connection parameters of my ldap server
       server: 'ldap.local'
        username: 'user'
        password: 'password'
        ssl: False
        tls: True
      params:
        base_search: 'DC=test,DC=local'
        search_filter: '(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=65536))'
        attributes: ['cn', 'mail', 'phone']
    # Append prefix number on phone number
    map: |
        def map_func(phone):
           if phone.startswith('33'):
              return '+39' + phone
    output:
      manager: 'xlsx'
      filename: '/tmp/users.xlsx'
    mail:
      server: 'smtp.local'
      from: 'ARTHUR DENT <arthur.dent@hitchhikers.com'
      to: 'ford.prefect@hitchhikers.com'

Two report examples#

Combine latest report examples into one configuration file.

reports:
- report:
    title: 'Red ford machine'
    input:
      manager: 'mysql'
      source:
      # Connection parameters of my mysql database
        host: 'mysql1.local'
        database: 'cars'
        user: 'admin'
        password: 'dba0000'
      params:
        query: 'SELECT * FROM cars WHERE brand = %s AND color = %s'
        params: ['ford', 'red']
    # Filter km
    filters: [40000, 45000]
    output:
      manager: 'csv'
      filename: '/tmp/car_csv.csv'
- report:
    title: 'Users who have passwords without expiration'
    input:
      manager: 'ldap'
      source:
      # Connection parameters of my ldap server
        server: 'ldap.local'
        username: 'user'
        password: 'password'
        ssl: False
        tls: True
      params:
        base_search: 'DC=test,DC=local'
        search_filter: '(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=65536))'
        attributes: ['cn', 'mail', 'phone']
    # Append prefix number on phone number
    map: |
        def map_func(phone):
           if phone.startswith('33'):
              return '+39' + phone
    output:
      manager: 'xlsx'
      filename: '/tmp/users.xlsx'
    mail:
      server: 'smtp.local'
      from: 'ARTHUR DENT <arthur.dent@hitchhikers.com'
      to: 'ford.prefect@hitchhikers.com'