Changeset 29585


Ignore:
Timestamp:
2011-12-20T05:36:42+01:00 (6 years ago)
Author:
jow
Message:

Add UCI support to Openswan

The Openswan and UCI configuration file formats are very similar.
Implement the conversion from UCI to IPsec configuration file format in
the ipsec init script and store the converted information in
/etc/ipsec.uci.{conf,secrets} then reference these files from
/etc/ipsec.{conf,secrets}. This scheme allows for
backwards-compatibility during upgrades (since the original
configuration is preserved) and allows for users to implement any exotic
configurations that they require without conflicting with the
configuration in UCI.

Also add a nearly empty ipsec config file which enables nat_traversal.
This option should be safe in all configurations and is required in
many, which makes it a good default.

Signed-off-by: Kevin Locke <kevin@…>

Location:
packages/net/openswan
Files:
3 added
2 edited

Legend:

Unmodified
Added
Removed
  • packages/net/openswan/Makefile

    r29584 r29585  
    8787/etc/ipsec.conf 
    8888/etc/ipsec.secrets 
     89/etc/config/ipsec 
    8990endef 
    9091 
     
    9394        $(INSTALL_DIR) $(1)/etc/init.d 
    9495        $(CP) ./files/ipsec.init $(1)/etc/init.d/ipsec 
     96        $(CP) ./files/ipsec.conf $(1)/etc/ipsec.conf 
     97        $(CP) ./files/ipsec.secrets $(1)/etc/ipsec.secrets 
     98        $(INSTALL_DIR) $(1)/etc/config 
     99        $(INSTALL_CONF) ./files/ipsec.config $(1)/etc/config/ipsec 
    95100        rm -rf $(1)/usr/share 
    96101        rm -rf $(1)/usr/man 
  • packages/net/openswan/files/ipsec.init

    r13092 r29585  
    3333START=60 
    3434EXTRA_COMMANDS=status 
    35 EXTRA_HELP="    status  Show the status of the service" 
     35EXTRA_HELP="    status  Show the status of the service" 
     36 
     37# Format a list into a delimited string and print it 
     38config_list_delimit() { 
     39        local SECTION="$1" 
     40        local OPTION="$2" 
     41        local DELIMITER="${3:- }" 
     42 
     43        config_list_foreach "$SECTION" "$OPTION" "printf \"%s%s\"" "$DELIMITER" | sed "s/.\{${#DELIMITER}\}$//" 
     44} 
     45 
     46# Callback for each ipsec configuration section 
     47# Converts list options from UCI to ipsec format and writes ipsec section headers 
     48CUR_SECTION_NAME= 
     49CUR_SECTION_TYPE= 
     50config_cb() { 
     51        local TYPE="$1" 
     52        local NAME="$2" 
     53 
     54        # Handle list options from previous section 
     55        if [ "$CUR_SECTION_TYPE" = "ipsec_conn" ] ; then 
     56                local IKE="$(config_list_delimit "$CUR_SECTION_NAME" "ike" ", ")" 
     57                if [ -n "$IKE" ] ; then 
     58                        printf "\tike=\"%s\"\n" "$IKE" >> "$IPSEC_UCI_CONF" 
     59                fi 
     60 
     61                local SUBNETS 
     62                local SPACE_PAT="* *" 
     63                config_get "SUBNETS" "$CUR_SECTION_NAME" "leftsubnets" 
     64                case "$SUBNETS" in 
     65                        $SPACE_PAT) 
     66                                printf "\tleftsubnets={ %s }\n" "$SUBNETS" >> "$IPSEC_UCI_CONF" 
     67                                ;; 
     68                        ?*) 
     69                                printf "\tleftsubnet=%s\n" "$SUBNETS" >> "$IPSEC_UCI_CONF" 
     70                                ;; 
     71                esac 
     72 
     73                config_get "SUBNETS" "$CUR_SECTION_NAME" "rightsubnets" 
     74                case "$SUBNETS" in 
     75                        $SPACE_PAT) 
     76                                printf "\trightsubnets={ %s }\n" "$SUBNETS" >> "$IPSEC_UCI_CONF" 
     77                                ;; 
     78                        ?*) 
     79                                printf "\trightsubnet=%s\n" "$SUBNETS" >> "$IPSEC_UCI_CONF" 
     80                                ;; 
     81                esac 
     82        elif [ "$CUR_SECTION_TYPE" = "ipsec_config" ] ; then 
     83                local VPRIV="$(config_list_delimit "$CUR_SECTION_NAME" "virtual_private" ",")" 
     84                if [ -n "$VPRIV" ] ; then 
     85                        printf "\tvirtual_private=%s\n" "$VPRIV" >> "$IPSEC_UCI_CONF" 
     86                fi 
     87        fi 
     88 
     89        CUR_SECTION_NAME="$NAME" 
     90        CUR_SECTION_TYPE="$TYPE" 
     91 
     92        case "$CUR_SECTION_TYPE" in 
     93                ipsec_config|ipsec_conn) 
     94                        # Handled in option_cb 
     95                        echo >> "$IPSEC_UCI_CONF" 
     96                        echo "${TYPE#ipsec_} $NAME" >> "$IPSEC_UCI_CONF" 
     97                        ;; 
     98                *) 
     99                        # Not handled in option_cb 
     100                        ;; 
     101        esac 
     102 
     103        return 0 
     104} 
     105 
     106# Callback for each ipsec configuration option 
     107# Prints each UCI option to $IPSEC_UCI_CONF in ipsec.conf format 
     108option_cb() { 
     109        local NAME="$1" 
     110        local VALUE="$2" 
     111 
     112        case "$CUR_SECTION_TYPE" in 
     113                ipsec_config|ipsec_conn) 
     114                        # Handle option in these sections 
     115                        ;; 
     116                *) 
     117                        # Ignore options in all other sections 
     118                        return 0 
     119                        ;; 
     120        esac 
     121 
     122        case "$NAME" in 
     123                modecfgdns_ITEM[0-9]*) 
     124                        printf "\tmodecfgdns%d=%s\n" "${NAME##modecfgdns_ITEM}" "$VALUE" >> "$IPSEC_UCI_CONF" 
     125                        ;; 
     126                modecfgwins_ITEM[0-9]*) 
     127                        printf "\tmodecfgwins%d=%s\n" "${NAME##modecfgwins_ITEM}" "$VALUE" >> "$IPSEC_UCI_CONF" 
     128                        ;; 
     129                *_ITEM[0-9]*|*_LENGTH) 
     130                        # Ignore list items and length updates 
     131                        ;; 
     132                [!a-zA-Z]*) 
     133                        # Ignore non-ipsec.conf parameters 
     134                        ;; 
     135                *) 
     136                        # Quote values with characers which require quoting 
     137                        if echo "$VALUE" | grep -q '^[[:alnum:]_%.]*$' ; then 
     138                                printf "\t%s=%s\n" "$NAME" "$VALUE" >> "$IPSEC_UCI_CONF" 
     139                        else 
     140                                printf "\t%s=\"%s\"\n" "$NAME" "$VALUE" >> "$IPSEC_UCI_CONF" 
     141                        fi 
     142                        ;; 
     143        esac 
     144 
     145        return 0 
     146} 
     147 
     148ipsec_config_convert() { 
     149        IPSEC_UCI_CONF="${IPSEC_UCI_CONF:-${IPSEC_CONFS:-/etc}/ipsec.uci.conf}" 
     150        ipsec_config_print_header 
     151        config_load "ipsec" 
     152        # Conversion for $IPSEC_UCI_CONF handled in section_cb and option_cb 
     153 
     154        IPSEC_SEC_UCI_CONF="${IPSEC_SEC_UCI_CONF:-${IPSEC_CONFS:-/etc}/ipsec.uci.secrets}" 
     155        ipsec_config_print_header_secret 
     156        echo >> "$IPSEC_SEC_UCI_CONF" 
     157        echo "# Certificate Secrets" >> "$IPSEC_SEC_UCI_CONF" 
     158        config_foreach "ipsec_config_add_secret_cs" "ipsec_secret_cs" 
     159        echo >> "$IPSEC_SEC_UCI_CONF" 
     160        echo "# Shared Secrets" >> "$IPSEC_SEC_UCI_CONF" 
     161        config_foreach "ipsec_config_add_secret_ss" "ipsec_secret_ss" 
     162        echo >> "$IPSEC_SEC_UCI_CONF" 
     163        echo "# XAUTH Secrets" >> "$IPSEC_SEC_UCI_CONF" 
     164        config_foreach "ipsec_config_add_secret_xs" "ipsec_secret_xs" 
     165} 
     166 
     167ipsec_config_print_header() { 
     168        cat > "$IPSEC_UCI_CONF" <<ENDHEADER 
     169# $IPSEC_UCI_CONF - UCI IPsec configuration file 
     170# 
     171# This file is automatically generated by the ipsec init script from 
     172# configuration information stored in UCI.  DO NOT EDIT THIS FILE BY HAND. 
     173ENDHEADER 
     174} 
     175 
     176ipsec_config_print_header_secret() { 
     177        cat > "$IPSEC_SEC_UCI_CONF" <<ENDHEADER 
     178# $IPSEC_SEC_UCI_CONF - UCI IPsec sensitive configuration file 
     179# 
     180# This file is automatically generated by the ipsec init script from 
     181# configuration information stored in UCI.  DO NOT EDIT THIS FILE BY HAND. 
     182ENDHEADER 
     183} 
     184 
     185ipsec_config_add_secret_cs() { 
     186        local SECTNAME="$1" 
     187 
     188        config_get "FILE" "$SECTNAME" "file" 
     189        config_get "SECRET" "$SECTNAME" "secret" 
     190 
     191        FILE="\"$FILE\"" 
     192        if [ "$SECRET" != "%prompt" ] ; then 
     193                SECRET="\"$SECRET\"" 
     194        fi 
     195 
     196        echo ": RSA $FILE $SECRET" >> "$IPSEC_SEC_UCI_CONF" 
     197} 
     198 
     199ipsec_config_add_secret_ss() { 
     200        local SECTNAME="$1" 
     201 
     202        config_get "INDICES" "$SECTNAME" "indices" 
     203        config_get "SECRET" "$SECTNAME" "secret" 
     204 
     205        echo "$INDICES : PSK \"$SECRET\"" >> "$IPSEC_SEC_UCI_CONF" 
     206} 
     207 
     208ipsec_config_add_secret_xs() { 
     209        local SECTNAME="$1" 
     210 
     211        config_get "USERNAME" "$SECTNAME" "username" 
     212        config_get "SECRET" "$SECTNAME" "secret" 
     213 
     214        echo "@$USERNAME : XAUTH \"$SECRET\"" >> "$IPSEC_SEC_UCI_CONF" 
     215} 
    36216 
    37217script_init() { 
     
    190370} 
    191371start() { 
     372        ipsec_config_convert 
    192373        script_init start "$@" 
    193374        script_command start "$@" 
     
    200381 
    201382restart() { 
     383        ipsec_config_convert 
    202384        script_init stop "$@" 
    203385        script_command stop "$@" 
Note: See TracChangeset for help on using the changeset viewer.