#!/bin/bash version=0.10.3 display_help() { echo "open5gs-dbctl: Open5GS Database Configuration Tool ($version)" echo "FLAGS: --db_uri=mongodb://localhost" echo "COMMANDS:" >&2 echo " add {imsi key opc}: adds a user to the database with default values" echo " add {imsi ip key opc}: adds a user to the database with default values and a IPv4 address for the UE" echo " addT1 {imsi key opc}: adds a user to the database with 3 differents apns" echo " addT1 {imsi ip key opc}: adds a user to the database with 3 differents apns and the same IPv4 address for the each apn" echo " remove {imsi}: removes a user from the database" echo " reset: WIPES OUT the database and restores it to an empty default" echo " static_ip {imsi ip4}: adds a static IP assignment to an already-existing user" echo " static_ip6 {imsi ip6}: adds a static IPv6 assignment to an already-existing user" echo " type {imsi type}: changes the PDN-Type of the first PDN: 1 = IPv4, 2 = IPv6, 3 = IPv4v6" echo " help: displays this message and exits" echo " default values are as follows: APN \"internet\", dl_bw/ul_bw 1 Gbps, PGW address is 127.0.0.3, IPv4 only" echo " add_ue_with_apn {imsi key opc apn}: adds a user to the database with a specific apn," echo " add_ue_with_slice {imsi key opc apn sst sd}: adds a user to the database with a specific apn, sst and sd" echo " update_apn {imsi apn slice_num}: adds an APN to the slice number slice_num of an existent UE" echo " update_slice {imsi apn sst sd}: adds an slice to an existent UE" echo " showall: shows the list of subscriber in the db" echo " showpretty: shows the list of subscriber in the db in a pretty json tree format" echo " showfiltered: shows {imsi key opc apn ip} information of subscriber" echo " ambr_speed {imsi dl_value dl_unit ul_value ul_unit}: Change AMBR speed from a specific user and the unit values are \"[0=bps 1=Kbps 2=Mbps 3=Gbps 4=Tbps ]\"" echo " subscriber_status {imsi subscriber_status_val={0,1} operator_determined_barring={0..8}}: Change TS 29.272 values for Subscriber-Status (7.3.29) and Operator-Determined-Barring (7.3.30)" } while test $# -gt 0; do case "$1" in --db_uri*) DB_URI=`echo $1 | sed -e 's/^[^=]*=//g'` shift ;; *) break ;; esac done DB_URI="${DB_URI:-mongodb://localhost/open5gs}" if [ "$#" -lt 1 ]; then display_help exit 1 fi if [ "$1" = "help" ]; then display_help exit 1 fi if [ "$1" = "add" ]; then if [ "$#" -eq 4 ]; then IMSI=$2 KI=$3 OPC=$4 mongosh --eval "db.subscribers.insertOne( { \"_id\": new ObjectId(), \"schema_version\": NumberInt(1), \"imsi\": \"$IMSI\", \"msisdn\": [], \"imeisv\": [], \"mme_host\": [], \"mm_realm\": [], \"purge_flag\": [], \"slice\":[ { \"sst\": NumberInt(1), \"default_indicator\": true, \"session\": [ { \"name\" : \"internet\", \"type\" : NumberInt(3), \"qos\" : { \"index\": NumberInt(9), \"arp\": { \"priority_level\" : NumberInt(8), \"pre_emption_capability\": NumberInt(1), \"pre_emption_vulnerability\": NumberInt(2) } }, \"ambr\": { \"downlink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) }, \"uplink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) } }, \"pcc_rule\": [], \"_id\": new ObjectId(), }], \"_id\": new ObjectId(), }], \"security\": { \"k\" : \"$KI\", \"op\" : null, \"opc\" : \"$OPC\", \"amf\" : \"8000\", }, \"ambr\" : { \"downlink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)}, \"uplink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)} }, \"access_restriction_data\": 32, \"network_access_mode\": 0, \"subscriber_status\": 0, \"operator_determined_barring\": 0, \"subscribed_rau_tau_timer\": 12, \"__v\": 0 } );" $DB_URI exit $? fi if [ "$#" -eq 5 ]; then IMSI=$2 IP=$3 KI=$4 OPC=$5 mongosh --eval "db.subscribers.insertOne( { \"_id\": new ObjectId(), \"schema_version\": NumberInt(1), \"imsi\": \"$IMSI\", \"msisdn\": [], \"imeisv\": [], \"mme_host\": [], \"mm_realm\": [], \"purge_flag\": [], \"slice\":[ { \"sst\": NumberInt(1), \"default_indicator\": true, \"session\": [ { \"name\" : \"internet\", \"type\" : NumberInt(3), \"qos\" : { \"index\": NumberInt(9), \"arp\": { \"priority_level\" : NumberInt(8), \"pre_emption_capability\": NumberInt(1), \"pre_emption_vulnerability\": NumberInt(2) } }, \"ambr\": { \"downlink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) }, \"uplink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) } }, \"ue\": { \"ipv4\": \"$IP\" }, \"pcc_rule\": [], \"_id\": new ObjectId(), }], \"_id\": new ObjectId(), }], \"security\": { \"k\" : \"$KI\", \"op\" : null, \"opc\" : \"$OPC\", \"amf\" : \"8000\", }, \"ambr\" : { \"downlink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)}, \"uplink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)} }, \"access_restriction_data\": 32, \"network_access_mode\": 0, \"subscriber_status\": 0, \"operator_determined_barring\": 0, \"subscribed_rau_tau_timer\": 12, \"__v\": 0 } );" $DB_URI exit $? fi echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl add imsi key opc\"" exit 1 fi if [ "$1" = "addT1" ]; then if [ "$#" -eq 4 ]; then IMSI=$2 KI=$3 OPC=$4 mongosh --eval "db.subscribers.insertOne( { \"_id\": new ObjectId(), \"schema_version\": NumberInt(1), \"imsi\": \"$IMSI\", \"msisdn\": [], \"imeisv\": [], \"mme_host\": [], \"mm_realm\": [], \"purge_flag\": [], \"slice\":[ { \"sst\": NumberInt(1), \"default_indicator\": true, \"session\": [ { \"name\" : \"internet\", \"type\" : NumberInt(3), \"qos\" : { \"index\": NumberInt(9), \"arp\": { \"priority_level\" : NumberInt(8), \"pre_emption_capability\": NumberInt(1), \"pre_emption_vulnerability\": NumberInt(2) } }, \"ambr\": { \"downlink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) }, \"uplink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) } }, \"pcc_rule\": [], \"_id\": new ObjectId(), },{ \"name\" : \"internet1\", \"type\" : NumberInt(3), \"qos\" : { \"index\": NumberInt(9), \"arp\": { \"priority_level\" : NumberInt(8), \"pre_emption_capability\": NumberInt(1), \"pre_emption_vulnerability\": NumberInt(2) } }, \"ambr\": { \"downlink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) }, \"uplink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) } }, \"pcc_rule\": [], \"_id\": new ObjectId(), },{ \"name\" : \"internet2\", \"type\" : NumberInt(3), \"qos\" : { \"index\": NumberInt(9), \"arp\": { \"priority_level\" : NumberInt(8), \"pre_emption_capability\": NumberInt(1), \"pre_emption_vulnerability\": NumberInt(2) } }, \"ambr\": { \"downlink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) }, \"uplink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) } }, \"pcc_rule\": [], \"_id\": new ObjectId(), } ], \"_id\": new ObjectId(), }], \"security\": { \"k\" : \"$KI\", \"op\" : null, \"opc\" : \"$OPC\", \"amf\" : \"8000\", }, \"ambr\" : { \"downlink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)}, \"uplink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)} }, \"access_restriction_data\": 32, \"network_access_mode\": 0, \"subscriber_status\": 0, \"operator_determined_barring\": 0, \"subscribed_rau_tau_timer\": 12, \"__v\": 0 } );" $DB_URI exit $? fi if [ "$#" -eq 5 ]; then IMSI=$2 IP=$3 KI=$4 OPC=$5 mongosh --eval "db.subscribers.insertOne( { \"_id\": new ObjectId(), \"schema_version\": NumberInt(1), \"imsi\": \"$IMSI\", \"msisdn\": [], \"imeisv\": [], \"mme_host\": [], \"mm_realm\": [], \"purge_flag\": [], \"slice\":[ { \"sst\": NumberInt(1), \"default_indicator\": true, \"session\": [ { \"name\" : \"internet\", \"type\" : NumberInt(3), \"qos\" : { \"index\": NumberInt(9), \"arp\": { \"priority_level\" : NumberInt(8), \"pre_emption_capability\": NumberInt(1), \"pre_emption_vulnerability\": NumberInt(2) } }, \"ambr\": { \"downlink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) }, \"uplink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) } }, \"ue\": { \"ipv4\": \"$IP\" }, \"pcc_rule\": [], \"_id\": new ObjectId(), },{ \"name\" : \"internet1\", \"type\" : NumberInt(3), \"qos\" : { \"index\": NumberInt(9), \"arp\": { \"priority_level\" : NumberInt(8), \"pre_emption_capability\": NumberInt(1), \"pre_emption_vulnerability\": NumberInt(2) } }, \"ambr\": { \"downlink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) }, \"uplink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) } }, \"ue\": { \"ipv4\": \"$IP\" }, \"pcc_rule\": [], \"_id\": new ObjectId(), },{ \"name\" : \"internet2\", \"type\" : NumberInt(3), \"qos\" : { \"index\": NumberInt(9), \"arp\": { \"priority_level\" : NumberInt(8), \"pre_emption_capability\": NumberInt(1), \"pre_emption_vulnerability\": NumberInt(2) } }, \"ambr\": { \"downlink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) }, \"uplink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) } }, \"ue\": { \"ipv4\": \"$IP\" }, \"pcc_rule\": [], \"_id\": new ObjectId(), } ], \"_id\": new ObjectId(), }], \"security\": { \"k\" : \"$KI\", \"op\" : null, \"opc\" : \"$OPC\", \"amf\" : \"8000\", }, \"ambr\" : { \"downlink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)}, \"uplink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)} }, \"access_restriction_data\": 32, \"network_access_mode\": 0, \"subscriber_status\": 0, \"operator_determined_barring\": 0, \"subscribed_rau_tau_timer\": 12, \"__v\": 0 } );" $DB_URI exit $? fi echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl add imsi key opc\"" exit 1 fi if [ "$1" = "remove" ]; then if [ "$#" -ne 2 ]; then echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl remove imsi\"" exit 1 fi IMSI=$2 mongosh --eval "db.subscribers.deleteOne({\"imsi\": \"$IMSI\"});" $DB_URI exit $? fi if [ "$1" = "reset" ]; then if [ "$#" -ne 1 ]; then echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl reset\"" exit 1 fi mongosh --eval "db.subscribers.deleteMany({});" $DB_URI exit $? fi if [ "$1" = "static_ip" ]; then if [ "$#" -ne 3 ]; then echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl static_ip imsi ip\"" exit 1 fi IMSI=$2 IP=$3 mongosh --eval "db.subscribers.updateOne({\"imsi\": \"$IMSI\"},{\$set: { \"slice.0.session.0.ue.ipv4\": \"$IP\" }});" $DB_URI exit $? fi if [ "$1" = "static_ip6" ]; then if [ "$#" -ne 3 ]; then echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl static_ip6 imsi ip\"" exit 1 fi IMSI=$2 IP=$3 mongosh --eval "db.subscribers.updateOne({\"imsi\": \"$IMSI\"},{\$set: { \"slice.0.session.0.ue.ipv6\": \"$IP\" }});" $DB_URI exit $? fi if [ "$1" = "type" ]; then if [ "$#" -ne 3 ]; then echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl type imsi type\"" exit 1 fi IMSI=$2 TYPE=$3 mongosh --eval "db.subscribers.updateOne({\"imsi\": \"$IMSI\"},{\$set: { \"slice.0.session.0.type\": NumberInt($TYPE) }});" $DB_URI exit $? fi if [ "$1" = "add_ue_with_apn" ]; then if [ "$#" -eq 5 ]; then IMSI=$2 KI=$3 OPC=$4 APN=$5 mongosh --eval "db.subscribers.insertOne( { \"_id\": new ObjectId(), \"schema_version\": NumberInt(1), \"imsi\": \"$IMSI\", \"msisdn\": [], \"imeisv\": [], \"mme_host\": [], \"mm_realm\": [], \"purge_flag\": [], \"slice\":[ { \"sst\": NumberInt(1), \"default_indicator\": true, \"session\": [ { \"name\" : \"$APN\", \"type\" : NumberInt(3), \"qos\" : { \"index\": NumberInt(9), \"arp\": { \"priority_level\" : NumberInt(8), \"pre_emption_capability\": NumberInt(1), \"pre_emption_vulnerability\": NumberInt(2) } }, \"ambr\": { \"downlink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) }, \"uplink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) } }, \"pcc_rule\": [], \"_id\": new ObjectId(), }], \"_id\": new ObjectId(), }], \"security\": { \"k\" : \"$KI\", \"op\" : null, \"opc\" : \"$OPC\", \"amf\" : \"8000\", }, \"ambr\" : { \"downlink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)}, \"uplink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)} }, \"access_restriction_data\": 32, \"network_access_mode\": 0, \"subscriber_status\": 0, \"operator_determined_barring\": 0, \"subscribed_rau_tau_timer\": 12, \"__v\": 0 } );" $DB_URI exit $? fi echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl add_ue_with_apn imsi key opc apn\"" exit 1 fi if [ "$1" = "add_ue_with_slice" ]; then if [ "$#" -eq 7 ]; then IMSI=$2 KI=$3 OPC=$4 APN=$5 SST=$6 SD=$7 mongosh --eval "db.subscribers.insertOne( { \"_id\": new ObjectId(), \"schema_version\": NumberInt(1), \"imsi\": \"$IMSI\", \"msisdn\": [], \"imeisv\": [], \"mme_host\": [], \"mm_realm\": [], \"purge_flag\": [], \"slice\":[ { \"sst\": NumberInt($SST), \"sd\": \"$SD\", \"default_indicator\": true, \"session\": [ { \"name\" : \"$APN\", \"type\" : NumberInt(3), \"qos\" : { \"index\": NumberInt(9), \"arp\": { \"priority_level\" : NumberInt(8), \"pre_emption_capability\": NumberInt(1), \"pre_emption_vulnerability\": NumberInt(2) } }, \"ambr\": { \"downlink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) }, \"uplink\": { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0) } }, \"pcc_rule\": [], \"_id\": new ObjectId(), }], \"_id\": new ObjectId(), }], \"security\": { \"k\" : \"$KI\", \"op\" : null, \"opc\" : \"$OPC\", \"amf\" : \"8000\", }, \"ambr\" : { \"downlink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)}, \"uplink\" : { \"value\": NumberInt(1000000000), \"unit\": NumberInt(0)} }, \"access_restriction_data\": 32, \"network_access_mode\": 0, \"subscriber_status\": 0, \"operator_determined_barring\": 0, \"subscribed_rau_tau_timer\": 12, \"__v\": 0 } );" $DB_URI exit $? fi echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl add_ue_with_slice imsi key opc apn sst sd\"" exit 1 fi if [ "$1" = "update_apn" ]; then if [ "$#" -eq 4 ]; then IMSI=$2 APN=$3 SLICE_NUM=$4 mongosh --eval "db.subscribers.updateOne({ \"imsi\": \"$IMSI\"}, {\$push: { \"slice.$SLICE_NUM.session\": { \"name\" : \"$APN\", \"type\" : NumberInt(3), \"_id\" : new ObjectId(), \"pcc_rule\" : [], \"ambr\" : { \"uplink\" : { \"value\": NumberInt(1), \"unit\" : NumberInt(3) }, \"downlink\" : { \"value\": NumberInt(1), \"unit\" : NumberInt(3) }, }, \"qos\" : { \"index\" : NumberInt(9), \"arp\" : { \"priority_level\" : NumberInt(8), \"pre_emption_capability\" : NumberInt(1), \"pre_emption_vulnerability\" : NumberInt(1), }, }, } } });" $DB_URI exit $? fi echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl update_apn imsi apn num_slice\"" exit 1 fi if [ "$1" = "update_slice" ]; then if [ "$#" -eq 5 ]; then IMSI=$2 APN=$3 SST=$4 SD=$5 mongosh --eval "db.subscribers.updateOne({ \"imsi\": \"$IMSI\"}, {\$push: { \"slice\": { \"sst\" : NumberInt($SST), \"sd\" : \"$SD\", \"default_indicator\" : false, \"_id\" : new ObjectId(), \"session\" : [{ \"name\" : \"$APN\", \"type\" : NumberInt(3), \"_id\" : new ObjectId(), \"pcc_rule\" : [], \"ambr\" : { \"uplink\" : { \"value\": NumberInt(1), \"unit\" : NumberInt(3) }, \"downlink\" : { \"value\": NumberInt(1), \"unit\" : NumberInt(3) }, }, \"qos\" : { \"index\" : NumberInt(9), \"arp\" : { \"priority_level\" : NumberInt(8), \"pre_emption_capability\" : NumberInt(1), \"pre_emption_vulnerability\" : NumberInt(1), }, }, }] } } });" $DB_URI exit $? fi echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl update_slice imsi apn sst sd\"" exit 1 fi if [ "$1" = "subscriber_status" ]; then if [ "$#" -eq 4 ]; then IMSI=$2 SUB_STATUS=$3 OP_DET_BARRING=$4 mongosh --eval "db.subscribers.updateOne({ \"imsi\": \"$IMSI\"}, {\$set: { \"subscriber_status\": $SUB_STATUS, \"operator_determined_barring\": $OP_DET_BARRING } });" $DB_URI exit $? fi echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl subscriber_status imsi subscriber_status_val={0,1} operator_determined_barring={0..8}" exit 1 fi if [ "$1" = "showall" ]; then mongosh --eval "db.subscribers.find()" $DB_URI exit $? fi if [ "$1" = "showpretty" ]; then mongosh --eval "db.subscribers.find().pretty()" $DB_URI exit $? fi if [ "$1" = "showfiltered" ]; then mongosh --eval "db.subscribers.find({},{'_id':0,'imsi':1,'security.k':1, 'security.opc':1,'slice.session.name':1,'slice.session.ue.ipv4':1})" $DB_URI exit $? fi if [ "$1" = "ambr_speed" ]; then if [ "$#" -eq 6 ]; then IMSI=$2 DL_VALUE=$3 DL_UNIT=$4 UL_VALUE=$5 UL_UNIT=$6 mongosh --eval "db.subscribers.updateOne({\"imsi\": \"$IMSI\"}, {\$set: { \"ambr\" : { \"downlink\" : { \"value\" : NumberInt($DL_VALUE), \"unit\" : NumberInt($DL_UNIT) }, \"uplink\" :{ \"value\": NumberInt($UL_VALUE), \"unit\" : NumberInt($UL_UNIT) } }, \"slice.0.session.0.ambr\": { \"downlink\" : { \"value\" : NumberInt($DL_VALUE), \"unit\" : NumberInt($DL_UNIT) }, \"uplink\" :{ \"value\": NumberInt($UL_VALUE), \"unit\" : NumberInt($UL_UNIT) } } } });" $DB_URI exit $? fi echo "open5gs-dbctl: incorrect number of args, format is \"open5gs-dbctl ambr_speed imsi dl_value dl_unit ul_value ul_unit dl is for download and ul is for upload and the unit values are[0=bps 1=Kbps 2=Mbps 3=Gbps 4=Tbps ] \"" exit 1 fi display_help