Installing the SIP Server

This is a rough intro to installing the SIP server for Evergreen.

Getting the code

Current SIP server code lives at in the Evergreen git repository:

cd /opt
git clone git://git.evergreen-ils.org/SIPServer.git SIPServer

Configuring the Server

  1. Type the following commands from the command prompt:

    $ sudo su opensrf
    $ cd /openils/conf
    $ cp oils_sip.xml.example oils_sip.xml
  2. Edit oils_sip.xml. Change the commented out <server-params> section to this:

    <server-params
       min_spare_servers='1'
       max_spare_servers='2'
       min_servers='3'
       max_servers='25'
                 />
  3. max_servers will directly correspond to the number of allowed SIP clients. Set the number accordingly, but bear in mind that too many connections can exhaust memory. On a 4G RAM/4 CPU server (that is also running evergreen), it is not recommended to exceed 100 SIP client connections.

Setting the encoding

SIPServer looks for the encoding in the following places:

  1. An encoding attribute on the account element for the currently active SIP account.
  2. The encoding element that is a child of the institution element of the currently active SIP account.
  3. The encoding element that is a child of the implementation_config element that is itself a child of the institution element of the currently active SIP account.
  4. If none of the above exist, then the default encoding (ASCII) is used.

Option 3 is a legacy option. It is recommended that you alter your configuration to move this element out of the implementation_config element and into its parent institution element. Ideally, SIPServer should not look into the implementation config, and this check may be removed at some time in the future.

Datatypes

The msg64_hold_datatype setting is similar to msg64_summary_datatype, but affects holds instead of circulations. When set to barcode, holds information will be delivered as a set of copy barcodes instead of title strings for patron info requests. With barcodes, SIP clients can both find the title strings for display (via item info requests) and make subsequent hold-related action requests, like holds cancellation.

Adding SIP Users

  1. Type the following commands from the command prompt:

    $ sudo su opensrf
    $ cd /openils/conf
  2. In the <accounts> section, add SIP client login information. Make sure that all <logins> use the same institution attribute, and make sure the institution is listed in <institutions>. All attributes in the <login> section will be used by the SIP client.
  3. In Evergreen, create a new profile group called SIP. This group should be a sub-group of Users (not Staff or Patrons). Set Editing Permission as group_application.user.sip_client and give the group the following permissions:

    COPY_CHECKIN
    COPY_CHECKOUT
    CREATE_PAYMENT
    RENEW_CIRC
    VIEW_CIRCULATIONS
    VIEW_COPY_CHECKOUT_HISTORY
    VIEW_PERMIT_CHECKOUT
    VIEW_USER
    VIEW_USER_FINES_SUMMARY
    VIEW_USER_TRANSACTIONS

    OR use SQL like:

    INSERT INTO permission.grp_tree (name,parent,description,application_perm)
    VALUES ('SIP', 1, 'SIP2 Client Systems', 'group_application.user.sip_client');
    INSERT INTO
      permission.grp_perm_map (grp, perm, depth, grantable)
    SELECT
      g.id, p.id, 0, FALSE
    FROM
      permission.grp_tree g,
      permission.perm_list p
    WHERE
      g.name = 'SIP' AND
      p.code IN (
        'COPY_CHECKIN',
        'COPY_CHECKOUT',
        'RENEW_CIRC',
        'VIEW_CIRCULATIONS',
        'VIEW_COPY_CHECKOUT_HISTORY',
        'VIEW_PERMIT_CHECKOUT',
        'VIEW_USER',
        'VIEW_USER_FINES_SUMMARY',
        'VIEW_USER_TRANSACTIONS'
     );

    Verify:

    SELECT *
    FROM permission.grp_perm_map pgpm
        INNER JOIN permission.perm_list ppl ON pgpm.perm = ppl.id
        INNER JOIN permission.grp_tree pgt ON pgt.id = pgpm.grp
    WHERE pgt.name = 'SIP';
  4. For each account created in the <login> section of oils_sip.xml, create a user (via the staff client user editor) that has the same username and password and put that user into the SIP group.

