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