Skip to content

Instantly share code, notes, and snippets.

@TNick
Created August 2, 2019 16:46
Show Gist options
  • Select an option

  • Save TNick/3d154707c24a332dab32d98aa160655c to your computer and use it in GitHub Desktop.

Select an option

Save TNick/3d154707c24a332dab32d98aa160655c to your computer and use it in GitHub Desktop.

Revisions

  1. TNick created this gist Aug 2, 2019.
    167 changes: 167 additions & 0 deletions create-openwrt.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,167 @@
    #!/bin/bash
    # Inspired by https://github.com/whiskerz007/proxmox_tuya-convert_container/blob/master/create_container.sh

    # Arguments
    #
    # 1 - LXC_STORAGE (local-lvm by default)
    # 2 - DISK_SIZE (1G by default) can be a number and must be followed
    # by either a G or a M
    # 3 - TEMPLATE (local:vztmpl/openwrt-18.06-openwrt_18.06.4_amd64.tar.gz by default)
    # 4 - CORES (1 by default)
    # 5 - SWAP (512 by default)
    # 6 - MEMORY (512 by default)
    # 7 - PASSWORD (123456789 by default)
    # 8 - HOSTNAME (openwrt by default)
    # 9 - OSTYPE (unmanaged by default)
    # 10 - POOL (Others by default)
    # 11 - ONBOOT (1 by default) 1 to enable, 0 to disble
    # 12 - NET_NAME (eth0 by default) the name of the interface
    # 13 - BRIDGE (vmbr0 by default) the name of the bridge
    # 14 - IP (dhcp by default) the IP to assogn on NET_NAME
    # 15 - SIMULATE (0 by default) only print commands, do not execute
    # 16 - DEBUG (0 by default) print debug info



    # Setup script
    set -o pipefail
    shopt -s expand_aliases
    alias die='EXIT=$? LINE=$LINENO error_exit'
    trap die ERR

    function error_exit() {
    REASON=$1
    MSG="\e[91mERROR: \e[93m$EXIT@"
    if [ -z "$REASON" ]; then
    MSG="$MSG$LINE:"
    REASON="A failure has occured."
    else
    MSG="$MSG`echo $(( $LINE - 1 ))`:"
    fi
    echo -e "$MSG \e[97m$REASON\e[39m\e[49m"
    exit $EXIT
    }

    function debug() {
    MSG=$1
    if [ "$DEBUG" == "1" ] ; then
    echo "$MSG"
    fi
    }

    # Verify valid storage location; use local-lvm by default.
    LXC_STORAGE=${1:-local-lvm}
    SIMULATE=${15:-0}
    DEBUG=${16:-1}

    pvesm list $LXC_STORAGE >&/dev/null ||
    die "'$LXC_STORAGE' is not a valid storage ID.\n\n\n"
    pvesm status -content images -storage $LXC_STORAGE >&/dev/null ||
    die "'$LXC_STORAGE' does not allow 'Disk image' to be stored."
    debug "LXC_STORAGE = ${LXC_STORAGE}"

    # Get storage type
    STORAGE_TYPE=`pvesm status -storage $LXC_STORAGE | awk 'NR>1 {print $2}'`
    debug "STORAGE_TYPE = ${STORAGE_TYPE}"


    # Get the next guest VM/LXC ID
    CTID=$(cat<<EOF | python3
    import json
    with open('/etc/pve/.vmlist') as vmlist:
    vmids = json.load(vmlist)
    if 'ids' not in vmids:
    print(100)
    else:
    for i in range(100, 10000):
    if not str(i) in vmids['ids']:
    print(i)
    break
    # last_vm = sorted(vmids['ids'].keys())[-1:][0]
    # print(int(last_vm)+1)
    EOF
    )
    debug "CTID = ${CTID}"

    # For dir add special extensions.
    if [ "$STORAGE_TYPE" = "dir" ]; then
    DISK_EXT=".raw"
    DISK_REF="$CTID/"
    fi
    debug "DISK_EXT = ${DISK_EXT}"
    debug "DISK_REF = ${DISK_REF}"

    # Compute storage info.
    DISK=vm-${CTID}-disk-0${DISK_EXT}
    ROOTFS=${LXC_STORAGE}:${DISK_REF}${DISK}
    DISK_PATH=`pvesm path $ROOTFS`
    DISK_SIZE=${2:-1G}
    debug "DISK = ${DISK}"
    debug "ROOTFS = ${ROOTFS}"
    debug "DISK_PATH = ${DISK_PATH}"
    debug "DISK_SIZE = ${DISK_SIZE}"

    # Allocate the disk and format it.
    PVESM_COMMAND="pvesm alloc $LXC_STORAGE $CTID $DISK $DISK_SIZE"
    MKEFS_COMMAND="mke2fs $DISK_PATH"
    if [ $SIMULATE == "1" ] ; then
    echo "$PVESM_COMMAND"
    echo "$MKEFS_COMMAND"
    else
    $PVESM_COMMAND
    $MKEFS_COMMAND
    fi

    # Create the container
    TEMPLATE=${3:-local:vztmpl/openwrt-18.06-openwrt_18.06.4_amd64.tar.gz}
    CORES=${4:-1}
    SWAP=${5:-512}
    MEMORY=${6:-512}
    PASSWORD=${7:-123456789}
    HOSTNAME=${8:-openwrt}
    OSTYPE=${9:-unmanaged}
    POOL=${10:-Others}
    ONBOOT=${11:-1}
    NET_NAME=${12:-eth0}
    BRIDGE=${13:-vmbr0}
    IP=${14:-dhcp}

    debug "TEMPLATE = ${TEMPLATE}"
    debug "CORES = ${CORES}"
    debug "SWAP = $SWAP{}"
    debug "MEMORY = ${MEMORY}"
    debug "PASSWORD = ${PASSWORD}"
    debug "HOSTNAME = ${HOSTNAME}"
    debug "OSTYPE = ${OSTYPE}"
    debug "POOL = ${POOL}"
    debug "ONBOOT = ${ONBOOT}"
    debug "NET_NAME = ${NET_NAME}"
    debug "BRIDGE = ${BRIDGE}"
    debug "IP = ${IP}"

    PCT_COMMAND="pct create $CTID $TEMPLATE \
    -arch amd64 -cores $CORES \
    -swap $SWAP -memory $MEMORY -password "$PASSWORD" -hostname $HOSTNAME \
    -ostype $OSTYPE -pool $POOL \
    -onboot $ONBOOT \
    -net0 name=$NET_NAME,bridge=$BRIDGE,ip=$IP,type=veth \
    -rootfs $ROOTFS -storage $LXC_STORAGE"

    if [ $SIMULATE == "1" ] ; then
    echo "$PCT_COMMAND"
    else
    $PCT_COMMAND
    cat <<EOF >> /etc/pve/lxc/${CTID}.conf
    lxc.include: /usr/share/lxc/config/openwrt.common.conf
    lxc.include: /usr/share/lxc/config/common.conf
    lxc.cap.drop: sys_admin
    lxc.mount.entry: tmp tmp tmpfs rw,nodev,relatime,mode=1777 0 0
    EOF

    echo -e "\n\n\n" \
    "******************************\n" \
    "* Successfully Create New CT *\n" \
    "* CT ID is $CTID *\n" \
    "******************************\n\n"
    fi