OsmoHLR> ?
  show        Show running system information
  list        Print command list
  exit        Exit current mode and down to previous mode
  help        Description of the interactive help system
  enable      Turn on privileged mode command
  terminal    Set terminal line parameters
  who         Display who is on vty
  logging     Configure logging
  no          Negate a command or set its defaults
  logp        Print a message on all log outputs; useful for placing markers in test logs
  subscriber  Subscriber management commands
OsmoHLR> list
  show version
  show online-help
  list
  exit
  help
  enable
  terminal length <0-512>
  terminal no length
  who
  show history
  logging enable
...
  show logging vty
  show alarms
  show talloc-context (application|all) (full|brief|DEPTH)
  show talloc-context (application|all) (full|brief|DEPTH) tree ADDRESS
  show talloc-context (application|all) (full|brief|DEPTH) filter REGEXP
  show stats
  show stats level (global|peer|subscriber)
  show asciidoc counters
  show rate-counters
  show gsup-connections
  subscriber (imsi|msisdn|id|imei) IDENT show
  show subscriber (imsi|msisdn|id|imei) IDENT

OsmoHLR> enable
OsmoHLR# ?
  help        Description of the interactive help system
  list        Print command list
  write       Write running configuration to memory, network, or terminal
  show        Show running system information
  exit        Exit current mode and down to previous mode
  disable     Turn off privileged mode command
  configure   Configuration from vty interface
  copy        Copy configuration
  terminal    Set terminal line parameters
  who         Display who is on vty
  logging     Configure logging
  no          Negate a command or set its defaults
  logp        Print a message on all log outputs; useful for placing markers in test logs
  subscriber  Subscriber management commands
OsmoHLR# list
  help
...
  exit
  disable
  configure terminal
  copy running-config startup-config
  show startup-config
  show version
  show online-help
  terminal length <0-512>
  terminal no length
  who
  show history
  terminal monitor
  terminal no monitor
  logging enable
...

OsmoHLR# configure terminal
OsmoHLR(config)# ?
...
  banner    Set banner string
  service   Set up miscellaneous service
  line      Configure a terminal line
  ctrl      Configure the Control Interface
  log       Configure logging sub-system
  stats     Configure stats sub-system
  hlr       Configure the HLR
OsmoHLR(config)# list
  help
...
  exit
  end
...
  hlr

OsmoHLR(config)# hlr
OsmoHLR(config-hlr)# ?
...
  euse                         Configure a particular External USSD Entity
  no                           Negate a command or set its defaults
  ussd                         USSD Configuration
  ncss-guard-timeout           Set guard timer for NCSS (call independent SS) session activity
  store-imei                   Save the IMEI in the database when receiving Check IMEI requests. Note that an MSC does not necessarily send Check IMEI requests (for OsmoMSC, you may want to set 'check-imei-rqd 1').
  subscriber-create-on-demand  Make a new record when a subscriber is first seen.
OsmoHLR(config-hlr)# list
  help
...
  exit
  end
  gsup
  database PATH
  euse NAME
  no euse NAME
  ussd route prefix PREFIX internal (own-msisdn|own-imsi)
  ussd route prefix PREFIX external EUSE
  no ussd route prefix PREFIX
  ussd default-route external EUSE
  no ussd default-route
  ncss-guard-timeout <0-255>
  store-imei
  no store-imei
  subscriber-create-on-demand (no-msisdn|<3-15>) (none|cs|ps|cs+ps)
  no subscriber-create-on-demand

OsmoHLR(config-hlr)# gsup
OsmoHLR(config-hlr-gsup)# ?
...
  bind   Listen/Bind related socket option
OsmoHLR(config-hlr-gsup)# list
...
  bind ip A.B.C.D

OsmoHLR(config-hlr-gsup)# exit
OsmoHLR(config-hlr)# exit
OsmoHLR(config)# exit
OsmoHLR# configure terminal
OsmoHLR(config)# hlr
OsmoHLR(config-hlr)# store-imei
OsmoHLR(config-hlr)# gsup
OsmoHLR(config-hlr-gsup)# end
OsmoHLR# disable
OsmoHLR> enable

OsmoHLR# show running-config

Current configuration:
!
!
log stderr
...
 logging level main notice
 logging level db notice
 logging level auc notice
 logging level ss info
...
hlr
 store-imei
 database hlr_vty_test.db
 gsup
  bind ip 127.0.0.1
 ussd route prefix *#100# internal own-msisdn
 ussd route prefix *#101# internal own-imsi
end