Note

The expiration date will affect the SIP users' connection so you might want to make a note of this somewhere.

Running the server

To start the SIP server type the following commands from the command prompt:

$ sudo su opensrf
$ oils_ctl.sh -a [start|stop|restart]_sip

Logging-SIP

Syslog

It is useful to log SIP requests to a separate file especially during initial setup by modifying your syslog config file.

  1. Edit syslog.conf.

    $ sudo vi /etc/syslog.conf  # maybe /etc/rsyslog.conf
  2. Add this:

    local6.*                -/var/log/SIP_evergreen.log
  3. Syslog expects the logfile to exist so create the file.

    $ sudo touch /var/log/SIP_evergreen.log
  4. Restart sysklogd.

    $ sudo /etc/init.d/sysklogd restart

Syslog-NG

  1. Edit logging config.

    sudo vi /etc/syslog-ng/syslog-ng.conf
  2. Add:

    # +SIP2+ for Evergreen
    filter    f_eg_sip { level(warn, err, crit) and facility(local6); };
    destination eg_sip { file("var/log/SIP_evergreen.log"); };
    log { source(s_all); filter(f_eg_sip); destination(eg_sip); };
  3. Syslog-ng expects the logfile to exist so create the file.

    $ sudo touch /var/log/SIP_evergreen.log
  4. Restart syslog-ng

    $ sudo /etc/init.d/syslog-ng restart

Testing Your SIP Connection

  • In the root directory of the SIPServer code:

    $ cd SIPServer/t
  • Edit SIPtest.pm, change the $instid, $server, $username, and $password variables. This will be enough to test connectivity. To run all tests, you’ll need to change all the variables in the Configuration section.

    $ PERL5LIB=../ perl 00sc_status.t

    This should produce something like:

    1..4
    ok 1 - Invalid username
    ok 2 - Invalid username
    ok 3 - login
    ok 4 - SC status
  • Don’t be dismayed at Invalid Username. That’s just one of the many tests that are run.

More Testing

Once you have opened up either the SIP OR SIP2 ports to be accessible from outside you can do some testing via telnet. In the following tests:

  • Replace $server with your server hostname (or localhost if you want to skip testing external access for now);
  • Replace $username, $password, and $instid with the corresponding values in the <accounts> section of your SIP configuration file;
  • Replace the $user_barcode and $user_password variables with the values for a valid user.
  • Replace the $item_barcode variable with the values for a valid item.
  1. Start by testing your ability to log into the SIP server:

    Note

    We are using 6001 here which is associated with SIP2 as per our configuration.

    $ telnet $server 6001
    Connected to $server.
    Escape character is '^]'.
    9300CN$username|CO$password|CP$instid

    If successful, the SIP server returns a 941 result. A result of 940, however, indicates an unsuccessful login attempt. Check the <accounts> section of your SIP configuration and try again.

  2. Once you have logged in successfully, replace the variables in the following line and paste it into the telnet session:

    2300120080623    172148AO$instid|AA$user_barcode|AC$password|AD$user_password

    If successful, the SIP server returns the patron information for $user_barcode, similar to the following:

    24  Y           00120100113    170738AEFirstName MiddleName LastName|AA$user_barcode|BLY|CQY
    |BHUSD|BV0.00|AFOK|AO$instid|

    The response declares it is a valid patron BLY with a valid password CQY and shows the user’s $name.

  3. To test the SIP server’s item information response, issue the following request:

    1700120080623    172148AO$instid|AB$item_barcode|AC$password

    If successful, the SIP server returns the item information for $item_barcode, similar to the following:

    1803020120160923    190132AB30007003601852|AJRégion de Kamouraska|CK001|AQOSUL|APOSUL|BHCAD
    |BV0.00|BGOSUL|CSCA2 PQ NR46 73R

    The response declares it is a valid item, with the title, owning library, permanent and current locations, and call number.