Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


The information on this page refers to License Statistics
4
v6.
9
5 or newer, which
changed the method of adding custom license servers to License Statistics
introduced Reservation reports. If you are
running
using an
older
earlier version of License Statistics,
see
please refer to the documentation for
previous versions
releases prior to v6.5.

If you use a different license server than one of those currently supported by License Statistics (see Supported license servers), you can customize License Statistics to run with your specific license server. To run License Statistics with your license server, your parser must write an UTF-8 encoded XML file that License Statistics can read and understand. In this way, virtually any licensing system can communicate with the License Statistics ' graphing engine. 

See Adding and editing license servers for information about adding a custom license server to License Statistics.

License Statistics will read your XML file at each update interval. You should generate the XML files on a regular, scheduled basis. You can schedule the XML file generation using Windows scheduler for Windows or crontab for UnixLinux. Note that the custom parser is a realtime parser that contains the current state of the license server. When regenerating the XML, replace (do not append to) the previous XML file.

The specifications for the XML file are as follows: 

  • CUSTOM_STAT, VENDOR, FEATURE and CHECKOUT_TIME specifications are required. 
  • The VENDOR name must start with "custom_". 
  • USED_LICENSES reports the total of number of licenses currently in use (including borrowed licenses). 
  • All dates and times must be in the following format: YYYY-MM-DD [HH:MM]. 
  • EXPIRES accepts only a date. 
  • CHECKOUT_TIME and BORROW_EXPIRE_TIME require both a date and time. 
  • BORROW_EXPIRE_TIME is required only if licenses are borrowed.
  • USERNAME can be omitted if your licensing system does not deliver user names. 
  • SHARE is for informational purposes, to specify which type of license sharing is in use.

...

  • STAT – required
    - VENDOR – required
  • USAGE – the usage of a single feature
    - FEATURE – required; the name of the feature
    - VERSION – the version of the feature
    - USED_LICENSES – the sum of licenses used by users (including borrowed licenses, but excluding reserved licenses)
    - DENIED_LICENSES – the sum of denied licenses
    - BORROWED_LICENSES – the sum of licenses borrowed by users
    - RESERVED_LICENSES – the sum of remaining reservations
    - TOTAL_LICENSES – "UNLIMITED" or numeric value of licenses in the feature
    - SHARE – the type of license sharing in use
    - EXPIRES – "PERMANENT", or an empty string, or the date on which the feature is set to expire, in "YYYY-MM-dd" format

  • USER – the usage of the feature for a single user
    - USERNAME
    - HOSTNAME
    - IP – the user's IP address
    - USED_LICENSES – the number of licenses used by the user
    - DENIED_LICENSES – the number of licenses the user was denied
    - BORROW_EXPIRE_TIME – if the used licenses are borrowed, the date when the borrow is due to expire, in "YYYY-MM-DD HH:mm" format
    - CHECKOUT_TIME – required; the date on which the user checked out the licenses, in "YYYY-MM-DD HH:mm" format

  • RESERVATION - reservation for the feature
    - TYPE - reservation type, one of:  UNKNOWN, DYNAMIC, USER, USERGROUP, HOST, HOSTGROUP, IP, PROJECT, DISPLAY. Defaults to UNKNOWN
    - PATTERN - pattern describing reservation, f.e user name, ip address etc. May include wildcards. Required for type other than UNKNOWN. Defaults to '*' for Unknown
    - TOTAL - total number of reservations
    - REMAINING - required; number of unused reservations
    - SINCE - indicates the beginning of reservation period; in "YYYY-MM-DD HH:mm" format
    - EXPIRES_AT - indicates the end of reservation period; in "YYYY-MM-DD HH:mm" format

Important:

  1. USED_LICENSES and DENIED_LICENSES have to be located in separate USER entries.
  2. All dates and times must be in the format specified for the variable in the list above.
  3. Only one VENDOR name can be used.

An example of the content for a custom parser XML file is given below. 

Code Block
languagexml
<CUSTOM_STAT VENDOR="custom_testdev">

...


  <USAGE FEATURE="App1" VERSION="12.3" USED_LICENSES="2" TOTAL_LICENSES="100" BORROWED_LICENSES="1" RESERVED_LICENSES="10" SHARE="TEST" EXPIRES="

...

2020-11-20">

...


    <USER USERNAME="user1" HOSTNAME="host1" IP="127.0.0.1" USED_LICENSES="1" CHECKOUT_TIME="

...

2020-05-07 08:41"/>

