Skip to main content

IT - Virtualization - Supporting Scripts

Supporting scripts

Table of Contents

Build environment

ConvertFromTextToHtmlCodeBox.sh

#!/bin/bash

#=====================================================================================
OutputDetailsHeader() {
  if [[ $fDetail -eq 1 ]]; then
    cat <<EOF
<details>
  <summary style="background-color: #fdf6e3; border-color: red; border-radius: 0px; border-style: solid; line-height: 1; padding-bottom: 0em; padding-left: 0.3em; padding-top: 0em;">
    Click here to see a run example<span class="icon">👇</span>
  </summary>
EOF
  fi
}

#=====================================================================================
OutputFileHeader() {
  if [[ $fFileName -eq 1 ]]; then
    declare sPath="$1"
    declare sFilename="$2"
    [[ -z "${sPath}" ]] && sPath="."
    [[ -z "${sFilename}" ]] && sFilename=stdin
    cat <<EOF
  <div style="font-size: small; line-height: 1; text-align: right;">
    <br />
    <span style="font-family: courier; font-style: italic; line-height: 1; text-align: right;">
      ${sPath}
    </span>
    <br />
    <span style="font-weight: bold;">
      ${sFilename}
    </span>
    <br />
    <br />
  </div>
EOF
  fi
}

#=====================================================================================
OutputFileContents() {
cat <<EOF
  <div style="background-color: #FDF6E3; border-style: solid; border-radius: 10px; border-color: blue; color: black; line-height: 1; padding-top: 0em; padding-left: 0.3em; padding-bottom: 0em; text-align: left;">
    <span style="font-family: courier; font-size: small;">
EOF
#Result	Description	Entity Name	Entity Number	Try it
#non-breaking space	&nbsp;	&#160;
#<	less than	&lt;	&#60;
#>	greater than	&gt;	&#62;
#&	ampersand	&amp;	&#38;
#"	double quotation mark	&quot;	&#34;
#'	single quotation mark (apostrophe)	&apos;	&#39;
#¢	cent	&cent;	&#162;
#£	pound	&pound;	&#163;
#¥	yen	&yen;	&#165;
#€	euro	&euro;	&#8364;
#©	copyright	&copy;	&#169;
#®	registered trademark	&reg;	&#174;
sed 's/&/\&amp;/g;
         s/"/\&quot;/g;
         s/</\&lt;/g;
         s/>/\&gt;/g;
         s/\\/\&bsol;/g ;
         s/ /\&nbsp;/g ;
     1 s/^/<pre>/ ;
     $ s/$/<\/pre>/' < <(
  [[ -z "$1" ]] && cat
  [[ ! -z "$1" ]] && cat "$1"
)
  cat <<EOF
    </span>
  </div>
EOF

}

#=====================================================================================
OutputFileFooter() {
  : nothing
}

#=====================================================================================
OutputDetailsFooter() {

[[ $fDetail -eq 1 ]] && echo "</details>"

}

#=====================================================================================
fDetail=1
fFileName=1

while [[ $# -gt 0 ]]; do
  case "$1" in
  --help | -h)
    echo "
Syntax: $0 [options] input-file-name
Where options are:
  -h | --help     Display this help page
  --no-detail     Do not generate the <details> tag
  --no-file-name  Do not generate output for the file name
"
    exit
    ;;
  --h1) ;;
  --h2) ;;
  --id) shift ;;
  --no-detail) fDetail=0 ;;
  --no-file-name) fFileName=0 ;;
  -*) echo "Option $1 is unknown"
     exit ;;
  -- | *) break ;;
  esac
  shift
done

if [[ -z "$1" ]]; then
  sPath="."
  sFilename="-"
else
  sPath="$(dirname "$1")"
  sFilename="$(basename "$1")"
fi

OutputDetailsHeader 
OutputFileHeader "${sPath}" "${sFilename}"
OutputFileContents "${1}"
OutputFileFooter
OutputDetailsFooter

CreateGuestDirectory.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0) $*"
#echo "${SCRIPT_DIR}"

