#
# FLEXlm rule file
# 

! Author: Walter E. Capers
! Modified on: May. 21 2003
! Release rule file: May. 21 2003

#
# Define how the fields are separated.
# For FLEXlm license files they are separated by spaces.
#
field_separators( )

#
# A block is a series of delimiters that groups a series
# of tokens as one.
#
token_block(")

#
# In a FLEXlm license file a single line can be continued
# over several records the '\' symbol denotes a line 
# continuation in FLEXlm
continuation_sym(\)

#
# This cluster defines a generic vendor string
# format
#
cluster( generic_vendor_string )

   sep(=)
   object( vendor_string_token )
       ignore_case
       keyword
       type(string)
       valid_value(VENDOR_STRING)
   eobject

   object( data )
       type(string)
   eobject

ecluster

# 
# This cluster defines user_based
#
cluster( user_based )

      sep(=)
      object( user_based_token )
       ignore_case
       keyword
       type(string)
       valid_value(USER_BASED)
      eobject

      object( data )
       option
       type(integer)
      eobject

ecluster

#
# This cluster defines host_based
#
cluster( host_based )

      sep(=)
      object( host_based_token )
       ignore_case
       keyword
       type(string)
       valid_value(HOST_BASED)
      eobject

      object( data )
       option
       type(integer)
      eobject

ecluster

#
#
# This cluster defines a vendor string of type
# VENDOR_STRING=9999999;999;TRIAL|PERM|LEASE;optional_data
cluster( vendor_string )

   sep(=; )

   object( vendor_string_token )
       ignore_case
       type(string)
       keyword
       valid_value(VENDOR_STRING)
   eobject
   
   object( vendor_string_field1 )
       type( integer )
   eobject

   object( vendor_string_field2 )
       type( integer )
   eobject

   object( vendor_string_license_opt )
       type( string )
       valid_values(TRIAL,PERM,LEASE)
   eobject

   object( additional_info )
       option
       type(string)
   eobject

ecluster


#
# This cluster defines the license checksum.
# The field resembles the following: ch=9999.
cluster( checksum )

     sep(= )

     object( ck_token )
        type( string )
        keyword
        valid_value(ck)
     eobject

     object( ck_value )
        type( integer )
     eobject

ecluster

#
# in FLEX a year of 0000 means a perminant non-expirering license
#
cluster( date_no_expire )
   sep(-)

   object( day )
      type( integer )
      valid_range(1,31)
   eobject

   object( month )
      type( string )
      ignore_case
      valid_values(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec)
   eobject

   object( year )
      type( integer )
      valid_value(0000)
   eobject

ecluster

#
# This is the FLEXlm expiration field.
# dd-mmm-yyyy where mmm is a character string
# symbolizing the month.
cluster( date )

   sep(-)

   object( day )
      type( integer )
      valid_range(1,31)
      err_message(Day parameter is out of range, 1->31)
   eobject

   object( month )
      type( string )
      ignore_case
      valid_values(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec)
   eobject

   object( year )
      type( integer )
      valid_if_greater_than(2000)
   eobject

ecluster


#
# used in the VENDOR/DAEMON definition
# [[options=]option_file_path
#
cluster(option_file_path)
  
  sep(=)
  
  object(options_token)
    type( string )
    keyword
    ignore_case
    valid_value(options)
  eobject

  object(option_file_path)
    type(string)
    isfile
  eobject

ecluster


#
# used in the VENDOR/DAEMON rules
# [[port=]port]
#

cluster(port)
  sep(=)
  
  object(port_token)
     type(string)
     ignore_case
     keyword
     valid_values(port,tcp)
  eobject

  object(port_value)
     type(integer)
     valid_if_greater_than(1024)
  eobject

ecluster


#
# ip address ###.###.###.###
#
cluster(ip_addr)
   sep(.)
   error_on(75)

   object(ipaddr_field1)
     type(integer)
   eobject

   object(ipaddr_field2)
      type(integer)
   eobject

   object(ipaddr_field3)
      type(integer)
   eobject

   object(ipaddr_field4)
      type(integer)
   eobject

ecluster


#
# [DUP_GROUP=NONE|SITE|[UHDV]]
#
cluster(dup_group)
  
  sep(=)

  object(dup_group_token)
     type(string)
     valid_value(DUP_GROUP)
     keyword
  eobject

  object(dup_group_value)
     type(string)
! you may need to define more combinations of UHDV
     valid_values(NONE,SITE,UHDV,DUP_USER,DUP_HOST,DUP_DISPLAY,UHDV,UHD,UH,U,HDV,HD,HDV,UDV,UD,DV,D)
  eobject
ecluster

#
# [SUITE_DUP_GROUP=NONE|SITE|[UHDV]]
#
cluster(suite_dup_group)

  sep(=)

  object(suite_dup_group)
     type(string)
     valid_value(SUITE_DUP_GROUP)
  eobject

  object(suite_dup_group_value)
     type(string)
! you may need to define more combinations of UHDV
     valid_values(NONE,SITE,UHDV,DUP_USER,DUP_HOST,DUP_DISPLAY,UHDV,UHD,UH,U,HDV,HD,HDV,UDV,UD,DV)
  eobject

ecluster

cluster(platform)
  
   sep(=)

   object(platform_token)
      type(string)
      valid_value(PLATFORMS)
   eobject
   object(platform_value)
      type(string)
   eobject

ecluster

#SPX:1234@000000000001#BOFSCC06

cluster(spx)
   sep(:@#)

   object(spx_token)
      type(string)
      valid_value(SPX)
      keyword
   eobject

   object(spx_field1)
      type( integer )
   eobject

   object(spx_field2)
      type( integer )
   eobject

   object(spx_field3)
      type( string )
   eobject

ecluster

cluster(tcp)

   sep(:)
   
   object(tcp_token)
      type(string)
      valid_value(TCP)
      keyword
   eobject
   
   object(port_value)
      type(integer)
      valid_if_greater_than(1024)
   eobject

ecluster

cluster(components)

   sep(=)

   object(component_token)
      type( string )
      valid_value(COMPONENTS)
   eobject

   object(component_values)
      type(string)
   eobject
ecluster

cluster(options)
   sep(=)

   object(options_token)
     type(string)
     valid_value(OPTIONS)
     keyword
   eobject

   object(suite)
     type(string)
     valid_value(SUITE)
   eobject
ecluster

cluster(sign)
  sep(=)

  object(sign_token)
     type(string)
     keyword
     valid_value(SIGN)
  eobject

  object(sign_value)
     type(integer)
  eobject
ecluster

cluster(issued)
  sep(=)

  object(issued_token)
    type(string)
    keyword
    valid_value(ISSUED)
  eobject

  object(issued_value)
    type(string)
  eobject
ecluster

cluster(hostid)
  sep(=)

  object(hostid_token)
     type(string)
     keyword
     ignore_case
     valid_value(HOSTID)
  eobject

  object(hostid_value)
     type(string)
  eobject

ecluster
###################################################### 
#                   PACKAGE                          #
######################################################

#PACKAGE package vendor pkg_version COMPONENTS="pkg_list" [OPTIONS=SUITE] SIGN=pkg_sign

rule(PACKAGE)
 
  case(1)
  instances(many)
  duplication( false )

  object(package)
     type(string)
  eobject

  object(vendor)
     type(string)
     valid_value(compuware)
     err_message(vendor name spelled incorrectly, should be compuware)
  eobject

  object(pkg_version)
     type(float)
     err_message(version must be a floating point value)
  eobject

  object(sign)
     type(string)
  eobject

  object(components)
     type($components)
  eobject

  object(options)
     option
     type($options)
  eobject


erule

###################################################### 
#                SERVER LINES                        #
######################################################

#SERVER host hostid [port]

!
!-case 1:
!      SERVER ###.###.###.### hostid [port]
!
rule(SERVER)
  severity(fatal)
  case(1)
  instances(3)
  duplication( false )
  
  object(hostname)
     type($ip_addr)
     err_message(invalid hostname, should be a numeric dot notation,###.###.###.###)
     err_message(or alpha-numeric string)
  eobject

  object(hostid)
     type(string)
  eobject
  
  object(port)
     option
     type(integer)
     valid_if_greater_than(1024)
     err_message(invalid port definition)
     err_message(  should be one of the following formats:)
     err_message(  NOVEL)
     err_message(     SPX:9999@999999999999#HHHHHHHH where 9 is a numeric digit)
     err_message(     and H is a hex digit)
     err_message(  TCPIP)
     err_message(     TCP:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)
  eobject

erule 


!
!-case 2:
!      SERVER hostname hostid [port]
!
rule(SERVER)
  severity(fatal)
  case(2)
  instances(3)
  duplication( false )
  
  object(hostname)
     type(string)
     err_message(invalid hostname, should be a numeric dot notation,###.###.###.###)
     err_message(or alpha-numeric string)
  eobject

  object(hostid)
     type(string)
  eobject
  
  object(port)
     option
     type(integer)
     valid_if_greater_than(1024)
     err_message(invalid port definition)
     err_message(  should be one of the following formats:)
     err_message(  NOVEL)
     err_message(     SPX:9999@999999999999#HHHHHHHH where 9 is a numeric digit)
     err_message(     and H is a hex digit)
     err_message(  TCPIP)
     err_message(     TCP:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)
  eobject

erule 

!
!- case 3:
!       SERVER hostname hostid [TCP:port]
!
rule(SERVER)
  severity(fatal)
  case(3)
  instances(3)
  duplication( false )
  
  object(hostname)
     type(string)
  eobject

  object(hostid)
     type(string)
     err_message(invalid hostname, should be a numeric dot notation,###.###.###.###)
     err_message(or alpha-numeric string)
  eobject
  
  object(port)
     option
     type($tcp)
     err_message(invalid port definition)
     err_message(  should be one of the following formats:)
     err_message(  NOVEL)
     err_message(     SPX:9999@999999999999#HHHHHHHH where 9 is a numeric digit)
     err_message(     and H is a hex digit)
     err_message(  TCPIP)
     err_message(     TCP:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)

  eobject

erule 

!
!- case 4:
!      SERVER ###.###.###.### hostid [TCP:port]
!
rule(SERVER)
  severity(fatal)
  case(4)
  instances(3)
  duplication( false )
  
  object(hostname)
     type($ip_addr)
     err_message(invalid hostname, should be a numeric dot notation,###.###.###.###)
     err_message(or alpha-numeric string)
  eobject

  object(hostid)
     type(string)
  eobject
  
  object(port)
     option
     type($tcp)
     err_message(invalid port definition)
     err_message(  should be one of the following formats:)
     err_message(  NOVEL)
     err_message(     SPX:9999@999999999999#HHHHHHHH where 9 is a numeric digit)
     err_message(     and H is a hex digit)
     err_message(  TCPIP)
     err_message(     TCP:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)

  eobject

erule 

!
!- case 5:
!
!     SERVER hostname hostid SPX:1234@000000000001#BOFSCC06
!
rule(SERVER)
  severity(fatal)
  case(5)
  instances(3)
  duplication( false )
  
  object(hostname)
     type(string)
  eobject

  object(hostid)
     type(string)
     err_message(invalid hostname, should be a numeric dot notation,###.###.###.###)
     err_message(or alpha-numeric string)
  eobject
  
  object(port)
     option
     type($spx)
     err_message(invalid port definition)
     err_message(  should be one of the following formats:)
     err_message(  NOVEL)
     err_message(     SPX:9999@999999999999#HHHHHHHH where 9 is a numeric digit)
     err_message(     and H is a hex digit)
     err_message(  TCPIP)
     err_message(     TCP:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)

  eobject

erule 


###################################################### 
#                VENDOR | DAEMON RULES               #
######################################################

# VENDOR compuwar vendor_daemon_path [[options=]option_file_path] [[port=]port]

!-case 1:
!        VENDOR compuwar vendor_daemon_path [options=option_file_path] [port=port]
!
rule(VENDOR)
 
 case(1)
 instances(3)
 duplication(false)

 object(vendor_daemon)
     type(string)
     valid_value(compuware)
     err_message(incorrect spelling of vendor name, should be compuware)
 eobject

 object(vendor_daemon_path)
     type(string)
     has_string(!compuware)
     err_message(incorrect spelling of vendor daemon, should be compuwar.exe)
 eobject

 object(option_file_path)
     option
     type($option_file_path)
     err_message(invalid definition for options file)
     err_message(format should be options=option_file_name)
 eobject

 object(port)
     option
     type($port)
     err_message(invalid port definition)
     err_message(  should be one of the following format)
     err_message(     PORT:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)
 eobject

erule

!
!-case 2:
!        VENDOR compuwar vendor_daemon_path option_file_path port
!
rule(VENDOR)
 case(2)
 instances(3)
 duplication(false)

 object(vendor_daemon)
     type(string)
     valid_value(compuware)
     err_message(incorrect spelling of vendor name, should be compuware)
 eobject

 object(vendor_daemon_path)
     type(string)
     has_string(!compuware)
     err_message(incorrect spelling of vendor daemon, should be compuwar.exe)
 eobject

 object(option_file_path)
     option
     isFile
     type(string)
     err_message(invalid definition for options file)
     err_message(format should be options=option_file_name)
 eobject

 object(port)
     option
     type(integer)
     err_message(invalid port definition)
     err_message(  should be one of the following format)
     err_message(     PORT:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)

 eobject
erule

!
!-case 3:
!         VENDOR compuwar vendor_daemon_path [options=option_file_path] port
!
rule(VENDOR)
 
 case(3)
 instances(3)
 duplication(false)

 object(vendor_daemon)
     type(string)
     valid_value(compuware)
     err_message(incorrect spelling of vendor name, should be compuware)
 eobject

 object(vendor_daemon_path)
     type(string)
     has_string(!compuware)
     err_message(incorrect spelling of vendor daemon, should be compuwar.exe)
 eobject

 object(option_file_path)
     option
     type($option_file_path)
     err_message(invalid definition for options file)
     err_message(format should be options=option_file_name)
 eobject

 object(port)
     option
     type(integer)
     err_message(invalid port definition)
     err_message(  should be one of the following format)
     err_message(     PORT:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)

 eobject

erule

!
!-case 4:
!        VENDOR compuwar vendor_daemon_path option_file_path [port=port]
!
rule(VENDOR)
 
 case(4)
 instances(3)
 duplication(false)

 object(vendor_daemon)
     type(string)
     valid_value(compuware)
     err_message(incorrect spelling of vendor name, should be compuware)
 eobject

 object(vendor_daemon_path)
     type(string)
     has_string(!compuware)
     err_message(incorrect spelling of vendor daemon, should be compuwar.exe)
 eobject

 object(option_file_path)
     option
     isFile
     type(string)
     err_message(invalid definition for options file)
     err_message(format should be options=option_file_name)
 eobject

 object(port)
     option
     type($port)
     err_message(invalid port definition)
     err_message(  should be one of the following format)
     err_message(     PORT:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)

 eobject

erule

# DAEMON compuwar vendor_daemon_path [[options=]option_file_path] [[port=]port]

!-case 1:
!        DAEMON compuwar vendor_daemon_path [options=option_file_path] [port=port]
!
rule(DAEMON)
 
 case(1)
 instances(3)
 duplication(false)

 object(vendor_daemon)
     type(string)
     valid_value(compuware)
     err_message(incorrect spelling of vendor name, should be compuware)
 eobject

 object(vendor_daemon_path)
     type(string)
     has_string(!compuware)
     err_message(incorrect spelling of vendor daemon, should be compuwar.exe)
 eobject

 object(option_file_path)
     option
     type($option_file_path)
     err_message(invalid definition for options file)
     err_message(format should be options=option_file_name)
     err_message(make sure file exists)
 eobject

 object(port)
     option
     type($port)
     err_message(invalid port definition)
     err_message(  should be one of the following formats:)
     err_message(  NOVEL)
     err_message(     SPX:9999@999999999999#HHHHHHHH where 9 is a numeric digit)
     err_message(     and H is a hex digit)
     err_message(  TCPIP)
     err_message(     TCP:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)
 eobject

erule

!
!-case 2:
!        DAEMON compuwar vendor_daemon_path option_file_path port
!
rule(DAEMON)
 case(2)
 instances(3)
 duplication(false)

 object(vendor_daemon)
     type(string)
     valid_value(compuware)
     err_message(incorrect spelling of vendor name, should be compuware)
 eobject

 object(vendor_daemon_path)
     type(string)
     has_string(!compuware)
     err_message(incorrect spelling of vendor daemon, should be compuwar.exe)
 eobject

 object(option_file_path)
     option
     isFile
     type(string)
     err_message(invalid definition for options file)
     err_message(format should be options=option_file_name)
     err_message(make sure file exists)
 eobject

 object(port)
     option
     type(integer)
     err_message(invalid port definition)
     err_message(  should be one of the following formats:)
     err_message(  NOVEL)
     err_message(     SPX:9999@999999999999#HHHHHHHH where 9 is a numeric digit)
     err_message(     and H is a hex digit)
     err_message(  TCPIP)
     err_message(     TCP:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)
 eobject
erule

!
!-case 3:
!         DAEMON compuwar vendor_daemon_path [options=option_file_path] port
!
rule(DAEMON)
 
 case(3)
 instances(3)
 duplication(false)

 object(vendor_daemon)
     type(string)
     valid_value(compuware)
     err_message(incorrect spelling of vendor name, should be compuware)
 eobject

 object(vendor_daemon_path)
     type(string)
     has_string(!compuware)
     err_message(incorrect spelling of vendor daemon, should be compuwar.exe)
 eobject

 object(option_file_path)
     option
     type($option_file_path)
     err_message(invalid definition for options file)
     err_message(format should be options=option_file_name)
     err_message(make sure file exists)
 eobject

 object(port)
     option
     type(integer)
     err_message(invalid port definition)
     err_message(  should be one of the following formats:)
     err_message(  NOVEL)
     err_message(     SPX:9999@999999999999#HHHHHHHH where 9 is a numeric digit)
     err_message(     and H is a hex digit)
     err_message(  TCPIP)
     err_message(     TCP:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)
 eobject

erule

!
!-case 4:
!        DAEMON compuwar vendor_daemon_path option_file_path [port=port]
!
rule(DAEMON)
 
 case(4)
 instances(3)
 duplication(false)

 object(vendor_daemon)
     type(string)
     valid_value(compuware)
     err_message(incorrect spelling of vendor name, should be compuware)
 eobject

 object(vendor_daemon_path)
     type(string)
     has_string(!compuware)
     err_message(incorrect spelling of vendor name, should be compuwar.exe)
 eobject

 object(option_file_path)
     option
     isFile
     type(string)
     err_message(invalid definition for options file)
     err_message(format should be options=option_file_name)
     err_message(make sure file exists)
 eobject

 object(port)
     option
     type($port)
     err_message(invalid port definition)
     err_message(  should be one of the following formats:)
     err_message(  NOVEL)
     err_message(     SPX:9999@999999999999#HHHHHHHH where 9 is a numeric digit)
     err_message(     and H is a hex digit)
     err_message(  TCPIP)
     err_message(     TCP:9999 where 9 is a numeric digit)
     err_message(     NOTE: the port number must be greater than 1024)
 eobject

erule


###################################################### 
#             FEATURE|INCREMENT RULES                #
######################################################

# A perminant feature
# FEATURE feature daemon feat_version exp_date num_lic key vendor_str
#         [HOSTID=feat_hostid] [ch=####] [DUP_GROUP=NONE|SITE|[UHDV]]
rule( FEATURE )

  case( 1 )
  instances( many )
  duplication( false )
  
  object(feature)
    type( string )
  eobject

  object(daemon)
    type( string )
    valid_value(compuware)
    err_message(incorrect spelling of vendor name, should be compuware)
  eobject

  object(feat_version)
    type( float )
    err_message(the feature version must be a floating point number)
  eobject

  object(exp_date)
    type( $date_no_expire )
    err_message(invalid expiration date specification)
  eobject

  object(num_lic)
    type( integer )
    err_message(the number of licenses must be a numeric value)
  eobject

  object( key )
    type( string )
  eobject

  object(vendor_str)
     type( $generic_vendor_string )
  eobject

  object( hostid )
     optional
     type($hostid)
  eobject

  object( issued )
     optional
     type($issued)
  eobject

  object( user_based )
     optional
     type( $user_based )
  eobject

  object( host_based )
     optional
     type( $host_based )
  eobject

  object( checksum )
     option
     type( $checksum )
     err_message(invalid check sum description should be chk=999 where 9 is a numerical digit)
  eobject

  object( platform )
     option
     type( $platform )
  eobject 

  object( dup_group )
     option
     type( $dup_group )
  eobject

  object( suite_dup_group )
     option
     type($suite_dup_group)
  eobject
erule

# FEATURE feature daemon feat_version exp_date num_lic key vendor_str
#         [HOSTID=feat_hostid] [ch=####] [DUP_GROUP=NONE|SITE|[UHDV]]
rule( FEATURE )

  case( 1 )
  instances( many )
  duplication( false )
  
  object(feature)
    type( string )
  eobject

  object(daemon)
    type( string )
    valid_value(compuware)
    err_message(incorrect spelling of vendor name, should be compuware)
  eobject

  object(feat_version)
    type( float )
    err_message(invalid feature version, version must be a floating point number)
  eobject

  object(exp_date)
    type( $date )
    err_message(invalid expiration date, check year)
  eobject

  object(num_lic)
    type( integer )
    err_message(the number of licenses must be a numeric integer value)
  eobject

  object( key )
    type( string )
  eobject

  object(vendor_str)
     type( $generic_vendor_string )
  eobject

  object( hostid )
     optional
     type( $hostid )
  eobject

  object( issued )
     optional
     type($issued)
  eobject

  object( user_based )
     optional
     type( $user_based )
  eobject

  object( host_based )
     optional
     type( $host_based )
  eobject

  object( checksum )
     option
     type( $checksum )
  eobject

  object( platform )
     option
     type( $platform )
  eobject 

  object( dup_group )
     option
     type( $dup_group )
  eobject

  object( suite_dup_group )
     option
     type($suite_dup_group)
  eobject
erule

# INCREMENT feature daemon feat_version exp_date num_lic key vendor_str
#         [HOSTID=feat_hostid] [ch=####] [DUP_GROUP=NONE|SITE|[UHDV]]
rule( INCREMENT )

  case( 1 )
  instances( many )
  duplication( false )
  
  object(feature)
    type( string )
  eobject

  object(daemon)
    type( string )
    valid_value(compuware)
    err_message(incorrect spelling of vendor name, should be compuware)
  eobject

  object(feat_version)
    type( float )
    err_message(invalid version number, the version number must be a floating point number)
  eobject

  object(exp_date)
    type( $date )
    err_message(invalid expiration date, check year)
  eobject

  object(num_lic)
    type( integer )
    err_message(the number of licenses must be a numeric integer value)
  eobject

  object( key )
    type( string )
  eobject

  object(vendor_str)
     type( $generic_vendor_string  )
  eobject

  object( hostid )
     optional
     type( $hostid )
  eobject

  object( issued )
     optional
     type($issued)
  eobject

  object( checksum )
     option
     type( $checksum )
     err_message(checksum format is invalid, should be chk=999 where 9 is a digit)
  eobject

  object( platform )
     option
     type( $platform )
  eobject 

  object( dup_group )
     option
     type( $dup_group )
  eobject
erule

###################################################### 
#                  UPGRADE RULES                     #
######################################################

# UPGRADE feature daemon feat_version_from feat_version_to exp_date num_lic key vendor_str
#         [HOSTID=feat_hostid] [ch=####] [DUP_GROUP=NONE|SITE|[UHDV]]
rule( UPGRADE )

  case( 1 )
  instances( many )
  duplication( false )
  
  object(feature)
    type( string )
  eobject

  object(daemon)
    type( string )
    valid_value(compuware)
    err_message(incorrect spelling of vendor name, should be compuware)
  eobject

  object(feat_version_from)
    type( float )
  eobject

  object(feat_version_to)
    type( float )
  eobject

  object(exp_date)
    type( $date )
  eobject

  object(num_lic)
    type( integer )
  eobject

  object( key )
    type( string )
  eobject

  object(vendor_str)
     type( $generic_vendor_string  )
  eobject

  object( hostid )
     type( $hostid )
  eobject

  object( checksum )
     option
     type( $checksum )
  eobject

  object( platform )
     option
     type( $platform )
  eobject 

  object( dup_group )
     option
     type( $dup_group )
  eobject
erule

