1. added multipath protocol and schema suport

2. added SCTP protocol and schema support
3. added set of NAS models support (Asustor, ReadyNAS, Drobo, QNAP, WD, Synology, Terramaster)
4. moved to fc00::/7 private segment
5. added Windows, MacOS and Linux UI for peers edit and current status
This commit is contained in:
vadym 2022-10-27 22:03:37 +03:00
parent cfa293d189
commit d8a4000141
198 changed files with 8589 additions and 697 deletions

View file

@ -0,0 +1,8 @@
RedirectMatch 301 ^/mesh$ /mesh/
LoadModule proxy_http_module modules/mod_proxy_http.so
<Location /mesh/>
ProxyPreserveHost On
ProxyPass "http://127.0.0.1:19019/"
ProxyPassReverse "http://127.0.0.1:19019/"
</Location>

View file

@ -0,0 +1,7 @@
#!/bin/sh
CFG=/etc/default_config/uLinux.conf
echo vendor=QNAP
echo vendorOperatingSystemName=$(/sbin/getcfg System OS -f $CFG)
echo firmwareVersion=$(/sbin/getcfg System Version -f $CFG)
echo model=$(/sbin/getcfg System Model -f $CFG)
echo serial=$(/sbin/get_hwsn)

View file

@ -0,0 +1,31 @@
#!/bin/sh
#we want read:
#export HTTP_COOKIE='qnapuser=admin; qnappwd=L4edNyoCC15.kDBLIN05480'
IFS=';'
for x in $HTTP_COOKIE
do
eval $x
done
[ -z ${qnapuser} ] && exit 1
[ -z ${qnappwd} ] && exit 1
#exit with zero status on auth success
#2-pass auth
S=$(curl -s -k -L "http://127.0.0.1:58080/cgi-bin/authLogin.cgi?user=${qnapuser}&pwd=${qnappwd}" | tr -d '\040\011\012\015' | grep -F '<authPassed><![CDATA[1]]></authPassed>')
[ ! 0 -eq ${#S} ] && exit 0
AUTH_PORT=$(cat /etc/apache-sys-proxy.conf | grep Listen | awk '{print $2}')
if [ -n $AUTH_PORT ] ; then
AUTH_PORT=8080
fi
S=$(curl -s -k -L "http://127.0.0.1:${AUTH_PORT}/cgi-bin/authLogin.cgi?user=${qnapuser}&pwd=${qnappwd}" | tr -d '\040\011\012\015' | grep -F '<authPassed><![CDATA[1]]></authPassed>')
[ ! 0 -eq ${#S} ] && exit 0
#fallback to plain password auth
#decode password first
plain_pwd=$(openssl enc -base64 -d <<< ${qnappwd})
[ -z $plain_pwd ] && exit 1
S=$(curl -s -k -L "http://127.0.0.1:${AUTH_PORT}/cgi-bin/authLogin.cgi?user=${qnapuser}&plain_pwd=${plain_pwd}" | tr -d '\040\011\012\015' | grep -F '<authPassed><![CDATA[1]]></authPassed>')
[ 0 -eq ${#S} ] && exit 1 || exit 0

View file

@ -0,0 +1,12 @@
#!/bin/sh
log_exit(){
echo $2
exit $1
}
[ -z "$MESH_USER_NAME" ] && log_exit 1 "Credentials are not set. Remove aborted"
rm "$MESH_APP_ROOT/bin/mesh
rm -rf "$MESH_APP_ROOT/www"

View file

@ -0,0 +1,102 @@
/* encode function start */
var ezEncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var ezDecodeChars = new Array(
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
function utf16to8(str)
{
var out, i, len, c;
out = "";
len = str.length;
for (i=0; i<len; i++) {
c = str.charCodeAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
out += str.charAt(i);
}
else if (c > 0x07FF) {
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
out += String.fromCharCode(0x80 | ((c >>6) & 0x3F));
out += String.fromCharCode(0x80 | ((c >>0) & 0x3F));
}
else {
out += String.fromCharCode(0xC0 | ((c >>6) & 0x1F));
out += String.fromCharCode(0x80 | ((c >>0) & 0x3F));
}
}
return out;
}
function utf8to16(str) {
var out, i, len, c;
var char2, char3;
out = "";
len = str.length;
i = 0;
while(i < len) {
c = str.charCodeAt(i++);
switch(c >> 4)
{
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
// 0xxxxxxx
out += str.charAt(i-1);
break;
case 12: case 13:
// 110x xxxx 10xx xxxx
char2 = str.charCodeAt(i++);
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
// 1110 xxxx10xx xxxx10xx xxxx
char2 = str.charCodeAt(i++);
char3 = str.charCodeAt(i++);
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
}
}
return out;
}
function ezEncode(str)
{
var out, i, len;
var c1, c2, c3;
len = str.length;
i = 0;
out = "";
while(i < len)
{
c1 = str.charCodeAt(i++) & 0xff;
if(i == len)
{
out += ezEncodeChars.charAt(c1 >> 2);
out += ezEncodeChars.charAt((c1 & 0x3) << 4);
out += "==";
break;
}
c2 = str.charCodeAt(i++);
if(i == len)
{
out += ezEncodeChars.charAt(c1 >> 2);
out += ezEncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += ezEncodeChars.charAt((c2 & 0xF) << 2);
out += "=";
break;
}
c3 = str.charCodeAt(i++);
out += ezEncodeChars.charAt(c1 >> 2);
out += ezEncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += ezEncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
out += ezEncodeChars.charAt(c3 & 0x3F);
}
return out;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -0,0 +1,104 @@
var ed = {
partnerId: 1222,
brand: 'RiV Mesh',
applicationName: "RiV Mesh QNAP NAS OS App",
nasOSName: "QNAP NAS device",
useAuthNASRichScreen: true,
nasVisitEDWebsiteLogin: "https://github.com/RiV-chain/RiV-mesh",
nasVisitEDWebsiteSignup: "https://github.com/RiV-chain/RiV-mesh",
nasVisitEDWebsiteLoggedin: "https://github.com/RiV-chain/RiV-mesh",
getNasAuthUrl: function () {
return "/";
}
};
$(function () {
ed.nasLoginCall = function (nasLoginSuccess, nasLoginFailure) {
/* encode function start */
var ezEncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function utf16to8(str)
{
var out, i, len, c;
out = "";
len = str.length;
for (i = 0; i < len; i++) {
c = str.charCodeAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
out += str.charAt(i);
} else if (c > 0x07FF) {
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
} else {
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
}
}
return out;
}
function ezEncode(str)
{
var out, i, len;
var c1, c2, c3;
len = str.length;
i = 0;
out = "";
while (i < len)
{
c1 = str.charCodeAt(i++) & 0xff;
if (i == len)
{
out += ezEncodeChars.charAt(c1 >> 2);
out += ezEncodeChars.charAt((c1 & 0x3) << 4);
out += "==";
break;
}
c2 = str.charCodeAt(i++);
if (i == len)
{
out += ezEncodeChars.charAt(c1 >> 2);
out += ezEncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
out += ezEncodeChars.charAt((c2 & 0xF) << 2);
out += "=";
break;
}
c3 = str.charCodeAt(i++);
out += ezEncodeChars.charAt(c1 >> 2);
out += ezEncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
out += ezEncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
out += ezEncodeChars.charAt(c3 & 0x3F);
}
return out;
}
var d = new Date();
d.setTime(d.getTime() + (30 * 60 * 1000));
document.cookie = "qnapuser=" + encodeURIComponent($('#nasInputUser').val()) + "; expires=" + d.toUTCString() + "; path=/";
document.cookie = "qnappwd=" + encodeURIComponent(ezEncode(utf16to8($('#nasInputPassword').val()))) + "; expires=" + d.toUTCString() + "; path=/";
$.ajax({url: "rest/info"}).done(function (response) {
window.location.reload();
checkError(response);
}).fail(function () {
ed.nasLogoutCall();
nasLoginFailure();
});
};
ed.nasLogoutCall = function() {
document.cookie = "qnapuser=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/";
document.cookie = "qnappwd=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/";
};
function getCookie(name) {
var matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}
ed.getNasUser = function() {
return getCookie('qnapuser');
};
});

View file

@ -0,0 +1,42 @@
#script called from qinstall.sh
#SYS_QPKG_SERVICE_ENABLED="FALSE"
QPKG_NAME="mesh"
CONF=/etc/config/mesh.conf
PKG_PRE_REMOVE="{
killall -q mesh
rm -rf /share/Web/$QPKG_NAME
[ -L /var/log/mesh.log ] && rm -f /var/log/mesh.log
}"
PKG_MAIN_REMOVE="{
$CMD_RM -f $CONF
}"
pkg_pre_install(){
killall -q mesh
rm -rf /share/Web/$QPKG_NAME
}
pkg_install(){
exec 2>/tmp/mesh.log
set -x
if [ -f $CONF ]; then
mkdir -p /var/backups
echo "Backing up configuration file to /var/backups/mesh.conf.`date +%Y%m%d`"
cp $CONF /var/backups/mesh.conf.`date +%Y%m%d`
echo "Normalising and updating $CONF"
${SYS_QPKG_DIR}/bin/mesh -useconf -normaliseconf < /var/backups/mesh.conf.`date +%Y%m%d` > $CONF
else
echo "Generating initial configuration file $config_file"
echo "Please familiarise yourself with this file before starting RiV-mesh"
sh -c "umask 0027 && ${SYS_QPKG_DIR}/bin/mesh -genconf > '$CONF'"
fi
chmod a+w $CONF
}
pkg_post_install(){
ln -sf $SYS_QPKG_DIR/var/log/mesh.log $SYS_QPKG_DIR/www/log
}

View file

@ -0,0 +1,120 @@
#!/bin/sh
QPKG_CONF="/etc/config/qpkg.conf"
CONF="/etc/config/mesh.conf"
QPKG_NAME="mesh"
QPKG_DIR=$(/sbin/getcfg $QPKG_NAME Install_Path -f $QPKG_CONF)
KERNEL_MODULES+=" tun"
load_kernel_modules(){
local KERNEL_VERSION=$(/bin/uname -r)
local KERNEL_MODULES_PATH="/lib/modules"
for M in ${KERNEL_MODULES}; do
if [ -f ${KERNEL_MODULES_PATH}/vpn/${M}.ko ]; then
/sbin/insmod ${KERNEL_MODULES_PATH}/vpn/${M}.ko
continue
fi
if [ -f ${KERNEL_MODULES_PATH}/qvpn/${M}.ko ]; then
/sbin/insmod ${KERNEL_MODULES_PATH}/qvpn/${M}.ko
continue
fi
if [ -f ${KERNEL_MODULES_PATH}/misc/${M}.ko ]; then
/sbin/insmod ${KERNEL_MODULES_PATH}/misc/${M}.ko
continue
fi
if [ -f ${KERNEL_MODULES_PATH}/others/${M}.ko ]; then
/sbin/insmod ${KERNEL_MODULES_PATH}/others/${M}.ko
continue
fi
if [ -f ${KERNEL_MODULES_PATH}/${KERNEL_VERSION}/${M}.ko ]; then
/sbin/insmod ${KERNEL_MODULES_PATH}/${KERNEL_VERSION}/${M}.ko
continue
fi
done
}
create_tun(){
if ( [ ! -c /dev/net/tun ] ); then
if ( [ ! -d /dev/net ] ); then
mkdir -m 755 /dev/net
fi
mknod /dev/net/tun c 10 200
chmod 0755 /dev/net/tun
fi
# Load the tun module if not already loaded
if ( !(lsmod | grep -q "^tun\s") ); then
insmod /lib/modules/tun.ko
fi
}
start_service ()
{
exec 2>>/tmp/mesh.log
set -x
#enable ipv6
sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl -w net.ipv6.conf.default.disable_ipv6=0
# Create the necessary file structure for /dev/net/tun
create_tun
load_kernel_modules
#. /etc/init.d/vpn_common.sh && load_kernel_modules
if [ ! -f '/etc/config/apache/extra/apache-mesh.conf' ] ; then
ln -sf $QPKG_DIR/apache-mesh.conf /etc/config/apache/extra/
apache_reload=1
fi
if ! grep '/etc/config/apache/extra/apache-mesh.conf' /etc/config/apache/apache.conf ; then
echo 'Include /etc/config/apache/extra/apache-mesh.conf' >> /etc/config/apache/apache.conf
apache_reload=1
fi
if [ -n "$apache_reload" ] ; then
/usr/local/apache/bin/apachectl -k graceful
fi
# Launch the mesh in the background.
${QPKG_DIR}/bin/mesh -useconffile "$CONF" \
-httpaddress "http://127.0.0.1:19019" \
-wwwroot "$QPKG_DIR/www" \
-logto "$QPKG_DIR/var/log/mesh.log" &
if [ $? -ne 0 ]; then
echo "Starting $QPKG_NAME failed"
exit 1
fi
}
stop_service ()
{
# Kill mesh
pid=`pidof -s mesh`
if [ -z "$pid" ]; then
echo "mesh was not running"
exit 0
fi
kill "$pid"
}
case "$1" in
start)
start_service
;;
stop)
stop_service
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0