[buildout] parts = directory ltelogs gnb-config enb-service xamari-xlog-service {% if slapparameter_dict.get('xlog_fluentbit_forward_host') %} xlog-fluentbit-service {% endif %} amarisoft-stats-service amarisoft-rf-info-service check-sdr-busy.py check-baseband-latency.py check-amarisoft-stats-log.py check-rx-saturated.py monitor-base publish-connection-information extends = {{ monitor_template }} eggs-directory = {{ eggs_directory }} develop-eggs-directory = {{ develop_eggs_directory }} offline = true [monitor-httpd-conf-parameter] httpd-include-file = {{ buildout_directory }}/etc/httpd-include-file.conf port = ${monitor-instance-parameter:monitor-httpd-port} url = https://[${monitor-instance-parameter:monitor-httpd-ipv6}]:${:port} [monitor-instance-parameter] monitor-httpd-port = ${monitor-address:port} [monitor-address] recipe = slapos.cookbook:free_port minimum = 8035 maximum = 8055 ip = ${monitor-instance-parameter:monitor-httpd-ipv6} [slap-configuration] recipe = slapos.cookbook:slapconfiguration.serialised computer = {{ slap_connection['computer-id'] }} partition = {{ slap_connection['partition-id'] }} url = {{ slap_connection['server-url'] }} key = {{ slap_connection['key-file'] }} cert = {{ slap_connection['cert-file'] }} configuration.com_ws_port = 9001 configuration.com_addr = 127.0.1.2 configuration.amf_addr = 127.0.1.100 configuration.gtp_addr = 127.0.1.1 configuration.default_nr_bandwidth = {{ default_nr_bandwidth }} configuration.default_nr_inactivity_timer = {{ default_nr_inactivity_timer }} configuration.default_nr_ssb_pos_bitmap = {{ default_nr_ssb_pos_bitmap }} configuration.default_n_antenna_dl = {{ default_n_antenna_dl }} configuration.default_n_antenna_ul = {{ default_n_antenna_ul }} [directory] recipe = slapos.cookbook:mkdirectory software = {{ buildout_directory }} home = ${buildout:directory} etc = ${:home}/etc var = ${:home}/var etc = ${:home}/etc bin = ${:home}/bin tmp = ${:home}/tmp run = ${:var}/run script = ${:etc}/run service = ${:etc}/service promise = ${:etc}/promise log = ${:var}/log [ltelogs] recipe = slapos.recipe.template:jinja2 url = {{ ltelogs_template }} output = ${directory:home}/ltelogs.sh extensions = jinja2.ext.do context = section directory directory {% if slapparameter_dict.get("gnb_config_link", None) %} [gnb-config-dl] recipe = slapos.recipe.build:download url = {{ slapparameter_dict.get("gnb_config_link") }} version = {{ slapparameter_dict.get("gnb_config_version") }} offline = false {% endif %} [enb-sh-wrapper] recipe = slapos.recipe.template output = ${directory:bin}/${:_buildout_section_name_} gnb-log = ${directory:log}/gnb-output.log inline = #!/bin/sh {% if not slapparameter_dict.get("testing", False) %} sudo -n /opt/amarisoft/rm-tmp-lte; sudo -n /opt/amarisoft/init-sdr; sudo -n /opt/amarisoft/init-enb; (echo && echo && date "+[%Y/%m/%d %T.%N %Z] Starting gNB software..." && echo) >> ${:gnb-log}; tail -c 1M ${:gnb-log} > ${:gnb-log}.tmp; mv ${:gnb-log}.tmp ${:gnb-log}; {{ enb }}/lteenb ${directory:etc}/gnb.cfg >> ${:gnb-log} 2>> ${:gnb-log}; {% endif %} ### eNodeB (enb) [enb-service] recipe = slapos.cookbook:wrapper init = ${ltelogs:output} ${directory:log}/enb.log; sleep 2 command-line = ${enb-sh-wrapper:output} wrapper-path = ${directory:service}/enb mode = 0775 reserve-cpu = True pidfile = ${directory:run}/enb.pid hash-files = ${gnb-config:output} ${enb-sh-wrapper:output} environment = LD_LIBRARY_PATH={{ openssl_location }}/lib AMARISOFT_PATH=/opt/amarisoft/.amarisoft [xamari-xlog-script] recipe = slapos.recipe.template output = ${directory:bin}/${:_buildout_section_name_} period = {{ slapparameter_dict.get("gnb_stats_fetch_period", 60) }} stats_logspec = stats[samples,rf]/${:period}s {%- if slapparameter_dict.get("gnb_drb_stats_enabled", True) %} drb_stats_logspec = x.drb_stats/${:period}s {%- else %} drb_stats_logspec = {%- endif %} rotatespec = 100MB.9 logspec = ${:stats_logspec} ${:drb_stats_logspec} logspec = ${:stats_logspec} ${:drb_stats_logspec} {% if slapparameter_dict.get("websocket_password", "") %} websock = ws://[${slap-configuration:ipv6-random}]:9001 {% else %} websock = ws://127.0.1.2:9001 {% endif %} xamari = {{ buildout_directory }}/bin/xamari logfile = ${monitor-directory:public}/gnb.xlog inline = #!/bin/sh exec ${:xamari} xlog --rotate ${:rotatespec} ${:websock} ${:logfile} ${:logspec} [xamari-xlog-service] recipe = slapos.cookbook:wrapper wrapper-path = ${directory:service}/${:_buildout_section_name_} command-line = ${xamari-xlog-script:output} hash-files = ${:command-line} {% if slapparameter_dict.get('xlog_fluentbit_forward_host') %} [xlog-fluentbit-config] recipe = slapos.recipe.template output = ${directory:etc}/${:_buildout_section_name_}.cfg logfile = ${xamari-xlog-script:logfile} forward-host = {{ slapparameter_dict.get('xlog_fluentbit_forward_host', '') }} forward-port = {{ slapparameter_dict.get('xlog_fluentbit_forward_port', '') }} forward-shared-key = {{ slapparameter_dict.get('xlog_fluentbit_forward_shared_key', '') }} forward-self-hostname = {{ ors_id['ors-id'] }} inline = [SERVICE] flush 5 [INPUT] name tail path ${:logfile} Read_from_Head True [OUTPUT] name forward match * Host ${:forward-host} {%- if slapparameter_dict.get('xlog_fluentbit_forward_port') %} Port ${:forward-port} {%- endif %} Shared_Key ${:forward-shared-key} Self_Hostname ${:forward-self-hostname} tls on tls.verify off [xlog-fluentbit-service] recipe = slapos.cookbook:wrapper fluentbit = {{ fluent_bit_location }}/bin/fluent-bit fluentbit-config = ${xlog-fluentbit-config:output} command-line = ${:fluentbit} -c ${:fluentbit-config} wrapper-path = ${directory:service}/${:_buildout_section_name_} hash-files = ${:fluentbit-config} {% endif %} [amarisoft-stats-template] recipe = slapos.recipe.template:jinja2 extensions = jinja2.ext.do log-output = ${directory:var}/log/amarisoft-stats.json.log context = section directory directory key slapparameter_dict slap-configuration:configuration key log_file :log-output raw stats_period {{ slapparameter_dict.get("gnb_stats_fetch_period", 60) }} raw testing {{ slapparameter_dict.get("testing", False) }} raw python_path {{ buildout_directory}}/bin/pythonwitheggs mode = 0775 url = {{ amarisoft_stats_template }} output = ${directory:bin}/amarisoft-stats.py [amarisoft-rf-info-template] recipe = slapos.recipe.template:jinja2 extensions = jinja2.ext.do log-output = ${directory:var}/log/amarisoft-rf-info.json.log context = section directory directory key slapparameter_dict slap-configuration:configuration key log_file :log-output raw stats_period {{ slapparameter_dict.get("gnb_stats_fetch_period", 60) }} raw testing {{ slapparameter_dict.get("testing", False) }} raw python_path {{ buildout_directory}}/bin/pythonwitheggs mode = 0775 url = {{ amarisoft_rf_info_template }} output = ${directory:bin}/amarisoft-rf-info.py [amarisoft-stats-service] recipe = slapos.cookbook:wrapper command-line = ${amarisoft-stats-template:output} wrapper-path = ${directory:service}/amarisoft-stats mode = 0775 hash-files = ${amarisoft-stats-template:output} [amarisoft-rf-info-service] recipe = slapos.cookbook:wrapper command-line = ${amarisoft-rf-info-template:output} wrapper-path = ${directory:service}/amarisoft-rf-info mode = 0775 hash-files = ${amarisoft-rf-info-template:output} [config-base] recipe = slapos.recipe.template:jinja2 extensions = jinja2.ext.do context = section directory directory section slap_configuration slap-configuration key slapparameter_dict slap-configuration:configuration key gtp_addr_v6 slap-configuration:ipv6-random raw gtp_addr_v4 {{ lan_ipv4 }} raw one_watt {{ ors_version['one-watt'] }} raw tx_gain {{ ors_version['current-tx-gain'] }} raw rx_gain {{ ors_version['current-rx-gain'] }} raw nr_arfcn {{ ors_version['current-nr-arfcn'] }} raw nr_band {{ ors_version['current-nr-band'] }} raw software_name {{ software_name }} raw rf_mode {{ rf_mode }} raw trx {{ trx }} raw bbu {{ bbu }} raw ru {{ ru }} import netaddr netaddr [gnb-config] <= config-base {% if slapparameter_dict.get("gnb_config_link", None) %} url = ${gnb-config-dl:target} {% else %} url = {{ gnb_template }} {% endif %} output = ${directory:etc}/gnb.cfg [publish-connection-information] <= monitor-publish recipe = slapos.cookbook:publish.serialised {%- if slapparameter_dict.get("websocket_password", "") %} websocket_url = ws://[${slap-configuration:ipv6-random}]:9001 {%- endif %} gnb-ipv6 = ${slap-configuration:ipv6-random} gnb-ipv4 = {{ lan_ipv4 }} ors-version = {{ ors_version['ors-version'] }} frequency-range-rating = {{ ors_version['range'] }} current-tx-power-estimate = {{ ors_version['power-estimate'] }} current-tx-gain = {{ ors_version['current-tx-gain'] }} current-rx-gain = {{ ors_version['current-rx-gain'] }} current-nr-arfcn = {{ ors_version['current-nr-arfcn'] }} current-nr-band = {{ ors_version['current-nr-band'] }} amarisoft-version = {{ lte_version }} license-expiration = {{ lte_expiration }} monitor-gadget-url = ${:monitor-base-url}/gadget/software.cfg.html [monitor-instance-parameter] {% if slapparameter_dict.get("name", None) %} monitor-title = {{ slapparameter_dict['name'] | string }} {% endif %} {% if slapparameter_dict.get("monitor-password", None) %} password = {{ slapparameter_dict['monitor-password'] | string }} {% endif %} [macro.promise] <= monitor-promise-base name = ${:_buildout_section_name_} [check-sdr-busy.py] <= macro.promise promise = check_sdr_busy config-testing = {{ slapparameter_dict.get("testing", False) }} config-sdr = {{ sdr }} config-sdr_dev = 0 config-dma_chan = 0 [check-baseband-latency.py] <= macro.promise promise = check_baseband_latency config-testing = {{ slapparameter_dict.get("testing", False) }} config-amarisoft-stats-log = ${amarisoft-stats-template:log-output} config-stats-period = {{ slapparameter_dict.get("gnb_stats_fetch_period", 60) }} config-min-txrx-delay = {{ slapparameter_dict.get("min_txrx_delay", 5) }} [check-amarisoft-stats-log.py] <= macro.promise promise = check_amarisoft_stats_log output = ${directory:plugins}/check-amarisoft-stats-log.py config-testing = {{ slapparameter_dict.get("testing", False) }} config-amarisoft-stats-log = ${amarisoft-stats-template:log-output} config-stats-period = {{ slapparameter_dict.get("gnb_stats_fetch_period", 60) }} [check-rx-saturated.py] <= macro.promise promise = check_rx_saturated config-testing = {{ slapparameter_dict.get("testing", False) }} config-rf-rx-chan-list = {{ list(range(0, int(slapparameter_dict.get('n_antenna_ul', default_n_antenna_ul)))) }} config-amarisoft-stats-log = ${amarisoft-stats-template:log-output} config-stats-period = {{ slapparameter_dict.get("gnb_stats_fetch_period", 60) }} config-max-rx-sample-db = {{ slapparameter_dict.get("max_rx_sample_db", 0) }}