mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2025-04-29 14:45:07 +03:00
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:
parent
cfa293d189
commit
d8a4000141
198 changed files with 8589 additions and 697 deletions
8
contrib/ui/nas-qnap/au/apache-mesh.conf
Normal file
8
contrib/ui/nas-qnap/au/apache-mesh.conf
Normal 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>
|
7
contrib/ui/nas-qnap/au/var/lib/mesh/hooks/deviceinfo
Normal file
7
contrib/ui/nas-qnap/au/var/lib/mesh/hooks/deviceinfo
Normal 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)
|
31
contrib/ui/nas-qnap/au/var/lib/mesh/hooks/webauth
Normal file
31
contrib/ui/nas-qnap/au/var/lib/mesh/hooks/webauth
Normal 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
|
12
contrib/ui/nas-qnap/au/var/lib/mesh/pre_upgrade.sh
Normal file
12
contrib/ui/nas-qnap/au/var/lib/mesh/pre_upgrade.sh
Normal 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"
|
||||
|
102
contrib/ui/nas-qnap/au/www/assets/get_sid.js
Normal file
102
contrib/ui/nas-qnap/au/www/assets/get_sid.js
Normal 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;
|
||||
}
|
BIN
contrib/ui/nas-qnap/au/www/assets/partner-logo.png
Normal file
BIN
contrib/ui/nas-qnap/au/www/assets/partner-logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
104
contrib/ui/nas-qnap/au/www/assets/properties.js
Normal file
104
contrib/ui/nas-qnap/au/www/assets/properties.js
Normal 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');
|
||||
};
|
||||
});
|
42
contrib/ui/nas-qnap/package/package_routines
Normal file
42
contrib/ui/nas-qnap/package/package_routines
Normal 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
|
||||
}
|
120
contrib/ui/nas-qnap/package/shared/mesh.sh
Normal file
120
contrib/ui/nas-qnap/package/shared/mesh.sh
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue