当前位置: 首页 > news >正文

【部署与升级-会议签到的web安装】

部署与升级-会议的远程安装

  • 技术路线
  • 界面规划
  • flaskAPI以及socketio.emit 'shellout'
  • 浏览器和后端交互
  • 到处是偶遇

技术路线

运行的基础是Flask-Soketio,
并借鉴了后台运行系统指令的代码
和scrncpy项目,app安装的脚本

网页浏览器 router() subprocess.Popen socketio 你好! 打开连接(安装,卸载)? $.get("/api/connect(install..")以及 onmessage(shellout) 连接(安装,卸载)? 可能时间太长 适合放thread中执行., callback,emmit shellout 已经执行,结果发送. 连接(安装,卸载)的回馈来了! 网页浏览器 router() subprocess.Popen socketio

界面规划

在这里插入图片描述
固定标题不会滚动消失,texarea滚动回馈,断开连接,释放,以让其他管理机使用.

<head>
<style>body {padding-top: 100px; /* Required padding for .navbar-fixed-top */}</style><meta charset="UTF-8"><title>部署和撤销</title><link href="/static/bootstrap.min1.css" rel="stylesheet"  ><script type="text/javascript" src="/js/socket.io.min.js"></script><script type="text/javascript" src="/js/jquery.min.js"></script><body><nav class="navbar navbar-default  navbar-fixed-top" role="navigation"><div class="container-fluid"><div class="navbar-header"><a class="navbar-brand" href="#">运行结果:</a></div><div><form class="navbar-form navbar-left" role="search" style="height: 80px;width:80%;" ><div class="form-group" style="height: 80px;width:80%;" ><textarea id="shstatus" style="height: 80px;width:100%;"> </textarea>  </div><button type="button" class="btn btn-default"  onclick='$.get("/api/disconnect")'>断开连接</button></li>    </button></form></div></nav>   <table  class="table"  >
<caption class="h4"> 部署和撤销</caption>
<thead><tr><th>点位名</th><th>状态</th><th>更新时刻</th><th>操作</th><th>IP</th>
<tbody id="mytable"></table>
</body></html>
初始化列表
$.get("/list" function (stas)
{Object.keys( stas).forEach(function(key) {$('#mytable').append(`<tr><td>${stas[key].sta}</td>.........<td><button onclick="$.get('/api/myconnect/${stas[key].sta}')">连接</button></td>...}})

flaskAPI以及socketio.emit ‘shellout’

分二部分.执行和回馈 参考关于socketio的配置

from checkout.she import sh
.......
@app.route('/api/myinstall/<sta>')
def install(sta):if ip4sta(sta):target=ip4sta(sta)+":Port"sh.install(target)return json.dumps("install"+ip4sta(sta))  
@app.route('/api/myconnect/<sta>')
def connect(sta):if ip4sta(sta):target=ip4sta(sta)+":Port"sh.connect(target)return json.dumps("install"+ip4sta(sta))   
@app.route('/api/myuninstall/<sta>')
def uninstall(sta):if ip4sta(sta):target=ip4sta(sta)+":Port"sh.uninstall(target)return json.dumps("uninstall"+ip4sta(sta))   
@app.route('/api/mydisconnect')
def disconnect():sh.disconnect()return "OK"
def shellout(msg):socketio.emit('shellout',msg,namespace='/chat') 
sh.callback=shellout  

#运行本地shell的py
上代码

# 存储ping数据的redis 1号库
#from redis import  StrictRedis
import subprocess
import os 
import threading
#redis_sh = StrictRedis(host='192.168.1.231', port=6379, decode_responses=True, db=2)callback=print
def sh(command, callback):cwd=os.getcwd()if (not cwd.endswith('she')):cwd=os.getcwd()+"/she"p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,cwd=cwd)callback(command)for line in iter(p.stdout.readline, b''):callback(line.decode())def run(command):global callbacktry:# 起线程执行命令task = threading.Thread(target=sh, args=(command, callback))task.start()except Exception as e:print(e)def install(target):command = "./sndcpy.sh  %s i" %  targetrun(command) 
def uninstall(target):command = ["./adb -s %s remount" % target,"./adb -s  %s   uninstall  com.tumuyan.fixedplay" %  target,"./adb -s %s shell mv /tmp/Launcher_1.apk /system/app/" % target]for com in command:run(com )
def connect(target):command = "./adb connect  %s" %  targetrun(command)
def disconnect():run("./adb disconnect")
if __name__=="__main__":ip="ip:Port"uninstall(ip) 

根据网友关于redis,flask ip的代码做出的调节,

  1. redis换成socketio,简化前端的逻辑,和信息的处理.callback了所有.
  2. flask的threading,转移到了sh.py其中一个函数,让所有command共用.
  3. 对目录进行了分级,subprocess.Popen使用了cwd参数.一般来说,flask的当前路径在上一级.
    附加:
    针对adb connect等待时间过长,使用ping3判断在线
    pip install ping3
@app.route('/api/connect/<sta>')
def connect(sta):if ip4sta(sta):target=ip4sta(sta)tgp=ping3.ping( target,timeout=1)  if tgp is not False and tgp is not None:shellout("ping SUUCESS, 连接中<-->%s\n" %target)sh.connect(target+":5555")else:shellout("ping FAIL,设备离线 ><%s\n" %target)shellout("请联系[%s],开机后再测试!\n"%sta)return json.dumps("connect"+target)   

浏览器和后端交互

以前文章的内容

  1. 取得所有当前信息表格,布局页面.

  2. 取得当前已经安装app的客户端信息,方便查看安装结果

  3. 定制功能按钮,获取回馈消息通知

 onclick='$.get("/api/mydisconnect")'---断开连接...<button onclick="$.get('/api/myconnect/${stas[key].sta}')">连接</button> 

取得io的消息shellout

         var socket = io.connect('http://ip:port/chat'  );socket.on('shellout',handleshell);function handleshell(msg){var text = document.getElementById('shstatus');text.scrollTop = text.scrollHeight;  //滚动到最后$("#shstatus").text($("#shstatus").text()+msg)}

到处是偶遇

那天在逛微信,推送了一个开源手机同屏控制的项目QTscncpy.结果会议机版本低4个数字,无法安装.在ubuntu下,才25M.一个前端,窗口程序,一个adb.一个apk,一段安装脚本.前端在调试时的输出代码,有不错的监测,一直的等待安装后的启动,可惜我这里都是错误.
在很多天无聊之后,浏览了一下它的内容.
如下


#!/bin/bashecho Begin Runing...
SNDCPY_PORT=28200
SNDCPY_APK=sndcpy.apk
ADB=./adbserial=
if [[ $# -ge 2 ]]
thenserial="-s $1"SNDCPY_PORT=$2
fiecho "Waiting for device $1..."
$ADB $serial wait-for-device
echo "Find device $1"sndcpy_installed=$($ADB $serial shell pm path com.rom1v.sndcpy)
if [[ $sndcpy_installed == "" ]]; thenecho Install $SNDCPY_APK... $ADB $serial uninstall com.rom1v.sndcpy || echo uninstall failed$ADB $serial install -t -r -g $SNDCPY_APKecho Install $SNDCPY_APK success
fiecho Request PROJECT_MEDIA permission...
$ADB $serial shell appops set com.rom1v.sndcpy PROJECT_MEDIA allowecho Forward port $SNDCPY_PORT...
$ADB $serial forward tcp:$SNDCPY_PORT localabstract:sndcpyecho Start $SNDCPY_APK...
$ADB $serial shell am start com.rom1v.sndcpy/.MainActivitywhile ((1))
doecho Waiting $SNDCPY_APK start...sleep 0.1sndcpy_started=$($ADB shell 'ps | grep com.rom1v.sndcpy')if [[ $sndcpy_started != "" ]]; thenbreakfi
doneecho Ready playing...

短短一段代码,
提供了,一客户监测等待, 安装后的赋权,启动后的观测.几乎涵盖了我需要的所有,所有唯一目前我没有的就是web端的便捷.于是把以前搁置的功能补齐了.

相关文章:

【部署与升级-会议签到的web安装】

部署与升级-会议的远程安装 技术路线界面规划flaskAPI以及socketio.emit shellout浏览器和后端交互到处是偶遇 技术路线 运行的基础是Flask-Soketio, 并借鉴了后台运行系统指令的代码 和scrncpy项目,app安装的脚本 #mermaid-svg-8H9rbzbpgpnAXfA3 {font-family:"trebuche…...

【jvm】如何设置新生代和老年代的比例

目录 1. 说明2. 使用-XX:NewRatio参数3. 使用-Xmn参数4. 配置新生区中的Eden区和Survivor区比例5. 综合配置示例6. 注意事项 1. 说明 1.新生代&#xff08;Young Generation&#xff09;和老年代&#xff08;Old Generation&#xff09;的比例可以通过特定的参数进行设置。2.这…...

系统学习CFD,常见收敛问题、及如何与机器学习相结合

一、如何系统学习CFD 系统学习计算流体力学&#xff08;CFD&#xff09;需要按照一定的步骤和层次进行&#xff0c;以下是一个学习路径的建议&#xff1a; 1.基础知识学习&#xff1a; 掌握流体力学的基本原理&#xff0c;包括流体静力学、流体动力学、流体控制方程等。 学习…...

REST架构与实现

一、REST 架构风格 基本概念 REST(Representational State Transfer),即表述性状态转移,是一种软件架构风格。它通过使用标准的 HTTP 方法操作网络上的资源来实现信息交互。在 REST 架构风格中,网络上的一切都被抽象成资源,例如,在一个在线购物系统中,商品、订单、用户…...

AI驱动的低代码未来:加速应用开发的智能解决方案

引言 随着数字化转型的浪潮席卷全球&#xff0c;企业对快速构建应用程序的需求愈发强烈。然而&#xff0c;传统的软件开发周期冗长、成本高昂&#xff0c;往往无法满足快速变化的市场需求。在此背景下&#xff0c;低代码平台逐渐成为开发者和企业的优选方案&#xff0c;以其“低…...

快速上手 Rust——环境配置与项目初始化

Rust 跨界&#xff1a;全面掌握跨平台应用开发 第一章&#xff1a;快速上手 Rust 1.1 环境配置与项目初始化 1.1.1 安装 Rust 和 Cargo 在开始学习 Rust 之前&#xff0c;首先需要安装 Rust 编程语言及其包管理工具 Cargo。Rust 的安装非常简单&#xff0c;使用官方的安装脚…...

分布式事务Seata-AT模式

1. seata安装 docker 安装 docker run --name seata-server \-p 8091:8091 \-p 7091:7091 \-e SEATA_IP192.168.0.250 \-e SEATA_PORT8091 \seataio/seata-server将安装好的配置文件数据&#xff0c;拷贝一份到物理机 docker cp seata-serve:/seata-server/resources /User/…...

编程知识概览

编程&#xff0c;这个在现代社会中无处不在的词汇&#xff0c;已经从最初的计算机专业人士的专属技能&#xff0c;变成了许多人日常生活和工作中不可或缺的一部分。从简单的网页浏览、邮件发送&#xff0c;到复杂的游戏开发、数据分析&#xff0c;编程的应用几乎覆盖了所有领域…...

基于 GADF+Swin-CNN-GAM 的高创新扰动信号识别模型!

往期精彩内容&#xff1a; Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…...

【Nextcloud】在 Ubuntu 22.04.3 LTS 上的 Nextcloud Hub 8 (29.0.0) 优化

[TOC](Nextcloud Hub 8 (29.0.0) 优化) Nextcloud 优化是个长期的过程&#xff0c;只能遇到问题解决问题了。遇到的问题和解决办法会逐步的编写完善。 打开 PHP 内存限制 伴随着内容增多&#xff0c;并添加更多的功能&#xff0c;访问 Nextcloud 变慢。通过修改PHP 内存限制&am…...

全渠道供应链打造中企业定制开发2+1链动模式S2B2C商城小程序的策略与影响

摘要&#xff1a;本文探讨了全渠道供应链打造对于零售企业的重要性及面临的挑战&#xff0c;着重分析了物流环节整合的难点&#xff0c;并以家电行业为例说明了节假日期间物流对企业经营的影响。同时&#xff0c;引入“企业定制开发21链动模式S2B2C商城小程序”这一关键因素&am…...

Github 2024-10-24 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Solidity项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:…...

中航资本:锂电行业现分化 优质产能仍然紧俏

2024年前三季度&#xff0c;受轻贱需求增速放缓影响&#xff0c;锂电工业堕入结构性供需错配&#xff0c;产品价格继续低迷&#xff0c;作业盈余全体承压。 当资料端不再稀缺&#xff0c;锂电作业由“卖方商场”转向“买方商场”&#xff0c;工业链博弈天平逐渐向轻贱倾斜。表…...

安宝特案例 | AR技术在院外心脏骤停急救中的革命性应用

00 案例背景 在院外心脏骤停 (OHCA) 的突发救援中&#xff0c;时间与效率直接决定着患者的生命。传统急救模式下&#xff0c;急救人员常通过视频或电话与医院医生进行沟通&#xff0c;以描述患者状况并依照指令行动。然而&#xff0c;这种信息传递方式往往因信息不完整或传递延…...

curl调用微信退款No required SSL certificate was sent

文章目录 前言一、错误一二、错误二 总结 前言 在之前的博客中提到微信证书到期了&#xff0c;需要更换&#xff0c;但是当我更换完证书自信满满的时候&#xff0c;却出现了两个问题&#xff0c;记录一下。 一、错误一 CURL Error: 58unable to load client key: -8178 (SEC_…...

进程守护SuperVisord内部的进程定时监测并重启

一个swoole的wensocket程序运行在SuperVisord下端口9503 设置一个每分钟任务监测9503的端口链接数&#xff0c;输出链接数&#xff0c;并在链接数为0的情况下重启wensocket进程。 以下截图是宝塔面板环境下 #!/bin/bash current$(date %H.%M) ws9503_procnumnetstat -nat | gre…...

[面试题]ES6 Javascript

ES6 箭头函数和普通函数有什么区别? 1)定义方式:箭头函数使用箭头(>)语法&#xff0c;省略了 function 关键字。 2)参数处理:如果只有一个参数&#xff0c;箭头函数可以省略括号。 3)函数体:如果函数体只有一条语句&#xff0c;箭头函数可以省略花括号和 return 关键字 4)…...

四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk

前言 远程桌面软件对于职场人来说并不陌生&#xff0c;可以说是必备的办公软件之一。在经历过新冠疫情后&#xff0c;大家对于远程办公的认识越来越深入&#xff0c;也就在这段期间&#xff0c;远程桌面软件大范围的应用起来&#xff0c;真正走进大众视野并融入我们的工作和生…...

解决电脑突然没有声音

问题描述&#xff1a;电脑突然没有声音了&#xff0c;最近没有怎么动过系统&#xff0c;没有安装或者卸载过什么软件&#xff0c;也没有安装或者卸载过驱动程序&#xff0c;怎么就没有声音了呢&#xff1f; 问题分析&#xff1a;仔细观察&#xff0c;虽然音量按钮那边看不到什…...

ZFX数字股票全球品牌战略新闻发布会在香港盛大举行

香港&#xff0c;2024年10月26日 —— 在香港这座东方之珠&#xff0c;ZFX集团今日在港岛 海逸君绰酒店隆重举办了“ZFX数字股票全球品牌战略新闻发布会暨世界佳 丽群星闪耀香港见面会”。作为全球数字金融领域的一次盛会&#xff0c;本次活动不 仅展示了ZFX集团在数字资产交易…...

vue中elementUI的el-select下拉框的层级太高修改设置!

项目场景&#xff1a; 项目中遇到一个问题&#xff0c;下拉框选择之后弹出一个弹出框选择数据再关闭。 问题就出在&#xff0c;我打开下拉框后再弹出弹出框&#xff0c;弹出框的 z-index 层级没有 select 的层级高&#xff0c;导致我弹框弹出了几个下拉框还在弹出框上面显示着…...

测试员最佳跳槽频率是多少?进来看看你是不是符合

最近笔者刷到一则消息&#xff0c;一位测试员在某乎上分享&#xff0c;从月薪5K到如今的20K&#xff0c;他总共跳了10次槽&#xff0c;其中还经历过两次劳动申诉&#xff0c;拿到了大几万的赔偿&#xff0c;被同事们称为“职场碰瓷人”。 虽说这种依靠跳槽式的挣钱法相当奇葩&…...

【数字信号处理】

https://www.bilibili.com/video/BV1B4421U79k/ 文章目录 1-绪论11-FFT1-绪论 1- Preliminery 引言 信号的概念,离散时间时域,频域2- 获得数字信号 采样,对信号的一种表达方式,是DSP的基础A/D,D/A 数字都是人造的,两个桥梁将现实和人造连接3-如何处理数字信号 两个工具:…...

Docker | 校园网上docker pull或者docker run失败的一种解决方法

场景 需要从仓库拉取镜像 无论使用命令docker pull 还是 docker run 但是总是显示如下的错误: 解决方法 查看虚拟机网络连接方式 Linux上检查校园网是否登录 有界面 无界面 只是命令行操作的Linux 关于Linux服务器端更新命令apt update没有效果问题总结(校园网认证)...

实现Java后端的图形验证码和行为验证码

登录添加图形验证码&#xff1a; 在 Java 中&#xff0c;我们可以使用一些图形处理库&#xff08;如 java.awt 和 javax.imageio&#xff09;生成图形验证码&#xff0c;并将验证码文本存储在会话&#xff08;session&#xff09;中以供验证。下面是一个完整的实现步骤&#x…...

事务的原理、MVCC的原理

事务特性 数据库事务具有以下四个基本特性&#xff0c;通常被称为 ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务被视为不可分割的最小工作单元&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。这意味着如果事务执行过程中发生…...

Golang反射原理

Golang反射原理 Go语言中的反射机制是通过标准库中的reflect包实现的。反射允许程序在运行时检查变量的类型和值&#xff0c;甚至可以修改变量的值。以下是反射的基本原理和使用方法&#xff1a; 基本原理 类型和种类&#xff1a; 反射中的类型信息通过reflect.Type表示&…...

MATLAB计算朗格朗日函数

1. 朗格朗日函数介绍 朗格朗日函数&#xff08;Lagrange function&#xff09;通常用于优化问题&#xff0c;尤其是带有约束的优化问题。其一般形式为&#xff1a; 其中&#xff1a; f(x) 是目标函数。 是约束条件。 是拉格朗日乘子。 为了编写一个MATLAB代码来计算和绘制…...

嵌入式linux跨平台基于mongoose的TCP C++类的源码

嵌入式linux开发中&#xff0c;需要使用http服务器时&#xff0c;mongoose是个很好的选择&#xff0c;linux&#xff0c;win双平台都支持&#xff0c;代码全开放&#xff0c;简单明了&#xff0c;我非常喜欢这种尽在撑控中的感觉&#xff08;关于mongoose实现一个小型的http服务…...

入驻商家必看:如何在TikTok实现多店铺高效上货及运营?

TikTok作为跨境电商平台之一&#xff0c;越来越多人进入其电商赛道——TikTok Shop&#xff0c;运营者想要长远发展&#xff0c;了解平台的政策动向并进行调整店铺至关重要。本文整理了TikTok Shop降低入驻门槛的资讯&#xff0c;并为广大TikTok电商运营者提供实用、有效的开店…...

成都网站建设比较好的公司/已备案域名交易平台

弹出view&#xff0c;input框文字飘到view上&#xff0c;如上图。官方解释&#xff1a; http://www.wxapp-union.com/forum.php?modviewthread&tid1600 由于textarea是原生组件实现&#xff0c;层级最高&#xff0c;目前还无法支持在上面覆盖元素这样的交互设计。 既然如此…...

南澳做网站/晨阳seo服务

北京作为租赁需求旺盛的城市之一&#xff0c;未来五年计划供地1300公顷&#xff0c;建设租赁住房50万套。与往年“划拨”、“协议租赁”、“竞配建”等租赁用地供应方式不同&#xff0c;这50万套租赁住房&#xff0c;将主要通过集体建设用地安排。此外&#xff0c;北京还引入“…...

网站建设的误区/台州seo公司

python3中range不返回数组对象&#xff0c;而是返回range对象 所以不能像python2中那样直接返回就是数组 解决&#xff1a; python3中返回一个range函数产生的数组对象&#xff1a; 从我的神经网络模型中截取一段代码 a list(range(layerNum)) # 要的仅仅是定长list结构&am…...

哪个博客可以做单页网站/百度收录网站需要多久

///自己copy过来的&#xff0c;忘了出处&#xff0c;一来分享&#xff0c;二来保存起来 CREATEPROCP_TEST NameVARCHAR(20), RowcountINTOUTPUT ASBEGINSELECT*FROMT_Customer WHERENAMENameSETRowcountROWCOUNTENDGO--存储过程调用如下: -----------------------------------…...

wordpress图片外链设置/网络营销成功案例ppt

前前后后&#xff0c;大概两个月的时间&#xff0c;lunar这个项目终于达到了一个很高的完整度。 Lunar是一个Python语言的网络框架&#xff0c;类似于Django&#xff0c;Flask&#xff0c;Tornado等当下流行的web framework。最初有这个想法是在大二下学期&#xff0c;当时接触…...

鄞州网站设计/想做游戏推广怎么找游戏公司

chmod 指令- 修改檔案目錄權限 https://www.opencli.com/linux/chmod-command...