#!/bin/bash 
 | 
# 
 | 
# Create a "bank" of tap network devices that can be used by the 
 | 
# runqemu script. This script needs to be run as root, and will 
 | 
# use the tunctl binary from the build system sysroot. Note: many Linux  
 | 
# distros these days still use an older version of tunctl which does not 
 | 
# support the group permissions option, hence the need to use the build 
 | 
# system provided version. 
 | 
# 
 | 
# Copyright (C) 2010 Intel Corp. 
 | 
# 
 | 
# SPDX-License-Identifier: GPL-2.0-only 
 | 
# 
 | 
  
 | 
uid=`id -u` 
 | 
gid=`id -g` 
 | 
if [ -n "$SUDO_UID" ]; then 
 | 
    uid=$SUDO_UID 
 | 
fi 
 | 
if [ -n "$SUDO_GID" ]; then 
 | 
    gid=$SUDO_GID 
 | 
fi 
 | 
  
 | 
usage() { 
 | 
    echo "Usage: sudo $0 <uid> <gid> <num> <staging_bindir_native>" 
 | 
    echo "Where <uid> is the numeric user id the tap devices will be owned by" 
 | 
    echo "Where <gid> is the numeric group id the tap devices will be owned by" 
 | 
    echo "<num> is the number of tap devices to create (0 to remove all)" 
 | 
    echo "<native-sysroot-basedir> is the path to the build system's native sysroot" 
 | 
    echo "For example:" 
 | 
    echo "$ bitbake qemu-helper-native" 
 | 
    echo "$ sudo $0 $uid $gid 4 tmp/sysroots-components/x86_64/qemu-helper-native/usr/bin" 
 | 
    echo "" 
 | 
    exit 1 
 | 
} 
 | 
  
 | 
if [ $# -ne 4 ]; then 
 | 
    echo "Error: Incorrect number of arguments" 
 | 
    usage 
 | 
fi 
 | 
  
 | 
TUID=$1 
 | 
GID=$2 
 | 
COUNT=$3 
 | 
STAGING_BINDIR_NATIVE=$4 
 | 
  
 | 
TUNCTL=$STAGING_BINDIR_NATIVE/tunctl 
 | 
if [[ ! -x "$TUNCTL" || -d "$TUNCTL" ]]; then 
 | 
    echo "Error: $TUNCTL is not an executable" 
 | 
    usage 
 | 
fi 
 | 
  
 | 
if [ $EUID -ne 0 ]; then 
 | 
    echo "Error: This script must be run with root privileges" 
 | 
    exit 
 | 
fi 
 | 
  
 | 
SCRIPT_DIR=`dirname $0` 
 | 
RUNQEMU_IFUP="$SCRIPT_DIR/runqemu-ifup" 
 | 
if [ ! -x "$RUNQEMU_IFUP" ]; then 
 | 
    echo "Error: Unable to find the runqemu-ifup script in $SCRIPT_DIR" 
 | 
    exit 1 
 | 
fi 
 | 
  
 | 
IFCONFIG=`which ip 2> /dev/null` 
 | 
if [ -z "$IFCONFIG" ]; then 
 | 
    # Is it ever anywhere else? 
 | 
    IFCONFIG=/sbin/ip 
 | 
fi 
 | 
if [ ! -x "$IFCONFIG" ]; then 
 | 
       echo "$IFCONFIG cannot be executed" 
 | 
       exit 1 
 | 
fi 
 | 
  
 | 
if [ $COUNT -ge 0 ]; then 
 | 
    # Ensure we start with a clean slate 
 | 
    for tap in `$IFCONFIG link | grep tap | awk '{ print \$2 }' | sed s/://`; do 
 | 
        echo "Note: Destroying pre-existing tap interface $tap..." 
 | 
        $TUNCTL -d $tap 
 | 
    done 
 | 
    rm -f /etc/runqemu-nosudo 
 | 
else 
 | 
    echo "Error: Incorrect count: $COUNT" 
 | 
    exit 1 
 | 
fi 
 | 
  
 | 
if [ $COUNT -gt 0 ]; then 
 | 
    echo "Creating $COUNT tap devices for UID: $TUID GID: $GID..." 
 | 
    for ((index=0; index < $COUNT; index++)); do 
 | 
        echo "Creating tap$index" 
 | 
        ifup=`$RUNQEMU_IFUP $TUID $GID $STAGING_BINDIR_NATIVE 2>&1` 
 | 
        if [ $? -ne 0 ]; then 
 | 
            echo "Error running tunctl: $ifup" 
 | 
            exit 1 
 | 
        fi 
 | 
    done 
 | 
  
 | 
    echo "Note: For systems running NetworkManager, it's recommended" 
 | 
    echo "Note: that the tap devices be set as unmanaged in the" 
 | 
    echo "Note: NetworkManager.conf file. Add the following lines to" 
 | 
    echo "Note: /etc/NetworkManager/NetworkManager.conf" 
 | 
    echo "[keyfile]" 
 | 
    echo "unmanaged-devices=interface-name:tap*" 
 | 
  
 | 
    # The runqemu script will check for this file, and if it exists, 
 | 
    # will use the existing bank of tap devices without creating 
 | 
    # additional ones via sudo. 
 | 
    touch /etc/runqemu-nosudo 
 | 
fi 
 |