# Parameter Management
## Overview
### Function
The parameter management module, namely, sysparam, provides an easy-to-use key-value pair access interface for system services to configure service functions based on their own system parameters.
### Basic Concepts
Figure 1 System parameter operation primitives
![System parameter operation primitives](figures/system-parameter-operation-primitives.png)
**Table 1** Description of system parameter operation primitives
| Operation Primitive| Description|
| -------- | -------- |
| get | Obtains the value of a system parameter. |
| set | Sets the value of a system parameter. |
| wait | Waits for value change of a system parameter synchronously.|
| watch | Observes value change of a system parameter asynchronously.|
#### System Parameter Definition
- Naming format
A system parameter name consists of multiple segments in dotted notation. Each segment can be a string that consists of letters, digits, and underscores (_). The total length cannot exceed 96 bytes. System parameter names are categorized into the following two types.
**Table 2** System parameter names
| Type | Example | Description |
| -------- | -------- | -------- |
| Parameter name | const.product.**name** | Complete system parameter name. It does not end with a period (.). |
| Parameter directory | const.product **.** | Name of the directory storing system parameters with the same prefix. It ends with a period (.).|
- Type
System parameters are categorized into three types.
**Table 3** System parameter types
| Type| Prefix| Description|
| -------- | -------- | -------- |
| Constant| const. | Constant parameter, which will not be changed once a value is assigned. The value can contain a maximum of 4,096 bytes (including the terminator).|
| Writable| Others| Writable parameter, which will be lost after system restart. The value can contain a maximum of 96 bytes (including the terminator).|
| Persistent| persist. | Writable and persistent parameter, which will not be lost after system restart. The value can contain a maximum of 96 bytes (including the terminator).|
The general naming format is as follows:
```
[ const | persist ].$sub_system.$desc
```
**$sub_system** is the name of the subsystem or module.
**$desc** indicates the description of a system parameter. The description can contain multiple segments in dotted notation.
#### Definition Rules
Each subsystem defines the system parameters of its own modules, including the system parameter name, default value, and access permission information.
- System parameter value definition file
- The system parameter value definition file ends with the **.para** extension. An example of the file format is as follows:
```shell
# This is comment
const.product.name=OHOS-PRODUCT
const.os.version.api=26
const.telephony.enable=false|true
const.test.withblank=My Value
const.test.withcomment=MyValue # This should be ommitted
const.test.multiline="This is a multiline parameter.
Line2 value.
Last line."
```
- You must use a complete system parameter command when assigning a value for a system parameter. The following table describes the value assignment modes.
**Table 4** Value assignment modes
| Type| Example| Description|
| -------- | -------- | -------- |
| String | const.product.name=OHOS-PRODUCT | A multi-line string must be enclosed in double quotation marks ("").|
| Number | const.os.version.api=26 | Numbers do not need to be enclosed in quotation marks.|
| Boolean | const.telephony.enable=false | A Boolean value can be **0**, **1**, **false**, or **true**.|
- DAC definition file
Currently, access permissions of system parameters are managed in Discretionary Access Control (DAC) mode. The access permission definition file ends with the **.para.dac** extension. The following is an example:
```java
const.product.="root:root:660"
```
As shown above, we can use **parameter directory** to define the same access permission for system parameters with the same prefix. The DAC information is divided into three segments, user, group, and UGO rule, which are separated using a semicolon (:).
The following figure shows the structure of the UGO rule.
**Figure 2** UGO rule structure
![UGO rule](figures/dac-definition.png)
- SELinux policy for system parameter configuration
- Add SELinux tags.
To add a SELinux tag to system parameters, you first need to define the tag in the **/base/security/selinux/sepolicy/base/public/parameter.te** file. For example:
```java
type servicectrl_param, parameter_attr
```
After the tag is defined, add the system parameter prefix associated with the tag to **/base/security/selinux/sepolicy/base/public/parameter_contexts**. The following uses the prefix **ohos.servicectrl** as an example:
```java
ohos.servicectrl. u:object_r:servicectrl_param:s0
```
- Grant operation permissions. For example, to grant operation permissions such as map for the init process, add the following content to the **/base/security/selinux/sepolicy/ohos_policy/startup/init/public/init.te** file:
```java
allow servicectrl_param tmpfs:filesystem associate;
allow init servicectrl_param:file { map open read relabelto relabelfrom };
```
- Set the write permission. For example, grant the system parameter write permission for services such as **init**, **samgr**, and **hdf_devmgr**.
```java
allow { init samgr hdf_devmgr } servicectrl_param:parameter_service { set };
```
- Set the read permission. If you want to grant the permission only for certain services, replace **xxx** with the services in the following code:
```java
allow { xxx } servicectrl_param:file { map open read };
```
- If you want to grant the permission for all services, use the following code:
```java
allow { domain -limit_domain } servicectrl_param:file { map open read };
```
- Suggestions
Keep only two system parameter tags for each subsystem:
- A private tag to control system parameter settings.
- A public tag to grant access from all services.
- Loading sequence
The following table provides the sequence of loading system parameters.
**Table 5** System parameter loading sequence
| Type| Path| Description|
| -------- | -------- | -------- |
| Kernel parameters | /proc/cmdline | Convert some values of kernel parameters into system parameters. Specifically, convert all **ohospara.xxx=valXXX** parameters to **ohos.boot.xxx=valXXX** parameters.|
| OS system parameters| /system/etc/param/ohos_const/*.para | Load the definition file containing OS constants preferentially. |
| Vendor parameters| /vendor/etc/param/*.para | Load the system parameters defined by vendors with the secondary priority. |
| System parameters| /system/etc/param/*.para | Load the parameters defined by each subsystem. If a system parameter already exists, ignore it.|
| Persistent parameters| /data/parameters/ | If persistent parameters exist, load them at last. Persistent parameters will overwrite the default system parameters that have been loaded.|
#### System Parameter Tag File Size
If one tag corresponds to more than five system parameters, you need to set the size of the system parameter tag file in **/base/startup/init/services/etc/param/ohos.para.size**. The size value is **512** by default.
Configuring rule:
System parameter tag = Size
Example:
```java
startup_init_param=40960
```
### Constraints
The service management module is available only for the mini system and standard system.
## How to Develop
### Use Cases
You can set specific system parameters as needed to meet your service demand.
### Available APIs
- Shell commands
You can operate system parameters directly by using shell commands. This operation mode is available only for the standard system. The following table lists the shell commands.
**Table 6** Description of shell commands
| Command| Description|
| -------- | -------- |
| param get [**key**] | Obtains the system parameter value of the specified key. If no key name is specified, all system parameter values will be returned.|
| param set **key value** | Sets the specified value for the specified key.|
| param wait **key** **value** | Waits for the system parameter value of the specified key to match the specified value. Fuzzy match is supported. For example, * indicates any value, and val* indicates matching of only the first three val characters.|
| param watch | Observes value change of a system parameter asynchronously.|
- syspara APIs
The following table lists the APIs used to obtain system parameter values. The return result is a const string and the free operation is not supported.
**Table 7** Description of syspara APIs
| API| Description|
| -------- | -------- |
| int GetParameter(const char\* key, const char\* def, char\* value, unsigned int len) | Obtains system parameters.|
| int SetParameter(const char\* key, const char\* value) | Sets or updates system parameters.|
| const char\* GetDeviceType(void) | Obtains the device type.|
| const char\* GetManufacture(void) | Obtains the device manufacturer.|
| const char\* GetBrand(void) | Obtains the device brand.|
| const char\* GetMarketName(void) | Obtains the device marketing name.|
| const char\* GetProductSeries(void) | Obtains the device series name.|
| const char\* GetProductModel(void) | Obtains the device authentication model.|
| const char\* GetSoftwareModel(void) | Obtains the device software model.|
| const char\* GetHardwareModel(void) | Obtains the device hardware model.|
| const char\* GetHardwareProfile(void) | Obtains the device hardware profile.|
| const char\* GetSerial(void) | Obtains the device serial number (SN).|
| const char\* GetOSFullName(void) | Obtains the operating system name.|
| const char\* GetDisplayVersion(void) | Obtains the software version visible to users.|
| const char\* GetBootloaderVersion(void) | Obtains the bootloader version of this device.|
| const char\* GetSecurityPatchTag(void) | Obtains the security patch tag.|
| const char\* GetAbiList(void) | Obtains the list of application binary interfaces (ABIs) supported on this device.|
| int GetSdkApiVersion(void) | Obtains the SDK API level that matches the current system software.|
| int GetFirstApiVersion(void) | Obtains the first SDK API level of the system software.|
| const char\* GetIncrementalVersion(void) | Obtains the incremental version.|
| const char\* GetVersionId(void) | Obtains the version ID.|
| const char\* GetBuildType(void) | Obtains the build type.|
| const char\* GetBuildUser(void) | Obtains the build account user name.|
| const char\* GetBuildHost(void) | Obtains the build host name.|
| const char\* GetBuildTime(void) | Obtains the build time.|
| const char\* GetBuildRootHash(void) | Obtains the buildroot hash value of this version.|
| const char\* GetOsReleaseType(void) | Obtains the system release type.|
| int GetDevUdid(char \*udid, int size) | Obtains the device identifier (UDID).|
| const char *AclGetSerial(void); | Obtains the device SN (with ACL check).|
| int AclGetDevUdid(char *udid, int size); | Obtains the UDID (with ACL check).|
### How to Develop
1. System parameter definition
You can define default system parameters and implement permission control on them by configuring the subsystem or product .para and .para.dac files.
On a standard system, use the ohos_prebuilt_para template to install the configuration file to the /etc/param/ directory. The following is an example of the GN script:
```go
import("//base/startup/init/services/etc/param/param_fixer.gni")
ohos_prebuilt_para("ohos.para") {
source = "//base/startup/init/services/etc/ohos.para"
part_name = "init"
module_install_dir = "etc/param"
}
ohos_prebuilt_para("ohos.para.dac") {
source = "//base/startup/init/services/etc/ohos.para.dac"
part_name = "init"
module_install_dir = "etc/param"
}
```
On a small system, run the copy command to copy the corresponding system parameter definition file to the system/etc/param directory.
```go
copy("ohos.para") {
sources = [ "//base/startup/init/services/etc/param/ohos.para" ]
outputs = [ "$root_out_dir/system/etc/param/ohos.para" ]
}
copy("ohos.para.dac") {
sources = [ "//base/startup/init/services/etc/param/ohos.para.dac" ]
outputs = [ "$root_out_dir/system/etc/param/ohos.para.dac" ]
}
```
On a mini system, convert all defined default system parameters into header files through **action** and compile them into the system.
```go
action("lite_const_param_to") {
script = "//base/startup/init/scripts/param_cfg_to_code.py"
args = [
"--source",
rebase_path(
"//base/startup/init/services/etc_lite/param/ohos_const/ohospara"),
"--dest_dir",
rebase_path("$root_out_dir/gen/init/"),
"--priority",
"0",
]
outputs = [ "$target_gen_dir/${target_name}_param_cfg_to_code.log" ]
}
```
2. Development example
```
// set && get
char key1[] = "rw.sys.version";
char value1[] = "10.1.0";
int ret = SetParameter(key1, value1);
char valueGet1[128] = {0};
ret = GetParameter(key1, "version=10.1.0", valueGet1, 128);
// get sysparm
char* value1 = GetDeviceType();
printf("Product type =%s\n", value1);
char* value2 = GetManufacture();
printf("Manufacture =%s\n", value2);
char* value3 = GetBrand();
printf("GetBrand =%s\n", value3);
char* value4 = GetMarketName();
printf("MarketName =%s\n", value4);
char* value5 = GetProductSeries();
printf("ProductSeries =%s\n", value5);
char* value6 = GetProductModel();
printf("ProductModel =%s\n", value6);
char* value7 = GetSoftwareModel();
printf("SoftwareModel =%s\n", value7);
char* value8 = GetHardwareModel();
printf("HardwareModel =%s\n", value8);
char* value9 = GetHardwareProfile();
printf("Software profile =%s\n", value9);
char* value10 = GetSerial();
printf("Serial =%s\n", value10);
char* value11 = GetOSFullName();
printf("OS name =%s\n", value11);
char* value12 = GetDisplayVersion();
printf("Display version =%s\n", value12);
char* value13 = GetBootloaderVersion();
printf("bootloader version =%s\n", value13);
char* value14 = GetSecurityPatchTag();
printf("secure patch level =%s\n", value14);
char* value15 = GetAbiList();
printf("abi list =%s\n", value15);
int value16 = GetFirstApiVersion();
printf("first api level =%d\n", value16);
char* value17 = GetIncrementalVersion();
printf("Incremental version = %s\n", value17);
char* value18 = GetVersionId();
printf("formal id =%s\n", value18);
char* value19 = GetBuildType();
printf("build type =%s\n", value19);
char* value20 = GetBuildUser();
printf("build user =%s\n", value20);
char* value21 = GetBuildHost();
printf("Build host = %s\n", value21);
char* value22 = GetBuildTime();
printf("build time =%s\n", value22);
char* value23 = GetBuildRootHash();
printf("build root later..., %s\n", value23);
char* value24 = GetOsReleaseType();
printf("OS release type =%s\n", value24);
char* value25 = GetOsReleaseType();
printf("OS release type =%s\n", value25);
char value26[65] = {0};
GetDevUdid(value26, 65);
printf("device udid =%s\n", value26);
```