mirror of
https://shylinux.com/x/ContextOS
synced 2025-04-26 01:04:06 +08:00
add client/python
This commit is contained in:
parent
972c688a3e
commit
4b7a6966b0
232
usr/client/python/ssh/__init__.py
Normal file
232
usr/client/python/ssh/__init__.py
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
import json
|
||||||
|
import urllib
|
||||||
|
import socket
|
||||||
|
|
||||||
|
class Context(object):
|
||||||
|
def Ctx(self):
|
||||||
|
msg.echo("context")
|
||||||
|
def Cmd(self, msg):
|
||||||
|
msg.echo("command %s", dir(self))
|
||||||
|
|
||||||
|
def config(self, msg):
|
||||||
|
for k, v in self.configs.iteritems():
|
||||||
|
msg.append("key", k)
|
||||||
|
msg.append("value", str(json.dumps(v)))
|
||||||
|
msg.table()
|
||||||
|
msg.log("fuck %s", msg.meta["result"])
|
||||||
|
|
||||||
|
def Cap(self):
|
||||||
|
msg.echo("cache")
|
||||||
|
|
||||||
|
class Message(object):
|
||||||
|
|
||||||
|
code = 0
|
||||||
|
@classmethod
|
||||||
|
def _incr_count(cls):
|
||||||
|
cls.code += 1
|
||||||
|
return cls.code
|
||||||
|
|
||||||
|
def __init__(self, m=None, target=None, remote_code=-1, message=None, meta={}):
|
||||||
|
self.code = self._incr_count()
|
||||||
|
self.remote_code = remote_code
|
||||||
|
self.message = m.code if m else message
|
||||||
|
self.target = target
|
||||||
|
self.meta = meta
|
||||||
|
|
||||||
|
def detail(self, *argv):
|
||||||
|
detail = self.meta.get("detail", [])
|
||||||
|
if argv:
|
||||||
|
try:
|
||||||
|
i = int(argv[0])
|
||||||
|
if 0 <= i and i < len(detail):
|
||||||
|
return detail[i]
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
except:
|
||||||
|
self.meta["detail"] = argv
|
||||||
|
return self.meta.get("detail") or []
|
||||||
|
|
||||||
|
def detaili(self, *argv):
|
||||||
|
v = self.detail(*argv)
|
||||||
|
try:
|
||||||
|
return int(v)
|
||||||
|
except:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def option(self, key=None, value=None):
|
||||||
|
if key:
|
||||||
|
msg = self
|
||||||
|
while msg:
|
||||||
|
if key in msg.meta["option"]:
|
||||||
|
return msg.meta[key]
|
||||||
|
msg = msg.message
|
||||||
|
return []
|
||||||
|
return self.meta.get("option", [])
|
||||||
|
|
||||||
|
def append(self, key=None, value=None):
|
||||||
|
if value is not None:
|
||||||
|
self.meta[key] = self.meta.get(key, [])
|
||||||
|
self.meta[key].append(value)
|
||||||
|
if key not in self.meta.get("append", []):
|
||||||
|
self.meta["append"] = self.meta.get("append", [])
|
||||||
|
self.meta["append"].append(key)
|
||||||
|
|
||||||
|
if key is not None:
|
||||||
|
return self.meta.get(key, [""])[0]
|
||||||
|
|
||||||
|
return self.meta.get("append", [])
|
||||||
|
|
||||||
|
def result(self, s=None):
|
||||||
|
if s:
|
||||||
|
self.meta["result"] = self.meta.get("result", [])
|
||||||
|
self.meta["result"].append(s)
|
||||||
|
return self.meta.get("result", [])
|
||||||
|
|
||||||
|
def table(self):
|
||||||
|
nrow = len(self.meta[self.meta["append"][0]])
|
||||||
|
ncol = len(self.meta["append"])
|
||||||
|
|
||||||
|
for j, k in enumerate(self.meta["append"]):
|
||||||
|
self.echo(k)
|
||||||
|
self.echo(" " if j < ncol-1 else "\n")
|
||||||
|
for i in range(nrow):
|
||||||
|
for j, k in enumerate(self.meta["append"]):
|
||||||
|
self.echo(self.meta[k][i])
|
||||||
|
self.echo(" " if j < ncol-1 else "\n")
|
||||||
|
|
||||||
|
def echo(self, s, *argv):
|
||||||
|
if len(argv) == 0:
|
||||||
|
self.result(s if len(argv) == 0 else s % argv)
|
||||||
|
|
||||||
|
def Conf(self, key=None, value=None):
|
||||||
|
if value is not None:
|
||||||
|
self.target.configs[key] = value
|
||||||
|
if key is not None:
|
||||||
|
return self.target.configs.get(key, "")
|
||||||
|
return self.target.configs
|
||||||
|
|
||||||
|
def log(self, s, *argv):
|
||||||
|
print s % argv
|
||||||
|
|
||||||
|
class SSH(Context):
|
||||||
|
def __init__(self, m, target=None, name="demo", host="127.0.0.1", port=9090):
|
||||||
|
self.target = target or self
|
||||||
|
self.m = m
|
||||||
|
self.host = host
|
||||||
|
self.port = port
|
||||||
|
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
self.socket.connect((host, port))
|
||||||
|
msg = Message(m)
|
||||||
|
msg.detail("recv", "add", name, "worker")
|
||||||
|
self.sendDetail(msg, self.recvResult, self)
|
||||||
|
self.recvLoop()
|
||||||
|
|
||||||
|
sendMM = {}
|
||||||
|
def sendDetail(self, msg, fun=None, obj=None):
|
||||||
|
msg.recvFun = fun
|
||||||
|
msg.recvObj = obj
|
||||||
|
self.sendMM[msg.code] = msg
|
||||||
|
self.socket.send("code: %s\n" % msg.code)
|
||||||
|
data = ["detail: %s" % urllib.quote(d) for d in msg.detail()]
|
||||||
|
for k, option in enumerate(msg.option()):
|
||||||
|
for i, v in enumerate(option):
|
||||||
|
data.append("%s: %s" % (urllib.quote(k) ,urllib.quote(v)))
|
||||||
|
data.append("\n")
|
||||||
|
self.socket.send("\n".join(data))
|
||||||
|
msg.log("send: %s %s", msg.code, data)
|
||||||
|
|
||||||
|
def recvResult(self, msg):
|
||||||
|
msg.log("echo: %s", msg.result())
|
||||||
|
|
||||||
|
def recvLoop(self):
|
||||||
|
m = self.m
|
||||||
|
self.file = self.socket.makefile()
|
||||||
|
|
||||||
|
meta = {}
|
||||||
|
while True:
|
||||||
|
l = self.file.readline()
|
||||||
|
if l == "\n":
|
||||||
|
m.log("recv: %s %s", meta.get("remote_code"), meta)
|
||||||
|
if "detail" in meta:
|
||||||
|
msg = Message(m, self.target, remote_code=meta.get("remote_code"), meta=meta)
|
||||||
|
self.recvDetail(msg)
|
||||||
|
else:
|
||||||
|
msg = self.sendMM[int(meta.get("remote_code"))]
|
||||||
|
msg.meta.update(meta)
|
||||||
|
msg.recvFun and msg.recvFun(msg)
|
||||||
|
msg.recvObj and msg.recvObj.recvResult(msg)
|
||||||
|
meta = {}
|
||||||
|
continue
|
||||||
|
|
||||||
|
v = l.rstrip("\n").split(": ")
|
||||||
|
if v[0] == "code":
|
||||||
|
meta["remote_code"] = v[1]
|
||||||
|
elif v[0] == "detail":
|
||||||
|
meta["detail"] = meta.get("detail", [])
|
||||||
|
meta["detail"].append(v[1])
|
||||||
|
elif v[0] == "result":
|
||||||
|
meta["result"] = meta.get("result", [])
|
||||||
|
meta["result"].append(v[1])
|
||||||
|
else:
|
||||||
|
if v[0] == "remote_code":
|
||||||
|
continue
|
||||||
|
if v[0] not in meta:
|
||||||
|
if "detail" in meta:
|
||||||
|
meta["option"] = meta.get("option", [])
|
||||||
|
meta["option"].append(v[0])
|
||||||
|
else:
|
||||||
|
meta["append"] = meta.get("append", [])
|
||||||
|
meta["append"].append(v[0])
|
||||||
|
meta[v[0]] = meta.get(v[0], [])
|
||||||
|
meta[v[0]].append(v[1])
|
||||||
|
|
||||||
|
def pwd(self, msg):
|
||||||
|
msg.echo("shaoying")
|
||||||
|
|
||||||
|
def recvDetail(self, msg):
|
||||||
|
if hasattr(self.target, msg.detail(1)):
|
||||||
|
getattr(self.target, msg.detail(1))(msg)
|
||||||
|
self.sendResult(msg)
|
||||||
|
|
||||||
|
def sendResult(self, msg):
|
||||||
|
self.socket.send("code: %s\n" % msg.remote_code)
|
||||||
|
data = ["result: %s" % urllib.quote(d) for d in msg.result()]
|
||||||
|
for i, k in enumerate(msg.append()):
|
||||||
|
for i, v in enumerate(msg.meta[k]):
|
||||||
|
data.append("%s: %s" % (urllib.quote(k) ,urllib.quote(v)))
|
||||||
|
data.append("\n")
|
||||||
|
self.socket.send("\n".join(data))
|
||||||
|
msg.log("send: %s %s", msg.remote_code, data)
|
||||||
|
|
||||||
|
try:
|
||||||
|
import RPi.GPIO as GPIO
|
||||||
|
except:
|
||||||
|
GPIO = Context()
|
||||||
|
pass
|
||||||
|
|
||||||
|
class RPI(Context):
|
||||||
|
def __init__(self):
|
||||||
|
self.configs = {
|
||||||
|
"setmode": False,
|
||||||
|
}
|
||||||
|
|
||||||
|
def gpio(self, msg, *argv):
|
||||||
|
if msg.detail(2) == "init":
|
||||||
|
GPIO.setmode(GPIO.BCM)
|
||||||
|
elif msg.detail(2) == "out":
|
||||||
|
if not msg.Conf("setmode"):
|
||||||
|
msg.log("default setmode")
|
||||||
|
msg.Conf("setmode", True)
|
||||||
|
GPIO.setmode(GPIO.BCM)
|
||||||
|
if msg.Conf(msg.detail(3)) != GPIO.OUT:
|
||||||
|
msg.log("default output")
|
||||||
|
msg.Conf(msg.detail(3), GPIO.OUT)
|
||||||
|
GPIO.setup(msg.detaili(3), GPIO.OUT)
|
||||||
|
GPIO.output(msg.detaili(3), msg.detaili(4))
|
||||||
|
elif msg.detail(2) == "exit":
|
||||||
|
GPIO.cleanup()
|
||||||
|
|
||||||
|
import sys
|
||||||
|
SSH(Message(), RPI(),
|
||||||
|
sys.argv[1] if len(sys.argv) > 1 else "demo",
|
||||||
|
sys.argv[2] if len(sys.argv) > 2 else "127.0.0.1")
|
117
usr/wiki/自然/编程/后端技术栈/raspi.md
Normal file
117
usr/wiki/自然/编程/后端技术栈/raspi.md
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
## 树莓派
|
||||||
|
|
||||||
|
- 官网:<https://www.raspberrypi.org/>
|
||||||
|
- 文档:<https://www.raspberrypi.org/documentation/>
|
||||||
|
- 开源:<https://github.com/raspberrypi>
|
||||||
|
|
||||||
|
## 基本配置
|
||||||
|
|
||||||
|
- 官网:<http://www.raspbian.org/>
|
||||||
|
- 文档:<http://www.raspbian.org/RaspbianDocumentation>
|
||||||
|
|
||||||
|
lsb_release
|
||||||
|
raspi-config
|
||||||
|
/boot/config.txt
|
||||||
|
|
||||||
|
/etc/network/interfaces
|
||||||
|
/etc/wpa_supplicant/wpa_supplicant.conf
|
||||||
|
|
||||||
|
/etc/hostname
|
||||||
|
/etc/hosts
|
||||||
|
|
||||||
|
## 基本命令
|
||||||
|
|
||||||
|
- 官网:<https://www.debian.org/>
|
||||||
|
- 文档:<https://www.debian.org/doc/>
|
||||||
|
|
||||||
|
ls
|
||||||
|
cp
|
||||||
|
mv
|
||||||
|
rm
|
||||||
|
cd
|
||||||
|
pwd
|
||||||
|
mkdir
|
||||||
|
rmdir
|
||||||
|
|
||||||
|
cat
|
||||||
|
echo
|
||||||
|
more
|
||||||
|
nano
|
||||||
|
vi
|
||||||
|
|
||||||
|
sudo
|
||||||
|
chmod
|
||||||
|
chown
|
||||||
|
|
||||||
|
find
|
||||||
|
grep
|
||||||
|
|
||||||
|
ps
|
||||||
|
fg
|
||||||
|
bg
|
||||||
|
top
|
||||||
|
kill
|
||||||
|
killall
|
||||||
|
history
|
||||||
|
alias
|
||||||
|
man
|
||||||
|
|
||||||
|
df
|
||||||
|
date
|
||||||
|
lsusb
|
||||||
|
lsmod
|
||||||
|
|
||||||
|
wget
|
||||||
|
curl
|
||||||
|
tar
|
||||||
|
git
|
||||||
|
|
||||||
|
apt-get update
|
||||||
|
apt-get install
|
||||||
|
apt-get remove
|
||||||
|
apt-get clean
|
||||||
|
|
||||||
|
apt-get install python-pip
|
||||||
|
pip install
|
||||||
|
|
||||||
|
crontab
|
||||||
|
/etc/rc.local
|
||||||
|
/etc/init.d/
|
||||||
|
update-rc.d
|
||||||
|
|
||||||
|
## 基础编程
|
||||||
|
|
||||||
|
- 官网:<https://www.python.org/>
|
||||||
|
- 文档:<https://docs.python.org/2/>
|
||||||
|
|
||||||
|
python
|
||||||
|
hi.py
|
||||||
|
|
||||||
|
input()
|
||||||
|
print()
|
||||||
|
open()
|
||||||
|
|
||||||
|
int()
|
||||||
|
str()
|
||||||
|
len()
|
||||||
|
|
||||||
|
if
|
||||||
|
elif
|
||||||
|
else
|
||||||
|
for in range/enumerate
|
||||||
|
while
|
||||||
|
break
|
||||||
|
continue
|
||||||
|
|
||||||
|
def
|
||||||
|
|
||||||
|
class
|
||||||
|
new
|
||||||
|
|
||||||
|
try
|
||||||
|
except
|
||||||
|
else
|
||||||
|
finally
|
||||||
|
|
||||||
|
from import as
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user