mirror of
https://github.com/pocopico/tinycore-redpill.git
synced 2025-09-15 12:51:13 +08:00
2817 lines
106 KiB
Bash
2817 lines
106 KiB
Bash
#!/usr/bin/sudo bash
|
|
|
|
###### VARIABLES
|
|
|
|
HOMEPATH="/home/tc"
|
|
TEMPPAT="${HOMEPATH}/temppat"
|
|
CONFIGFILES="${HOMEPATH}/config"
|
|
CUSTOMCONFIG="${HOMEPATH}/custom_config2.json"
|
|
PATCHEXTRACTOR="${HOMEPATH}/patch-extractor"
|
|
THISURL="index.sh"
|
|
BUILDLOG="/home/tc/html/buildlog.txt"
|
|
USERCONFIGFILE="/home/tc/user_config.json"
|
|
TOOLSPATH="https://raw.githubusercontent.com/pocopico/tinycore-redpill/main/tools/"
|
|
SCRIPTREPO="https://github.com/pocopico/tinycore-redpill/raw/main/html/index.sh"
|
|
#extensionrepofile="https://github.com/pocopico/rp-ext/raw/main/redpill/rpext-index.json"
|
|
#extensionfile="rpext-index.json"
|
|
extensionrepofile="https://github.com/pocopico/tcrp-addons/raw/main/addons.json"
|
|
extensionfile="addons.json"
|
|
TOOLS="bspatch bzImage-to-vmlinux.sh calc_run_size.sh crc32 dtc kexec ramdisk-patch.sh vmlinux-to-bzImage.sh xxd zimage-patch.sh kpatch zImage_template.gz grub-editenv"
|
|
SCRIPTVERSION="0.10.4"
|
|
|
|
#. ${HOMEPATH}/include/config.sh
|
|
############################################
|
|
|
|
function versionhistory() {
|
|
|
|
cat <<EOF
|
|
<h3> TCRP HTML, Version History : </h3>
|
|
<br> 0.10.0, Initial release, most models tested and booted.
|
|
<br> 0.10.1, Added file download functions to the web interface, fixed some bugs.
|
|
<br> 0.10.2, Fixed some bugs, added more models.
|
|
<br> 0.10.3, Added full image backup function
|
|
<br> 0.10.4, Fixed long standing issue with the corruption of the user_config.json file.
|
|
<br>
|
|
|
|
EOF
|
|
|
|
latestscript
|
|
|
|
}
|
|
|
|
function pagehead() {
|
|
|
|
cat <<EOF
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Bootstrap, from Twitter</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta name="description" content="">
|
|
<meta name="author" content="">
|
|
|
|
<!-- Le styles -->
|
|
<link href="assets/css/bootstrap.css" rel="stylesheet">
|
|
<style>
|
|
body {
|
|
padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */
|
|
}
|
|
</style>
|
|
<link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
|
|
<link href="assets/css/tcrp.css" rel="stylesheet">
|
|
|
|
|
|
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
|
<!--[if lt IE 9]>
|
|
<script src="assets/js/html5shiv.js"></script>
|
|
<![endif]-->
|
|
|
|
<!-- Fav and touch icons -->
|
|
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
|
|
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
|
|
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
|
|
<link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
|
|
<link rel="shortcut icon" href="assets/ico/favicon.png">
|
|
</head>
|
|
|
|
<body>
|
|
|
|
EOF
|
|
}
|
|
function checkmachine() {
|
|
|
|
if grep -q ^flags.*\ hypervisor\ /proc/cpuinfo; then
|
|
MACHINE="VIRTUAL"
|
|
HYPERVISOR=$(dmesg | grep -i "Hypervisor detected" | awk '{print $5}')
|
|
echo "Machine is $MACHINE Hypervisor=$HYPERVISOR" | tee -a $BUILDLOG >/dev/null
|
|
fi
|
|
|
|
}
|
|
|
|
function usbidentify() {
|
|
|
|
checkmachine
|
|
|
|
if [ "$MACHINE" = "VIRTUAL" ]; then
|
|
vendorid="0x46f4"
|
|
productid="0x0001"
|
|
echo "Running on $HYPERVISOR, setting USB VID and PID,to $productid:$vendorid" | tee -a $BUILDLOG >/dev/null
|
|
return
|
|
fi
|
|
|
|
loaderdisk=$(mount | grep -i optional | grep cde | awk -F / '{print $3}' | uniq | cut -c 1-3)
|
|
|
|
lsusb -v 2>&1 | grep -B 33 -A 1 SCSI >/tmp/lsusb.out
|
|
|
|
usblist=$(grep -B 33 -A 1 SCSI /tmp/lsusb.out)
|
|
vendorid=$(grep -B 33 -A 1 SCSI /tmp/lsusb.out | grep -i idVendor | awk '{print $2}')
|
|
productid=$(grep -B 33 -A 1 SCSI /tmp/lsusb.out | grep -i idProduct | awk '{print $2}')
|
|
|
|
if [ $(echo $vendorid | wc -w) -gt 1 ]; then
|
|
echo "Found more than one USB disk devices, please select which one is your loader on" | tee -a $BUILDLOG >/dev/null
|
|
usbvendor=$(for item in $vendorid; do grep $item /tmp/lsusb.out | awk '{print $3}'; done)
|
|
select usbdev in $usbvendor; do
|
|
vendorid=$(grep -B 10 -A 10 $usbdev /tmp/lsusb.out | grep idVendor | grep $usbdev | awk '{print $2}')
|
|
productid=$(grep -B 10 -A 10 $usbdev /tmp/lsusb.out | grep -A 1 idVendor | grep idProduct | awk '{print $2}')
|
|
echo "Selected Device : $usbdev , with VendorID: $vendorid and ProductID: $productid" | tee -a $BUILDLOG >/dev/null
|
|
break
|
|
done
|
|
else
|
|
usbdevice="$(grep iManufacturer /tmp/lsusb.out | awk '{print $3}') $(grep iProduct /tmp/lsusb.out | awk '{print $3}') SerialNumber: $(grep iSerial /tmp/lsusb.out | awk '{print $3}')"
|
|
fi
|
|
|
|
if [ -n "$usbdevice" ] && [ -n "$vendorid" ] && [ -n "$productid" ]; then
|
|
echo "Found $usbdevice" | tee -a $BUILDLOG >/dev/null
|
|
echo "Vendor ID : $vendorid Product ID : $productid" | tee -a $BUILDLOG >/dev/null
|
|
else
|
|
echo "Sorry, no usb disk could be identified" | tee -a $BUILDLOG >/dev/null
|
|
rm /tmp/lsusb.out
|
|
fi
|
|
}
|
|
|
|
function staticip() {
|
|
|
|
ipset=$(cat $USERCONFIGFILE | jq -r -e ' .ipsettings .ipset')
|
|
ipaddr=$(cat $USERCONFIGFILE | jq -r -e ' .ipsettings .ipaddr')
|
|
ipgw=$(cat $USERCONFIGFILE | jq -r -e ' .ipsettings .ipgw')
|
|
ipdns=$(cat $USERCONFIGFILE | jq -r -e ' .ipsettings .ipdns')
|
|
ipproxy=$(cat $USERCONFIGFILE | jq -r -e ' .ipsettings .ipproxy')
|
|
|
|
cat <<EOF
|
|
<div class="staticip">
|
|
<div class="title-bar">
|
|
<h3>Static IP Form</h3>
|
|
</div>
|
|
<div class="content">
|
|
|
|
<form id="staticip" action="/${THISURL}?action=staticipset" class="form-horizontal" align="left" method="POST">
|
|
<div class="control-group">
|
|
<label class="control-label" for="ipset">IP Setting</label>
|
|
<div class="controls">
|
|
<input id="ipset" name="ipset" value="$ipset" placeholder='static/dhcp' required />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="ipaddr">IP Address</label>
|
|
<div class="controls">
|
|
<input id="ipaddr" name="ipaddr" value="$ipaddr" placeholder='xxx.xxx.xxx.xxx' required pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$" />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="ipgw">Gateway</label>
|
|
<div class="controls">
|
|
<input id="ipgw" name="ipgw" value="$ipgw" placeholder='xxx.xxx.xxx.xxx' required pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$" />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="ipdns">DNS</label>
|
|
<div class="controls">
|
|
<input id="ipdns" name="ipdns" value="$ipdns" placeholder='xxx.xxx.xxx.xxx' requrequired pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$"ired />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="ipproxy">HTTP proxy</label>
|
|
<div class="controls">
|
|
<input id="ipproxy" name="ipproxy" value="$ipproxy" placeholder='xxx.xxx.xxx.xxx' pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$" />
|
|
</div>
|
|
</div>
|
|
<br><br><button id="staticipset" class="btn btn-lg btn-success btn-left">Save Settings</button>
|
|
</form>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
function staticipset() {
|
|
|
|
echo "$POST"
|
|
|
|
updateuserconfigfield "ipsettings" "ipset" "$ipset"
|
|
updateuserconfigfield "ipsettings" "ipaddr" "$ipaddr"
|
|
updateuserconfigfield "ipsettings" "ipgw" "$ipgw"
|
|
updateuserconfigfield "ipsettings" "ipdns" "$ipdns"
|
|
updateuserconfigfield "ipsettings" "ipproxy" "$ipproxy"
|
|
|
|
}
|
|
|
|
function mountshare() {
|
|
|
|
cat <<EOF
|
|
<div class="mountshare">
|
|
<div class="title-bar">
|
|
<h3>Mount Share</h3>
|
|
</div>
|
|
<div class="content">
|
|
|
|
<form id="mountshare" action="/${THISURL}?action=mountshare&share=$share&mountpoint=$mountpoint&cifsuser=$cifsuser&cifspass=$cifspass" class="form-horizontal" align="left" method="POST">
|
|
<div class="control-group">
|
|
<label class="control-label" for="share">Share</label>
|
|
<div class="controls">
|
|
<input id="share" name="share" value="$share" placeholder='Share url e.g //192.168.1.100/tcrpshare' required />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="mountpoint">Mount Point</label>
|
|
<div class="controls">
|
|
<input id="mountpoint" name="mountpoint" value="$mountpoint" placeholder='/home/tc/mountpoint' required />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="cifsuser">User Name</label>
|
|
<div class="controls">
|
|
<input id="cifsuser" name="cifsuser" value="$cifsuser" placeholder='usename' required />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="cifspass">Password</label>
|
|
<div class="controls">
|
|
<input id="cifspass" name="cifspass" value="$cifspass" placeholder='password' required />
|
|
</div>
|
|
</div>
|
|
EOF
|
|
|
|
if [ ! -z $share ] && [ ! -z $mountpoint ] && [ ! -z $cifsuser ] && [ ! -z $cifspass ]; then
|
|
mkdir -p $mountpoint
|
|
echo -e "username=$cifsuser\npassword=$cifspass" >/home/tc/credentials
|
|
chmod 600 /home/tc/credentials
|
|
sudo /usr/local/sbin/mount.cifs "$share" "$mountpoint" -o credentials=/home/tc/credentials --verbose
|
|
if [ $(mount | grep "$mountpoint" | wc -l) -gt 0 ]; then
|
|
echo "<button id='mounted' class='btn btn-lg btn-success btn-left'>mounted</button>"
|
|
else
|
|
echo "<button id='mounted' class='btn btn-lg btn-danger btn-left'>Not mounted</button>"
|
|
fi
|
|
else
|
|
echo ""
|
|
fi
|
|
|
|
cat <<EOF
|
|
|
|
<button id="mountthisshare" class="btn btn-lg btn-success btn-left">Mountshare</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
EOF
|
|
|
|
rm -rf /home/tc/credentials
|
|
|
|
}
|
|
|
|
function filemanagement() {
|
|
|
|
getvars
|
|
|
|
SYNOMODEL="$(echo $MODEL | sed -s 's/+/p/g' | tr '[:upper:]' '[:lower:]')"
|
|
REVISION="$(echo "${VERSION}" | awk -F- '{print $2}')"
|
|
patfile="${SYNOMODEL}_${REVISION}.pat"
|
|
unencpatfile="${SYNOMODEL}_${REVISION}.pat-unenc"
|
|
cat <<EOF
|
|
<div class="filemanagement">
|
|
<div class="title-bar">
|
|
<h3>Files Download</h3>
|
|
</div>
|
|
<table class="table table-dark">
|
|
<thead><tr><th title="Field #1">Filename</th>
|
|
<th title="Field #2">Description</th>
|
|
<th title="Field #3">Link</th>
|
|
</tr></thead>
|
|
<tbody><tr>
|
|
EOF
|
|
|
|
testarchive /tmp/$patfile >/dev/null 2>&1
|
|
|
|
if [ "$isencrypted" == "yes" ]; then
|
|
echo " <td>Original downloaded PAT for $MODEL version $VERSION</td>"
|
|
echo " <td>Use that for the installation</td>"
|
|
echo " <td><a href=/assets/$patfile>$patfile</a></td>"
|
|
echo " </tr>"
|
|
|
|
fi
|
|
|
|
cat <<EOF
|
|
<td>Unencrypted PAT file for $MODEL version $VERSION</td>
|
|
<td>Keep that as a backup</td>
|
|
<td><a href=/assets/$unencpatfile>$unencpatfile</a></td>
|
|
</tr>
|
|
<td>User Config file for $MODEL version $VERSION</td>
|
|
<td>Keep that as a backup</td>
|
|
<td><a href=/assets/user_config.json>user_config.json</a></td>
|
|
</tr>
|
|
|
|
</tr></tbody></table>
|
|
|
|
</div>
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
function selectmodel() {
|
|
|
|
cat <<EOF
|
|
<form id="myform" method=POST action="/${THISURL}?action=build">
|
|
<select id="mymodel" name="mymodel">
|
|
EOF
|
|
echo "<option value=\"'Please Select Model\">Select Model</option>"
|
|
#for model in `getPlatforms`
|
|
for model in $(ls ${CONFIGFILES} | grep -v comm | sed -e 's/\///'); do
|
|
echo "<option value=\"'$model\">$model</option>"
|
|
done
|
|
cat <<EOF
|
|
</select>
|
|
</form>
|
|
<div id="output"></div>
|
|
EOF
|
|
|
|
}
|
|
|
|
function selectversion() {
|
|
|
|
getvars
|
|
|
|
cat <<EOF
|
|
<form id="myversion" method=POST action="/${THISURL}?action=build&mymodel=$MODEL&myversion=$VERSION">
|
|
<label for="mymodel">Model</label>
|
|
<input id="mymodel" name="mymodel" value="$MODEL" required readonly/>
|
|
<label for="myversion">Version</label>
|
|
<select id="myversion" name="myversion">
|
|
<option value="Please Select OS Version">Select version</option>
|
|
EOF
|
|
for version in $(ls ${CONFIGFILES}/$MODEL/ | grep -v comm | sed -e 's/\///'); do
|
|
echo "<option value=\"'$version\">$version</option>"
|
|
done
|
|
cat <<EOF
|
|
</select>
|
|
<input id="mymodel" name="mymodel" value="$MODEL" hidden required />
|
|
|
|
</form>
|
|
<div id="output"></div>
|
|
EOF
|
|
|
|
}
|
|
|
|
function urldecode {
|
|
local url_encoded="${1//+/ }"
|
|
printf '%b' "${url_encoded//%/\\x}"
|
|
}
|
|
|
|
function backuploader() {
|
|
|
|
getvars
|
|
|
|
[ -z "$1" ] && echo "Backing up loader and making current home dir persistent" || status "setstatus" "backuploader" "warn" "Backing up loader and making current home dir persistent"
|
|
|
|
HOMESIZE="$(du -sk . /home/tc/)"
|
|
TCRPFREESPACE="$(df -k | grep $tcrppart | awk '{print $4}')"
|
|
REMAINSPACE="$($TCRPFREESPACE-$HOMESIZE)"
|
|
|
|
if [ $remainspace -le 150000 ]; then
|
|
[ -z "$1" ] && wecho "Not enough space to backup" || status "backuploader" "warn" "Not enough space to backup"
|
|
|
|
else
|
|
[ -z "$1" ] && wecho "There is enough space to backup" || status "setstatus" "backuploader" "true" "There is enough space to backup"
|
|
[ -z "$1" ] && echo y | backup >/dev/null
|
|
[ -z "$1" ] && wecho "Backup File Date : $(ls -l /mnt/$tcrppart/mydata.tgz | awk '{print $6 " " $7 " " $8}')" || status "setstatus" "backuploader" "true" "Backup File Date : $(ls -l /mnt/$tcrppart/mydata.tgz | awk '{print $6 " " $7 " " $8}')"
|
|
[ -z "$1" ] && wecho "Backup File size is : $(ls -lh /mnt/$tcrppart/mydata.tgz | awk '{print $5}')" || status "setstatus" "backuploader" "true" "Backup File size is : $(ls -lh /mnt/$tcrppart/mydata.tgz | awk '{print $5}')"
|
|
fi
|
|
|
|
}
|
|
|
|
function imgbackuploader() {
|
|
|
|
loaderdisk="$(mount | grep -i optional | grep cde | awk -F / '{print $3}' | uniq | cut -c 1-3)"
|
|
tcrppart="$(mount | grep -i optional | grep cde | awk -F / '{print $3}' | uniq | cut -c 1-3)3"
|
|
homesize=$(du -sh /home/tc | awk '{print $1}')
|
|
backupdate="$(date +%Y-%b-%d-%H-%M)"
|
|
|
|
if [ ! -n "$loaderdisk" ] || [ ! -n "$tcrppart" ]; then
|
|
echo "No Loader disk or no TCRP partition found, return"
|
|
return
|
|
fi
|
|
|
|
wecho "Backing up current loader"
|
|
wecho "Checking backup folder existence"
|
|
|
|
[ ! -d /tmp/backup/${backupdate} ] && mkdir -p /tmp/backup/${backupdate}
|
|
|
|
wecho "Temporarily moving PAT files $(ls /mnt/${loaderdisk}3/auxfiles/*.pat) to /tmp/temppatdir"
|
|
mkdir -p /tmp/temppatdir
|
|
mv /mnt/${loaderdisk}3/auxfiles/*.pat /tmp/temppatdir/
|
|
|
|
availsize=$(df -m /mnt/sda3 | grep sda3 | awk '{print $4}')
|
|
wecho "Rezeroing free space on partition 3"
|
|
dd if=/dev/zero of=/mnt/${loaderdisk}3/zeros bs=1M count=$(($availsize - 1))
|
|
rm -f /mnt/${loaderdisk}3/zeros
|
|
|
|
wecho "Unmounting partition 1" && umount /dev/${loaderdisk}1
|
|
wecho "Unmounting partition 2" && umount /dev/${loaderdisk}2
|
|
wecho "Unmounting partition 3" && umount /dev/${loaderdisk}3
|
|
|
|
dd if=/dev/${loaderdisk} of=/tmp/backup/${backupdate}/tcrpimg-${backupdate}.img bs=1M
|
|
|
|
cd /tmp/backup/${backupdate} && 7z a -t7z -m0=lzma -mfb=64 -md=32m -ms=on /tmp/tcrpimg-${backupdate}.7z *
|
|
ln -s /tmp/tcrpimg-${backupdate}.7z /${HOMEPATH}/html/assets/tcrpimg-${backupdate}.7z
|
|
cd /tmp && rm -rf /tmp/backup/
|
|
|
|
wecho "Moving back PAT files to /mnt/${loaderdisk}3/auxfiles/"
|
|
mv /tmp/temppatdir/*.pat /mnt/${loaderdisk}3/auxfiles/
|
|
|
|
echo "<br> You can download the backup file : <a href=/assets/tcrpimg-${backupdate}.7z>tcrpimg-${backupdate}.7z</a></br>"
|
|
wecho "DONE"
|
|
|
|
}
|
|
|
|
function pagebody() {
|
|
cat <<EOF
|
|
|
|
<div class="navbar navbar-inverse bg-dark navbar-fixed-top">
|
|
<div class="navbar-inner">
|
|
<div class="container">
|
|
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
|
<span class="icon-bar"></span>
|
|
</button>
|
|
<a class="brand" href="${THISURL}?action=none">TinyCore RedPill</a>
|
|
<div class="nav-collapse collapse">
|
|
<ul class="nav">
|
|
<li><a href="/${THISURL}?action=build">Build</a></li>
|
|
<li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
Additional Actions
|
|
</a>
|
|
<ul class="dropdown-menu">
|
|
<li><a class=" dropdown-item" href="${THISURL}?action=filemanagement">Down/Upload Files</a></li>
|
|
<li><a class=" dropdown-item" href="${THISURL}?action=backuploader">Backup Loader</a></li>
|
|
<li><a class=" dropdown-item" href="${THISURL}?action=imgbackuploader">Image Backup Loader</a></li>
|
|
<li><a class=" dropdown-item" href="${THISURL}?action=fullupgrade">Full upgrade loader</a></li>
|
|
<li><a class=" dropdown-item" href="${THISURL}?action=cleanloader">Clean Loader </a></li>
|
|
<li><a class=" dropdown-item" href="${THISURL}?action=listplatforms">List Platforms</a><li>
|
|
<li><a class=" dropdown-item" href="${THISURL}?action=extensions">Extension Management</a><li>
|
|
<li><a class=" dropdown-item" href="${THISURL}?action=staticip">Static IP Setting</a><li>
|
|
<li><a class=" dropdown-item" href="${THISURL}?action=mountshare">Mount share</a><li>
|
|
<li><a class=" dropdown-item" href="${THISURL}?action=buildstatus">Last build status</a><li>
|
|
<hr class="dropdown-divider">
|
|
<li><a class="dropdown-item" href="${THISURL}?action=resetmodel" onclick="return confirm('About to reset the model are you sure?, this will permanently remove model info from /home/tc/user_config.json')" data-toggle="confirmation" data-title="Reset Model ?">Reset Model</a></li>
|
|
<hr class="dropdown-divider">
|
|
<li><a class="dropdown-item" href="${THISURL}?action=sysreboot" onclick="return confirm('About to reboot tinycore are you sure?')" data-toggle="confirmation" data-title="Reboot Tinycore ?">Reboot Tinycore</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="https://github.com/pocopico/tinycore-redpill">Tinycore Redpill Repo</a></li>
|
|
<li><a href="https://xpenology.com/forum/topic/53817-redpill-tinycore-loader/">Contact</a></li>
|
|
<li><a href="${THISURL}?action=versionhistory">Version ${SCRIPTVERSION}</a></li>
|
|
</ul>
|
|
|
|
</div><!--/.nav-collapse -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="container">
|
|
EOF
|
|
|
|
[ ! -z "$MODEL" ] && [ ! -z "$VERSION" ] && breadcrumb
|
|
|
|
}
|
|
|
|
function pagefooter() {
|
|
cat <<EOF
|
|
</div> <!-- /container -->
|
|
|
|
<!-- Le javascript
|
|
================================================== -->
|
|
<!-- Placed at the end of the document so the pages load faster -->
|
|
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/gh/xcash/bootstrap-autocomplete@v2.3.7/dist/latest/bootstrap-autocomplete.min.js"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js"></script>
|
|
|
|
|
|
|
|
<script src="assets/js/bootstrap-transition.js"></script>
|
|
<script src="assets/js/bootstrap-alert.js"></script>
|
|
<script src="assets/js/bootstrap-modal.js"></script>
|
|
<script src="assets/js/bootstrap-dropdown.js"></script>
|
|
<script src="assets/js/bootstrap-scrollspy.js"></script>
|
|
<script src="assets/js/bootstrap-tab.js"></script>
|
|
<script src="assets/js/bootstrap-tooltip.js"></script>
|
|
<script src="assets/js/bootstrap-popover.js"></script>
|
|
<script src="assets/js/bootstrap-button.js"></script>
|
|
<script src="assets/js/bootstrap-collapse.js"></script>
|
|
<script src="assets/js/bootstrap-carousel.js"></script>
|
|
<script src="assets/js/bootstrap-typeahead.js"></script>
|
|
<script src="assets/js/bootstrap-confirmation.js"></script>
|
|
|
|
<script>
|
|
|
|
\$(document).ready(function () {
|
|
console.log("document loaded");
|
|
|
|
\$('#myform').val("$MODEL");
|
|
\$('#mymodel').change( function() {
|
|
\$('#myform').submit();
|
|
\$.ajax({ // create an AJAX call...
|
|
data: \$(this).serialize(), // get the form data
|
|
type: \$(this).attr('method'), // GET or POST
|
|
url: \$(this).attr('action'), // the file to call
|
|
success: function(response) { // on success..
|
|
\$('#output').html(response); // update the DIV
|
|
}
|
|
});
|
|
console.log("form myform changed");
|
|
return false; // cancel original event to prevent form submitting
|
|
});
|
|
|
|
\$('#myversion').val("$VERSION");
|
|
\$('#myversion').change( function() {
|
|
\$('#myversion').submit();
|
|
\$.ajax({ // create an AJAX call...
|
|
data: \$(this).serialize(), // get the form data
|
|
type: \$(this).attr('method'), // GET or POST
|
|
url: \$(this).attr('action'), // the file to call
|
|
success: function(response) { // on success..
|
|
\$('#output').html(response); // update the DIV
|
|
}
|
|
});
|
|
console.log("form myversion changed");
|
|
return false; // cancel original event to prevent form submitting
|
|
});
|
|
|
|
\$('#addextbutton').click(function(){
|
|
|
|
\$.ajax({
|
|
data: \$(this).serialize(), // get the form data
|
|
data: { "exturl" : \$('#extensionlist').val(), "action" : "extadd", "platform" : \$('#myplatform').val()},
|
|
type: 'POST',
|
|
url: "/actions.sh?action=extadd&ext=" + \$('#extensionlist').val() + "&url=\$exturl&platform=\$MODEL", // the file to call
|
|
success: function(data) {
|
|
console.log("Button addextbutton pressed loading : \${location.href} " + \$('#extensionlist').val()) ;
|
|
|
|
\$("extensionmanagement").text(data);
|
|
location.reload();
|
|
}
|
|
});
|
|
|
|
});
|
|
\$('#remextbutton').click(function(){
|
|
|
|
\$.ajax({
|
|
data: \$(this).serialize(), // get the form data
|
|
// POST DATA IS SET BELOW
|
|
data: { "exturl" : \$('#extensionpayloadlist').val(), "action" : "extrem", "platform" : \$('#myplatform').val() },
|
|
type: 'POST',
|
|
url: "/actions.sh?action=extrem&ext=" + \$('#extensionlist').val() + "&url=\$exturl", // the file to call
|
|
success: function(data) {
|
|
console.log("Button remextbutton pressed removing : \${location.href} " + \$('#extensionlist').val()) ;
|
|
//alert(data);
|
|
\$("extensionmanagement").text(data);
|
|
location.reload();
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
\$('#manualextbutton').click(function(){
|
|
|
|
\$.ajax({
|
|
data: \$(this).serialize(), // get the form data
|
|
// POST DATA IS SET BELOW
|
|
data: { "exturl" : \$('#manualexturl').val(), "action" : "manualextadd", "platform" : \$('#myplatform').val() },
|
|
type: 'POST',
|
|
url: "/actions.sh?action=manualextadd&ext=" + \$('#manualexturl').val() + "&url=\$exturl&platform=\$mymodel", // the file to call
|
|
success: function(data) {
|
|
console.log("Button manualextbutton pressed adding : \${location.href} " + \$('#manualexturl').val()) ;
|
|
//alert(data);
|
|
\$("extensionmanagement").text(data);
|
|
location.reload();
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
\$('#autoextbutton').click(function(){
|
|
|
|
\$.ajax({
|
|
data: \$(this).serialize(), // get the form data
|
|
data: { "action" : "autoaddexts"},
|
|
type: 'POST',
|
|
url: "/index.sh?action=autoaddexts", // the file to call
|
|
success: function(data) {
|
|
console.log("Button autoaddextbutton pressed");
|
|
\$("extensionmanagement").text(data);
|
|
location.reload();
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
\$('#redpillmakebutton').click(function(){
|
|
|
|
\$.ajax({
|
|
data: \$(this).serialize(), // get the form data
|
|
data: { "action" : "redpillmake"},
|
|
type: 'POST',
|
|
url: "/index.sh?action=redpillmake", // the file to call
|
|
success: function(data) {
|
|
console.log("Button redpillmake pressed");
|
|
\$("buildform").text(data);
|
|
location.reload();
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
\$('#realmac').click(function(){
|
|
|
|
\$.ajax({
|
|
data: \$(this).serialize(), // get the form data
|
|
data: { "action" : "realmac"},
|
|
type: 'POST',
|
|
url: "/index.sh?action=realmac", // the file to call
|
|
success: function(data) {
|
|
console.log("Button realmac pressed");
|
|
\$("buildform").text(data);
|
|
location.reload();
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
\$('#staticipset').click(function(){
|
|
|
|
\$.ajax({
|
|
data: \$(this).serialize(), // get the form data
|
|
data: { "ipset" : \$('#ipset').val(),"ipaddr" : \$('#ipaddr').val(), "ipgw" : \$('#ipgw').val(), "ipdns" : \$('#ipdns').val(), "ipproxy" : \$('#ipproxy').val(),"action" : "staticipset"},
|
|
type: 'POST',
|
|
url: "/index.sh?action=staticipset", // the file to call
|
|
success: function(data) {
|
|
console.log("Button realmac pressed");
|
|
\$("staticipform").text(data);
|
|
location.reload();
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
\$('#buildstatus').hide();
|
|
|
|
loadstatus();
|
|
|
|
setInterval("loadstatus();",1000);
|
|
|
|
if (window.location.search.indexOf('action=buildstatus') === -1) {
|
|
console.log("no build status action");
|
|
\$('#buildlog').hide();
|
|
} else {
|
|
console.log("build status action");
|
|
\$('#buildlog').show();
|
|
\$('#buildstatus').show();
|
|
}
|
|
|
|
if (window.location.search.indexOf('action=build') === -1) {
|
|
console.log("no build action");
|
|
\$('#buildlog').hide();
|
|
} else {
|
|
console.log("build action");
|
|
\$('#buildlog').show();
|
|
|
|
}
|
|
|
|
if (window.location.search.indexOf('result=true') === -1) {
|
|
console.log("no build result page");
|
|
} else {
|
|
console.log("build result page");
|
|
\$('#buildlog').show();
|
|
\$('#buildstatus').show();
|
|
}
|
|
|
|
|
|
});
|
|
|
|
var buildlog = document.getElementById('buildlog');
|
|
|
|
function getLog() {
|
|
\$.ajax({
|
|
url: 'buildlog.txt',
|
|
dataType: 'text',
|
|
success: function(text) {
|
|
\$("#buildlogtab").text(text);
|
|
setTimeout(getLog, 1000); // refresh every 1 seconds
|
|
}
|
|
})
|
|
}
|
|
|
|
getLog();
|
|
|
|
function loadstatus() {
|
|
\$("#buildstatus").load("status.sh");
|
|
//add more lines / divs
|
|
}
|
|
|
|
function hidebuild() {
|
|
\$('#buildform').hide();
|
|
\$('#extmanagement').hide();
|
|
\$('#buildstatus').show();
|
|
\$('#buildlog').show();
|
|
}
|
|
|
|
function hidebuildlog() {
|
|
\$('#buildlog').hide();
|
|
}
|
|
|
|
function togglemac(e) {
|
|
let txt = e.innerText;
|
|
e.innerText = txt == 'Real Mac' ? 'Gen Mac' : 'Real Mac';
|
|
macaddress.value = txt == '$realmac' ? '$macaddress' : '$realmac';
|
|
}
|
|
|
|
|
|
function onModelChange() {
|
|
var x = document.getElementById("myModel").value;
|
|
document.getElementById("model").innerHTML = "You selected: " + x;
|
|
}
|
|
|
|
\$('#redpillmake').tooltip({'trigger':'focus', 'title': 'Change the redpill make to development or production'});
|
|
\$('#macaddress').tooltip({'trigger':'focus', 'title': 'Change the mac address to what you like or leave the generated one'});
|
|
\$('#serial').tooltip({'trigger':'focus', 'title': 'Change the serial to what you like or leave the generated one'});
|
|
\$('#sataportmap').tooltip({'trigger':'focus', 'title': 'Thats a calculated value, if you dont know what that does leave that as is'});
|
|
\$('#diskidxmap').tooltip({'trigger':'focus', 'title': 'Thats a calculated value, if you dont know what that does leave that as is'});
|
|
\$('#staticboot').tooltip({'trigger':'focus', 'title': 'Set this to true if you have issues with booting TCRP Friend'});
|
|
|
|
|
|
</script>
|
|
EOF
|
|
|
|
chartinit
|
|
|
|
readlog
|
|
|
|
cat <<EOF
|
|
|
|
</body>
|
|
</html>
|
|
EOF
|
|
|
|
}
|
|
|
|
function sysreboot() {
|
|
|
|
wecho "System is going for reboot" | tee -a $LOGFILE
|
|
sync
|
|
sync
|
|
sync
|
|
backuploader
|
|
wecho "Rebooting" | tee -a $LOGFILE
|
|
sleep 2 && /usr/bin/exitcheck.sh reboot | tee -a $LOGFILE
|
|
|
|
}
|
|
|
|
function breadcrumb() {
|
|
|
|
echo "<div class=\"container\"><div class=\"row\"><div class=\"col-sm\">"
|
|
echo "<nav aria-label=\"breadcrumb\"> <ol class=\"breadcrumb\">"
|
|
|
|
[ ! -z "$MODEL" ] && echo "<li class=\"breadcrumb-item\"><a href=\"${THISURL}?action=resetmodel\">$MODEL\</a></li>"
|
|
[ ! -z "$VERSION" ] && echo "<li class=\"breadcrumb-item\"><a href=\"index.sh?action=setversion\">$VERSION\</a></li>"
|
|
echo "<li class=\"breadcrumb-item active\" aria-current=\"page\">Build</li>"
|
|
|
|
echo "</ol></nav></div></div></div>"
|
|
|
|
}
|
|
|
|
function serialgen() {
|
|
|
|
[ ! -z "$GATEWAY_INTERFACE" ] && shift 0 || shift 1
|
|
|
|
#if [ "$1" = "DS3615xs" ] || [ "$1" = "DS3617xs" ] || [ "$1" = "DS916+" ] || [ "$1" = "DS918+" ] || [ "$1" = "DS920+" ] || [ "$1" = "DS3622xs+" ] || [ "$1" = "FS6400" ] || [ "$1" = "DVA3219" ] || [ "$1" = "DVA3221" ] || [ "$1" = "DS1621+" ] || [ "$1" = "DVA1622" ] || [ "$1" = "DS2422+" ] || [ "$1" = "RS4021xs+" ] || [ "$1" = "DS1522+" ] || [ "$1" = "DS923+" ] || [ "$1" = "SA6400" ]; then
|
|
|
|
if [ -n $(generateSerial $1) ]; then
|
|
|
|
serial="$(generateSerial $1)"
|
|
mac="$(generateMacAddress $1)"
|
|
|
|
echo "Serial Number for Model = $serial"
|
|
echo "Mac Address for Model $1 = $mac "
|
|
|
|
macaddress=$(echo $mac | sed -s 's/://g')
|
|
|
|
updateuserconfigfield "extra_cmdline" "sn" "${serial}"
|
|
updateuserconfigfield "extra_cmdline" "mac1" "${macaddress}"
|
|
fi
|
|
|
|
}
|
|
|
|
function beginArray() {
|
|
|
|
case $1 in
|
|
DS3615xs)
|
|
permanent="LWN"
|
|
serialstart="1130 1230 1330 1430"
|
|
;;
|
|
DS3617xs)
|
|
permanent="ODN"
|
|
serialstart="1130 1230 1330 1430"
|
|
;;
|
|
DS916+)
|
|
permanent="NZN"
|
|
serialstart="1130 1230 1330 1430"
|
|
;;
|
|
DS918+)
|
|
permanent="PDN"
|
|
serialstart="1780 1790 1860 1980"
|
|
;;
|
|
DS1019+)
|
|
permanent="PDN"
|
|
serialstart="1780 1790 1860 1980"
|
|
;;
|
|
DS720+)
|
|
permanent="SBR"
|
|
serialstart="2030 2040 20C0 2150"
|
|
;;
|
|
DS920+)
|
|
permanent="SBR"
|
|
serialstart="2030 2040 20C0 2150"
|
|
;;
|
|
DS1520+)
|
|
permanent="TRR"
|
|
serialstart="2270"
|
|
;;
|
|
DS3622xs+)
|
|
permanent="SQR"
|
|
serialstart="2030 2040 20C0 2150"
|
|
;;
|
|
DS1621xs+)
|
|
permanent="S7R"
|
|
serialstart="2080"
|
|
;;
|
|
DS923+)
|
|
permanent="TQR"
|
|
serialstart="2270"
|
|
;;
|
|
DS1522+)
|
|
permanent="TRR"
|
|
serialstart="2270"
|
|
;;
|
|
DS723+)
|
|
permanent="TQR"
|
|
serialstart="2270"
|
|
;;
|
|
DS1621+)
|
|
permanent="S7R"
|
|
serialstart="2080"
|
|
;;
|
|
DS2422+)
|
|
permanent="S7R"
|
|
serialstart="2080"
|
|
;;
|
|
FS2500)
|
|
permanent="PSN"
|
|
serialstart="1960"
|
|
;;
|
|
FS6400)
|
|
permanent="PSN"
|
|
serialstart="1960"
|
|
;;
|
|
DVA3219)
|
|
permanent="RFR"
|
|
serialstart="1930 1940"
|
|
;;
|
|
DVA3221)
|
|
permanent="SJR"
|
|
serialstart="2030 2040 20C0 2150"
|
|
;;
|
|
DVA1622)
|
|
permanent="UBR"
|
|
serialstart="2030 2040 20C0 2150"
|
|
;;
|
|
RS1221+)
|
|
permanent="RWR"
|
|
serialstart="20B0"
|
|
;;
|
|
RS1619xs+)
|
|
permanent="QPR"
|
|
serialstart="1920"
|
|
;;
|
|
RS3618xs)
|
|
permanent="ODN"
|
|
serialstart="1130 1230 1330 1430"
|
|
;;
|
|
RS3413xs+)
|
|
permanent="S7R"
|
|
serialstart="2080"
|
|
;;
|
|
RS3621xs+)
|
|
permanent="SZR"
|
|
serialstart="20A0"
|
|
;;
|
|
RS4021xs+)
|
|
permanent="T2R"
|
|
serialstart="2250"
|
|
;;
|
|
SA3400)
|
|
permanent="RJR"
|
|
serialstart="1920"
|
|
;;
|
|
SA6400)
|
|
permanent="TQR"
|
|
serialstart="2270"
|
|
;;
|
|
*)
|
|
permanent=""
|
|
serialstart=""
|
|
;;
|
|
esac
|
|
|
|
}
|
|
|
|
function realmac() {
|
|
|
|
getvars
|
|
|
|
if [ "$macaddress" = "$realmac" ]; then
|
|
updateuserconfigfield "extra_cmdline" "mac1" "$genmac"
|
|
else
|
|
updateuserconfigfield "extra_cmdline" "mac1" "$realmac"
|
|
fi
|
|
|
|
}
|
|
|
|
function redpillmake() {
|
|
|
|
getvars
|
|
|
|
if [ "$redpillmake" = "prod" ]; then
|
|
updateuserconfigfield "general" "redpillmake" "dev"
|
|
elif [ "$redpillmake" = "dev" ]; then
|
|
updateuserconfigfield "general" "redpillmake" "prod"
|
|
fi
|
|
|
|
}
|
|
|
|
function random() {
|
|
|
|
printf "%06d" $(($RANDOM % 30000 + 1))
|
|
|
|
}
|
|
function randomhex() {
|
|
val=$(($RANDOM % 255 + 1))
|
|
echo "obase=16; $val" | bc
|
|
}
|
|
|
|
function generateRandomLetter() {
|
|
for i in a b c d e f g h j k l m n p q r s t v w x y z; do
|
|
echo $i
|
|
done | sort -R | tail -1
|
|
}
|
|
|
|
function generateRandomValue() {
|
|
for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f g h j k l m n p q r s t v w x y z; do
|
|
echo $i
|
|
done | sort -R | tail -1
|
|
}
|
|
|
|
function toupper() {
|
|
echo $1 | tr '[:lower:]' '[:upper:]'
|
|
}
|
|
|
|
function generateMacAddress() {
|
|
|
|
#toupper "Mac Address: 00:11:32:$(randomhex):$(randomhex):$(randomhex)"
|
|
if [ "$1" = "DS923+" ] || [ "$1" = "DS1522+" ] || [ "$1" = "RS4021xs+" ] || [ "$1" = "SA6400" ]; then
|
|
# DS1522+ and DS923+ Mac starts with 90:09:d0
|
|
printf '90:09:d0:%02X:%02X:%02X' $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256))
|
|
else
|
|
printf '00:11:32:%02X:%02X:%02X' $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256))
|
|
fi
|
|
|
|
}
|
|
|
|
function generateSerial() {
|
|
|
|
beginArray $1
|
|
|
|
case $1 in
|
|
|
|
DS3615xs)
|
|
serialnum="$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(random)
|
|
;;
|
|
DS3617xs)
|
|
serialnum="$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(random)
|
|
;;
|
|
DS916+)
|
|
serialnum="$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(random)
|
|
;;
|
|
DS918+)
|
|
serialnum="$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(random)
|
|
;;
|
|
DS1019+)
|
|
serialnum="$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(random)
|
|
;;
|
|
FS2500)
|
|
serialnum="$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(random)
|
|
;;
|
|
FS6400)
|
|
serialnum="$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(random)
|
|
;;
|
|
DS720+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DS920+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DS923+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DS1522+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DS723+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DS1520+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DS3622xs+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DS1621xs+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DS1621+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DS2422+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DVA3219)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DVA3221)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
DVA1622)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
RS1221+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
RS1619xs+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
RS3621xs+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
RS4021xs+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
RS3618xs)
|
|
serialnum="$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(random)
|
|
;;
|
|
RS3413xs+)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
SA3400)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
SA6400)
|
|
serialnum=$(toupper "$(echo "$serialstart" | tr ' ' '\n' | sort -R | tail -1)$permanent"$(generateRandomLetter)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomValue)$(generateRandomLetter))
|
|
;;
|
|
*)
|
|
serialnum=""
|
|
;;
|
|
esac
|
|
|
|
echo $serialnum
|
|
|
|
}
|
|
|
|
function updateuserconfigfield() {
|
|
|
|
block="$1"
|
|
field="$2"
|
|
value="$3"
|
|
|
|
while [ -f update.tmp ]; do
|
|
echo "$(date) - Waiting for update.tmp to be removed" >>updateconfig.log
|
|
sleep 1
|
|
done
|
|
|
|
if [ "$(jq -re ".$block.$field" $USERCONFIGFILE)" != "$value" ]; then
|
|
|
|
if [ -n "$1 " ] && [ -n "$2" ]; then
|
|
jsonfile=$(jq ".$block+={\"$field\":\"$value\"}" $USERCONFIGFILE >update.tmp && mv -f update.tmp $USERCONFIGFILE)
|
|
#echo $jsonfile | jq . >$USERCONFIGFILE
|
|
echo "Updating field in $block , $field to $value" >>updateconfig.log
|
|
verify="$(jq -re .${block}.${field} $USERCONFIGFILE)"
|
|
echo "Verifying user config file for values $block, $field, $value -> $verify" >>updateconfig.log
|
|
else
|
|
echo "No values to update specified"
|
|
fi
|
|
else
|
|
return
|
|
fi
|
|
}
|
|
|
|
function status() {
|
|
|
|
action="$1"
|
|
stage="$2"
|
|
status="$3"
|
|
msg="$4"
|
|
|
|
/home/tc/html/status.sh "$action" "$stage" "$status" "$msg"
|
|
|
|
}
|
|
|
|
function bringoverfriend() {
|
|
|
|
echo "Adding my friend"
|
|
status "setstatus" "frienddownload" "false" "Downloading my friend"
|
|
|
|
[ ! -d /home/tc/friend ] && mkdir /home/tc/friend/ && cd /home/tc/friend
|
|
URLS=$(curl --insecure -s https://api.github.com/repos/pocopico/tcrpfriend/releases/latest | jq -r ".assets[].browser_download_url")
|
|
for file in $URLS; do curl --insecure --location --progress-bar "$file" -O; done
|
|
|
|
if [ -f bzImage-friend ] && [ -f initrd-friend ] && [ -f chksum ]; then
|
|
FRIENDVERSION="$(grep VERSION chksum | awk -F= '{print $2}')"
|
|
BZIMAGESHA256="$(grep bzImage-friend chksum | awk '{print $1}')"
|
|
INITRDSHA256="$(grep initrd-friend chksum | awk '{print $1}')"
|
|
status "setstatus" "frienddownload" "false" "Checking TCRP checksum"
|
|
[ "$(sha256sum bzImage-friend | awk '{print $1}')" == "$BZIMAGESHA256" ] && status "setstatus" "frienddownload" "false" "bzImage-friend checksum OK !" && echo "bzImage-friend checksum OK !" || echo "bzImage-friend checksum ERROR !" || exit 99
|
|
[ "$(sha256sum initrd-friend | awk '{print $1}')" == "$INITRDSHA256" ] && status "setstatus" "frienddownload" "false" "initrd-friend checksum OK !" && echo "initrd-friend checksum OK !" || echo "initrd-friend checksum ERROR !" || exit 99
|
|
else
|
|
status "setstatus" "frienddownload" "fail" "Checksum of TCRP friend failed"
|
|
echo "Could not find friend files, exiting" && exit 0
|
|
fi
|
|
|
|
echo "Copying friend to /mnt/$tcrppart"
|
|
status "setstatus" "frienddownload" "false" "Copying friend to /mnt/$tcrppart"
|
|
|
|
cp -f /home/tc/friend/bzImage-friend /mnt/$tcrppart && [ -f /mnt/$tcrppart/bzImage-friend ] && [ "$(sha256sum /mnt/$tcrppart/bzImage-friend | awk '{print $1}')" == "$BZIMAGESHA256" ] && echo "bzImage-friend Copied succesfully" && status "setstatus" "frienddownload" "true" "bzImage-friend Copied succesfully to /mnt/$tcrppart"
|
|
cp -f /home/tc/friend/initrd-friend /mnt/$tcrppart && [ -f /mnt/$tcrppart/initrd-friend ] && [ "$(sha256sum /mnt/$tcrppart/initrd-friend | awk '{print $1}')" == "$INITRDSHA256" ] && echo "initrrd-friend Copied succesfully" && status "setstatus" "frienddownload" "true" "initrrd-friend Copied succesfully to /mnt/$tcrppart"
|
|
status "setstatus" "frienddownload" "true" "TCRP friend copied to /mnt/$tcrppart"
|
|
|
|
}
|
|
|
|
function buildform() {
|
|
|
|
getvars
|
|
satamap
|
|
|
|
checkuserconfig "$MODEL" "$VERSION"
|
|
|
|
#echo "$(date) : step 1 $(jq . $USERCONFIGFILE | wc -l)" >>${BUILDLOG}
|
|
|
|
updateuserconfigfield "general" "model" "$MODEL"
|
|
updateuserconfigfield "general" "version" "$VERSION"
|
|
|
|
if [ -z "$serial" ] || [ -z "$macaddress" ]; then
|
|
serialgen "$MODEL" | awk -F= '{print $2}' | sed -e 'N;s/\n/ /' | read serial macaddress
|
|
serialgen "$MODEL" >/dev/null
|
|
updateuserconfigfield "extra_cmdline" "sn" "$serial"
|
|
updateuserconfigfield "extra_cmdline" "mac1" "$macaddress"
|
|
|
|
fi
|
|
|
|
usbidentify
|
|
updateuserconfigfield "extra_cmdline" "pid" "$productid"
|
|
updateuserconfigfield "extra_cmdline" "vid" "$vendorid"
|
|
|
|
updateuserconfigfield "extra_cmdline" "SataPortMap" "$SATAPORTMAP"
|
|
updateuserconfigfield "extra_cmdline" "DiskIdxMap" "$DISKIDXMAP"
|
|
|
|
cat <<EOF
|
|
<div class="buildform" id="buildform">
|
|
<div class="title-bar">
|
|
<h3>Build Form</h3>
|
|
|
|
EOF
|
|
|
|
checkcached
|
|
|
|
if [ "$iscached" = "yes" ]; then
|
|
cat <<EOF
|
|
<button type="button" id="patfilecached" class="btn btn-lg btn-success position-absolute top-0 start-0 translate-middle" data-toggle="popover" title="Found Cached" data-content="Patfile $patfile is cached">Patfile cached</button>
|
|
EOF
|
|
else
|
|
cat <<EOF
|
|
<button type="button" id="patfilecached" class="btn btn-lg btn-danger position-absolute top-0 start-0 translate-middle" data-toggle="popover" title="Found Cached" data-content="Patfile $patfile is cached">Patfile not cached</button>
|
|
EOF
|
|
fi
|
|
cat <<EOF
|
|
</div>
|
|
<div class="content">
|
|
|
|
<form id="mybuild" action="/${THISURL}?result=true" class="form-horizontal" align="left" method="POST">
|
|
<div class="control-group">
|
|
<label class="control-label" for="mymodel">Model</label>
|
|
<div class="controls">
|
|
<input id="mymodel" name="mymodel" value="$MODEL" required readonly/>
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="myversion">Version</label>
|
|
<div class="controls">
|
|
<input id="myversion" name="myversion" value="$VERSION" required readonly />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="serial">Serial</label>
|
|
<div class="controls">
|
|
<input id="serial" name="serial" value="$serial" required />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="macaddress">Macaddress</label>
|
|
<div class="controls">
|
|
<input id="macaddress" name="macaddress" value="$macaddress" required />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="redpillmake">Redpill Make</label>
|
|
<div class="controls">
|
|
<input id="redpillmake" name="redpillmake" value="$redpillmake" required />
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="sataportmap">SataPortMap</label>
|
|
<div class="controls">
|
|
<input id="sataportmap" name="sataportmap" value="$SATAPORTMAP" required/>
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="diskidxmap">DiskIdxMap</label>
|
|
<div class="controls">
|
|
<input id="diskidxmap" name="diskidxmap" value="$DISKIDXMAP" required/>
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" for="staticboot">Static Boot</label>
|
|
<div class="controls">
|
|
<input id="staticboot" name="staticboot" value="false" required/>
|
|
</div>
|
|
</div>
|
|
<!--
|
|
<div class="control-group">
|
|
<label class="control-label" class="form-check-label" for="addexts">Automatically add extensions</label>
|
|
<div class="controls">
|
|
<input class="form-check-input" type="checkbox" name="addexts" id="addexts" value="auto" checked>
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label class="control-label" class="form-check-label" for="withfriend">With Friend</label>
|
|
<div class="controls">
|
|
<input class="form-check-input" type="checkbox" name="withfriend" id="withfriend" value="withfriend" checked>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="control-group">
|
|
<label class="control-label" for="extracmdline">Extra Command Line Options (e.g SataPortMap, DiskIdxMap etc</label>
|
|
<div class="controls">
|
|
<textarea id="extracmdline" name="extracmdline" value=" "> </textarea>
|
|
</div>
|
|
</div>
|
|
-->
|
|
|
|
<input id="action" class="hidden" name="action" value="build" hidden required />
|
|
<input id="buildit" class="hidden" name="buildit" value="yes" hidden required />
|
|
<br>
|
|
<button id="realmac" name="realmac" onclick="toggle(this)" type="button" class="btn btn-lg btn-info">Real Mac</button>
|
|
<button id="redpillmakebutton" name="redpillmakebutton" onclick="" type="button" class="btn btn-info btn-sm">Change Redpill Make</button>
|
|
<br><br><button type="submit" class="btn btn-lg btn-success btnright" id="toggle" onclick="return hidebuild()">Build</button>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
EOF
|
|
|
|
extmanagement
|
|
|
|
}
|
|
|
|
function satamap() {
|
|
|
|
TEXT=""
|
|
SATAPORTMAP=""
|
|
DISKIDXMAP=""
|
|
PCIPORTS=0
|
|
NUMPORTS=0
|
|
ZEROPORTS=""
|
|
TOTALPORTS=0
|
|
LOOPPORTS=0
|
|
|
|
for PCI in $(lspci -d ::106 | awk '{print$1}'); do
|
|
NAME=$(lspci -s "${PCI}" | sed "s/\ .*://")
|
|
TEXT+="${NAME}/n Ports: "
|
|
unset HOSTPORTS
|
|
declare -A HOSTPORTS
|
|
while read LINE; do
|
|
ATAPORT="$(echo ${LINE} | grep -o 'ata[0-9]*')"
|
|
PORT=$(echo ${ATAPORT} | sed 's/ata//')
|
|
HOSTPORTS[${PORT}]=$(echo ${LINE} | grep -o 'host[0-9]*$')
|
|
done < <(ls -l /sys/class/scsi_host | fgrep "${PCI}")
|
|
while read PORT; do
|
|
ls -l /sys/block | fgrep -q "${PCI}/ata${PORT}" && ATTACH=1 || ATTACH=0
|
|
PCMD=$(cat /sys/class/scsi_host/${HOSTPORTS[${PORT}]}/ahci_port_cmd)
|
|
[ "${PCMD}" = "0" ] && DUMMY=1 || DUMMY=0
|
|
[ ${ATTACH} -eq 1 ] && TEXT+="ATTACH"
|
|
[ ${DUMMY} -eq 1 ] && TEXT+="DUMMY"
|
|
|
|
TEXT+="${PORT} "
|
|
NUMPORTS=$((${NUMPORTS} + 1))
|
|
done < <(echo ${!HOSTPORTS[@]} | tr ' ' '\n' | sort -n)
|
|
TEXT+="\n"
|
|
done
|
|
|
|
for PCI in $(lspci -d ::106 | awk '{print$1}'); do
|
|
MAP="$(echo -e "$TEXT" | grep -i "$PCI" | grep -o ATTACH | wc -w)"
|
|
[ "$MAP" -ge 1 ] && ZEROPORTS+="$MAP" && [ "$MAP" -le 8 ] && let MAP=8 && let PCIPORTS=$(($PCIPORTS + 1))
|
|
[ "$MAP" -eq 0 ] && ZEROPORTS+="$MAP" && let MAP=1 && let PCIPORTS=$(($PCIPORTS + 1))
|
|
TOTALPORTS=$(($TOTALPORTS + $MAP))
|
|
SATAPORTMAP+="$MAP"
|
|
done
|
|
|
|
for ((i = 0; i < ${#ZEROPORTS}; i++)); do
|
|
if [ "${ZEROPORTS:$i:1}" -eq 0 ]; then
|
|
DISKIDXMAP+="$(printf "%02X" $(($TOTALPORTS + 1)))"
|
|
elif [ "${ZEROPORTS:$i:1}" -le 8 ] && [ "$LOOPPORTS" -eq 0 ]; then
|
|
DISKIDXMAP+="$(printf "%02X" ${LOOPPORTS})"
|
|
TOTALPORTS=$(($TOTALPORTS - $LOOPPORTS))
|
|
LOOPPORTS=$(($LOOPPORTS + 8 + 1))
|
|
else
|
|
DISKIDXMAP+="$(printf "%02X" $(($LOOPPORTS)))"
|
|
LOOPPORTS=$(($LOOPPORTS + 8))
|
|
fi
|
|
done
|
|
|
|
#echo "SATAPORTMAP=${SATAPORTMAP}"
|
|
#echo "DISKIDXMAP=${DISKIDXMAP}"
|
|
|
|
}
|
|
|
|
function checkcached() {
|
|
|
|
patfile="$(find /mnt/$tcrppart/auxfiles/ -maxdepth 1 | grep -i $OS_ID)"
|
|
|
|
[ -z "$patfile" ] && patfile="$(find /home/tc/html/ -maxdepth 1 | grep -i $OS_ID)"
|
|
|
|
if [ ! -z "$patfile" ] && [ -f "$patfile" ]; then
|
|
iscached="yes"
|
|
echo "PATFILE for ${MODEL}_${VERSION} is CACHED as file ${patfile}" >>$BUILDLOG
|
|
status "setstatus" "iscached" "true" "Patfile $patfile is cached"
|
|
else
|
|
iscached="no"
|
|
echo "PATFILE for ${MODEL}_${VERSION} is NOT CACHED" >>$BUILDLOG
|
|
status "setstatus" "iscached" "false" "Patfile not cached"
|
|
fi
|
|
|
|
}
|
|
|
|
function getpost() {
|
|
echo ""
|
|
}
|
|
|
|
function resetmodel() {
|
|
|
|
getvars
|
|
|
|
cp -f ${HOMEPATH}/include/user_config.json $USERCONFIGFILE
|
|
rm -rf ${HOMEPATH}/payload
|
|
selectmodel
|
|
|
|
}
|
|
|
|
function getcontent() {
|
|
|
|
echo "<details>"
|
|
echo "<summary>$1</summary>"
|
|
echo "<pre>$($@)"
|
|
echo "</pre></details>"
|
|
|
|
}
|
|
|
|
function wecho() {
|
|
echo "<br>$@"
|
|
}
|
|
|
|
function recho() {
|
|
|
|
#printf "<div class=\"d-inline p-2 bg-primary text-white\">$@</div>"
|
|
printf "<pre>$@</pre>"
|
|
|
|
}
|
|
|
|
function getvars() {
|
|
|
|
ln -s /lib /lib64
|
|
|
|
tcrppart="$(mount | grep -i optional | grep cde | awk -F / '{print $3}' | uniq | cut -c 1-3)3"
|
|
loaderdisk=$(mount | grep -i optional | grep cde | awk -F / '{print $3}' | uniq | cut -c 1-3)
|
|
local_cache="/mnt/${tcrppart}/auxfiles"
|
|
GETTIME=$(curl -v --silent https://google.com/ 2>&1 | grep Date | sed -e 's/< Date: //')
|
|
INTERNETDATE=$(date +"%d%m%Y" -d "$GETTIME")
|
|
LOCALDATE=$(date +"%d%m%Y")
|
|
|
|
OS_ID=$(cat ${CONFIGFILES}/$MODEL/$VERSION/config.json | jq -r -e ' .os .id')
|
|
PAT_URL=$(cat ${CONFIGFILES}/$MODEL/$VERSION/config.json | jq -r -e ' .os .pat_url')
|
|
PAT_SHA=$(cat ${CONFIGFILES}/$MODEL/$VERSION/config.json | jq -r -e ' .os .sha256')
|
|
ZIMAGE_SHA=$(cat ${CONFIGFILES}/$MODEL/$VERSION/config.json | jq -r -e '.files .zlinux .sha256')
|
|
RD_SHA=$(cat ${CONFIGFILES}/$MODEL/$VERSION/config.json | jq -r -e '.files .ramdisk .sha256')
|
|
RAMDISK_PATCH=$(cat ${CONFIGFILES}/$MODEL/$VERSION/config.json | jq -r -e ' .patches .ramdisk')
|
|
SYNOINFO_PATCH=$(cat ${CONFIGFILES}/$MODEL/$VERSION/config.json | jq -r -e ' .synoinfo')
|
|
RAMDISK_COPY=$(cat ${CONFIGFILES}/$MODEL/$VERSION/config.json | jq -r -e ' .extra .ramdisk_copy')
|
|
SYNOINFO_USER=$(cat $USERCONFIGFILE | jq -r -e ' .synoinfo')
|
|
RD_COMPRESSED=$(cat ${CONFIGFILES}/$MODEL/$VERSION/config.json | jq -r -e ' .extra .compress_rd')
|
|
productid=$(cat $USERCONFIGFILE | jq -r -e ' .extra_cmdline .pid')
|
|
vendorid=$(cat $USERCONFIGFILE | jq -r -e ' .extra_cmdline .vid')
|
|
|
|
FILENAME="${OS_ID}.pat"
|
|
realmac=$(ifconfig eth0 | head -1 | awk '{print $NF}' | sed -s 's/://g')
|
|
genmac="$(generateMacAddress $MODEL | sed -e "s/://g")"
|
|
|
|
mount ${tcrppart}
|
|
mount ${loaderdisk}1
|
|
mount ${loaderdisk}2
|
|
|
|
#wecho "tcrppart : $tcrppart local_cache : $local_cache INTERNETDATE : $INTERNETDATE \ LOCALDATE : $LOCALDATE
|
|
#OS_ID : $OS_ID PAT_URL : $PAT_URL PAT_SHA : $PAT_SHA \
|
|
#ZIMAGE_SHA : $ZIMAGE_SHA RD_SHA : $RD_SHA RAMDISK_PATCH : $RAMDISK_PATCH \
|
|
#SYNOINFO_PATCH : $SYNOINFO_PATCH RAMDISK_COPY : $RAMDISK_COPY SYNOINFO_USER : $SYNOINFO_USER \
|
|
#RD_COMPRESSED : $RD_COMPRESSED redpillextension : $redpillextension FILENAME : $FILENAME "
|
|
|
|
[ -z "$MODEL" ] && MODEL="$(jq -r -e '.general .model' $USERCONFIGFILE)"
|
|
[ -z "$VERSION" ] && VERSION="$(jq -r -e '.general .version' $USERCONFIGFILE)"
|
|
[ -z "$serial" ] && serial="$(jq -r -e '.extra_cmdline .sn' $USERCONFIGFILE)"
|
|
[ -z "$macaddress" ] && macaddress="$(jq -r -e '.extra_cmdline .mac1' $USERCONFIGFILE)"
|
|
[ -z "$redpillmake" ] && redpillmake="$(jq -r -e ' .general .redpillmake' $USERCONFIGFILE)"
|
|
}
|
|
|
|
function checkextractor() {
|
|
|
|
if [ -d /mnt/${tcrppart}/auxfiles/patch-extractor ] && [ -f /mnt/${tcrppart}/auxfiles/patch-extractor/synoarchive.nano ]; then
|
|
extractorcached="yes"
|
|
else
|
|
extractorcached="no"
|
|
fi
|
|
|
|
}
|
|
|
|
function downloadextractor() {
|
|
|
|
status "setstatus" "patextraction" "warn" "Extractor not cached, downloading OLD PAT"
|
|
|
|
mkdir -p ${PATCHEXTRACTOR}/
|
|
|
|
cd ${PATCHEXTRACTOR}/
|
|
|
|
curl --insecure --location https://global.download.synology.com/download/DSM/release/7.0.1/42218/DSM_DS3622xs%2B_42218.pat --output ${HOMEPATH}/oldpat.tar.gz
|
|
#[ -f ${HOMEPATH}/oldpat.tar.gz ] && tar -C${temp_folder} -xf ${HOMEPATH}/oldpat.tar.gz rd.gz
|
|
|
|
status "setstatus" "patextraction" "warn" "OLD PAT downloaded, extracting"
|
|
|
|
tar xvf ../oldpat.tar.gz hda1.tgz
|
|
tar xf hda1.tgz usr/lib
|
|
tar xf hda1.tgz usr/syno/sbin
|
|
|
|
mkdir -p ${PATCHEXTRACTOR}/lib/
|
|
|
|
cp usr/lib/libicudata.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libicui18n.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libicuuc.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libjson.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_program_options.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_locale.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_filesystem.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_thread.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_coroutine.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_regex.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libapparmor.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libjson-c.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libsodium.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_context.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libsynocrypto.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libsynocredentials.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_iostreams.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libsynocore.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libicuio.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_chrono.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_date_time.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_system.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libsynocodesign.so.7* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libsynocredential.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libjson-glib-1.0.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libboost_serialization.so* ${PATCHEXTRACTOR}/lib
|
|
cp usr/lib/libmsgpackc.so* ${PATCHEXTRACTOR}/lib
|
|
|
|
cp -r usr/syno/sbin/synoarchive ${PATCHEXTRACTOR}/
|
|
|
|
status "setstatus" "patextraction" "warn" "Extractor in place, removing unneeded temp files"
|
|
|
|
sudo rm -rf usr
|
|
sudo rm -rf ../oldpat.tar.gz
|
|
sudo rm -rf hda1.tgz
|
|
|
|
status "setstatus" "patextraction" "warn" "Patching extraction binaries"
|
|
|
|
curl --silent --location "https://github.com/pocopico/tinycore-redpill/blob/main/tools/xxd?raw=true" --output xxd
|
|
|
|
chmod +x xxd
|
|
|
|
./xxd synoarchive | sed -s 's/000039f0: 0300/000039f0: 0100/' | ./xxd -r >synoarchive.nano
|
|
./xxd synoarchive | sed -s 's/000039f0: 0300/000039f0: 0a00/' | ./xxd -r >synoarchive.smallpatch
|
|
./xxd synoarchive | sed -s 's/000039f0: 0300/000039f0: 0000/' | ./xxd -r >synoarchive.system
|
|
|
|
chmod +x synoarchive.*
|
|
|
|
status "setstatus" "patextraction" "warn" "Caching extractor for future use"
|
|
|
|
[ ! -d /mnt/${tcrppart}/auxfiles/patch-extractor ] && mkdir -p /mnt/${tcrppart}/auxfiles/patch-extractor
|
|
|
|
cp -rf ${PATCHEXTRACTOR}/lib /mnt/${tcrppart}/auxfiles/patch-extractor/
|
|
cp -rf ${PATCHEXTRACTOR}/synoarchive.* /mnt/${tcrppart}/auxfiles/patch-extractor/
|
|
|
|
## get list of available pat versions from
|
|
#curl --silent https://archive.synology.com/download/Os/DSM/ | grep "/download/Os/DSM/7" | awk '{print $2}' | awk -F\/ '{print $5}' | sed -s 's/"//g'
|
|
## Get the selected update pats for your platform/version
|
|
#curl --silent https://archive.synology.com/download/Os/DSM/7.1-42661-3 | grep href | grep apollolake | awk '{print $2}'
|
|
## Select URL
|
|
#curl --silent https://archive.synology.com/download/Os/DSM/7.1-42661-2 | grep href | grep apollolake | awk '{print $2}' | awk -F= '{print $2}'
|
|
## URL
|
|
#url=$(curl --silent https://archive.synology.com/download/Os/DSM/7.1-42661-3 | grep href | grep geminilake | awk '{print $2}' | awk -F= '{print $2}' | sed -s 's/"//g')
|
|
|
|
#curl --location $url -O
|
|
|
|
#patfile=$(echo $url | awk -F/ '{print $9}')
|
|
|
|
mkdir -p temp && cd temp
|
|
|
|
if [ -d /mnt/${tcrppart}/auxfiles/patch-extractor ] && [ -f /mnt/${tcrppart}/auxfiles/patch-extractor/synoarchive.nano ]; then
|
|
status "setstatus" "patextraction" "warn" "Extracting pat file : ${PATCHEXTRACTOR}/$patfile" && LD_LIBRARY_PATH=/mnt/${tcrppart}/auxfiles/patch-extractor/lib /mnt/${tcrppart}/auxfiles/patch-extractor/synoarchive.nano -xvf ${PATCHEXTRACTOR}/$patfile
|
|
else
|
|
wecho "Extractor not found" && status "setstatus" "patextraction" "warn" "Extractor not found"
|
|
fi
|
|
## Extract ramdisk
|
|
|
|
flashfile=$(ls flashupdate*s2*)
|
|
|
|
tar xvf $flashfile && tar xvf content.txz
|
|
|
|
mkdir -p rd.temp
|
|
cd rd.temp && unlzma -c ../rd.gz | cpio -idm
|
|
etc/VERSION
|
|
|
|
}
|
|
|
|
function getstaticmodule() {
|
|
|
|
#SYNOMODEL="$(echo $MODEL | sed -s 's/+/p/g' | tr '[:upper:]' '[:lower:]')_${REVISION}"
|
|
SYNOMODEL="$(echo $OS_ID | sed -s 's/+/p/g' | tr '[:upper:]' '[:lower:]')"
|
|
|
|
cd ${HOMEPATH}
|
|
|
|
wecho "Removing any old redpill.ko modules"
|
|
[ -f ${HOMEPATH}/redpill.ko ] && rm -f ${HOMEPATH}/redpill.ko
|
|
|
|
extension=$(curl --insecure --silent --location "$extensionrepofile")
|
|
|
|
wecho "Looking for redpill for : $SYNOMODEL"
|
|
|
|
#release=`echo $extension | jq -r '.releases .${SYNOMODEL}_{$TARGET_REVISION}'`
|
|
release=$(echo $extension | jq -r -e --arg SYNOMODEL $SYNOMODEL '.releases[$SYNOMODEL]')
|
|
files=$(curl --insecure --silent --location "$release" | jq -r '.files[] .url')
|
|
|
|
for file in $files; do
|
|
wecho "Getting file $file"
|
|
curl --insecure --silent -O $file
|
|
if [ -f redpill*.tgz ]; then
|
|
wecho "Extracting module"
|
|
tar xf redpill*.tgz
|
|
rm redpill*.tgz
|
|
strip --strip-debug redpill.ko
|
|
fi
|
|
done
|
|
|
|
if [ -f ${HOMEPATH}/redpill.ko ] && [ -n $(strings ${HOMEPATH}/redpill.ko | grep -i $MODEL) ]; then
|
|
wecho "Copying redpill.ko module to ramdisk"
|
|
cp ${HOMEPATH}/redpill.ko ${TEMPPAT}/rd.temp/usr/lib/modules/rp.ko
|
|
else
|
|
wecho "Module does not contain platorm information for ${MODEL}"
|
|
fi
|
|
|
|
[ -f ${TEMPPAT}/rd.temp/usr/lib/modules/rp.ko ] && wecho "Redpill module is in place"
|
|
|
|
}
|
|
|
|
function testarchive() {
|
|
|
|
archive="$1"
|
|
archiveheader="$(od -bc ${archive} | head -1 | awk '{print $3}')"
|
|
|
|
case ${archiveheader} in
|
|
105)
|
|
wecho "${archive}, is a Tar file"
|
|
isencrypted="no"
|
|
return 0
|
|
;;
|
|
255)
|
|
wecho "File ${archive}, is encrypted"
|
|
isencrypted="yes"
|
|
return 1
|
|
;;
|
|
213)
|
|
wecho "File ${archive}, is a compressed tar"
|
|
isencrypted="no"
|
|
;;
|
|
*)
|
|
wecho "Could not determine if file ${archive} is encrypted or not, maybe corrupted"
|
|
ls -ltr ${archive}
|
|
wecho ${archiveheader}
|
|
exit 99
|
|
;;
|
|
esac
|
|
|
|
}
|
|
|
|
function _set_conf_kv() {
|
|
# Delete
|
|
if [ -z "$2" ]; then
|
|
sed -i "$3" -e "s/^$1=.*$//"
|
|
return 0
|
|
fi
|
|
|
|
# Replace
|
|
if grep -q "^$1=" "$3"; then
|
|
sed -i "$3" -e "s\"^$1=.*\"$1=\\\"$2\\\"\""
|
|
return 0
|
|
fi
|
|
|
|
# Add if doesn't exist
|
|
echo "$1=\"$2\"" >>$3
|
|
}
|
|
|
|
function downloadpat() {
|
|
|
|
checkcached
|
|
|
|
if [ "$iscached" = "yes" ]; then
|
|
echo "Found cached PAT file $patfile"
|
|
cp $patfile ./$FILENAME
|
|
status "setstatus" "downloadingpat" "true" "Already cached"
|
|
return
|
|
fi
|
|
|
|
if [ ! -f $FILENAME ]; then
|
|
wecho "Downloading PAT file $FILENAME for MODEL=$MODEL, Version=$VERSION, SHA256=$PAT_SHA"
|
|
status "setstatus" "downloadingpat" "false" "Downloading PAT file $FILENAME for MODEL=$MODEL, Version=$VERSION, SHA256=$PAT_SHA"
|
|
curl --insecure --silent "$PAT_URL" --output "$FILENAME" | tee -a ${BUILDLOG}
|
|
|
|
[ "$(sha256sum $FILENAME | awk '{print $1}')" = "$PAT_SHA" ] && status "setstatus" "downloadingpat" "true" "Downloaded PAT file $FILENAME succesfully" && wecho "File downloaded and matches expected sha256sum" || wecho "Error downloaded file is corrupted"
|
|
else
|
|
wecho "$(sha256sum $FILENAME | awk '{print $1}')" = "$PAT_SHA"
|
|
wecho "File $FILENAME is already downloaded"
|
|
status "setstatus" "downloadingpat" "true" "File $FILENAME is already downloaded"
|
|
return
|
|
if [ "$(sha256sum $FILENAME | awk '{print $1}')" = "$PAT_SHA" ]; then
|
|
wecho "File downloaded and matches expected sha256sum"
|
|
status "setstatus" "downloadingpat" "true" "File $FILENAME downloaded and matches expected sha256sum"
|
|
else
|
|
wecho "Error downloaded file is corrupted stopping process. Remove file $FILENAME and try again"
|
|
#rm -f $FILENAME
|
|
status "setstatus" "downloadingpat" "fail" "Error downloaded file is corrupted stopping process. Remove file $FILENAME and try again"
|
|
exit 99
|
|
fi
|
|
fi
|
|
|
|
if [ -f $FILENAME ] && [ ! -f ${tcrppart}/auxfiles/$filename ]; then
|
|
if [ $(df -h /mnt/${tcrpart} | tail -1 | awk '{print ($4+0)}') -le 400 ]; then
|
|
cp $filename ${tcrppart}/auxfiles/$filename
|
|
else
|
|
rm -f ${tcrppart}/auxfiles/*.pat
|
|
cp $filename ${tcrppart}/auxfiles/$filename
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
function downloadtools() {
|
|
|
|
wecho "Downloading tools"
|
|
|
|
[ ! -d ${HOMEPATH}/tools ] && mkdir -p ${HOMEPATH}/tools
|
|
cd ${HOMEPATH}/tools
|
|
for FILE in $TOOLS; do
|
|
[ ! -f ${HOMEPATH}/tools/$FILE ] && curl --silent --insecure --location "$TOOLSPATH/${FILE}" -O
|
|
chmod +x $FILE
|
|
done
|
|
|
|
status "setstatus" "downloadtools" "true" "Tools downloaded"
|
|
cd ${HOMEPATH}
|
|
|
|
}
|
|
|
|
function extractpat() {
|
|
|
|
FILENAME="$1"
|
|
mkdir -p $TEMPPAT
|
|
|
|
if [ "$isencrypted" = "yes" ]; then
|
|
checkextractor && [ "$extractorcached" = "yes" ] && wecho "Extractor Cached, proceeding..." && status "setstatus" "patextraction" "warn" "Extractor cached"
|
|
wecho "Extracting encrypted PAT file $FILENAME"
|
|
status "setstatus" "patextraction" "false" "Extracting encrypted PAT file $FILENAME"
|
|
[ ! -d ${TEMPPAT} ] && mkdir -p ${TEMPPAT}
|
|
|
|
LD_LIBRARY_PATH=/mnt/${tcrppart}/auxfiles/patch-extractor/lib /mnt/${tcrppart}/auxfiles/patch-extractor/synoarchive.system -C ${TEMPPAT} -xf $FILENAME
|
|
else
|
|
wecho "Extracting unencrypted PAT file ${FILENAME} to ${TEMPPAT}"
|
|
status "setstatus" "patextraction" "false" "Extracting unencrypted PAT file $FILENAME to $TEMPPAT"
|
|
tar xf $FILENAME -C ${TEMPPAT} && status "setstatus" "patextraction" "false" "File $FILENAME extracted to $TEMPPAT"
|
|
fi
|
|
|
|
[ ! -f ${TEMPPAT}/VERSION ] && echo "FAILED to extract" && status "setstatus" "patextraction" "false" "FAILED to extract" && exit 99
|
|
[ -f ${TEMPPAT}/VERSION ] && . ${TEMPPAT}/VERSION && status "setstatus" "patextraction" "true" "Extracted PAT file, VERSION Found : ${major}.${minor}.${micro}_${buildnumber}" && wecho "Extracted PAT file, VERSION Found : ${major}.${minor}.${micro}_${buildnumber}"
|
|
extractedzImagesha="$(sha256sum ${TEMPPAT}/zImage | awk '{print $1}')"
|
|
extractedrdsha="$(sha256sum ${TEMPPAT}/rd.gz | awk '{print $1}')"
|
|
wecho "zImage sha256sum : $extractedzImagesha" && updateuserconfigfield "general" "zimghash" "${extractedzImagesha}"
|
|
wecho "rd sha256sum : $extractedrdsha" && updateuserconfigfield "general" "rdhash" "${extractedrdsha}"
|
|
|
|
}
|
|
|
|
function patchkernel() {
|
|
|
|
wecho "Patching Kernel"
|
|
status "setstatus" "kernelpatch" "false" "Patching kernel $TEMPPAT/zImage"
|
|
${HOMEPATH}/tools/bzImage-to-vmlinux.sh ${TEMPPAT}/zImage ${TEMPPAT}/vmlinux >log 2>&1 >/dev/null
|
|
${HOMEPATH}/tools/kpatch ${TEMPPAT}/vmlinux ${TEMPPAT}/vmlinux-mod >log 2>&1 >/dev/null
|
|
${HOMEPATH}/tools/vmlinux-to-bzImage.sh ${TEMPPAT}/vmlinux-mod ${TEMPPAT}/zImage-dsm >/dev/null
|
|
|
|
[ -f ${TEMPPAT}/zImage-dsm ] && wecho "Kernel Patched, sha256sum : $(sha256sum ${TEMPPAT}/zImage-dsm)" && status "setstatus" "kernelpatch" "true" "Kernel Patched, sha256sum : $(sha256sum ${TEMPPAT}/zImage-dsm)"
|
|
|
|
}
|
|
|
|
function cachepat() {
|
|
|
|
echo "Caching PAT file"
|
|
status "setstatus" "cachingpat" "false" "Caching PAT file"
|
|
cd ${TEMPPAT}
|
|
rm -rf rd.temp && rm -rf vmlinux* && rm -rf zImage-dsm && rm -rf initrd-dsm && status "setstatus" "cachingpat" "false" "Removing temp files from ${TEMPPAT}"
|
|
echo "Cached pat file : /mnt/$tcrppart/auxfiles/${BUILDMODEL}_${BUILDVERSION}.pat"
|
|
rm -rf /mnt/$tcrppart/auxfiles/*.pat && status "setstatus" "cachingpat" "true" "Creating tar file to: /mnt/$tcrppart/auxfiles/${BUILDMODEL}_${BUILDVERSION}.pat " && tar cfz /mnt/$tcrppart/auxfiles/${BUILDMODEL}_${BUILDVERSION}.pat * && status "setstatus" "cachingpat" "true" "Cached file to: /mnt/$tcrppart/auxfiles/${BUILDMODEL}_${BUILDVERSION}.pat " || echo "Failed to cache file" || status "setstatus" "cachingpat" "fail" "Failed to cache file"
|
|
|
|
}
|
|
|
|
function cleanbuild() {
|
|
|
|
echo "Cleaning build directory"
|
|
status "setstatus" "cleanbuild" "true" "Removing temp OLD pat" && rm -rf /home/tc/oldpat.tar.gz
|
|
status "setstatus" "cleanbuild" "true" "Removing temp patch-extractor" && rm -rf /home/tc/patch-extractor
|
|
status "setstatus" "cleanbuild" "true" "Removing /home/tc/payload" && rm -rf /home/tc/payload
|
|
status "setstatus" "cleanbuild" "true" "Removing /home/tc/custom.gz" && rm -rf /home/tc/custom.gz
|
|
status "setstatus" "cleanbuild" "true" "Removing /home/tc/customtemp" && rm -rf /home/tc/customtemp
|
|
status "setstatus" "cleanbuild" "true" "Removing ${TEMPPAT}" && rm -rf ${TEMPPAT}
|
|
status "setstatus" "cleanbuild" "true" "Removing ${HOMEPATH}/html/*.pat" && mv -f ${HOMEPATH}/html/*.pat /tmp/ && rm -rf ${HOMEPATH}/html/*.pat
|
|
status "setstatus" "cleanbuild" "true" "Removing ${HOMEPATH}/friend" && rm -rf ${HOMEPATH}/friend
|
|
|
|
status "setstatus" "cleanbuild" "true" "Build directory cleaned"
|
|
|
|
}
|
|
|
|
function createdownloadlinks() {
|
|
|
|
ln -sf /tmp/${BUILDMODEL}_${BUILDVERSION}.pat ${HOMEPATH}/html/assets/${BUILDMODEL}_${BUILDVERSION}.pat
|
|
ln -sf ${HOMEPATH}/user_config.json ${HOMEPATH}/html/assets/user_config.json
|
|
ln -sf /mnt/$tcrppart/auxfiles/${BUILDMODEL}_${BUILDVERSION}.pat ${HOMEPATH}/html/assets/${BUILDMODEL}_${BUILDVERSION}.pat-unenc
|
|
|
|
}
|
|
|
|
function addextensions() {
|
|
|
|
cd $HOMEPATH/
|
|
|
|
status "setstatus" "extadd" "false" "Adding extensions"
|
|
|
|
# extadd URL PLATFORM
|
|
BUILDMODEL="$(echo $MODEL | tr '[:upper:]' '[:lower:]' | sed -e "s/+/p/g")"
|
|
platform_selected="$(jq -s '.[0].build_configs=(.[1].build_configs + .[0].build_configs | unique_by(.id)) | .[0]' $CUSTOMCONFIG | jq ".build_configs[] | select(.id==\"${BUILDMODEL}-${VERSION}\")")"
|
|
EXTENSIONS="$(echo $platform_selected | jq -r -e '.add_extensions[]' | grep json | awk -F: '{print $1}' | sed -s 's/"//g')"
|
|
EXTENSIONS_SOURCE_URL="$(echo $platform_selected | jq -r -e '.add_extensions[]' | grep json | awk '{print $2}' | sed -e 's/,//g' -e 's/"//g')"
|
|
BUILDVERSION="$(echo $VERSION | awk -F- '{print $2}')"
|
|
|
|
wecho "PLATFORM SELECTED : $platform_selected"
|
|
wecho "EXTENSIONS_SOURCE_URL : $EXTENSIONS_SOURCE_URL"
|
|
|
|
wecho "Adding extensions for ${BUILDMODEL}_${BUILDVERSION}"
|
|
|
|
for EXT in $EXTENSIONS_SOURCE_URL; do
|
|
wecho "Adding required extension $EXT for ${BUILDMODEL}_${BUILDVERSION}" && status "setstatus" "extadd" "warn" "Adding required extension $EXT for ${BUILDMODEL}_${BUILDVERSION}"
|
|
wecho "extadd $EXT ${BUILDMODEL}_${BUILDVERSION}"
|
|
|
|
$HOMEPATH/include/extmgr.sh extadd $EXT "${BUILDMODEL}_${BUILDVERSION}"
|
|
|
|
done
|
|
|
|
# DISABLE AUTO ADDING EXTENSIONS
|
|
#status "setstatus" "extadd" "false" "Auto detecting required extensions"
|
|
#$HOMEPATH/include/listmodules.sh "${BUILDMODEL}_${BUILDVERSION}"
|
|
|
|
status "setstatus" "extadd" "false" "Processing extensions"
|
|
wecho "Processing extensions"
|
|
$HOMEPATH/include/extmgr.sh processexts "${BUILDMODEL}_${BUILDVERSION}"
|
|
status "setstatus" "extadd" "true" "Completed extensions"
|
|
|
|
}
|
|
|
|
function patchramdisk() {
|
|
|
|
addextensions
|
|
|
|
status "setstatus" "ramdiskpatch" "false" "Patching ramdisk"
|
|
temprd="${TEMPPAT}/rd.temp/"
|
|
wecho "Patching RamDisk"
|
|
wecho "Extracting ramdisk to $temprd"
|
|
|
|
[ ! -d $temprd ] && mkdir -p $temprd && cd $temprd && xz -dc <"${TEMPPAT}/rd.gz" | cpio -idm >/dev/null 2>&1
|
|
[ -f ${TEMPPAT}/rd.temp/VERSION ] && ${TEMPPAT}/rd.temp/VERSION
|
|
wecho "Extracted ramdisk VERSION : ${major}.${minor}.${micro}_${buildnumber}"
|
|
PATCHES="$(echo $RAMDISK_PATCH | jq . | sed -s 's/@@@COMMON@@@/\/home\/tc\/config\/_common/' | grep config | sed -s 's/"//g' | sed -s 's/,//g')"
|
|
|
|
wecho "Patches to be applied : $PATCHES"
|
|
|
|
cd $temprd
|
|
for patch in $PATCHES; do
|
|
wecho "Applying patch $patch in dir $PWD"
|
|
patch -p1 <$patch
|
|
done
|
|
|
|
wecho "Applying model synoinfo patches"
|
|
status "setstatus" "ramdiskpatch" "false" "Applying model syinfo patches"
|
|
|
|
while IFS=":" read KEY VALUE; do
|
|
echo "Key :$KEY Value: $VALUE"
|
|
_set_conf_kv $KEY $VALUE $temprd/etc/synoinfo.conf
|
|
done <<<$(echo $SYNOINFO_PATCH | jq . | grep ":" | sed -s 's/"//g' | sed -s 's/,//g')
|
|
|
|
wecho "Applying user synoinfo settings"
|
|
status "setstatus" "ramdiskpatch" "false" "Applying user synoinfo settings"
|
|
|
|
while IFS=":" read KEY VALUE; do
|
|
echo "Key :$KEY Value: $VALUE"
|
|
_set_conf_kv $KEY $VALUE $temprd/etc/synoinfo.conf
|
|
done <<<$(echo $SYNOINFO_USER | jq . | grep ":" | sed -s 's/"//g' | sed -s 's/,//g')
|
|
|
|
wecho "Copying extra ramdisk files "
|
|
status "setstatus" "ramdiskpatch" "false" "Copying extra ramdisk files"
|
|
|
|
while IFS=":" read SRC DST; do
|
|
echo "Source :$SRC Destination : $DST"
|
|
cp -f $SRC $DST
|
|
cmp -s $SRC $DST || echo "File $SRC differ to $DST" && echo "FILE : $SRC copied to : $DST succesfully"
|
|
done <<<$(echo $RAMDISK_COPY | jq . | grep "COMMON" | sed -s 's/"//g' | sed -s 's/,//g' | sed -s 's/@@@COMMON@@@/\/home\/tc\/config\/_common/')
|
|
|
|
#wecho "Adding precompiled redpill module"
|
|
#getstaticmodule
|
|
|
|
cd $HOMEPATH
|
|
$HOMEPATH/include/extmgr.sh createcustominitfile "${BUILDMODEL}_${BUILDVERSION}"
|
|
cd $temprd
|
|
cp -rpf $HOMEPATH/customtemp/* .
|
|
|
|
# Reassembly ramdisk
|
|
wecho "Reassempling ramdisk"
|
|
status "setstatus" "ramdiskpatch" "false" "Reassempling ramdisk"
|
|
|
|
if [ "${RD_COMPRESSED}" == "true" ]; then
|
|
(cd "${temprd}" && find . | cpio -o -H newc -R root:root | xz -9 --format=lzma >"${TEMPPAT}/initrd-dsm") >/dev/null 2>&1 >/dev/null
|
|
else
|
|
(cd "${temprd}" && find . | cpio -o -H newc -R root:root >"${TEMPPAT}/initrd-dsm") >/dev/null 2>&1
|
|
fi
|
|
[ -f ${TEMPPAT}/initrd-dsm ] && wecho "Patched ramdisk created $(ls -l ${TEMPPAT}/initrd-dsm)" && status "setstatus" "ramdiskcreation" "true" "Patched ramdisk created $(ls -l ${TEMPPAT}/initrd-dsm)"
|
|
status "setstatus" "ramdiskpatch" "true" "Done patching ramdisk"
|
|
|
|
wecho "Copying file to ${tcrppart}"
|
|
|
|
status "setstatus" "copyfilestodisk" "false" "Copying all files to disk"
|
|
status "setstatus" "copyfilestodisk" "false" "Copying $HOMEPATH/custom.gz to /mnt/${tcrppart}/" && cp -f $HOMEPATH/custom.gz /mnt/${tcrppart}/ && status "setstatus" "copyfilestodisk" "false" "Copied $HOMEPATH/custom.gz to /mnt/${tcrppart}/"
|
|
#status "setstatus" "copyfilestodisk" "false" "Copying $HOMEPATH/custom.gz to /mnt/${loaderdisk}1/ " && cp -f $HOMEPATH/custom.gz /mnt/${loaderdisk}1/ && status "setstatus" "copyfilestodisk" "false" "Copied $HOMEPATH/custom.gz to /mnt/${loaderdisk}1/"
|
|
status "setstatus" "copyfilestodisk" "false" "Copying ${TEMPPAT}/zImage-dsm to /mnt/${tcrppart}/" && cp -f ${TEMPPAT}/zImage-dsm /mnt/${tcrppart}/ && status "setstatus" "copyfilestodisk" "false" "Copied ${TEMPPAT}/zImage-dsm to /mnt/${tcrppart}/"
|
|
status "setstatus" "copyfilestodisk" "false" "Copying ${TEMPPAT}/initrd-dsm to /mnt/${tcrppart}/" && cp -f ${TEMPPAT}/initrd-dsm /mnt/${tcrppart}/ && status "setstatus" "copyfilestodisk" "false" "Copied ${TEMPPAT}/initrd-dsm to /mnt/${tcrppart}/"
|
|
status "setstatus" "copyfilestodisk" "true" "Copied all boot files to the loader disk"
|
|
|
|
}
|
|
|
|
json_get_keys() {
|
|
local -n __json_return=$3
|
|
|
|
local out
|
|
out=$(/usr/local/bin/jq -r -e ".${2}|keys_unsorted|.[]" "${1}" 2>&1)
|
|
if [ $? -ne 0 ]; then
|
|
wecho "Failed extract K=>V pairs from %s:.%s\n\n%s" "${1}" "${2}" "${out}"
|
|
fi
|
|
|
|
readarray -t __json_return <<<"${out}"
|
|
}
|
|
|
|
read_kv_to_array() {
|
|
# kv_pair used dynamically in kv_extractor
|
|
# shellcheck disable=SC2034
|
|
local -n __json_kv_pairs=$3
|
|
local kv_extractor='.'"${2}"'|to_entries|map("[\(.key|@sh)]=\(.value|@sh) ")|"__json_kv_pairs=(" + add + ")"'
|
|
|
|
local out
|
|
out=$(/usr/local/bin/jq -r -e "${kv_extractor}" "${1}" 2>&1)
|
|
if [ $? -ne 0 ]; then
|
|
wecho "Failed extract K=>V pairs from %s:.%s\n\n%s" "${1}" "${2}" "${out}"
|
|
fi
|
|
|
|
# if you get a useless BASH error "invalid arithmetic operator" here check the variable you've passed (it must be -A)
|
|
eval "$out"
|
|
}
|
|
|
|
read_ordered_kv() {
|
|
local -n __json_keys=$3
|
|
local -n __json_values=$4
|
|
json_get_keys "${1}" "${2}" __json_keys
|
|
read_kv_to_array "${1}" "${2}" __json_values # we can reuse code to read k=>v pairs as we need them anyway
|
|
}
|
|
# Finds the token in file and replaces it with an arbitrary string
|
|
#
|
|
# This is slightly stupid because it uses a temporary file, but even our senior sed magician gave up. PRs welcomed.
|
|
#
|
|
# Args: $1 file to modify | $2 token | $3 text to insert
|
|
|
|
replace_token_with_text() {
|
|
local temp_file="${1}.tmp_ins_frag"
|
|
wecho "Replacing \"%s\" with text from %s in %s" "${2}" "${temp_file}" "${1}"
|
|
|
|
echo "${3}" >"${temp_file}"
|
|
if [ $? -ne 0 ]; then
|
|
wecho "Failed to create temp file %s" "${temp_file}"
|
|
fi
|
|
|
|
local out
|
|
out=$(sed -e "/${2}/ {" -e "r ${temp_file}" -e 'd' -e '}' -i "${1}" 2>&1)
|
|
if [ $? -ne 0 ]; then
|
|
wecho "Failed to replace %s in file %s with contents of %s\n\n%s" "${2}" "${1}" "${temp_file}" "${out}"
|
|
fi
|
|
rm -f "${temp_file}" || wecho "Failed to remove temp file %s" "${temp_file}"
|
|
}
|
|
|
|
json_noe() {
|
|
if [ "$1" == "null" ] || [ -z "$1" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
json_get_field() {
|
|
local field_val
|
|
field_val=$(/usr/local/bin/jq -e -r ".$2" "$1")
|
|
# "1 if the last output value was either false or null"
|
|
if [ $? -le 1 ]; then
|
|
echo $field_val
|
|
return 0
|
|
fi
|
|
|
|
if [ "${3:-'0'}" != 1 ]; then
|
|
wecho "Field \"$2\" doesn't existing in $1"
|
|
fi
|
|
}
|
|
|
|
json_get_array_values() {
|
|
local field_val
|
|
field_val=$(/usr/local/bin/jq -e -r ".${2} | .[]" "${1}")
|
|
local jq_exit=$?
|
|
|
|
# "1 if the last output value was either false or null", 4 if it was empty... we hate it
|
|
if [[ jq_exit -le 1 ]] || [[ jq_exit -eq 4 ]]; then
|
|
echo "${field_val}"
|
|
return 0
|
|
fi
|
|
|
|
if [ "${3:-'0'}" != 1 ]; then
|
|
wecho "Field \"$2\" doesn't existing in $1"
|
|
fi
|
|
}
|
|
|
|
expand_var_path() {
|
|
local -n __vars_map=$2
|
|
local file_path="${1}"
|
|
|
|
if [[ "${1}" == /* ]]; then
|
|
: #noop, absolute paths don't need any modifications
|
|
elif [[ "${1}" != @@@* ]]; then
|
|
# since path doesn't begin with a variable we just assume the default
|
|
file_path="${__vars_map["@@@_DEF_@@@"]}/${file_path}"
|
|
else
|
|
local var_value
|
|
for var_name in "${!__vars_map[@]}"; do
|
|
var_value="${__vars_map[$var_name]}"
|
|
file_path="${file_path/${var_name}/${var_value}}"
|
|
done
|
|
fi
|
|
|
|
wecho "Resolved path '${1}' to '${file_path}'"
|
|
echo "${file_path}"
|
|
}
|
|
|
|
function getcmdline() {
|
|
|
|
# Generates GRUB config file from a config structure
|
|
#
|
|
# - The main config file is expected to have .grub root key
|
|
# - The user config is expected to have extra_cmdline key
|
|
#
|
|
# Args:
|
|
# $1 main JSON config
|
|
# $2 user config
|
|
# $3 reference to a map of K=>V pairs with variables, see expand_var_path()
|
|
# $4 GRUB config destination file path
|
|
|
|
local menu_entries_txt
|
|
local -n _path_map=$3
|
|
|
|
# First get user cmdline overrides
|
|
wecho "Reading user extra_cmdline entries"
|
|
local -A extra_cmdline
|
|
read_kv_to_array "${2}" 'extra_cmdline' extra_cmdline
|
|
if [[ -v ${extra_cmdline['sn']} ]]; then wecho "User configuration (%s) doesn't contain unique extra_cmdline.sn" "${2}"; fi
|
|
if [[ -v ${extra_cmdline['vid']} ]]; then wecho "User configuration (%s) doesn't contain extra_cmdline.vid" "${2}"; fi
|
|
if [[ -v ${extra_cmdline['pid']} ]]; then wecho "User configuration (%s) doesn't contain extra_cmdline.pid" "${2}"; fi
|
|
if [[ -v ${extra_cmdline['mac1']} ]]; then wecho "User configuration (%s) doesn't contain at least one MAC (extra_cmdline.mac1)" "${2}"; fi
|
|
|
|
# First generate menu entries
|
|
wecho "Generating GRUB menu entries"
|
|
local entries_names
|
|
json_get_keys "${1}" 'grub.menu_entries' entries_names
|
|
|
|
# Cmdline is constructed by applying, in order, options from the follownig sources
|
|
# - platform config.json => .grub.base_cmdline
|
|
# - platform config.json => .grub.menu_entries.<entry name>.cmdline
|
|
# - user_config.json => .grub.menu_entries.<entry name>.extra_cmdline
|
|
|
|
local -A base_cmdline
|
|
wecho "Reading base cmdline"
|
|
read_kv_to_array "${1}" "grub.base_cmdline" base_cmdline
|
|
|
|
local -A entry_cmdline
|
|
local -A final_cmdline
|
|
local -a menu_entries_arr
|
|
local entry_cmdline_txt
|
|
for entry_name in "${entries_names[@]}"; do
|
|
wecho "Processing entry \"%s\"" "${entry_name}"
|
|
|
|
final_cmdline=()
|
|
# Bash doesn't have any sensible way of merging or even copying associative arrays... FML
|
|
# See https://stackoverflow.com/a/8881121
|
|
for base_cmdl_key in "${!base_cmdline[@]}"; do final_cmdline[$base_cmdl_key]=${base_cmdline[$base_cmdl_key]}; done
|
|
|
|
wecho "Applying entry cmdline"
|
|
read_kv_to_array "${1}" "grub.menu_entries[\"${entry_name}\"].cmdline" entry_cmdline # read entry CMDLINE
|
|
for entry_cmdl_key in "${!entry_cmdline[@]}"; do
|
|
wecho "Replacing base cmdline \"%s\" value \"%s\" with entry value \"%s\"" \
|
|
"${entry_cmdl_key}" "${final_cmdline[entry_cmdl_key]:-<not set>}" "${entry_cmdline[$entry_cmdl_key]}"
|
|
final_cmdline[$entry_cmdl_key]=${entry_cmdline[$entry_cmdl_key]}
|
|
done
|
|
|
|
wecho "Applying user extra_cmdline"
|
|
for user_cmdl_key in "${!extra_cmdline[@]}"; do
|
|
wecho "Replacing previous cmdline \"%s\" value \"%s\" with user value \"%s\"" \
|
|
"${user_cmdl_key}" "${final_cmdline[$user_cmdl_key]:-<not set>}" "${extra_cmdline[$user_cmdl_key]}"
|
|
final_cmdline[$user_cmdl_key]=${extra_cmdline[$user_cmdl_key]}
|
|
done
|
|
|
|
# Build the final cmdline for the entry
|
|
# There are more tricks in BASH 5.1 for printing but not on v4.3 which is standard on Debian 8 (needed for old GCC)
|
|
entry_cmdline_txt=''
|
|
for cmdline_key in "${!final_cmdline[@]}"; do
|
|
if json_noe "${final_cmdline[$cmdline_key]}"; then
|
|
entry_cmdline_txt+="${cmdline_key} "
|
|
else
|
|
entry_cmdline_txt+="${cmdline_key}=${final_cmdline[$cmdline_key]} "
|
|
fi
|
|
done
|
|
wecho "Generated cmdline for entry: %s" "${entry_cmdline_txt}"
|
|
|
|
# Now we can actually assemble the entry
|
|
menu_entries_txt+="menuentry '${entry_name}' {"$'\n'
|
|
read_ordered_kv "${1}" "grub.menu_entries[\"${entry_name}\"].options" entry_options_keys entry_options_vals
|
|
|
|
readarray -t menu_entries_arr <<<"$(json_get_array_values "${1}" "grub.menu_entries[\"${entry_name}\"].options")"
|
|
for entry in "${menu_entries_arr[@]}"; do
|
|
menu_entries_txt+=$'\t'"${entry/@@@CMDLINE@@@/${entry_cmdline_txt}}"$'\n'
|
|
done
|
|
menu_entries_txt+='}'$'\n'$'\n'
|
|
done
|
|
|
|
wecho "Generated all menu entries:\n%s" "${menu_entries_txt}"
|
|
|
|
wecho "Assembling final grub config in %s" "${4}"
|
|
local template
|
|
template=$(json_get_field "${1}" 'grub.template')
|
|
wecho "$(expand_var_path "${template}" _path_map)" "${4}"
|
|
replace_token_with_text "${4}" '@@@MENU_ENTRIES@@@' "${menu_entries_txt}"
|
|
|
|
}
|
|
|
|
function build() {
|
|
|
|
#window.open("index.sh&monitor");
|
|
|
|
getvars
|
|
|
|
wecho "Starting build"
|
|
wecho "Building loader for $MODEL, $VERSION, with serial number : $serial and macaddress : $macaddress"
|
|
wecho "Redpill Make $redpillmake, SataPortMap: $sataportmap, DiskIdxMap: $diskidxmap, StaticBoot: $staticboot"
|
|
wecho "extracommands : $extracmdline"
|
|
|
|
#wecho "Updating user_config with serial : $serial and macaddress : $macaddress"
|
|
updateuserconfigfield "extra_cmdline" "sn" "$serial"
|
|
updateuserconfigfield "extra_cmdline" "mac1" "$macaddress"
|
|
# Update the redpillmake
|
|
updateuserconfigfield "general" "redpillmake" "$redpillmake"
|
|
|
|
rm -rf ${HOMEPATH}/temppat
|
|
|
|
testarchive $FILENAME
|
|
checkextractor
|
|
checkcached
|
|
|
|
[ "$isencrypted" = "yes" ] && [ "$extractorcached" = "no" ] && downloadextractor
|
|
|
|
extractpat "$patfile"
|
|
|
|
if [ "$extractedzImagesha" = "$ZIMAGE_SHA" ]; then
|
|
wecho "Copying original zImage to partitions ${loaderdisk}1 and ${loaderdisk}2" && status "setstatus" "kernelpatch" "warn" "Copying original zImage to partitions ${loaderdisk}1 and ${loaderdisk}2"
|
|
cp -f ${TEMPPAT}/zImage /mnt/${loaderdisk}1/
|
|
cp -f ${TEMPPAT}/zImage /mnt/${loaderdisk}2/
|
|
wecho "zImage sha256sum matches expected sha256sum, patching kernel" && status "setstatus" "kernelpatch" "warn" "zImage sha256sum matches expected sha256sum, patching kernel"
|
|
patchkernel
|
|
else
|
|
wecho "zImage does not match sha256sum : $extractedzImagesha"
|
|
fi
|
|
|
|
if [ "$extractedrdsha" = "$RD_SHA" ]; then
|
|
wecho "Copying original ramdisk to partitions ${loaderdisk}1 and ${loaderdisk}2" && status "setstatus" "ramdiskpatch" "warn" "Copying original ramdisk to partitions ${loaderdisk}1 and ${loaderdisk}2"
|
|
cp -f ${TEMPPAT}/rd.gz /mnt/${loaderdisk}1/
|
|
cp -f ${TEMPPAT}/rd.gz /mnt/${loaderdisk}2/
|
|
wecho "ramdisk sha256sum matches expected sha256sum, patching kernel" && status "setstatus" "ramdiskpatch" "warn" "ramdisk sha256sum matches expected sha256sum, patching kernel"
|
|
patchramdisk
|
|
else
|
|
wecho "rd.gz does not match sha256sum : $extractedrdsha"
|
|
fi
|
|
|
|
[ -n "${extracmdline}" ] && wecho "Extra User built defined command line parameters ${extracmdline}"
|
|
|
|
while IFS="=" read KEY VALUE; do
|
|
#wecho "User cmdline Key :$KEY Value: $VALUE"
|
|
#_set_conf_kv $KEY $VALUE $USERCONFIGFILE
|
|
#wecho "Debug : ${KEY} : $(json_has_field '$USERCONFIGFILE' '.extra_cmdline.$KEY')"
|
|
if [ ! -z $KEY ] && [ ! -z $VALUE ]; then
|
|
/usr/local/bin/jq -e -r ".extra_cmdline.${KEY}|select(0)" "$USERCONFIGFILE" >/dev/null 2>&1 >/dev/null
|
|
rtncode=$?
|
|
if [ $rtncode -eq 0 ]; then
|
|
#wecho "Field exists, updating"
|
|
updateuserconfigfield "extra_cmdline" "${KEY}" "${VALUE}"
|
|
else
|
|
#wecho "Field does not exist, adding "
|
|
updateuserconfigfield "extra_cmdline" "${KEY}" "${VALUE}"
|
|
|
|
fi
|
|
fi
|
|
done <<<$(echo $extracmdline | sed -s 's/ /\n/g')
|
|
|
|
#wecho "Clearing and testing $USERCONFIGFILE"
|
|
json="$(cat $USERCONFIGFILE | sed -s 's/\\r//g' | jq .)" && echo -E "${json}" | jq . >$USERCONFIGFILE
|
|
|
|
#updating user_config with build form data
|
|
echo "Updating $USERCONFIGFILE with build form data SataPortMap: $sataportmap DiskIdxMap: $diskidxmap StaticBoot: $staticboot" | tee -a $LOGFILE
|
|
updateuserconfigfield "extra_cmdline" "SataPortMap" "${sataportmap}"
|
|
updateuserconfigfield "extra_cmdline" "DiskIdxMap" "${diskidxmap}"
|
|
updateuserconfigfield "general" "staticboot" "${staticboot}"
|
|
|
|
#wecho "Building CMD Line"
|
|
|
|
USB_LINE=$(getcmdline ${CONFIGFILES}/$MODEL/$VERSION/config.json $USERCONFIGFILE 2>&1 | grep linux | head -1 | cut -c 16-999)
|
|
SATA_LINE=$(getcmdline ${CONFIGFILES}/$MODEL/$VERSION/config.json $USERCONFIGFILE 2>&1 | grep linux | tail -1 | cut -c 16-999)
|
|
|
|
updateuserconfigfield "general" "usb_line" "${USB_LINE}"
|
|
updateuserconfigfield "general" "sata_line" "${SATA_LINE}"
|
|
|
|
#wecho "Copying $USERCONFIGFILE to boot partition"
|
|
cp -f $USERCONFIGFILE /mnt/${tcrppart}/
|
|
[ "$(sha256sum $USERCONFIGFILE | awk '{print $1}')" = "$(sha256sum /mnt/${tcrppart}/user_config.json | awk '{print $1}')" ] && wecho "File copied succesfully" || wecho "User config file is corrupted "
|
|
|
|
bringoverfriend
|
|
|
|
generategrub
|
|
|
|
cachepat
|
|
|
|
checkloader
|
|
|
|
cleanbuild
|
|
|
|
createdownloadlinks
|
|
|
|
backuploader silent
|
|
|
|
setgrubentry
|
|
|
|
echo "Finished building the loader. "
|
|
status "setstatus" "finishloader" "true" "Finished building the loader at : $(date +"%A %b %Y Time: %H:%M:%S")"
|
|
return
|
|
|
|
}
|
|
|
|
setgrubentry() {
|
|
|
|
status "setstatus" "setgrubentry" "warn" "Setting next grub entry"
|
|
echo "Setting next grub entry " | tee -a $LOGFILE
|
|
|
|
default="$(grep menuentry /mnt/${loaderdisk}1/boot/grub/grub.cfg | awk -F\' '{print $2}' | grep -i Friend)"
|
|
ISUSB="$(udevadm info --query property --name /dev/${loaderdisk} | grep -i DEVPATH | grep -i USB | wc -l)"
|
|
|
|
if [ "$staticboot" = "true " ] && [ "$ISUSB" = "1" ]; then
|
|
usbentry="$(grep menuentry /mnt/${loaderdisk}1/boot/grub/grub.cfg | awk -F\' '{print $2}' | grep -i USB)"
|
|
status "setstatus" "setgrubentry" "true" "Setting next grub entry to static USB : $usbentry"
|
|
echo "Setting next grub entry to static USB : $usbentry" | tee -a $LOGFILE
|
|
sudo /usr/local/bin/grub-editenv /mnt/${loaderdisk}1/boot/grub/grubenv set saved_entry="$usbentry"
|
|
elif [ "$staticboot" = "true " ] && [ "$ISUSB" = "0" ]; then
|
|
sataentry="$(grep menuentry /mnt/${loaderdisk}1/boot/grub/grub.cfg | awk -F\' '{print $2}' | grep -i SATA)"
|
|
status "setstatus" "setgrubentry" "true" "Setting next grub entry to static SATA : $sataentry"
|
|
echo "Setting next grub entry to static SATA : $sataentry" | tee -a $LOGFILE
|
|
sudo /usr/local/bin/grub-editenv /mnt/${loaderdisk}1/boot/grub/grubenv set saved_entry="$sataentry"
|
|
else
|
|
status "setstatus" "setgrubentry" "true" "Setting next grub entry to : $default"
|
|
echo "Setting next grub entry to Friend : $default" | tee -a $LOGFILE
|
|
sudo /usr/local/bin/grub-editenv /mnt/${loaderdisk}1/boot/grub/grubenv set saved_entry="$default"
|
|
fi
|
|
|
|
savedentry="$(sudo /usr/local/bin/grub-editenv /mnt/${loaderdisk}1/boot/grub/grubenv list | awk -F= '{print $2}')"
|
|
status "setstatus" "setgrubentry" "true" "Grub entry has been set to : $savedentry"
|
|
echo "Grub entry has been set to : $savedentry" | tee -a $LOGFILE
|
|
|
|
}
|
|
|
|
function generategrub() {
|
|
|
|
cd ${HOMEPATH}/html
|
|
|
|
getvars
|
|
|
|
BUILDMODEL="$(echo $MODEL | tr '[:upper:]' '[:lower:]' | sed -e "s/+/p/g")"
|
|
BUILDVERSION="$(echo $VERSION | awk -F- '{print $2}')"
|
|
|
|
echo "Generating GRUB entries for model :${BUILDMODEL}_${BUILDVERSION}"
|
|
status "setstatus" "gengrub" "false" "Generating GRUB entries for model :${BUILDMODEL}_${BUILDVERSION}"
|
|
|
|
${HOMEPATH}/include/grubmgr.sh generate "${BUILDMODEL}_${BUILDVERSION}" && [ -f grub.cfg ] && echo "Generated successfully" || echo "Failed to generate grub.cfg"
|
|
${HOMEPATH}/include/grubmgr.sh addentry usb && [ $(grep -i USB grub.cfg | wc -l) -gt 0 ] && echo "Added USB entry" || echo "Failed to add USB entry"
|
|
${HOMEPATH}/include/grubmgr.sh addentry sata && [ $(grep -i SATA grub.cfg | wc -l) -gt 0 ] && echo "Added SATA entry" || echo "Failed to add SATA entry"
|
|
${HOMEPATH}/include/grubmgr.sh addentry tcrp && [ $(grep -i "Tiny Core Image Build" grub.cfg | wc -l) -gt 0 ] && echo "Added TCRP entry" || echo "Failed to add SATA entry"
|
|
${HOMEPATH}/include/grubmgr.sh addentry tcrpfriend && [ $(grep -i "Tiny Core Friend" grub.cfg | wc -l) -gt 0 ] && echo "Added TCRP FRIEND entry" || echo "Failed to add SATA entry"
|
|
|
|
cp /mnt/${loaderdisk}1/boot/grub/grub.cfg /mnt/${loaderdisk}1/boot/grub/grub.cfg.old
|
|
cp -f grub.cfg /mnt/${loaderdisk}1/boot/grub/grub.cfg
|
|
|
|
status "setstatus" "gengrub" "true" "Finished generating GRUB entries for model :${BUILDMODEL}_${BUILDVERSION}"
|
|
|
|
}
|
|
|
|
function chartinit() {
|
|
|
|
tcrppart="$(mount | grep -i optional | grep cde | awk -F / '{print $3}' | uniq | cut -c 1-3)3"
|
|
freemem=$(free | grep Mem | awk '{print $4/$2*100}')
|
|
usedmem=$(free | grep Mem | awk '{print $3/$2*100}')
|
|
cpuload=$(cat /proc/stat | grep cpu | tail -1 | awk '{print ($5*100)/($2+$3+$4+$5+$6+$7+$8+$9+$10)}' | awk '{print "CPU Usage: " 100-$1}')
|
|
freehomespace=$(df -k /home/tc/ | grep root | awk '{print $4/$2*100}')
|
|
usedhomespace=$(df -k /home/tc/ | grep root | awk '{print $3/$2*100}')
|
|
freetcrpspace=$(df -k /mnt/$tcrppart | grep sd | awk '{print $4/$2*100}')
|
|
usedtcrpspace=$(df -k /mnt/$tcrppart | grep sd | awk '{print $3/$2*100}')
|
|
|
|
cat <<EOF
|
|
<script>
|
|
|
|
// chart colors
|
|
var colors = ['#007bff','#28a745','#333333','#c3e6cb','#dc3545','#6c757d'];
|
|
/* donut charts */
|
|
var donutOptions = {
|
|
cutoutPercentage: 85,
|
|
legend: {position:'bottom', padding:5, labels: {pointStyle:'circle', usePointStyle:true}}
|
|
};
|
|
|
|
|
|
// Home
|
|
var chDonutData1 = {
|
|
labels: ['Home space % Free', 'Home space % Used'],
|
|
datasets: [
|
|
{ backgroundColor: colors.slice(0,3), borderWidth: 0, data: [$freehomespace, $usedhomespace] }
|
|
]
|
|
};
|
|
|
|
var chDonutData2 = {
|
|
labels: ['TCRP space % Free', 'TCRP space % Used'],
|
|
datasets: [
|
|
{ backgroundColor: colors.slice(0,3), borderWidth: 0, data: [$freetcrpspace, $usedtcrpspace] }
|
|
]
|
|
};
|
|
|
|
var chDonutData3 = {
|
|
labels: ['Mem % Free', 'Mem % Used'],
|
|
datasets: [
|
|
{ backgroundColor: colors.slice(0,3), borderWidth: 0, data: [$freemem, $usedmem] }
|
|
]
|
|
};
|
|
|
|
|
|
var chDonut1 = document.getElementById("chDonut1");
|
|
if (chDonut1) {
|
|
new Chart(chDonut1, {
|
|
type: 'doughnut',
|
|
data: chDonutData1,
|
|
options: donutOptions
|
|
});
|
|
}
|
|
|
|
var chDonut2 = document.getElementById("chDonut2");
|
|
if (chDonut2) {
|
|
new Chart(chDonut2, {
|
|
type: 'doughnut',
|
|
data: chDonutData2,
|
|
options: donutOptions
|
|
});
|
|
}
|
|
|
|
|
|
var chDonut3 = document.getElementById("chDonut3");
|
|
if (chDonut3) {
|
|
new Chart(chDonut3, {
|
|
type: 'doughnut',
|
|
data: chDonutData3,
|
|
options: donutOptions
|
|
});
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
function loaderstatus() {
|
|
|
|
#wecho "Current used Space in /home/tc is:$(du -sh /home/tc)"
|
|
|
|
cat <<EOF
|
|
<div class="container"<div class="row">
|
|
<table class="table table-dark mx-auto w-auto">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Home Space</th>
|
|
<th scope="col">TCRP Partition Space</th>
|
|
<th scope="col">Memory</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><div class="col-sm ">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<canvas id="chDonut1" ></canvas>
|
|
</div>
|
|
</div>
|
|
</div></td>
|
|
<td> <div class="col-sm ">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<canvas id="chDonut2" ></canvas>
|
|
</div>
|
|
</div>
|
|
</div></td>
|
|
<td> <div class="col-sm ">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<canvas id="chDonut3" ></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
</div></div>
|
|
EOF
|
|
|
|
}
|
|
|
|
function listplatforms() {
|
|
|
|
models="$(ls ${CONFIGFILES} | grep -v comm | sed -e 's/\///g')"
|
|
echo "<h3>Available Platforms Hardware Information</h3>"
|
|
cat <<EOF
|
|
<table class="table table-dark">
|
|
<thead><tr><th title="Field #1">Model</th>
|
|
<th title="Field #2">Series</th>
|
|
<th title="Field #3">CPU</th>
|
|
<th title="Field #4">Cores</th>
|
|
<th title="Field #5">Threads</th>
|
|
<th title="Field #6">Platform</th>
|
|
<th title="Field #7">RAM</th>
|
|
</tr></thead>
|
|
<tbody><tr>
|
|
EOF
|
|
|
|
for model in $models; do
|
|
echo "<td> $(jq -r -e ".[] | select(.Model | contains(\"$model\"))" ${HOMEPATH}/include/platforms.json | jq -r -e .Model) </td>"
|
|
echo "<td> $(jq -r -e ".[] | select(.Model | contains(\"$model\"))" ${HOMEPATH}/include/platforms.json | jq -r -e .Series) </td>"
|
|
echo "<td> $(jq -r -e ".[] | select(.Model | contains(\"$model\"))" ${HOMEPATH}/include/platforms.json | jq -r -e .CPU) </td>"
|
|
echo "<td> $(jq -r -e ".[] | select(.Model | contains(\"$model\"))" ${HOMEPATH}/include/platforms.json | jq -r -e .Cores) </td>"
|
|
echo "<td> $(jq -r -e ".[] | select(.Model | contains(\"$model\"))" ${HOMEPATH}/include/platforms.json | jq -r -e .Threads) </td>"
|
|
echo "<td> $(jq -r -e ".[] | select(.Model | contains(\"$model\"))" ${HOMEPATH}/include/platforms.json | jq -r -e .Platform) </td>"
|
|
echo "<td> $(jq -r -e ".[] | select(.Model | contains(\"$model\"))" ${HOMEPATH}/include/platforms.json | jq -r -e .RAM) </td>"
|
|
echo "</tr>"
|
|
done
|
|
|
|
echo "</tr></tbody></table>"
|
|
|
|
}
|
|
|
|
function autoaddexts() {
|
|
|
|
getvars
|
|
|
|
wecho "Automatically detecting the required extensions"
|
|
BUILDMODEL="$(echo $MODEL | tr '[:upper:]' '[:lower:]' | sed -e "s/+/p/g")"
|
|
platform_selected="$(jq -s '.[0].build_configs=(.[1].build_configs + .[0].build_configs | unique_by(.id)) | .[0]' $CUSTOMCONFIG | jq ".build_configs[] | select(.id==\"${BUILDMODEL}-${VERSION}\")")"
|
|
EXTENSIONS="$(echo $platform_selected | jq -r -e '.add_extensions[]' | grep json | awk -F: '{print $1}' | sed -s 's/"//g')"
|
|
EXTENSIONS_SOURCE_URL="$(echo $platform_selected | jq -r -e '.add_extensions[]' | grep json | awk '{print $2}' | sed -e 's/,//g' -e 's/"//g')"
|
|
BUILDVERSION="$(echo $VERSION | awk -F- '{print $2}')"
|
|
|
|
wecho "Autoadding, executing : ${HOMEPATH}/include/listmodules.sh for ${BUILDMODEL}_${BUILDVERSION}" | tee -a ${BUILDLOG}
|
|
${HOMEPATH}/include/listmodules.sh ${BUILDMODEL}_${BUILDVERSION} | tee -a ${BUILDLOG}
|
|
|
|
}
|
|
|
|
function extmanagement() {
|
|
|
|
getvars
|
|
|
|
cat <<EOF
|
|
<div class="extmanagement" id="extmanagement">
|
|
<div class="title-bar">
|
|
<h3>Extension Management</h3>
|
|
<!-- Add buttons for minimization, maximization, and closing the window -->
|
|
</div>
|
|
<div class="content">
|
|
EOF
|
|
if [ -z "$MODEL" ] || [ -z "$VERSION" ]; then
|
|
echo "<p>Model or Version is not selected or not found, please click build to select model first<p>"
|
|
return
|
|
fi
|
|
|
|
BUILDMODEL="$(echo $MODEL | tr '[:upper:]' '[:lower:]' | sed -e "s/+/p/g")"
|
|
platform_selected="$(jq -s '.[0].build_configs=(.[1].build_configs + .[0].build_configs | unique_by(.id)) | .[0]' $CUSTOMCONFIG | jq ".build_configs[] | select(.id==\"${BUILDMODEL}-${VERSION}\")")"
|
|
EXTENSIONS="$(echo $platform_selected | jq -r -e '.add_extensions[]' | grep json | awk -F: '{print $1}' | sed -s 's/"//g')"
|
|
EXTENSIONS_SOURCE_URL="$(echo $platform_selected | jq -r -e '.add_extensions[]' | grep json | awk '{print $2}' | sed -e 's/,//g' -e 's/"//g')"
|
|
BUILDVERSION="$(echo $VERSION | awk -F- '{print $2}')"
|
|
wecho "Please note that for MODEL ${BUILDMODEL}_${BUILDVERSION}, the following extensions are added automatically: $EXTENSIONS <br>"
|
|
|
|
for exturl in $EXTENSIONS_SOURCE_URL; do
|
|
|
|
if [ $(jq -re '.url' ${HOMEPATH}/payload/*/rpext* | grep -i $exturl | wc -l) -ge 1 ]; then
|
|
echo "Extension $exturl already added, skipping" | tee -a ${BUILDLOG} >/dev/null
|
|
continue
|
|
else
|
|
${HOMEPATH}/include/extmgr.sh extadd $exturl ${BUILDMODEL}_${BUILDVERSION} | tee -a ${BUILDLOG} >/dev/null
|
|
fi
|
|
|
|
done
|
|
|
|
#listplaforms
|
|
|
|
extensionpayload="$(
|
|
for ext in $(cat /home/tc/payload/extensions | uniq); do
|
|
cat /home/tc/payload/$ext/*json | jq -r -e '. | .id,.url ' | paste -d " " - - | sort | uniq
|
|
done
|
|
)"
|
|
[ ! -f $extensionfile ] && curl --insecure -sL $extensionrepofile -O
|
|
extensionlist="$(cat $extensionfile | jq -r -e '. | .id,.url ' | paste -d " " - - | sort | uniq)"
|
|
|
|
echo "<div id=\"extmanagement\">"
|
|
echo "<input type=\"hidden\" id=\"myplatform\" name=\"myplatform\" value=\"${BUILDMODEL}_${BUILDVERSION}\">"
|
|
echo "<select rows=\"10\" id=\"extensionlist\" name=\"extensionlist\" class=\"form-select\" size=\"3\" aria-label=\"size 3 select example\">"
|
|
while IFS=" " read -r extension exturl; do
|
|
tooltiptext="$(jq -r -e ". | select(.id==\"$extension\") | .info.description " $extensionfile | uniq)"
|
|
echo "<option value=\"$exturl\" data-toggle=\"tooltip\" title=\"$tooltiptext\" >$extension</option>"
|
|
done < <(printf '%s\n' "$extensionlist")
|
|
|
|
echo "</select>"
|
|
|
|
echo "<button id=\"addextbutton\" name=\"addextbutton\" onclick=\"\" type=\"button\" class=\"btn btn-primary btn-sm\">Add extension</button></div>"
|
|
|
|
echo "<select rows=\"10\" id=\"extensionpayloadlist\" name=\"extensionpayload\" class=\"form-select\" size=\"3\" aria-label=\"size 3 select example\">"
|
|
while IFS=" " read -r extension exturl; do
|
|
|
|
echo "<option value=\"$exturl\">$extension</option>"
|
|
done < <(printf '%s\n' "$extensionpayload")
|
|
|
|
echo "</select>"
|
|
|
|
echo "<button id=\"remextbutton\" name=\"remextbutton\" onclick=\"\" type=\"button\" class=\"btn btn-danger btn-sm\">Remove extension</button></div>"
|
|
echo "<input type=\"url\" class=\"form-control input-sm\" id=\"manualexturl\" placeholder=\"Extension URL to manualy add \">"
|
|
echo "<button id=\"manualextbutton\" name=\"manualextbutton\" onclick=\"\" type=\"button\" class=\"btn btn-info btn-sm\">Manual add extensions</button>"
|
|
echo "<button id=\"autoextbutton\" name=\"autoextbutton\" onclick=\"\" type=\"button\" class=\"btn btn-info btn-sm\">Auto add extensions</button>"
|
|
|
|
echo "</div></div></div>"
|
|
|
|
}
|
|
|
|
checkloader() {
|
|
|
|
echo "Checking loader consistency ..."
|
|
status "setstatus" "checkloader" "false" "Checking loader consistency ..."
|
|
status "setstatus" "checkloader" "false" "Checking menuentries ..."
|
|
echo -n "Checking menuentries ..." && echo "$(grep menuentry /mnt/${loaderdisk}1/boot/grub/grub.cfg | wc -l) entries found" && status "setstatus" "checkloader" "false" "$(grep menuentry /mnt/${loaderdisk}1/boot/grub/grub.cfg | wc -l) entries found"
|
|
echo "Checking boot files are in place..."
|
|
status "setstatus" "checkloader" "false" "Checking boot files are in place..."
|
|
|
|
for bootfile in bzImage-friend initrd-friend zImage-dsm initrd-dsm user_config.json custom.gz; do
|
|
[ -f /mnt/${tcrppart}/$bootfile ] && echo "OK ! file /mnt/${tcrppart}/$bootfile, IN PLACE" && status "setstatus" "checkloader" "false" "OK ! file /mnt/${tcrppart}/$bootfile, IN PLACE" || echo "Error ! /mnt/${tcrppart}/$bootfile MISSING" || status "setstatus" "checkloader" "false" "Error ! /mnt/${tcrppart}/$bootfile MISSING"
|
|
done
|
|
|
|
status "setstatus" "checkloader" "false" "Checking user_config.json general block ..."
|
|
echo -n "Checking user_config.json general block ..." && [ $(jq .general /mnt/${tcrppart}/user_config.json | wc -l) -ge 12 ] && echo "OK" && status "setstatus" "checkloader" "true" "Done, all seems OK"
|
|
|
|
}
|
|
|
|
function latestscript() {
|
|
|
|
curl --insecure -L $SCRIPTREPO -o /tmp/index.sh
|
|
chmod +x /tmp/index.sh
|
|
|
|
curversion="$(grep "SCRIPTVERSION=" /home/tc/html/index.sh | head -1 | awk -F\" '{print $2}')"
|
|
repoversion="$(grep "SCRIPTVERSION=" /tmp/index.sh | head -1 | awk -F\" '{print $2}')"
|
|
reposha256sum="/tmp/index.sh | awk '{print $1'"
|
|
cursha256sum="$(sha256sum /home/tc/html/index.sh | awk '{print $1}')"
|
|
|
|
rm -f /tmp/index.sh
|
|
if [ "$curversion" != "$repoversion" ] || [ "$reposha256sum" != "$cursha256sum" ] && [ $(($(echo $repoversion | sed -e 's/'.//')-$(echo $curversion| sed -e 's/'.//'))) -gt 0 ]; then
|
|
wecho "Current version : $curversion, new version available $repoversion, please update"
|
|
echo "<a href=\"${THISURL}?action=updatescript\" class=\"btn btn-primary btn-lg active\" role=\"button\" aria-pressed=\"true\">UPDATE</a>"
|
|
fi
|
|
|
|
}
|
|
|
|
function updatescript() {
|
|
|
|
curl --insecure -L $SCRIPTREPO -o /tmp/index.sh && chmod +x /tmp/index.sh
|
|
repoversion="$(grep "SCRIPTVERSION=" /tmp/index.sh | head -1 | awk -F\" '{print $2}')"
|
|
|
|
[ ! -n "$(/tmp/index.sh version)" ] && cp /tmp/index.sh /home/tc/html/index.sh && chmod +x /home/tc/html/index.sh && wecho "Script updated to version $repoversion" && exit 0
|
|
[ -n "$(/tmp/index.sh version)" ] && wecho "Error updating script, please try again later" && exit 1
|
|
rm -f /tmp/index.sh
|
|
|
|
}
|
|
|
|
function fullupgrade() {
|
|
|
|
getvars
|
|
|
|
cd $HOMEPATH
|
|
|
|
backupdate="$(date +%Y-%b-%d-%H-%M)"
|
|
|
|
echo "Performing a full TCRP upgrade"
|
|
|
|
mkdir -p /mnt/$tcrppart/backup
|
|
echo "Backuping up current files to /mnt/$tcrppart/backup/loaderbackup-${backupdate}.tgz"
|
|
tar cfz /mnt/$tcrppart/backup/loaderbackup-${backupdate}.tgz /home/tc 2>&1 >/dev/null
|
|
git --git-dir=/dev/null clone --depth=1 $rploadergit
|
|
cd /home/tc/tinycore-redpill && sudo cp -frp * /home/tc && cd /home/tc
|
|
rm -rf tinycore-redpill
|
|
find /home/tc -type f -name "*.sh" -exec chmod +x {} \;
|
|
find /home/tc/tools -type f -exec chmod +x {} \;
|
|
|
|
backuploader
|
|
|
|
}
|
|
|
|
function buildstatus() {
|
|
|
|
echo "<div id="buildstatus"></div><br>"
|
|
|
|
}
|
|
|
|
checkuserconfig() {
|
|
|
|
retries=0
|
|
MODEL="$1"
|
|
VERSION="$2"
|
|
|
|
if [ $(jq . $USERCONFIGFILE | wc -l) -ge 38 ]; then
|
|
echo "File $USERCONFIGFILE looks OK" >>${BUILDLOG}
|
|
else
|
|
if [ -n "$MODEL " ] && [ -n "$VERSION " ]; then
|
|
wecho "Error, $USERCONFIGFILE looks corrupted, trying to fix it"
|
|
cp -f ${HOMEPATH}/include/user_config.json $USERCONFIGFILE
|
|
while [ "$testmodel" != "$MODEL" ] && [ "$testversion" != "$VERSION" ] && [ $retries -le 5 ]; do
|
|
updateuserconfigfield "general" "model" "$MODEL"
|
|
updateuserconfigfield "general" "version" "$VERSION"
|
|
testmodel="$(jq .general.model $USERCONFIGFILE | sed -e 's/"//g')"
|
|
testversion="$(jq .general.model $USERCONFIGFILE | sed -e 's/"//g')"
|
|
echo "$MODEL , $VERSION, retries=$retries"
|
|
let retries=$retries+1
|
|
wecho "Retrying $retries"
|
|
done
|
|
[ "$testmodel" != "$MODEL" ] && [ "$testversion" != "$VERSION" ] && pagefooter && exit 99
|
|
else
|
|
wecho "Error both $USERCONFIGFILE file looks corrupted, select Additional Actions -> Reset model to recreate"
|
|
fi
|
|
pagefooter
|
|
exit 99
|
|
fi
|
|
|
|
}
|
|
|
|
function readlog() {
|
|
|
|
cat <<EOF
|
|
<div class="buildlog fixed-bottom pre-scrollable bg-dark" id="buildlog">
|
|
<h3 class="fixed">Build output log<button id="hideoutputlog" class="btn btn-lg btn-success btn-right hideoutputlog" onclick="return hidebuildlog()">Hide build log</button><a id="downloadlog" href="buildlog.txt" class="btn btn-lg btn-success btn-right downloadlog">Download log</a></h3>
|
|
<pre id="buildlogtab"></pre>
|
|
|
|
</div>
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
[ -z "$POST_STRING" -a "$REQUEST_METHOD" = "POST" -a ! -z "$CONTENT_LENGTH" ] && read -n $CONTENT_LENGTH POST_STRING
|
|
|
|
OIFS=$IFS
|
|
IFS='=&'
|
|
parm_get=($QUERY_STRING)
|
|
parm_post=($POST_STRING)
|
|
IFS=$OIFS
|
|
|
|
declare -A get
|
|
declare -A post
|
|
|
|
for ((i = 0; i < ${#parm_get[@]}; i += 2)); do
|
|
get[${parm_get[i]}]=$(urldecode ${parm_get[i + 1]})
|
|
done
|
|
|
|
for ((i = 0; i < ${#parm_post[@]}; i += 2)); do
|
|
post[${parm_post[i]}]=$(urldecode ${parm_post[i + 1]})
|
|
done
|
|
|
|
if [ -z "$GATEWAY_INTERFACE" ]; then
|
|
[ -z "$GATEWAY_INTERFACE" ] && [ "$1" = "version" ] && echo "$SCRIPTVERSION" || echo "This is meant to run under CGI or to include functions in other scripts"
|
|
[ ! -z "$GATEWAY_INTERFACE" ] && [ "$1" = "version" ] && echo "$SCRIPTVERSION" && exit 0
|
|
else
|
|
|
|
echo "Gateway is : $GATEWAY_INTERFACE"
|
|
pagehead
|
|
pagebody
|
|
|
|
#echo "QUERY : $QUERY_STRING"
|
|
#echo "POST : $POST_STRING"
|
|
#echo "<br>INITIAL PAGE, REQUEST : $REQUEST_METHOD"
|
|
|
|
if [ "$REQUEST_METHOD" = "GET" ]; then
|
|
MODEL="$(echo ${get[mymodel]} | sed -s "s/'//g")"
|
|
VERSION="$(echo ${get[myversion]} | sed -s "s/'//g")"
|
|
action="$(echo "${get[action]}" | sed -s "s/'//g")"
|
|
elif [ "$REQUEST_METHOD" = "POST" ]; then
|
|
if [ -z "$(echo ${post[mymodel]} | sed -s "s/'//g")" ]; then
|
|
MODEL="$(echo "${get[mymodel]}" | sed -s "s/'//g")"
|
|
else
|
|
MODEL="$(echo "${post[mymodel]}" | sed -s "s/'//g")"
|
|
fi
|
|
VERSION="$(echo "${post[myversion]}" | sed -s "s/'//g")"
|
|
REVISION="$(echo "${VERSION}" | awk -F- '{print $2}')"
|
|
serial="$(echo "${post[serial]}" | sed -s "s/'//g")"
|
|
macaddress="$(echo "${post[macaddress]}" | sed -s "s/'//g")"
|
|
staticboot="$(echo "${post[staticboot]}" | sed -s "s/'//g")"
|
|
sataportmap="$(echo "${post[sataportmap]}" | sed -s "s/'//g")"
|
|
diskidxmap="$(echo "${post[diskidxmap]}" | sed -s "s/'//g")"
|
|
redpillmake="$(echo "${post[redpillmake]}" | sed -s "s/'//g")"
|
|
if [ -z "$(echo ${post[action]} | sed -s "s/'//g")" ]; then
|
|
action="$(echo "${get[action]}" | sed -s "s/'//g")"
|
|
else
|
|
action="$(echo "${post[action]}" | sed -s "s/'//g")"
|
|
fi
|
|
#action="$(echo "${post[action]}" | sed -s "s/'//g")"
|
|
extracmdline="$(
|
|
echo "${post[extracmdline]}" | sed -s "s/'//g" | sed -s 's/ /\n/g' | sed -s 's/%3D/=/g'
|
|
)"
|
|
buildit="$(echo "${post[buildit]}" | sed -s "s/'//g")"
|
|
if [ "$action" == "extadd" ]; then
|
|
exturl="$(echo "${post[exturl]}" | sed -s "s/'//g")"
|
|
fi
|
|
if [ "$action" == "staticipset" ]; then
|
|
ipset="$(echo "${post[ipset]}" | sed -s "s/'//g")"
|
|
ipaddr="$(echo "${post[ipaddr]}" | sed -s "s/'//g")"
|
|
ipgw="$(echo "${post[ipgw]}" | sed -s "s/'//g")"
|
|
ipdns="$(echo "${post[ipdns]}" | sed -s "s/'//g")"
|
|
ipproxy="$(echo "${post[ipproxy]}" | sed -s "s/'//g")"
|
|
fi
|
|
if [ "$action" == "mountshare" ]; then
|
|
share="$(echo "${post[share]}" | sed -s "s/'//g")"
|
|
mountpoint="$(echo "${post[mountpoint]}" | sed -s "s/'//g")"
|
|
cifsuser="$(echo "${post[cifsuser]}" | sed -s "s/'//g")"
|
|
cifspass="$(echo "${post[cifspass]}" | sed -s "s/'//g")"
|
|
enccifsuser="$(printf %s "${post[cifsuser]}" | jq -sRr @uri | sed -s "s/'//g")"
|
|
enccifspass="$(printf %s "${post[cifspass]}" | jq -sRr @uri | sed -s "s/'//g")"
|
|
fi
|
|
|
|
fi
|
|
|
|
#echo "POST STRING : $POST_STRING : Action = $action" | tee -a buildlog.log
|
|
#echo "<br>REQUEST METHOD $REQUEST_METHOD , MODEL : $MODEL , VERSION : $VERSION"
|
|
#echo "<br>Serial : $serial , MAC : $macaddress , Buildit : $buildit"
|
|
#echo "<br>Build VARS : MODEL :$MODEL VERSION: $VERSION SN: $serial MAC: $macaddress BUILDIT: $buildit"
|
|
#echo "<br>Build VARS : sataportmap :$sataportmap diskidxmap: $diskidxmap RepillMake: $redpillmake Static Boot: $staticboot "
|
|
|
|
[ "$action" == "backuploader" ] && result=$(backuploader) && recho "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "listplatforms" ] && result=$(listplatforms) && wecho "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "cleanloader" ] && result=$(cleanbuild) && recho "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "extensions" ] && result=$(extmanagement) && wecho "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "extadd" ] && wecho "Extadd" && result=$($HOMEPATH/include/extmgr.sh extadd $exturl $MODEL) && wecho "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "setversion" ] && result=$(selectversion) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "resetmodel" ] && result=$(resetmodel) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "redpillmake" ] && result=$(redpillmake) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "staticip" ] && result=$(staticip) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "staticipset" ] && result=$(staticipset) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "realmac" ] && result=$(realmac) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "autoaddexts" ] && result=$(autoaddexts) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "generategrub" ] && result=$(generategrub $MODEL) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "bringoverfriend" ] && result=$(bringoverfriend) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "versionhistory" ] && result=$(versionhistory) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "mountshare" ] && result=$(mountshare) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "buildstatus" ] && result=$(buildstatus) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "updatescript" ] && result=$(updatescript) && recho "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "fullupgrade" ] && result=$(fullupgrade) && recho "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "sysreboot" ] && result=$(sysreboot) && recho "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "filemanagement" ] && result=$(filemanagement) && echo "$result" | tee -a ${BUILDLOG}
|
|
[ "$action" == "imgbackuploader" ] && result=$(imgbackuploader) && echo "$result" | tee -a ${BUILDLOG}
|
|
|
|
[ "$action" == "none" ] && loaderstatus
|
|
|
|
if [ "$action" == "build" ]; then
|
|
|
|
echo "Clearing log file" >${BUILDLOG}
|
|
|
|
getvars
|
|
|
|
#checkuserconfig
|
|
|
|
if [ ! -z "$MODEL" ] && [ ! -z "$VERSION" ] && [ ! -z "$serial" ] && [ ! -z "$macaddress" ] && [ ! -z "$buildit" ]; then
|
|
|
|
echo "Building loader for model, $MODEL and software version, $VERSION" | tee -a ${BUILDLOG} >/dev/null
|
|
buildstatus
|
|
|
|
#status clearstatus
|
|
status "setstatus" "buildstatus" "true" "Started building the loader from Model :${MODEL}-${VERSION} at : $(date +"%A %b %Y Time: %H:%M:%S")"
|
|
|
|
downloadtools | tee -a ${BUILDLOG} >/dev/null
|
|
|
|
downloadpat | tee -a ${BUILDLOG} >/dev/null
|
|
|
|
build | tee -a ${BUILDLOG} >/dev/null
|
|
|
|
#result="$(cd ${HOMEPATH} && ./rploader.sh build v1000-7.1.0-42661 withfriend)"
|
|
#recho "$result" | tee -a buildlog.log
|
|
|
|
fi
|
|
|
|
if [ -z "$MODEL" ]; then
|
|
|
|
selectmodel
|
|
|
|
elif [ -z "$VERSION" ]; then
|
|
selectversion
|
|
fi
|
|
|
|
if [ ! -z "$MODEL" ] && [ ! -z "$VERSION" ] && [ -z "$buildit" ] && [ ! -z "$action" ]; then
|
|
|
|
#selectversion
|
|
#echo "<br></h1>Selected Model = $MODEL <br> Selected Version = $VERSION</h1><br>"
|
|
breadcrumb
|
|
buildstatus
|
|
buildform
|
|
status recreatejson
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
pagefooter
|
|
fi
|