...


    <USER USERNAME="user2" HOSTNAME="host2" IP="127.0.0.1" USED_LICENSES="1" BORROW_EXPIRE_TIME="2012-05-07 08:43" CHECKOUT_TIME="2012-05-07 08:41"/>
	<RESERVATION REMAINING="10"/>

...


  </USAGE>

...


  <USAGE FEATURE="App2" VERSION="1.0" USED_LICENSES="

...

1" DENIED_LICENSES="1" TOTAL_LICENSES="UNLIMITED" RESERVED_LICENSES="

...

4" EXPIRES="permanent">
    <USER USERNAME="user1" HOSTNAME="host1" IP="127.0.0.1" USED_LICENSES="1" CHECKOUT_TIME="2012-05-07 08:41"/>

...


    <USER USERNAME="

...

user1" HOSTNAME="

...

host1" IP="127.0.0.1" DENIED_LICENSES="1" CHECKOUT_TIME="2012-05-07

...

 08:41"/>
	<RESERVATION TYPE="USER" PATTERN="user1" TOTAL="5" REMAINING="4"/>
    <RESERVATION TYPE="HOST" PATTERN="host1" TOTAL="1" REMAINING="0" EXPIRES_AT="2012-01-01 00:00" />
    <RESERVATION TYPE="IP" PATTERN="127.0.*.*" TOTAL="1" REMAINING="0" SINCE="2012-01-01 00:00" EXPIRES_AT="2013-01-01 00:00" />
  </USAGE>
</CUSTOM_STAT>

It is important to understand that you validate all XML structure against the following XSD schema:

Code Block
languagexml
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="xfDate">
        <xs:restriction base="xs:string">
            <xs:pattern value="\d{4}-\d{2}-\d{2}"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="xfDateTime">
        <xs:restriction base="xs:string">
            <xs:pattern value="\d{4}-\d{2}-\d{2} \d{2}:\d{2}"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="CUSTOM_STAT">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="USAGE" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:sequence>
                                <xs:element name="USER" minOccurs="0" maxOccurs="unbounded">
                                    <xs:complexType>
                                        <xs:simpleContent>
                                            <xs:extension base="xs:string">
                                                <xs:attribute type="xs:string" name="USERNAME"/>
                                                <xs:attribute type="xs:string" name="HOSTNAME"/>
                                                <xs:attribute type="xs:string" name="IP"/>
                                                <xs:attribute type="xfDateTime" name="CHECKOUT_TIME" use="required"/>
                                                <xs:attribute type="xfDateTime" name="BORROW_EXPIRE_TIME"/>
                                                <xs:attribute type="xs:nonNegativeInteger" name="USED_LICENSES"/>
                                                <xs:attribute type="xs:nonNegativeInteger" name="DENIED_LICENSES"/>
                                            </xs:extension>
                                        </xs:simpleContent>
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                            <xs:sequence>
                                <xs:element name="RESERVATION" minOccurs="0" maxOccurs="unbounded">
                                    <xs:complexType>
                                        <xs:simpleContent>
                                            <xs:extension base="xs:string">
                                                <xs:attribute type="xs:string" name="TYPE"/>
                                                <xs:attribute type="xs:string" name="PATTERN"/>
                                                <xs:attribute type="xs:nonNegativeInteger" name="TOTAL"/>
                                                <xs:attribute type="xs:nonNegativeInteger" name="REMAINING" use="required"/>
                                                <xs:attribute type="xfDateTime" name="SINCE"/>
                                                <xs:attribute type="xfDateTime" name="EXPIRES_AT"/>
                                            </xs:extension>
                                        </xs:simpleContent>
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:sequence>
                        <xs:attribute name="FEATURE" use="required">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                        <xs:attribute type="xs:float" name="VERSION"/>
                        <xs:attribute type="xs:nonNegativeInteger" name="USED_LICENSES"/>
                        <xs:attribute type="xs:nonNegativeInteger" name="DENIED_LICENSES"/>
                        <xs:attribute type="xs:nonNegativeInteger" name="RESERVED_LICENSES"/>
                        <xs:attribute type="xs:nonNegativeInteger" name="BORROWED_LICENSES"/>
                        <xs:attribute type="xs:string" name="TOTAL_LICENSES"/>
                        <xs:attribute type="xs:string" name="SHARE"/>
                        <xs:attribute name="EXPIRES">
                            <xs:simpleType>
                                <xs:union memberTypes="xfDate">
                                    <xs:simpleType>
                                        <xs:restriction base="xs:string">
                                            <xs:enumeration value="permanent"/>
                                            <xs:enumeration value=""/>
                                        </xs:restriction>
                                    </xs:simpleType>
                                </xs:union>
                            </xs:simpleType>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="VENDOR" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
</xs:schema>

...