ShowHelp() {
  echo "
$(basename "$1") [options] emulator-name guest-hardware guest-os
Where options are:
  --           Stop processing options
  -h | --help  Show this help and exit
  --virt-eng   Name of the virtualization program
               SimH
  --guest-hw   Guest simulator platform hardware
  --guest-os   Guest simulator OS
For SimH
  --simh40     Use binaries from SimH 4.0 (Default)
  --simh41     Use binaries from SimH 4.1
"
}

ExitWithMessage() {
  echo "===> $*"
  exit
}

ExitWithErrorMessage() {
  ExitWithMessage "ERROR: $*"
}

sEmuName=
sGuestHw=
sGuestOs=
sSimHVersion=4.0
[[ "$(uname -s)" == CYGWIN* ]] && sRootEmulatorsDirectory=/cygdrive/f/
[[ "$(uname -s)" == Linux*  ]] && sRootEmulatorsDirectory=/Volumes/vol000/
[[ "$(uname -s)" == Darwin* ]] && sRootEmulatorsDirectory=~/Desktop/

while [[ $# -gt 0 ]]; do
  case "$1" in
  --virt-eng) shift ; sEmuName=$1 ;;
  --guest-hw) shift ; sGuestHw=$1 ;;
  --guest-os) shift ; sGuestOs=$1 ;;
  --simh40)
    sSimHVersion=4.0
    ;;
  --simh41)
    sSimHVersion=4.1
    ;;
  --help | -h)
    ShowHelp
    exit
    ;;        
  -- | *) 
    break
    ;;
  esac
  shift
done
[[ -z "${sRootEmulatorsDirectory}" ]] && ExitWithErrorMessage "sRootEmulatorsDirectory not defined"
[[ -z "${sEmuName}" ]] && ExitWithErrorMessage "No Virtualization Engine defined"
[[ -z "${sGuestHw}" ]] && ExitWithErrorMessage "No Guest Hardware Platform defined"
[[ -z "${sGuestOs}" ]] && ExitWithErrorMessage "No Guest OS defined"

mkdir -p "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/"
mkdir -p "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/mirror/"
mkdir -p "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/"
mkdir -p "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/${sGuestHw}_${sGuestOs}/"
mkdir -p "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/by-platform/"
mkdir -p "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/by-platform/${sGuestHw}/"
mkdir -p "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/by-os/"
mkdir -p "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/by-os/${sGuestOs}/"

( cd "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/by-platform/${sGuestHw}/"
  [[ -h "${sGuestOs}" ]] && rm "${sGuestOs}"
  ln -sf "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/${sGuestHw}_${sGuestOs}" "${sGuestOs}"
)

( cd "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/by-os/${sGuestOs}"
  [[ -h "${sGuestHw}" ]] && rm "${sGuestHw}"
  ln -sf "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/${sGuestHw}_${sGuestOs}" "${sGuestHw}" 
)

case "${sEmuName}" in
SimH)
  cd "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/mirror/"
  unset sBinName
  if [[ "$(uname -s)" == CYGWIN* ]]; then
    EXE=.exe
  else
    EXE=
  fi
  if [[ ${sSimHVersion} == 4.0 ]]; then
    [[ ! -d simh-4.0/BIN ]] && ExitWithErrorMessage "ERROR: Cannot find directory 'simh-4.0/BIN'. Did you download the package from https://github.com/simh/simh/suites/11977682803/artifacts/628547788?"

    case "${sGuestHw}" in
    pdp-11)        sBinName=PDP11 ;;
    microvax-3900) sBinName=MicroVAX3900 ;;
    vax-11-750)    sBinName=VAX750 ;;
    vax-11-780)    sBinName=VAX780 ;;
    vax-8600)      sBinName=VAX8600 ;;
    *)
      ExitWithErrorMessage "No process define yet for '${sGuestHw}' under '${sEmuName} 4.0'"
      ;;
    esac
    cd simh-4.0
    chmod a+x BIN/*
  elif [[ ${$sSimHVersion} == 4.1 ]]; then
    if [[ -d simh-4.1 ]]; then
      ( cd simh-4.1 && git fetch --all -v )
    else
      git clone https://github.com/open-simh/simh.git simh-4.1
    fi
    echo "
===> Compiling and testing the simulator for '${sGuestHw}'
"
    case "${sGuestHw}" in
    pdp-11)        sBinName=pdp11 ;;
    microvax-3900) sBinName=microvax3900 ;;
    vax-11-750)    sBinName=vax750 ;;
    vax-11-780)    sBinName=vax780 ;;
    vax-8600)      sBinName=vax8600 ;;
    *)
      ExitWithErrorMessage "No process define yet for '${sGuestHw}' under '${sEmuName} 4.1'"
      ;;
    esac
  fi
  [[ -z "${sBinName}" ]] && ExitWithErrorMessage "no binary program name defined for guest '${sGuestHw}'"

  if [[ $sSimHVersion == 4.1 ]]; then
    if [[ $(uname -s) == CYGWIN* ]]; then
      [[ -d windows-build-windows-build ]] && mv windows-build-windows-build windows-build
      if [[ -d windows-build && -f windows-build/winpcap/WpdPack/Include/pcap.h ]]; then
        : # do nothing
      else
        if [[ ! -f windows-build.zip ]]; then
          echo "===> Downloading pcap for Windows"
          wget --quiet https://github.com/simh/windows-build/archive/windows-build.zip
        fi
        [[ -f windows-build.zip ]] && 7z x -y windows-build.zip
        [[ -d windows-build-windows-build ]] && mv windows-build-windows-build windows-build
      fi
      [[ ! -f windows-build/winpcap/WpdPack/Include/pcap.h ]] && ExitWithErrorMessage "Cannot retrieve the pcap for the Windows build"
    fi

    cd simh-4.1 && make ${sBinName}
    if [[ ! -x ./BIN/${sBinName} ]]; then
      if [[ ${sBinName} == microvax3900 && -x ./BIN/vax ]]; then
        echo "===> WARNING: executable not present. Creating new copy from base guest machine"
        cp BIN/vax${EXE} BIN/${sBinName}${EXE}
      else
        ExitWithErrorMessage "Cannot find binary."
      fi
    fi
  fi

  [[ ! -x "./BIN/${sBinName}${EXE}" ]] && ExitWithErrorMessage "cannot find executable '$(pwd)/./BIN/${sBinName}${EXE}'" 
  ./BIN/${sBinName}

  cd "${sRootEmulatorsDirectory}/Emulators/${sEmuName}/guests/${sGuestHw}_${sGuestOs}/"
  ln -sf ../../mirror/simh-${sSimHVersion}/BIN/${sBinName}${EXE} ${sBinName}-${sSimHVersion}
  echo "===> Test run for the simulator link inside the guest base directory"
  ./${sBinName}-${sSimHVersion}
  ;;
*)
  ExitWithErrorMessage "No process defined yet for '${sEmuName}'"
  ;;
esac
echo
echo "==> Contents of guest directory"
echo
ls 
echo "

Execute the line below to change to your guest base directory

cd '$(pwd)'
"

CreateMyTapInterface.sh

#!/bin/bash

while [[ $# -gt 0 ]]; do
  case "$1" in
  --)
    # stop processing parameters
    break
    ;;
  --help | -h)
    echo "
$(basename "$0"): [options] virtualization-program [vendor] tap-id
Where virtualization-program can be:
  simh    SimH. You need to provide the vendor. Valid values are:
                dec : PDP, VAX, MicroVAX

Where options are:
  --help | -h    This help screen
"
    exit
    ;;
  *)
    break
    ;;
  esac
  shift
done

fErr=1
[[ "$1" == simh && $# -eq 3 ]] && fErr=0
[[ ${fErr} -eq 1 && $# -eq 2 ]] && fErr=0
if [[ ${fErr}  -eq 1 ]]; then
  echo "ERROR: Number of parameters ($#) for '$1' is wrong."
  exit
fi

sVirt="$1"
sTapId="$2"
sVirtTapBase=""
sOUI=""
sNicId=""
case "${sVirt}" in
simh)
  # 08:00:2B:5A:71:E1
  sVirtTapBase="mytap_simh"
  sOUI=""
  case "$2" in
  dec)
    sOUI="08002B"
    ;;
  *)
    echo "ERROR: SimH: Invalid vendor '$2'"
    exit
    ;;
  esac
  sNicId="000000${3}"
  sNicId=${sNicId: -6}
  ;;
*)
  echo "ERROR: Unknown virtualization program '${sVirt}'"
  exit
  ;;
esac

sOUI=$(echo $sOUI|tr '[[:lower:]]' '[[:upper:]]')
sNicId=$(echo $sNicId|tr '[[:lower:]]' '[[:upper:]]')
case "$(uname -s)" in
CYGWIN*)
  if [[ ! -x "/cygdrive/c/Program Files/OpenVPN/bin/openvpn" ]]; then
    echo "ERROR: OpenVPN is not installed"
    exit
  fi
  ;;
esac

echo "Tap interface name is '${sVirtTapBase}_${sOUI}_${sNicId}'"

case "$(uname -s)" in
CYGWIN*)

  wmic nic where '(NetConnectionId="'${sVirtTapBase}_${sOUI}_${sNicId}'")' get
exit

  if [[ $(/cygdrive/c/Program\ Files/OpenVPN/bin/openvpn --show-adapters | grep -c "'${sVirtTapBase}_${sOUI}_${sNicId}'") -eq 0 ]]; then
    cat <<EOF

  Create a tap interface called '${sVirtTapBase}_${sOUI}_${sNicId}'

  Open a cmd session as administrator and execute the following command:

  "c:\Program Files\OpenVPN\bin\tapctl.exe" create --name "${sVirtTapBase}_${sOUI}_${sNicId}" --hwid root\tap0901

  1) After adding to the bridge, the 'Network Connections' page is *not* automatically refreshed. You need to press F5 and confirm that the interface is type is "Network Bridge"
  2) Please double check that the new tap interface is associated to 'TAP-Windows Adapter V9'
EOF
  else
    cat <<EOF

  There is already a tap interface with this name.
EOF
  fi
  cat <<EOF

  There is no CLI way to identify if this interface is already member of the network bridge. I will open the 'Control Panel\Network and Internet\Network Connections'. Please right clich the interface and then click "Add to bridge". Afther this is done, please press ENTER to continue.


EOF
  cmd /c ncpa.cpl
  read -p 'Press ENTER to continue: '

  sSimHGuest=""
  [[ -x microvax3900-4.1 ]] && sSimHGuest=microvax3900-4.1

  /cygdrive/c/Program\ Files/OpenVPN/bin/openvpn --show-adapters | grep "'${sVirtTapBase}_${sOUI}_${sNicId}'"|awk '{print $2}'
  printf 'show xq eth\nexit' > .tmp.$$.ini
  ./${sSimHGuest} .tmp.$$.ini
  rm .tmp.$$.ini
  ;;
*)
  echo "$(uname -s): I have no idea how to proceed...."
  exit
  ;;
esac

case "${sVirt}" in
simh)
  cat <<EOF

  Add the following lines to your SimH .ini file

  For a MicroVAX3900

    ; Network Interface
    set xq enable
    ; Attention: If it fails with DELQA-T, try DELQA. The other option is DEQNA, which is the oldest board type
    set xq type=delqa-t
    set xq mac=${sOUI:0:2}:${sOUI:2:2}:${sOUI:4:2}:${sNicId:0:2}:${sNicId:2:2}:${sNicId:4:2}
    attach xq ...
EOF
  ;;
*)
  echo "${sVirt}: I have no idea what to suggest"
  ;;
esac

GenerateHtmlFromAllSupportingScripst.sh

#!/bin/bash

[[ -f /tmp/$$.tmp ]] && rm /tmp/$$.tmp
touch /tmp/$$.tmp

cat >> /tmp/$$.tmp <<EOF
<h1 style="text-align: left;">Supporting scripts</h1>
<h2 style="text-align: left;">Table of Contents</h2>
<ul>
EOF

c=1
for f in *.sh; do
  echo "<li><a href=\"#chapter-id-${c}\">${f}</a></li>" >>/tmp/$$.tmp
  ((c++))
done

cat >>/tmp/$$.tmp <<EOF
</ul>

<h2 style="text-align: left;">Build environment</h2>
EOF

c=1
for f in *.sh; do
  echo $f
  cat >>/tmp/$$.tmp <<EOF
<h3 id="“chapter-id-${c}”" style="text-align: left;">${f}</h3>
EOF
  ./ConvertFromTextToHtmlCodeBox.sh --no-file-name --no-detail $f >> /tmp/$$.tmp
  ((c++))
done 

case $(uname -s) in
CYGWIN*) cat /tmp/$$.tmp > /dev/clipboard ;;
#Darwin*)
#Linux*)
esac

rm /tmp/$$.tmp

simh.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0) $*"
"${SCRIPT_DIR}/CreateGuestDirectory.sh" --virt-eng SimH $*

simh_3bsd_vax-11-780.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-11-780.sh" 3bsd

simh_4-1bsd_vax-11-780.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-11-780.sh" 4-1bsd

simh_4-2bsd_vax-11-780.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-11-780.sh" 4-2bsd

simh_4-3bsd-reno_vax-11-780.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-11-780.sh" 4-3bsd-reno

simh_4-3bsd_vax-11-780.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-11-780.sh" 4-3bsd

simh_4bsd_vax-11-780.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-11-780.sh" 4bsd

simh_microvax-3900.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0) $*"
"${SCRIPT_DIR}/simh.sh" --guest-hw microvax-3900 $*

simh_pdp-11.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0) Guest OS: $1"
"${SCRIPT_DIR}/simh.sh" pdp-11 "$1"

simh_ultrix-1.0_vax-11-780.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-11-780.sh" --guest-os ultrix-1.0 $*

simh_ultrix-1.1_vax-11-780.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-11-780.sh" --guest-os ultrix-1.1 $*

simh_ultrix-2.0_vax-11-780.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-11-780.sh" --guest-os ultrix-2.0 $*

simh_ultrix-3.0_microvax-3900.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_microvax-3900.sh" ultrix-3.0

simh_ultrix-3.1_pdp-11.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_pdp-11.sh" ultrix-3.1

simh_ultrix-4.0_microvax-3900.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_microvax-3900.sh" --guest-os ultrix-4.0 $*

simh_ultrix-4.0_vax-8600.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-8600.sh" ultrix-4.0

simh_ultrix-4.2_microvax-3900.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_microvax-3900.sh" --guest-os ultrix-4.2 $*

simh_ultrix-4.5_microvax-3900.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_microvax-3900.sh" --guest-os ultrix-4.5 $*

simh_vax-11-750.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0) Guest OS: $1"
"${SCRIPT_DIR}/simh.sh" vax-11-750 "$1"

simh_vax-11-780.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0) $*"
"${SCRIPT_DIR}/simh.sh" --guest-hw vax-11-780 $*

simh_vax-8600.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0) Guest OS: $1"
"${SCRIPT_DIR}/simh.sh" vax-8600 "$1"

simh_vm2-2.0_vax-11-750.sh

#!/bin/bash

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
echo "($0)"
"${SCRIPT_DIR}/simh_vax-11-750.sh" vms-2.0

Comments

Popular posts from this blog

Movies - Deadpool & Wolverine (2024)

 

TV Mini-serie - Lady in the Lake (2024)

 

Movie - The Gorge (2025)

  My views For 80 years everything was ok ... until they sent a woman For sure is DTV ... really bad Inside the gorge is clearly designed and written by a gamer Plot Two elite  snipers  receive identical missions: travel to an undisclosed location and guard the West and East sides of a deep gorge for one year without any contact with the outside world nor their counterpart on the opposite side. Levi Kane, a former  U.S. Marine  and current  private contractor  accepts the offer to guard the West tower. Drasa, a  Lithuanian  covert operative frequently employed by the  Kremlin , agrees to guard the East side. Upon arriving, Levi relieves his predecessor, J.D., a  British   Royal Marine  of duty and asks for specifics about the mission. J.D. explains that in addition to the towers on the East and West, there are automated turret defenses to the North and South, a powerful signal ‘ cloak ,’ and  explosives on the walls ...