当前位置: 首页 > 工具软件 > EasyCwmp > 使用案例 >

easycwmp解读(1.0)-启动流程/etc/init.d/easycwmpd

萧晓博
2023-12-01

文件路径:

  1. 源码:ext/openwrt/init.d/easycwmpd
  2. 设备路径 /etc/init.d/easycwmpd

源码内容

#!/bin/sh /etc/rc.common
# Copyright (C) 2012-2014 OpenWrt.org

START=90

USE_PROCD=1
PROG="/usr/sbin/easycwmpd"

UCI_SET="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} set"
UCI_GET="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get"
UCI_COMMIT="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} commit"
init_device_info() {
	local val oval
	local change=0

	val=`cat "/etc/device_info" | grep "DEVICE_MANUFACTURER" | cut -f 2 -d '=' | sed -e "s/['\"]//g" -e "s'[]:@/?#[!$&()*+,;=]'_'g"`
	oval=`$UCI_GET easycwmp.@device[0].manufacturer`
	[ -n "$val" -a "$val" != "$oval" ] && { $UCI_SET easycwmp.@device[0].manufacturer="$val"; change=1; }

	val=`cat "/etc/device_info" | grep "DEVICE_PRODUCT" | cut -f 2 -d '=' | sed -e "s/['\"]//g" -e "s'[]:@/?#[!$&()*+,;=]'_'g"`
	oval=`$UCI_GET easycwmp.@device[0].product_class`
	[ -n "$val" -a "$val" != "$oval" ] && { $UCI_SET easycwmp.@device[0].product_class="$val"; change=1; }

	val=`cat "/etc/device_info" | grep "DEVICE_REVISION" | cut -f 2 -d '=' | sed -e "s/['\"]//g" -e "s'[]:@/?#[!$&()*+,;=]'_'g"`
	oval=`$UCI_GET easycwmp.@device[0].hardware_version`
	[ -n "$val" -a "$val" != "$oval" ] && { $UCI_SET easycwmp.@device[0].hardware_version="$val"; change=1; }

	val=`cat "/etc/openwrt_version"`
	oval=`$UCI_GET easycwmp.@device[0].software_version`
	[ -n "$val" -a "$val" != "$oval" ] && { $UCI_SET easycwmp.@device[0].software_version="$val"; change=1; }
	
	#The same thing here for OUI and SerialNumber

	[ "$change" = "1" ] && $UCI_COMMIT easycwmp
}

start_service() {
	#执行/etc/init.d/easycwmpd start,会进行到这里
	#读取开关
	local enable=`uci -q get easycwmp.@local[0].enable`
	if [ "$enable" == "1" ]; then
		#1. 获取平台的厂商 ,OID,软硬件版本号等,保存在uci中 /etc/config/easycwmp
		init_device_info
		#2.将/usr/sbin/easycwmpd进程加入到procd中监控起来
		#2.1增加一个服务实例
		procd_open_instance
		#2.2 添加进程处理
		procd_set_param command "$PROG" -f
		if [ "$1" = "--boot" ];then
			procd_append_param command --boot
		else
			procd_append_param command --getrpcmethod
		fi
		#2.3 设置异常 机制
		procd_set_param respawn "3" "7" "0"
		#2.4 完成进程实例的增加
		procd_close_instance
	fi
}

boot() {
	start --boot
}

service_triggers()
{
#配置文件或网络接口改变之后触发服务重新读取配置
	procd_add_reload_trigger easycwmp
}

启动脚本主要内容在函数start_service中,

  1. 1.在openwrt系统中,easycwmpd进程不是直接启动,而是使用procd监控进程来启动,做法很nice;
  2. 从系统文件中读取系统的基本信息,存入uci接口中,方便easycwmpd的读取信息操作

procd相关的介绍在详细请看

OpenWrt开发:25—软件模块之procd

 类似资料: