使用zig在linux上交叉编译cgo

使用zig在linux上交叉编译cgo 的 github action,此处不做解释了,自己可以看注释进行实验 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 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 name: build on: push: tags: - '*' jobs: build-rotateproxy: runs-on: ubuntu-18.04 steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Zig uses: goto-bus-stop/setup-zig@v1 with: version: 0.9.1 - name: Setup Golang uses: actions/setup-go@v2 with: go-version: 1.17 - name: Build RotateProxy run: | # download macos sysroot git clone --depth=1 https://github.com/hexops/sdk-macos-12.0.git "$HOME/macos-SDK" # create zig script mkdir -p "$HOME/.bin" export PATH=$PATH:"$HOME/.bin" touch "$HOME/.bin/zcc" && touch "$HOME/.bin/zxx" chmod +x "$HOME/.bin/zcc" && chmod +x "$HOME/.bin/zxx" mkdir -p build cd cmd/rotateproxy configs=( 'linux amd64 x86_64-linux-musl' 'linux 386 i386-linux-musl' 'windows amd64 x86_64-windows-gnu' 'windows 386 i386-windows-gnu' 'darwin amd64 x86_64-macos-gnu' ) IFS=$'\n' for i in ${configs[@]} do IFS=$' ' config=($i) goos=${config[0]} goarch=${config[1]} libc=${config[2]} ext='' if [ "${goos}" = "windows" ];then ext='.exe' fi # ref: https://dev.to/kristoff/zig-makes-go-cross-compilation-just-work-29ho echo "goos: ${goos} goarch: ${goarch} libc: ${libc}" echo '#!/bin/sh' > "$HOME/.bin/zcc" echo '#!/bin/sh' > "$HOME/.bin/zxx" # ref: https://github.com/ziglang/zig/issues/10660 # ref: https://github.com/ziglang/zig/issues/1349 # ref: https://github.com/ziglang/zig/issues/10299#issuecomment-989153750 if [ "${goos}" = "darwin" ];then # zig 0.10.0关于sysroot的行为有变更,参见 https://github.com/ziglang/zig/issues/10790#issuecomment-1030712395 echo 'ZIG_LOCAL_CACHE_DIR="$HOME/tmp" zig cc -target '${libc}' --sysroot="$HOME/macos-SDK/root" -I"$HOME/macos-SDK/root/usr/include" -L"$HOME/macos-SDK/root/usr/lib" -F"$HOME/macos-SDK/root/System/Library/Frameworks" $@' >> "$HOME/.bin/zcc" echo 'ZIG_LOCAL_CACHE_DIR="$HOME/tmp" zig c++ -target '${libc}' --sysroot="$HOME/macos-SDK/root" -I"$HOME/macos-SDK/root/usr/include" -L"$HOME/macos-SDK/root/usr/lib" -F"$HOME/macos-SDK/root/System/Library/Frameworks" $@' >> "$HOME/.bin/zxx" # zig cc 调用clang,clang更新后默认加了一些参数,见 https://github.com/golang/go/issues/38876 https://stackoverflow.com/questions/42074035 # 经过测试最基本需要 -Wno-nullability-completeness -Wno-expansion-to-defined -Wno-availability export CGO_CPPFLAGS="-Wno-error -Wno-nullability-completeness -Wno-expansion-to-defined -Wno-builtin-requires-header -Wno-availability" else echo 'ZIG_LOCAL_CACHE_DIR="$HOME/tmp" zig cc -target '${libc}' $@' >> "$HOME/.bin/zcc" echo 'ZIG_LOCAL_CACHE_DIR="$HOME/tmp" zig c++ -target '${libc}' $@' >> "$HOME/.bin/zxx" fi cat "$HOME/.bin/zxx" cat "$HOME/.bin/zcc" CGO_ENABLED=1 GOOS="${goos}" GOARCH="${goarch}" CC="zcc" CXX="zxx" go build -o "../../build/rotateproxy-${goos}-${goarch}${ext}" -trimpath -ldflags="-linkmode=external -extldflags=-static -s -w" done - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 with: version: latest args: release --rm-dist env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

二月 13, 2023 · 2 分钟

xp 兼容的 go-sciter

现在的 https://github.com/sciter-sdk/go-sciter 项目想要兼容 xp 已经十分困难 我写了一个例子,地址在 https://github.com/akkuman/go-sciter-xp, 旨在提供一个兼容 xp 的 go-sciter 样例。 感兴趣的可以将项目克隆下来后进行自己的开发 环境依赖 go 1.10 https://github.com/golang/dep 工具 sciter-sdk 4.4.4.7 关于环境的说明 上面几个环境务必保持相同 sciter-sdk 为什么使用 4.4.4.7 版本 我使用 rundll32 在 xp 上调用 sciter.dll,最高只能支持到这个版本 我已经将这个版本的 dll 放到本仓库了 sciter-4.4.4.7-normal.dll 来自 https://github.com/c-smile/sciter-sdk/tree/c7d48627e8716bb803bebf2c74f54ab2dd0d7c51/bin.win/x32 sciter-4.4.4.7-skia.dll 来自 https://github.com/c-smile/sciter-sdk/tree/c7d48627e8716bb803bebf2c74f54ab2dd0d7c51/bin.win/x32skia 这两个版本的区别是,skia 使用 skia 进行渲染,并且体积大一些 为什么使用 go1.10 根据 https://github.com/golang/go/issues/23380 ,golang version 1.10 是最后一个支持xp的版本,后续的版本不对兼容性做保证 关于gui库 govcl: go ver>=1.9.2 : 优势: 可以使用lazarus或delphi等界面设计软件直接画界面 go-sciter: go ver>=1.10:优势:使用了完整的web技术栈,但是肯定不能与浏览器的兼容性相比,不过写界面应该是够了,目前使用sciter的明星产品:rustdesk gotk3:go ver>=1.8 gtk绑定 qt:支持1.10,但是安装较为复杂 考虑到美观和兼容的问题,建议使用 go-sciter 注意,go1.10不支持go module,需要使用gopath的模式 为什么使用dep dep 已经是一个不再维护的东西,已经被 go module 取代,但是 module 到 go1.13 才有支持,所以我们使用 dep ...

九月 19, 2022 · 2 分钟

frp 源码阅读

首先根据源码梳理出时序图 sequenceDiagram actor u as user participant s as server participant c as client loop 直到登录成功 c ->> + s : login s -->> - c : version+runid+udpport+err end loop 心跳 c -) + s : 心跳ping s --) - c : 心跳pong end activate s s -) c : 发送 ReqWorkConn 消息,根据连接池配置建立连接 c -->> s : 建立连接,发送 NewWorkConn 消息,带上runid s ->> s: 将连接放入runid对应的连接池 deactivate s c -) + s : 根据 client proxy 配置,发送 NewProxy 请求 s ->> s : 启动proxy(监听proxy对应的端口) s -->> - c : 回复 NewProxyResp 消息(带入proxyName) u ->> + s : 访问 proxy 监听的端口 s ->> s : 将用户请求与 client 连接池中的一个可用连接串联起来 s -) c : 在上述可用连接上发送 StartWorkConn 消息,告知有新的用户连接接入该 proxy c ->> c : 处理该连接 frp中 client 和 server 之间的连接有 workConn 和普通连接两类,workConn 主要是为了和用户主动发起的连接打通,而普通连接主要是 client 与 server 之间的业务交流 ...

八月 17, 2022 · 1 分钟

hugo+NetlifyCMS部署

网上的博客很多关于Netlify CMS的部署都是使用了Netlify的服务,因为我自己的博客已经使用了GithubAction作为CI来自动部署,我的博客源文件放在hugo分支下,对hugo分支commit会触发GithubAction,然后使用进行网站构建并推送到master分支下,并且自定义域名是使用的其他域名提供商来解析的,本文主要是记录一下在这种情况下怎么为博客添加NetlifyCMS Netlify CMS 做什么 安装之前我们需要了解一下Netlify CMS是什么。Netlify CMS 和 Forestry 等工具一样,它可以帮助你管理你的git仓库,我们一般的主要用途就是拿它来管理git仓库中的 blog 源文件,它提供了一个友好的界面来帮助你编写你的 blog 源文件,然后后续的 git commit push 它会帮你效劳,你可以拿它来作为CI,自动帮你构建好网站,也可以只使用他的编辑推送功能,把它当作一个管理后台,让其他的CI来帮你做后面的事情。 举个例子,我有一个博客托管在 github pages,拥有自己的CI来进行博客部署,我只需要推送 markdown 博文源文件到指定分支下,即可触发构建,但是我不想每次都在本地写博客,我希望有个简单的方式来让我随时随地在线编辑发布博客,那我就可以使用 Netlify CMS,当然,你也可以使用 github.dev,不过缺点是你需要另外的工具来处理你的图片,因为 github.dev 不支持图片粘贴(相应的插件也无法安装),但是 Netlify CMS 能够通过配置来完成粘贴图片的功能,麻雀虽小五脏俱全。 如何部署 可能你看了不少说明文档,但是还是处于不可用的状态。其实有很大一部分原因是没有使用 Netlify 的服务,比如你的自定义域名没有托管在 Netlify。 我决定使用 Netlfify 提供给我的 xxxx.netlify.app 域名。最终效果是我可以直接访问该域名(xxxx.netlify.app) 即可管理我的博客后台。 建立新分支 从这里开始可能你就会发现和说明文档有点不一样。因为我不打算把它放置在子文件夹(admin)下。 首先我们 clone 我们的博客仓库。拿我自己的仓库举例子,hugo 是我放置博客源文件的分支。 1 2 git clone [email protected]:akkuman/akkuman.github.io.git cd akkuman.github.io 然后我们新建一个分支用来托管 Netlify CMS。 1 2 git checkout --orphan netlifycms # 新建一个没有历史的分支 git rm -rf . # 把当前内容全部删除,得到一个空分支 当然,你可以用你自己习惯的办法创建一个新分支然后删除所有的文件,我们只需要有一个新分支,这个分支上没有任何文件。 ...

六月 25, 2022 · 3 分钟

从arl中学习到的nmap配置

灯塔(ARL)里面有一个namp扫描模块,里面有配置可以学习一下 首先上代码 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 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 class PortScan: def __init__(self, targets, ports=None, service_detect=False, os_detect=False, port_parallelism=None, port_min_rate=None, custom_host_timeout=None): self.targets = " ".join(targets) self.ports = ports self.max_hostgroup = 128 self.alive_port = "22,80,443,843,3389,8007-8011,8443,9090,8080-8091,8093,8099,5000-5004,2222,3306,1433,21,25" self.nmap_arguments = "-sT -n --open" self.max_retries = 3 self.host_timeout = 60*5 self.parallelism = port_parallelism # 默认 32 self.min_rate = port_min_rate # 默认64 if service_detect: self.host_timeout += 60 * 5 self.nmap_arguments += " -sV" if os_detect: self.host_timeout += 60 * 4 self.nmap_arguments += " -O" if len(self.ports.split(",")) > 60: self.nmap_arguments += " -PE -PS{}".format(self.alive_port) self.max_retries = 2 else: if self.ports != "0-65535": self.nmap_arguments += " -Pn" if self.ports == "0-65535": self.max_hostgroup = 8 self.min_rate = max(self.min_rate, 400) self.nmap_arguments += " -PE -PS{}".format(self.alive_port) self.host_timeout += 60 * 2 self.max_retries = 2 self.nmap_arguments += " --max-rtt-timeout 800ms" self.nmap_arguments += " --min-rate {}".format(self.min_rate) self.nmap_arguments += " --script-timeout 6s" self.nmap_arguments += " --max-hostgroup {}".format(self.max_hostgroup) # 依据传过来的超时为准 if custom_host_timeout is not None: if int(custom_host_timeout) > 0: self.host_timeout = custom_host_timeout self.nmap_arguments += " --host-timeout {}s".format(self.host_timeout) self.nmap_arguments += " --min-parallelism {}".format(self.parallelism) self.nmap_arguments += " --max-retries {}".format(self.max_retries) def run(self): logger.info("nmap target {} ports {} arguments {}".format( self.targets[:20], self.ports[:20], self.nmap_arguments)) nm = nmap.PortScanner() nm.scan(hosts=self.targets, ports=self.ports, arguments=self.nmap_arguments) ip_info_list = [] for host in nm.all_hosts(): port_info_list = [] for proto in nm[host].all_protocols(): port_len = len(nm[host][proto]) for port in nm[host][proto]: # 对于开了很多端口的直接丢弃 if port_len > 600 and (port not in [80, 443]): continue port_info = nm[host][proto][port] item = { "port_id": port, "service_name": port_info["name"], "version": port_info["version"], "product": port_info["product"], "protocol": proto } port_info_list.append(item) osmatch_list = nm[host].get("osmatch", []) os_info = self.os_match_by_accuracy(osmatch_list) ip_info = { "ip": host, "port_info": port_info_list, "os_info": os_info } ip_info_list.append(ip_info) return ip_info_list def os_match_by_accuracy(self, os_match_list): for os_match in os_match_list: accuracy = os_match.get('accuracy', '0') if int(accuracy) > 90: return os_match return {} 入口是run ...

四月 13, 2022 · 3 分钟