source: Support/Support-New-OS.md This document will explain how to add basic and full support for a new OS. **Some knowledge in PHP is needed for the full support.** #### BASIC SUPPORT FOR A NEW OS ### MIB If we have the MIB, we can copy the file into the default directory: ```bash /opt/librenms/mibs ``` #### New OS definition Let's begin to declare the new OS in LibreNMS. At first we modify the definition file located here: ```bash includes/definitions.inc.php ``` ```php // Pulse Secure OS definition $os = 'pulse'; $config['os'][$os]['text'] = 'Pulse Secure'; $config['os'][$os]['type'] = 'firewall'; $config['os'][$os]['icon'] = 'junos'; $config['os'][$os]['over'][0]['graph'] = 'device_bits'; $config['os'][$os]['over'][0]['text'] = 'Device Traffic'; $config['os'][$os]['over'][1]['graph'] = 'device_processor'; $config['os'][$os]['over'][1]['text'] = 'CPU Usage'; $config['os'][$os]['over'][2]['graph'] = 'device_mempool'; $config['os'][$os]['over'][2]['text'] = 'Memory Usage'; //The icon described before is the image we have to create and put in the directory html/images/os ``` #### Discovery OS We create a new file named as our OS definition and in this directory: ```bash includes/discovery/os/pulse.inc.php ``` This file just sets the $os variable, done by checking the SNMP tree for a particular value that matches the OS you are adding. Typically, this will come from the presence of specific values in sysObjectID or sysDescr, or the existence of a particular enterprise tree. Look at other files to get help in the code structure. ```php $users ) $tags = compact('rrd_def'); data_update($device, 'pulse_users', $tags, $fields); $graphs['pulse_users'] = true; } $sessions = snmp_get($device, 'PULSESECURE-PSG-MIB::iveConcurrentUsers.0', '-OQv'); if (is_numeric($sessions)) { $rrd_def = array( 'DS:sessions:GAUGE:600:0:U', } $fields = array( 'sessions' => $sessions ); $tags = compact('rrd_def'); data_update($device, 'pulse_sessions', $tags, $fields); $graphs['pulse_sessions'] = true; } ``` We finish in the declaration of the two graph types in the database: We can do that within a file to share our work and contribute in the development of LibreNMS. :-) ```bash sql-schema/xxx.sql //check the file number in GitHub php includes/sql-schema/update.php ``` Or put the SQL commands directly in Mysql or PhpMyadmin for our tests: ```php INSERT INTO `graph_types`(`graph_type`, `graph_subtype`, `graph_section`, `graph_descr`, `graph_order`) VALUES ('device', 'pulse_users', 'firewall', 'Active Users', ''); INSERT INTO `graph_types`(`graph_type`, `graph_subtype`, `graph_section`, `graph_descr`, `graph_order`) VALUES ('device', 'pulse_sessions', 'firewall', 'Active Sessions', ''); ``` #### Displaying The specific graphs are not displayed automatically so we need to write the following PHP code: **Pulse Sessions** ```bash html/includes/graphs/device/pulse_sessions.inc.php ``` ```php checkOS('nios'); $this->checkOS('nios', 'nios-ipam'); } ``` We utilise [snmpsim](http://snmpsim.sourceforge.net/) to do unit testing for OS discovery. For this to work you need to supply an snmprec file. This is pretty simple and using nios as the example again this would look like: ``` 1.3.6.1.2.1.1.1.0|4|Linux 3.14.25 #1 SMP Thu Jun 16 18:19:37 EDT 2016 x86_64 1.3.6.1.2.1.1.2.0|6|1.3.6.1.4.1.7779.1.1402 ``` During testing LibreNMS will use any info in the snmprec file for snmp calls. This one provides sysDescr (`.1.3.6.1.2.1.1.1.0`, 4 = Octet String) and sysObjectID (`.1.3.6.1.2.1.1.2.0`, 6 = Object Identifier), which is the minimum that should be provided for new snmprec files. To look up the numeric OID and type of an string OID with snmptranslate: ```bash snmptranslate -On -Td SNMPv2-MIB::sysDescr.0 ``` Common OIDs used in discovery: | String OID | Numeric OID | | ----------------------------------- | --------------------------- | | SNMPv2-MIB::sysDescr.0 | 1.3.6.1.2.1.1.1.0 | | SNMPv2-MIB::sysObjectID.0 | 1.3.6.1.2.1.1.2.0 | | ENTITY-MIB::entPhysicalDescr.1 | 1.3.6.1.2.1.47.1.1.1.1.2.1 | | ENTITY-MIB::entPhysicalMfgName.1 | 1.3.6.1.2.1.47.1.1.1.1.12.1 | | SML-MIB::product-Name.0 | 1.3.6.1.4.1.2.6.182.3.3.1.0 | List of SNMP data types: | Type | Value | | ----------------- | ------------- | | OCTET STRING | 4 | | Integer32 | 2 | | NULL | 5 | | OBJECT IDENTIFIER | 6 | | IpAddress | 64 | | Counter32 | 65 | | Gauge32 | 66 | | TimeTicks | 67 | | Opaque | 68 | | Counter64 | 70 | You can run `./scripts/pre-commit.php -u` to run the unit tests to check your code. If you would like to run tests locally against a full snmpsim instance, run `./scripts/pre-commit.php -u --snmpsim`.