Added: python tools for server commands
Install Rocketchat scriptfeature/prepare-cross-merge
parent
406072f3e1
commit
5bddc6eaa7
@ -0,0 +1,143 @@
|
||||
import logging
|
||||
import socket
|
||||
|
||||
from nel_message import *
|
||||
|
||||
|
||||
class CAdminServiceWeb(CCallbackClient):
|
||||
|
||||
def globalCmd(self, command):
|
||||
msg = CMessage()
|
||||
msg.setName("GCMD")
|
||||
msg.serialString(command)
|
||||
return self.sendMessage(msg)
|
||||
|
||||
def controlCmd(self, serviceAlias, command):
|
||||
msg = CMessage()
|
||||
msg.setName("CCMD")
|
||||
|
||||
msg.serialString(serviceAlias)
|
||||
msg.serialString(command)
|
||||
|
||||
return self.sendMessage(msg)
|
||||
|
||||
|
||||
def serviceCmd(self, serviceAlias, command):
|
||||
msg = CMessage()
|
||||
msg.setName("SCMD")
|
||||
|
||||
msg.serialString(serviceAlias)
|
||||
msg.serialString(command)
|
||||
|
||||
return self.sendMessage(msg)
|
||||
|
||||
def getShardOrders(self):
|
||||
msg = CMessage()
|
||||
msg.setName("GSO")
|
||||
|
||||
ret = ""
|
||||
ret = sendMessage(msg)
|
||||
if not ret:
|
||||
print("getShardOrders: Error in 'sendMessage'")
|
||||
return False
|
||||
|
||||
retMsg = waitMessage()
|
||||
if not retMsg:
|
||||
print("getShardOrders: Error in 'waitMessage'")
|
||||
return False
|
||||
|
||||
if not retMsg.MsgName == "R_GSO":
|
||||
print("getShardOrders: Invalid response, awaited 'R_GSO', received: "+retMsg.MsgName)
|
||||
return False
|
||||
|
||||
nbElem = 0
|
||||
retMsg.serialUInt32(nbElem)
|
||||
retValue = []
|
||||
for i in range(nbElem):
|
||||
retMsg.serialString(item)
|
||||
retValue.append(item)
|
||||
|
||||
return retValue
|
||||
|
||||
|
||||
def waitCallback(self):
|
||||
message = self.waitMessage()
|
||||
|
||||
if not message:
|
||||
return False
|
||||
|
||||
if message.MsgName == "CMDR":
|
||||
self.commandResult_skel(message)
|
||||
else:
|
||||
return False
|
||||
return True
|
||||
|
||||
def commandResult_skel(self, message):
|
||||
serviceAlias = message.serialString()
|
||||
result = message.serialString()
|
||||
self.commandResult(serviceAlias, result)
|
||||
|
||||
def commandResult(self, serviceAlias, result):
|
||||
global command_return_data
|
||||
command_return_data = result
|
||||
|
||||
|
||||
|
||||
def queryShard(service_name, fullcmd, waitCallback=True, is_control=False):
|
||||
global command_return_data
|
||||
|
||||
nel_result = ""
|
||||
nel_status = not waitCallback
|
||||
res = ""
|
||||
p_result = None
|
||||
|
||||
adminService = CAdminServiceWeb()
|
||||
|
||||
if adminService.connect("yubo.ryzom.com", 46700, res):
|
||||
command_return_data = ""
|
||||
|
||||
if isinstance(fullcmd, str):
|
||||
if is_control:
|
||||
adminService.controlCmd(service_name, fullcmd)
|
||||
else:
|
||||
adminService.serviceCmd(service_name, fullcmd)
|
||||
service_command = fullcmd
|
||||
|
||||
if waitCallback and adminService.waitCallback():
|
||||
nel_status = True
|
||||
nel_result += command_return_data
|
||||
else:
|
||||
for service_command in fullcmd:
|
||||
if is_control:
|
||||
adminService.controlCmd(service_name, service_command)
|
||||
else:
|
||||
adminService.serviceCmd(service_name, service_command)
|
||||
adminService.close()
|
||||
|
||||
return {"status": nel_status, "query": service_name+":"+fullcmd, "raw": nel_result.split("\n")[1:]}
|
||||
|
||||
def serveShard():
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.bind(('', 15555))
|
||||
|
||||
adminService = CAdminServiceWeb()
|
||||
res = ""
|
||||
i = 1
|
||||
if adminService.connect("yubo.ryzom.com", 46700, res):
|
||||
print("Connected")
|
||||
while True:
|
||||
sock.listen(5)
|
||||
client, address = sock.accept()
|
||||
response = client.recv(255)
|
||||
if response != "":
|
||||
print(i, response)
|
||||
i = i + 1
|
||||
adminService.serviceCmd("egs", response)
|
||||
if adminService.waitCallback():
|
||||
pass
|
||||
|
||||
print("Close")
|
||||
client.close()
|
||||
sock.close()
|
||||
|
||||
|
@ -0,0 +1,60 @@
|
||||
#!/bin/bash
|
||||
VERSION="1.0.0-rc.0"
|
||||
|
||||
BUILD_PATH=~/builds
|
||||
|
||||
echo "INSTALLATION OF VERSION $VERSION !!!!"
|
||||
|
||||
echo "If you don't have install all requirements check at:"
|
||||
echo "https://rocket.chat/docs/installation/manual-installation/ubuntu/"
|
||||
echo "To install meteor : curl https://install.meteor.com/ | sh"
|
||||
|
||||
echo "Erasing old..."
|
||||
rm -rf $BUILD_PATH/RocketChat/Rocket.Chat.old
|
||||
|
||||
mv Rocket.Chat Rocket.Chat.old
|
||||
|
||||
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
|
||||
|
||||
cd ~/builds/RocketChat/
|
||||
if [[ ! -d "megacorp" ]]
|
||||
echo "Missing megacorp. Cloning it.."
|
||||
hg clone ssh://hg@bitbucket.org/ryzom/megacorp
|
||||
fi
|
||||
|
||||
cd megacorp
|
||||
hg pull
|
||||
hg update -v
|
||||
cd ..
|
||||
|
||||
git clone https://github.com/RocketChat/Rocket.Chat.git
|
||||
|
||||
cd Rocket.Chat
|
||||
git checkout $VERSION
|
||||
|
||||
cp $BUILD_PATH/RocketChat/megacorp/ryzom-rocket-bridge/ packages/
|
||||
echo -e "\nryzom-rocket-bridge" >> .meteor/packages
|
||||
|
||||
##cd packages/rocketchat-iframe-login
|
||||
##sed -i -e $'s/console.log/check(result.token, String);\\\n\\\tconsole.log/g' iframe_server.js
|
||||
##cd ../..
|
||||
|
||||
|
||||
npm install --production
|
||||
#npm audit fix // ???
|
||||
|
||||
rm -rf ../rc-bundle
|
||||
meteor build ../rc-bundle --architecture os.linux.x86_64
|
||||
meteor build ../rc-bundle --architecture os.linux.x86_64
|
||||
|
||||
|
||||
cd ../rc-bundle
|
||||
tar xvfz Rocket.Chat.tar.gz
|
||||
|
||||
cd ~
|
||||
mv Rocket.Chat/ Rocket.Chat.old
|
||||
cp -r src/rc-bundle/bundle/ Rocket.Chat/
|
||||
|
||||
cd ~/Rocket.Chat/programs/server
|
||||
npm install
|
||||
tools@chat:~/src$
|
@ -0,0 +1,170 @@
|
||||
import logging
|
||||
import socket
|
||||
|
||||
SockTimeOut=10
|
||||
|
||||
class CMemStream:
|
||||
def __init__(self):
|
||||
self.InputStream = False
|
||||
self.Pos = 0
|
||||
self.Buffer = b""
|
||||
|
||||
def setBuffer(self, Buffer):
|
||||
self.InputStream = True
|
||||
self.Buffer = Buffer
|
||||
self.Pos = 0
|
||||
|
||||
|
||||
def isReading(self):
|
||||
return self.InputStream
|
||||
|
||||
def serialUInt8(self, val=b""):
|
||||
if self.isReading():
|
||||
val = ord(self.Buffer[self.Pos])
|
||||
self.Pos += 1
|
||||
return val
|
||||
else:
|
||||
self.Buffer += bytes([val & 0xFF])
|
||||
self.Pos += 1
|
||||
|
||||
def serialUInt32(self, val=b""):
|
||||
if self.isReading():
|
||||
val = ord(self.Buffer[self.Pos])
|
||||
self.Pos += 1
|
||||
val += ord(self.Buffer[self.Pos])*256
|
||||
self.Pos += 1
|
||||
val += ord(self.Buffer[self.Pos])*256*256
|
||||
self.Pos += 1
|
||||
val += ord(self.Buffer[self.Pos])*256*256*256
|
||||
self.Pos += 1
|
||||
return val
|
||||
else:
|
||||
self.Buffer += bytes([val & 0xFF])
|
||||
self.Buffer += bytes([(val>>8) & 0xFF])
|
||||
self.Buffer += bytes([(val>>16) & 0xFF])
|
||||
self.Buffer += bytes([(val>>24) & 0xFF])
|
||||
self.Pos += 4
|
||||
|
||||
def serialString(self, val=b""):
|
||||
if self.isReading():
|
||||
size = self.serialUInt32()
|
||||
val = self.Buffer[self.Pos:self.Pos+size]
|
||||
self.Pos += len(val)
|
||||
return val
|
||||
else:
|
||||
try:
|
||||
#Convert to bytes if need
|
||||
val = val.encode("utf-8")
|
||||
except AttributeError:
|
||||
pass
|
||||
valLen = len(val)
|
||||
self.serialUInt32(valLen)
|
||||
self.Buffer += val
|
||||
self.Pos += valLen
|
||||
|
||||
def serialEnum(self, val=""):
|
||||
pass
|
||||
|
||||
|
||||
class CMessage(CMemStream):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
def setName(self, name):
|
||||
self.MsgName = name
|
||||
|
||||
|
||||
class CCallbackClient():
|
||||
|
||||
ConSock = False
|
||||
MsgNum = 0
|
||||
|
||||
def connect(self, addr, port, res):
|
||||
global SockTimeOut
|
||||
self.MsgNum = 0
|
||||
|
||||
|
||||
self.ConSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
try:
|
||||
self.ConSock.connect((addr, port))#, $errno, $errstr, $SockTimeOut)
|
||||
except socket.error:
|
||||
print("Connection failed...")
|
||||
return False
|
||||
|
||||
print("Connection enabled!")
|
||||
return True
|
||||
|
||||
#TODO: set time out on the socket to 2 secondes
|
||||
#stream_set_timeout(self.ConSock, $SockTimeOut)
|
||||
|
||||
def close(self):
|
||||
if self.ConSock:
|
||||
self.ConSock.close()
|
||||
|
||||
|
||||
def sendMessage(self, message):
|
||||
hd = CMemStream()
|
||||
hd.serialUInt32(self.MsgNum) #number the packet
|
||||
self.MsgNum += 1
|
||||
messageType = 0
|
||||
hd.serialUInt8(messageType)
|
||||
hd.serialString(message.MsgName)
|
||||
|
||||
size = hd.Pos + message.Pos
|
||||
Buffer = chr((size>>24)&0xFF)
|
||||
Buffer += chr((size>>16)&0xFF)
|
||||
Buffer += chr((size>>8)&0xFF)
|
||||
Buffer += chr(size&0xFF)
|
||||
Buffer = Buffer.encode("iso-8859-1")
|
||||
Buffer += hd.Buffer
|
||||
Buffer += message.Buffer
|
||||
|
||||
print(Buffer.decode("utf-8", errors="replace"))
|
||||
sent = self.ConSock.send(Buffer)
|
||||
if not sent:
|
||||
raise RuntimeError("socket connection broken")
|
||||
|
||||
def waitMessage(self):
|
||||
size = 0
|
||||
val = self.ConSock.recv(1)
|
||||
if val:
|
||||
size = ord(val) << 24
|
||||
else:
|
||||
print("Error")
|
||||
|
||||
val = self.ConSock.recv(1)
|
||||
if val:
|
||||
size = ord(val) << 16
|
||||
else:
|
||||
print("Error")
|
||||
|
||||
val = self.ConSock.recv(1)
|
||||
size += ord(val) << 8
|
||||
|
||||
val = self.ConSock.recv(1)
|
||||
size += ord(val)
|
||||
|
||||
fake = self.ConSock.recv(5)
|
||||
size -= 5 #remove the fake
|
||||
|
||||
Buffer = ""
|
||||
while size > 0 and len(Buffer) != size:
|
||||
Buffer += self.ConSock.recv(size - len(Buffer)).decode("utf-8", errors="replace")
|
||||
|
||||
msgin = CMemStream()
|
||||
msgin.setBuffer(Buffer)
|
||||
|
||||
#decode msg name
|
||||
name = ""
|
||||
name = msgin.serialString(name)
|
||||
|
||||
logging.info("Message name = '%s'" % name)
|
||||
|
||||
message = CMessage()
|
||||
message.setBuffer(msgin.Buffer[msgin.Pos:])
|
||||
message.setName(name)
|
||||
|
||||
return message
|
||||
|
||||
|
@ -0,0 +1,11 @@
|
||||
/////////////////////////////////
|
||||
/////////////////////////////////
|
||||
/// SHEETS PACKER CONFIG FILE ///
|
||||
/////////////////////////////////
|
||||
/////////////////////////////////
|
||||
DataPath = { "$RYZOMDATADIR/common/data_leveldesign", "$RYZOMDATADIR/common/data_common", "$D" };
|
||||
WorldSheet = "ryzom.world";
|
||||
PrimitivesPath = "$RYZOMDATADIR/common/data_leveldesign/primitives";
|
||||
OutputDataPath = "$D";
|
||||
LigoPrimitiveClass = "world_editor_classes.xml";
|
||||
DumpVisualSlotsIndex = 1;
|
Loading…
Reference in New Issue