mirror of
https://github.com/CHN-beta/nixos.git
synced 2026-01-11 22:49:56 +08:00
Compare commits
36 Commits
5de71b4f6d
...
production
| Author | SHA1 | Date | |
|---|---|---|---|
| 1e2114aaa3 | |||
| fe9bda0e7b | |||
| 16c84c3dca | |||
| 3336eeca78 | |||
| d22da25c2b | |||
| 40aa569024 | |||
| 5f36b073a7 | |||
| c707d8e168 | |||
| 758d86262c | |||
| 08e3440742 | |||
| 5e1c07931e | |||
| f1b762c959 | |||
| 2079a35e67 | |||
| 438c569c2f | |||
| 7a50f12129 | |||
| 0389536c9d | |||
| 163faa0db3 | |||
| 6d11d3232f | |||
| 48cd33e478 | |||
| 65bf14958b | |||
| 26371c3076 | |||
| f0cc24522e | |||
| 411a276d34 | |||
| 3b2ed6d850 | |||
| e580d7faa2 | |||
| c480e681c1 | |||
| 4adc1be9a2 | |||
| 93b1e4f146 | |||
| b71484eca4 | |||
| 3c37a9288c | |||
| 2532d3cf70 | |||
| 1e65495897 | |||
| f2a9d285f3 | |||
| ef8f516ab3 | |||
| d8b96a32e8 | |||
| 085fde23ba |
@@ -7,6 +7,7 @@ let devices =
|
||||
"/dev/disk/by-partlabel/nas-root2".mapper = "root2";
|
||||
"/dev/disk/by-partlabel/nas-root3" = { mapper = "root3"; ssd = true; };
|
||||
"/dev/disk/by-partlabel/nas-root4" = { mapper = "root4"; ssd = true; };
|
||||
"/dev/disk/by-partlabel/nas-root5".mapper = "root5";
|
||||
"/dev/disk/by-partlabel/nas-swap" = { mapper = "swap"; ssd = true; };
|
||||
"/dev/disk/by-partlabel/nas-ssd1" = { mapper = "ssd1"; ssd = true; };
|
||||
"/dev/disk/by-partlabel/nas-ssd2" = { mapper = "ssd2"; ssd = true; };
|
||||
|
||||
18
devices/hwang/default.nix
Normal file
18
devices/hwang/default.nix
Normal file
@@ -0,0 +1,18 @@
|
||||
# sudo nix build --store 'local?store=/data/gpfs01/hwang/.nix/store&state=/data/gpfs01/hwang/.nix/state&log=/data/gpfs01/hwang/.nix/log' .#hwang
|
||||
# sudo nix-store --store 'local?store=/data/gpfs01/hwang/.nix/store&state=/data/gpfs01/hwang/.nix/state&log=/data/gpfs01/hwang/.nix/log' -qR ./result | grep -Fxv -f <(ssh hwang find .nix/store -maxdepth 1 -exec realpath '{}' '\;') | sudo xargs nix-store --store 'local?store=/data/gpfs01/hwang/.nix/store&state=/data/gpfs01/hwang/.nix/state&log=/data/gpfs01/hwang/.nix/log' --export | pv > hwang.nar
|
||||
# cat hwang.nar | nix-store --import
|
||||
{ inputs, localLib }:
|
||||
let
|
||||
pkgs = import inputs.nixpkgs (localLib.buildNixpkgsConfig
|
||||
{
|
||||
inputs = { inherit (inputs.nixpkgs) lib; topInputs = inputs; };
|
||||
nixpkgs = { march = "haswell"; nixRoot = "/data/gpfs01/hwang/.nix"; nixos = false; };
|
||||
});
|
||||
hwang = pkgs.symlinkJoin
|
||||
{
|
||||
name = "hwang";
|
||||
paths = with pkgs; [ pv localPackages.vasp.intel glibc ];
|
||||
postBuild = "echo ${inputs.self.rev or "dirty"} > $out/.version";
|
||||
passthru = { inherit pkgs; archive = pkgs.closureInfo { rootPaths = [ hwang.drvPath ]; }; };
|
||||
};
|
||||
in hwang
|
||||
@@ -21,7 +21,10 @@ inputs:
|
||||
swap = [ "/dev/mapper/swap" ];
|
||||
# TODO: snapshot should take place just before switching root
|
||||
rollingRootfs.waitDevices =
|
||||
[ "/dev/mapper/root2" "/dev/mapper/root3" "/dev/mapper/root4" "/dev/mapper/ssd1" "/dev/mapper/ssd2" ];
|
||||
[
|
||||
"/dev/mapper/root2" "/dev/mapper/root3" "/dev/mapper/root4" "/dev/mapper/root5"
|
||||
"/dev/mapper/ssd1" "/dev/mapper/ssd2"
|
||||
];
|
||||
};
|
||||
initrd.sshd = {};
|
||||
nixpkgs.march = "alderlake";
|
||||
|
||||
@@ -18,9 +18,10 @@ inputs:
|
||||
"/dev/mapper/tf1" =
|
||||
{
|
||||
"/" = "/nix/tf";
|
||||
"/nix/remote/jykang" = "/data/gpfs01/jykang/.nix";
|
||||
"/nix/remote/xmuhk" = "/public/home/xmuhk/.nix";
|
||||
"/nix/remote/jykang" = "/data/gpfs01/jykang/.nix";
|
||||
"/nix/remote/wlin" = "/data/gpfs01/wlin/.nix";
|
||||
"/nix/remote/hwang" = "/data/gpfs01/hwang/.nix";
|
||||
};
|
||||
};
|
||||
nfs."nas.ts.chn.moe:/" = { mountPoint = "/nix/remote/nas"; mountBeforeSwitch = false; };
|
||||
|
||||
@@ -17,7 +17,7 @@ let
|
||||
paths = with pkgs;
|
||||
[
|
||||
gnuplot localPackages.vaspkit pv python localPackages.vasp.intel chn-bsub hwloc
|
||||
lsd prrte.dev
|
||||
lsd glibc glibc.bin
|
||||
];
|
||||
postBuild = "echo ${inputs.self.rev or "dirty"} > $out/.version";
|
||||
passthru = { inherit pkgs chn-bsub; archive = pkgs.closureInfo { rootPaths = [ wlin.drvPath ]; }; };
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
# .bash_profile
|
||||
|
||||
# Get the aliases and functions
|
||||
if [ -f ~/.bashrc ]; then
|
||||
. ~/.bashrc
|
||||
fi
|
||||
|
||||
# User specific environment and startup programs
|
||||
export PATH=/data/gpfs01/wlin/.nix/state/gcroots/current/bin:$HOME/bin:$PATH
|
||||
ulimit -s unlimited
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
# .bashrc
|
||||
|
||||
# Source global definitions
|
||||
if [ -f /etc/bashrc ]; then
|
||||
. /etc/bashrc
|
||||
fi
|
||||
export HISTFILESIZE=1000000
|
||||
|
||||
if [ -z "${BASHRC_SOURCED-}" ]; then
|
||||
export PATH=$HOME/.nix/state/gcroots/current/bin:$HOME/bin:$PATH
|
||||
ulimit -s unlimited
|
||||
export HISTFILESIZE=1000000
|
||||
export BASHRC_SOURCED=1
|
||||
fi
|
||||
|
||||
14
flake.lock
generated
14
flake.lock
generated
@@ -1161,11 +1161,11 @@
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1767530756,
|
||||
"narHash": "sha256-8Li3OLnzc406/gOe+Sgu0bHoedzibvIJ77bk3/EOMqw=",
|
||||
"lastModified": 1767694262,
|
||||
"narHash": "sha256-xpFtS6JGpwaDVqXWEYDfoLb05oLEAL1VE2GF9x8smDk=",
|
||||
"owner": "CHN-beta",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d7f3d87456d890459fac2f3e3723340d60de10bb",
|
||||
"rev": "ae0b0157cbfee59adb0d6211ea6e47299a173cd5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -1785,12 +1785,12 @@
|
||||
"ufo": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1762315512,
|
||||
"lastModified": 1768114392,
|
||||
"lfs": true,
|
||||
"narHash": "sha256-tTVQrXhnfFdrRwYJ60mpGdlbvUOE6egAxtqD0d80Crw=",
|
||||
"narHash": "sha256-H2vC6gA4oBBs4ZYSQAxI9VmviCcT9U9+xqNW0Q/N5Jw=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "dc6b431bf92db5ba22aac745a90e058528d9b5e3",
|
||||
"revCount": 85,
|
||||
"rev": "b130375ff8c5e4c02febdf3821ddeb43b6cbd89c",
|
||||
"revCount": 89,
|
||||
"type": "git",
|
||||
"url": "https://git.chn.moe/chn/ufo.git"
|
||||
},
|
||||
|
||||
@@ -53,7 +53,6 @@
|
||||
pocketfft = { url = "github:mreineck/pocketfft"; flake = false; };
|
||||
blog = { url = "git+https://git.chn.moe/chn/blog-public.git?lfs=1"; flake = false; };
|
||||
vaspberry = { url = "github:Infant83/VASPBERRY"; flake = false; };
|
||||
ufo = { url = "git+https://git.chn.moe/chn/ufo.git?lfs=1"; flake = false; };
|
||||
stickerpicker = { url = "github:maunium/stickerpicker"; flake = false; };
|
||||
fancy-motd = { url = "github:CHN-beta/fancy-motd"; flake = false; };
|
||||
mac-style = { url = "github:SergioRibera/s4rchiso-plymouth-theme?lfs=1"; flake = false; };
|
||||
@@ -66,6 +65,7 @@
|
||||
sqlgen = { url = "git+https://github.com/getml/sqlgen?submodules=1"; flake = false; };
|
||||
reflectcpp = { url = "git+https://github.com/getml/reflect-cpp?submodules=1"; flake = false; };
|
||||
linux-asus = { url = "github:CHN-beta/linux-g14/6.18"; flake = false; };
|
||||
ufo = { url = "git+https://git.chn.moe/chn/ufo.git?lfs=1"; flake = false; };
|
||||
};
|
||||
|
||||
outputs = inputs: let localLib = import ./flake/lib inputs.nixpkgs.lib; in
|
||||
|
||||
@@ -1,64 +1,64 @@
|
||||
{ inputs }: let inherit (inputs.self.nixosConfigurations.pc) pkgs; in
|
||||
{
|
||||
biu = pkgs.mkShell.override { stdenv = pkgs.clang18Stdenv; }
|
||||
biu = pkgs.mkShell
|
||||
{
|
||||
inputsFrom = [ pkgs.localPackages.biu ];
|
||||
packages = [ pkgs.llvmPackages_18.clang-tools ];
|
||||
packages = [ pkgs.llvmPackages.clang-tools ];
|
||||
CMAKE_EXPORT_COMPILE_COMMANDS = "1";
|
||||
hardeningDisable = [ "all" ];
|
||||
};
|
||||
hpcstat = pkgs.mkShell.override { stdenv = pkgs.gcc14Stdenv; }
|
||||
hpcstat = pkgs.mkShell
|
||||
{
|
||||
inputsFrom = [ (pkgs.localPackages.hpcstat.override { version = null; }) ];
|
||||
packages = [ pkgs.llvmPackages_18.clang-tools ];
|
||||
packages = [ pkgs.llvmPackages.clang-tools ];
|
||||
CMAKE_EXPORT_COMPILE_COMMANDS = "1";
|
||||
hardeningDisable = [ "all" ];
|
||||
};
|
||||
sbatch-tui = pkgs.mkShell.override { stdenv = pkgs.clang18Stdenv; }
|
||||
sbatch-tui = pkgs.mkShell
|
||||
{
|
||||
inputsFrom = [ pkgs.localPackages.sbatch-tui ];
|
||||
packages = [ pkgs.llvmPackages_18.clang-tools ];
|
||||
packages = [ pkgs.llvmPackages.clang-tools ];
|
||||
CMAKE_EXPORT_COMPILE_COMMANDS = "1";
|
||||
hardeningDisable = [ "all" ];
|
||||
};
|
||||
ufo = pkgs.mkShell.override { stdenv = pkgs.clang18Stdenv; }
|
||||
ufo = pkgs.mkShell
|
||||
{
|
||||
inputsFrom = [ pkgs.localPackages.ufo ];
|
||||
packages = [ pkgs.llvmPackages_18.clang-tools ];
|
||||
packages = [ pkgs.llvmPackages.clang-tools ];
|
||||
CMAKE_EXPORT_COMPILE_COMMANDS = "1";
|
||||
hardeningDisable = [ "all" ];
|
||||
};
|
||||
chn-bsub = pkgs.mkShell
|
||||
{
|
||||
inputsFrom = [ pkgs.localPackages.chn-bsub ];
|
||||
packages = [ pkgs.llvmPackages_18.clang-tools ];
|
||||
packages = [ pkgs.llvmPackages.clang-tools ];
|
||||
CMAKE_EXPORT_COMPILE_COMMANDS = "1";
|
||||
};
|
||||
info = pkgs.mkShell.override { stdenv = pkgs.clang18Stdenv; }
|
||||
info = pkgs.mkShell
|
||||
{
|
||||
inputsFrom = [ pkgs.localPackages.info ];
|
||||
packages = [ pkgs.llvmPackages_18.clang-tools ];
|
||||
packages = [ pkgs.llvmPackages.clang-tools ];
|
||||
CMAKE_EXPORT_COMPILE_COMMANDS = "1";
|
||||
hardeningDisable = [ "all" ];
|
||||
};
|
||||
vm = pkgs.mkShell.override { stdenv = pkgs.clang18Stdenv; }
|
||||
vm = pkgs.mkShell
|
||||
{
|
||||
inputsFrom = [ pkgs.localPackages.vm ];
|
||||
packages = [ pkgs.llvmPackages_18.clang-tools ];
|
||||
packages = [ pkgs.llvmPackages.clang-tools ];
|
||||
CMAKE_EXPORT_COMPILE_COMMANDS = "1";
|
||||
hardeningDisable = [ "all" ];
|
||||
};
|
||||
xinli = pkgs.mkShell.override { stdenv = pkgs.clang18Stdenv; }
|
||||
xinli = pkgs.mkShell
|
||||
{
|
||||
inputsFrom = [ pkgs.localPackages.xinli ];
|
||||
packages = [ pkgs.llvmPackages_18.clang-tools ];
|
||||
packages = [ pkgs.llvmPackages.clang-tools ];
|
||||
CMAKE_EXPORT_COMPILE_COMMANDS = "1";
|
||||
hardeningDisable = [ "all" ];
|
||||
};
|
||||
missgram = pkgs.mkShell.override { stdenv = pkgs.clang18Stdenv; }
|
||||
missgram = pkgs.mkShell
|
||||
{
|
||||
inputsFrom = [ pkgs.localPackages.missgram ];
|
||||
packages = [ pkgs.llvmPackages_18.clang-tools ];
|
||||
packages = [ pkgs.llvmPackages.clang-tools ];
|
||||
CMAKE_EXPORT_COMPILE_COMMANDS = "1";
|
||||
hardeningDisable = [ "all" ];
|
||||
};
|
||||
|
||||
@@ -78,6 +78,8 @@ in platformConfig //
|
||||
configureFlags = prev.configureFlags or [] ++ [ "--with-lsf" ];
|
||||
buildInputs = prev.buildInputs or [] ++ [ final.localPackages.lsf final.libnsl ];
|
||||
});
|
||||
cpptrace = prev.cpptrace.overrideAttrs (prev: { doCheck = !final.stdenv.hostPlatform.isStatic; });
|
||||
typst = final.pkgs-2505.typst;
|
||||
}
|
||||
// (
|
||||
let
|
||||
@@ -103,6 +105,7 @@ in platformConfig //
|
||||
})
|
||||
];
|
||||
};
|
||||
pkgs-2505 = "nixpkgs-2505";
|
||||
};
|
||||
packages = name:
|
||||
let flakeSource = inputs.topInputs.${source.${name}.source or source.${name}};
|
||||
|
||||
@@ -12,9 +12,7 @@
|
||||
duc = pkgs.pkgsStatic.duc.override { enableCairo = false; cairo = null; pango = null; };
|
||||
glaze = pkgs.pkgs-2411.pkgsStatic.glaze.overrideAttrs
|
||||
(prev: { cmakeFlags = prev.cmakeFlags ++ [ "-Dglaze_ENABLE_FUZZING=OFF" ]; });
|
||||
# pkgsStatic.clangStdenv have a bug
|
||||
# https://github.com/NixOS/nixpkgs/issues/177129
|
||||
biu = pkgs.pkgsStatic.localPackages.biu.override { stdenv = pkgs.pkgsStatic.gcc14Stdenv; inherit glaze; };
|
||||
biu = pkgs.pkgsStatic.localPackages.biu.override { inherit glaze; };
|
||||
in pkgs.pkgsStatic.localPackages.hpcstat.override
|
||||
{
|
||||
inherit openssh duc biu;
|
||||
@@ -31,6 +29,7 @@
|
||||
jykang = import ../devices/jykang { inherit inputs localLib; };
|
||||
wlin = import ../devices/wlin { inherit inputs localLib; };
|
||||
xmuhk = import ../devices/xmuhk { inherit inputs localLib; };
|
||||
hwang = import ../devices/hwang { inherit inputs localLib; };
|
||||
src =
|
||||
let getDrv = x:
|
||||
if pkgs.lib.isDerivation x then [ x ]
|
||||
|
||||
@@ -15,7 +15,7 @@ inputs:
|
||||
[
|
||||
# system management
|
||||
# TODO: module should add yubikey-touch-detector into path
|
||||
gparted wayland-utils clinfo mesa-demos vulkan-tools dracut yubikey-touch-detector btrfs-assistant snapper-gui
|
||||
gparted wayland-utils clinfo mesa-demos vulkan-tools dracut yubikey-touch-detector btrfs-assistant
|
||||
cpu-x wl-mirror geekbench xpra
|
||||
(
|
||||
writeShellScriptBin "xclip"
|
||||
@@ -60,19 +60,15 @@ inputs:
|
||||
# matplot++ needs old gnuplot
|
||||
pkgs-2311.gnuplot
|
||||
# math, physics and chemistry
|
||||
octaveFull ovito localPackages.vesta localPackages.v-sim jmol mpi geogebra6 localPackages.ufo
|
||||
octaveFull ovito localPackages.vesta localPackages.v-sim mpi geogebra6 localPackages.ufo
|
||||
(quantum-espresso.override { stdenv = gcc14Stdenv; gfortran = gfortran14; })
|
||||
pkgs-2311.hdfview numbat qalculate-qt
|
||||
# virtualization
|
||||
virt-viewer bottles wineWowPackages.stagingFull genymotion playonlinux
|
||||
pkgs-2311.hdfview
|
||||
# media
|
||||
nur-xddxdd.svp
|
||||
# for kdenlive auto subtitle
|
||||
openai-whisper
|
||||
# daily management
|
||||
activitywatch super-productivity
|
||||
# game
|
||||
lutris
|
||||
super-productivity
|
||||
];
|
||||
_pythonPackages = [(pythonPackages: with pythonPackages;
|
||||
[
|
||||
|
||||
@@ -9,7 +9,7 @@ inputs:
|
||||
_packages = with inputs.pkgs;
|
||||
[
|
||||
# basic tools
|
||||
beep dos2unix gnugrep pv tmux screen parallel tldr cowsay jq yq ipfetch localPackages.pslist
|
||||
beep dos2unix gnugrep pv tmux screen parallel tldr cowsay jq yq-go ipfetch localPackages.pslist
|
||||
fastfetch reptyr duc ncdu progress libva-utils ksh neofetch dateutils glib cryptsetup
|
||||
# lsxx
|
||||
pciutils usbutils lshw util-linux lsof dmidecode lm_sensors hwloc acpica-tools ethtool
|
||||
|
||||
@@ -26,8 +26,7 @@ inputs:
|
||||
[
|
||||
"github.copilot" "github.copilot-chat" "github.github-vscode-theme"
|
||||
"intellsmi.comment-translate"
|
||||
"ms-vscode.cmake-tools" "ms-vscode.cpptools-extension-pack" "ms-vscode.hexeditor"
|
||||
"ms-vscode.remote-explorer"
|
||||
"ms-vscode.hexeditor" "ms-vscode.remote-explorer"
|
||||
"ms-vscode-remote.remote-ssh"
|
||||
"donjayamanne.githistory" "fabiospampinato.vscode-diff"
|
||||
"llvm-vs-code-extensions.vscode-clangd" "ms-ceintl.vscode-language-pack-zh-hans"
|
||||
@@ -65,6 +64,9 @@ inputs:
|
||||
"ms-toolsai.datawrangler"
|
||||
# nushell
|
||||
"TheNuProjectContributors.vscode-nushell-lang"
|
||||
# C/C++
|
||||
"ms-vscode.cmake-tools" "ms-vscode.cpptools-extension-pack" "ms-vscode.cpptools" "coolchyni.beyond-debug"
|
||||
"vadimcn.vscode-lldb"
|
||||
];
|
||||
keybindings =
|
||||
[
|
||||
@@ -335,6 +337,8 @@ inputs:
|
||||
"tinymist.preview.partialRendering" = false;
|
||||
"tinymist.preview.refresh" = "onSave";
|
||||
"workbench.secondarySideBar.defaultVisibility" = "hidden";
|
||||
# disable terminal suggestions
|
||||
"terminal.integrated.suggest.enabled" = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
inputs:
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
config =
|
||||
{
|
||||
@@ -8,7 +8,12 @@ inputs:
|
||||
config.programs.yazi =
|
||||
{
|
||||
enable = true;
|
||||
keymap.mgr.append_keymap = [{ on = "T"; run = "shell --orphan ghostty"; }];
|
||||
keymap.mgr.append_keymap =
|
||||
[
|
||||
{ on = "T"; run = "shell --orphan ghostty"; }
|
||||
{ on = [ "c" "a" "a" ]; run = "plugin compress"; }
|
||||
];
|
||||
plugins = { inherit (pkgs.yaziPlugins) compress; };
|
||||
};
|
||||
}];
|
||||
};
|
||||
|
||||
@@ -57,16 +57,24 @@ inputs:
|
||||
"cron.gc_lfs" = { ENABLED = true; SCHEDULE = "@monthly"; NUMBER_TO_CHECK_PER_REPO = 0; };
|
||||
};
|
||||
};
|
||||
anubis.instances.gitea.settings =
|
||||
{
|
||||
OG_PASSTHROUGH = true;
|
||||
TARGET = "http://127.0.0.1:3002";
|
||||
BIND_NETWORK = "tcp";
|
||||
BIND = "127.0.0.1:3003";
|
||||
WEBMASTER_EMAIL = "chn@chn.moe";
|
||||
SERVE_ROBOTS_TXT = true;
|
||||
METRICS_BIND = "/run/anubis/anubis-gitea/anubis-metrics.sock";
|
||||
};
|
||||
# prevent AI web crawlers
|
||||
# https://her.esy.fun/posts/0031-how-i-protect-my-forgejo-instance-from-ai-web-crawlers/index.html
|
||||
# nginx.virtualHosts."https:${gitea.hostname}".locations."/".extraConfigPre =
|
||||
# ''
|
||||
# if ($http_user_agent ~* "git/|git-lfs/") {
|
||||
# set $bypass_cookie 1;
|
||||
# }
|
||||
# if ($cookie_Yogsototh_opens_the_door = "1") {
|
||||
# set $bypass_cookie 1;
|
||||
# }
|
||||
# if ($request_method != "GET") {
|
||||
# set $bypass_cookie 1;
|
||||
# }
|
||||
# if ($bypass_cookie != 1) {
|
||||
# add_header Content-Type text/html always;
|
||||
# return 418 '<script>document.cookie = "Yogsototh_opens_the_door=1; Path=/;"; window.location.reload();</script>';
|
||||
# }
|
||||
# '';
|
||||
};
|
||||
nixos =
|
||||
{
|
||||
@@ -78,7 +86,7 @@ inputs:
|
||||
};
|
||||
services =
|
||||
{
|
||||
nginx.https.${gitea.hostname}.location."/".proxy.upstream = "http://127.0.0.1:3003";
|
||||
nginx.https.${gitea.hostname}.location."/".proxy.upstream = "http://127.0.0.1:3002";
|
||||
postgresql.instances.gitea = {};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -69,6 +69,8 @@ inputs:
|
||||
"bin" "Desktop" "Documents" "Downloads" "Music" "Pictures" "repo" "share" "Public" "Videos" ".config"
|
||||
".local" ".ecdata" { directory = ".mozilla/firefox/default"; mode = "0700"; } ".steam" ".zotero"
|
||||
"Zotero" ".thunderbird"
|
||||
# dms 将剪贴板历史数据和主题的一些设置存放在这里
|
||||
".cache/dms-clipboard" ".cache/DankMaterialShell"
|
||||
];
|
||||
})
|
||||
# 对于集群的工作节点,挂载一些本来由 home-manager 生成的文件,以及一些用来存放 home-manager 生成文件的目录
|
||||
|
||||
@@ -4,7 +4,6 @@ inputs:
|
||||
{
|
||||
type = types.nullOr (types.submodule { options =
|
||||
{
|
||||
timeout = mkOption { type = types.int; default = 15; };
|
||||
windowsEntries = mkOption { type = types.attrsOf types.nonEmptyStr; default = {}; };
|
||||
# "efi" using efi, "efiRemovable" using efi with install grub removable, or dev path like "/dev/sda" using bios
|
||||
installDevice = mkOption { type = types.str; default = "efi"; };
|
||||
@@ -15,9 +14,13 @@ inputs:
|
||||
(inputs.lib.mkMerge
|
||||
[
|
||||
# general settings
|
||||
{ boot.loader.grub = { enable = true; useOSProber = false; }; }
|
||||
# grub timeout
|
||||
{ boot.loader.timeout = grub.timeout; }
|
||||
{
|
||||
boot.loader =
|
||||
{
|
||||
grub = { enable = true; useOSProber = false; };
|
||||
timeout = if inputs.config.nixos.model.type == "desktop" then null else 15;
|
||||
};
|
||||
}
|
||||
# grub install
|
||||
{
|
||||
boot.loader =
|
||||
|
||||
@@ -71,15 +71,20 @@ inputs:
|
||||
"Mod+WheelScrollUp" = { action.focus-column-left = {}; cooldown-ms = 50; };
|
||||
"Mod+Left".action.focus-column-left = {};
|
||||
"Mod+Right".action.focus-column-right = {};
|
||||
"Ctrl+Mod+Left".action.move-column-left = {};
|
||||
"Ctrl+Mod+Right".action.move-column-right = {};
|
||||
"Mod+Up".action.focus-workspace-up = {};
|
||||
"Mod+Down".action.focus-workspace-down = {};
|
||||
"Mod+MouseMiddle".action.close-window = {};
|
||||
"Mod+L".action.spawn = [ "dms" "ipc" "lock" "lock" ];
|
||||
"Mod+W".action.move-workspace-to-monitor-next = {};
|
||||
"Mod+Ctrl+C".action.spawn = [ "sh" "-c" "${xsel} -ob | ${wl-copy}" ];
|
||||
"Mod+Ctrl+V".action.spawn = [ "sh" "-c" "${wl-paste} -n | ${xsel} -ib" ];
|
||||
"Mod+S".action.screenshot = {};
|
||||
"Mod+F".action.set-column-width= "100%";
|
||||
"Mod+R".action.switch-preset-column-width = {};
|
||||
"Mod+T".action.expand-column-to-available-width = {};
|
||||
"Mod+F".action.switch-preset-column-width = {};
|
||||
"Mod+T".action.spawn = [ "ghostty" ];
|
||||
"Mod+B".action.spawn = [ "firefox" ];
|
||||
"Mod+Escape".action.power-off-monitors = {};
|
||||
};
|
||||
outputs =
|
||||
{
|
||||
@@ -102,7 +107,7 @@ inputs:
|
||||
layout =
|
||||
{
|
||||
default-column-width.proportion = 0.5;
|
||||
preset-column-widths = [ { proportion = 0.33333; } { proportion = 0.5; } { proportion = 0.66667; } ];
|
||||
preset-column-widths = [ { proportion = 0.5; } { proportion = 1.; } ];
|
||||
};
|
||||
spawn-at-startup =
|
||||
[
|
||||
|
||||
@@ -3,11 +3,7 @@ inputs:
|
||||
config =
|
||||
{
|
||||
# only preserve the last 7 days of logs
|
||||
services =
|
||||
{
|
||||
journald.extraConfig = "MaxRetentionSec=7d";
|
||||
logind.settings.Login.HandleLidSwitch = "ignore";
|
||||
};
|
||||
services.journald.extraConfig = "MaxRetentionSec=7d";
|
||||
systemd =
|
||||
{
|
||||
settings.Manager =
|
||||
|
||||
@@ -13,8 +13,7 @@ endif()
|
||||
|
||||
find_package(magic_enum REQUIRED)
|
||||
find_package(fmt REQUIRED)
|
||||
find_package(Boost REQUIRED COMPONENTS headers iostreams filesystem system process stacktrace_from_exception
|
||||
stacktrace_backtrace)
|
||||
find_package(Boost REQUIRED COMPONENTS headers iostreams filesystem system process)
|
||||
find_package(range-v3 REQUIRED)
|
||||
find_path(NAMEOF_INCLUDE_DIR nameof.hpp REQUIRED)
|
||||
find_package(Eigen3 REQUIRED)
|
||||
@@ -22,13 +21,14 @@ set(HIGHFIVE_FIND_HDF5 Off)
|
||||
find_package(HighFive REQUIRED)
|
||||
find_path(ZPP_BITS_INCLUDE_DIR zpp_bits.h REQUIRED)
|
||||
find_package(TgBot REQUIRED)
|
||||
find_path(LIBBACKTRACE_INCLUDE_DIR backtrace.h REQUIRED)
|
||||
find_library(LIBBACKTRACE_LIBRARY NAMES backtrace REQUIRED)
|
||||
find_package(HDF5 REQUIRED)
|
||||
find_package(concurrencpp REQUIRED)
|
||||
find_path(POCKETFFT_INCLUDE_DIR pocketfft.h REQUIRED)
|
||||
find_package(yaml-cpp REQUIRED)
|
||||
find_package(glaze REQUIRED)
|
||||
find_package(cpptrace REQUIRED)
|
||||
# on static build, cpptrace requires zlib
|
||||
find_library(ZLIB_LIBRARY NAMES z REQUIRED)
|
||||
|
||||
add_library(biu src/common.cpp src/hdf5.cpp src/string.cpp)
|
||||
target_include_directories(biu PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||
@@ -36,7 +36,7 @@ target_include_directories(biu PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_D
|
||||
${LIBBACKTRACE_INCLUDE_DIR} ${POCKETFFT_INCLUDE_DIR})
|
||||
target_link_libraries(biu PUBLIC magic_enum::magic_enum fmt::fmt Boost::headers Boost::iostreams Boost::filesystem
|
||||
range-v3::range-v3 Eigen3::Eigen HighFive TgBot::TgBot ${LIBBACKTRACE_LIBRARY} hdf5::hdf5 concurrencpp::concurrencpp
|
||||
yaml-cpp::yaml-cpp glaze::glaze Boost::process Boost::stacktrace_from_exception Boost::stacktrace_backtrace)
|
||||
yaml-cpp::yaml-cpp glaze::glaze Boost::process cpptrace::cpptrace ${ZLIB_LIBRARY})
|
||||
target_compile_features(biu PUBLIC cxx_std_23)
|
||||
target_compile_options(biu PUBLIC -Wno-gnu-string-literal-operator-template)
|
||||
install(TARGETS biu EXPORT biuTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/biuTargets.cmake")
|
||||
find_package(magic_enum REQUIRED)
|
||||
find_package(fmt REQUIRED)
|
||||
find_package(Boost REQUIRED COMPONENTS headers iostreams filesystem system process stacktrace_from_exception
|
||||
stacktrace_backtrace)
|
||||
find_package(Boost REQUIRED COMPONENTS headers iostreams filesystem system process)
|
||||
find_package(range-v3 REQUIRED)
|
||||
find_path(NAMEOF_INCLUDE_DIR nameof.hpp REQUIRED)
|
||||
find_package(Eigen3 REQUIRED)
|
||||
find_package(HighFive REQUIRED)
|
||||
find_path(ZPP_BITS_INCLUDE_DIR zpp_bits.h REQUIRED)
|
||||
find_package(TgBot REQUIRED)
|
||||
find_path(LIBBACKTRACE_INCLUDE_DIR backtrace.h REQUIRED)
|
||||
find_library(LIBBACKTRACE_LIBRARY NAMES backtrace REQUIRED)
|
||||
find_package(HDF5 REQUIRED)
|
||||
find_package(concurrencpp REQUIRED)
|
||||
find_path(POCKETFFT_INCLUDE_DIR pocketfft.h REQUIRED)
|
||||
find_package(yaml-cpp REQUIRED)
|
||||
find_package(glaze REQUIRED)
|
||||
find_package(cpptrace REQUIRED)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
stdenv, cmake, lib,
|
||||
magic-enum, fmt, boost, eigen, range-v3, nameof, zpp-bits, highfive, tgbot-cpp, libbacktrace, hdf5, concurrencpp,
|
||||
pocketfft, yaml-cpp, glaze
|
||||
pocketfft, yaml-cpp, glaze, cpptrace
|
||||
}: stdenv.mkDerivation rec
|
||||
{
|
||||
name = "biu";
|
||||
@@ -10,6 +10,7 @@
|
||||
[
|
||||
magic-enum fmt boost range-v3 nameof zpp-bits eigen libbacktrace hdf5
|
||||
concurrencpp pocketfft yaml-cpp glaze (highfive.override { inherit boost; }) (tgbot-cpp.override { inherit boost; })
|
||||
cpptrace
|
||||
];
|
||||
propagatedBuildInputs = buildInputs;
|
||||
nativeBuildInputs = [ cmake ];
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace biu
|
||||
namespace common
|
||||
{
|
||||
std::size_t hash(auto&&... objs);
|
||||
[[gnu::always_inline]] void unused(auto&&...);
|
||||
[[gnu::always_inline]] inline void unused(auto&&...);
|
||||
[[noreturn]] void block_forever();
|
||||
|
||||
bool is_interactive();
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# pragma once
|
||||
# include <map>
|
||||
# define BOOST_STACKTRACE_USE_BACKTRACE
|
||||
# include <boost/stacktrace.hpp>
|
||||
# include <biu/atomic.hpp>
|
||||
|
||||
namespace biu
|
||||
@@ -43,25 +41,16 @@ namespace biu
|
||||
protected: const std::chrono::time_point<std::chrono::steady_clock> CreateTime_;
|
||||
|
||||
// call log<Debug>("create {type} at {address}.");
|
||||
protected: [[gnu::always_inline]] ObjectMonitor();
|
||||
protected: [[gnu::noinline]] inline ObjectMonitor();
|
||||
|
||||
// call log<Debug>("destroy {type} at {address} after {duration} ms.");
|
||||
protected: [[gnu::always_inline]] virtual ~ObjectMonitor();
|
||||
protected: [[gnu::noinline]] inline virtual ~ObjectMonitor();
|
||||
};
|
||||
template <typename T> friend class ObjectMonitor;
|
||||
|
||||
// List of objects that is being monitored by ObjectMonitor, {address, type}
|
||||
protected: static Atomic<std::multimap<const void*, std::string_view>> Objects_;
|
||||
|
||||
public: template <typename FinalException> class Exception : public std::exception
|
||||
{
|
||||
protected: const std::string Message_;
|
||||
protected: const boost::stacktrace::stacktrace Stacktrace_;
|
||||
|
||||
public: explicit Exception(const std::string& message);
|
||||
public: const char* what() const noexcept final {return Message_.c_str();}
|
||||
};
|
||||
|
||||
public: template <typename Function> static void try_exec(Function&& function);
|
||||
|
||||
// Monitor the start and end of a function, as well as corresponding thread.
|
||||
@@ -76,30 +65,26 @@ namespace biu
|
||||
|
||||
// if sizeof...(Param) > 0, call log<Debug>("begin function with {arguments}.");
|
||||
// else call log<Debug>("begin function.");
|
||||
public: template <typename... Param> [[gnu::always_inline]] explicit Guard(Param&&... param);
|
||||
public: template <typename... Param> explicit Guard(Param&&... param);
|
||||
|
||||
// call log<Debug>("end function after {duration} ms.")
|
||||
public: [[gnu::always_inline]] inline virtual ~Guard();
|
||||
public: [[gnu::noinline]] inline virtual ~Guard();
|
||||
|
||||
// call log<Debug>("reached after {duration} ms.")
|
||||
public: [[gnu::always_inline]] inline void operator()() const;
|
||||
public: [[gnu::noinline]] inline void operator()() const;
|
||||
|
||||
// call log<Debug>("return {return} after {duration} ms.")
|
||||
public: template <typename T> [[gnu::always_inline]] T rtn(T&& value) const;
|
||||
public: template <typename T> [[gnu::noinline]] T rtn(T&& value) const;
|
||||
|
||||
// print the following message if LoggerConfig_ is set and the level is higher than the level of the
|
||||
// LoggerConfig_
|
||||
// [ {time} {thread} {indent} {filename}:{line} {function_name} ] {message}
|
||||
public: template <Level L> [[gnu::always_inline]] void log(const std::string& message) const;
|
||||
public: [[gnu::always_inline]] inline void error(const std::string& message) const;
|
||||
public: [[gnu::always_inline]] inline void info(const std::string& message) const;
|
||||
public: [[gnu::always_inline]] inline void debug(const std::string& message) const;
|
||||
|
||||
public: [[gnu::always_inline]] inline void print_exception
|
||||
(
|
||||
std::optional<std::pair<std::string, std::string>> type_and_message,
|
||||
const boost::stacktrace::stacktrace& stacktrace
|
||||
) const;
|
||||
// All directly called log functions should not be inlined to ensure correct stacktrace information
|
||||
// all not directly called log functions should be inlined to align stacktrace depth (always 1)
|
||||
protected: template <Level L> [[gnu::noinline]] void log_(const std::string& message) const;
|
||||
public: [[gnu::noinline]] inline void error(const std::string& message) const;
|
||||
public: [[gnu::noinline]] inline void info(const std::string& message) const;
|
||||
public: [[gnu::noinline]] inline void debug(const std::string& message) const;
|
||||
};
|
||||
friend class Guard;
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
# include <biu/common.hpp>
|
||||
# include <biu/format.hpp>
|
||||
# include <boost/exception/diagnostic_information.hpp>
|
||||
# include <cpptrace/cpptrace.hpp>
|
||||
# include <cpptrace/from_current.hpp>
|
||||
|
||||
namespace biu
|
||||
{
|
||||
@@ -44,12 +46,12 @@ namespace biu
|
||||
{
|
||||
Guard guard;
|
||||
Objects_.lock()->emplace(this, nameof::nameof_full_type<T>());
|
||||
guard.debug("create {} at {}."_f(nameof::nameof_full_type<T>(), fmt::ptr(this)));
|
||||
guard.log_<Level::Debug>("create {} at {}."_f(nameof::nameof_full_type<T>(), fmt::ptr(this)));
|
||||
}
|
||||
template <typename T> Logger::ObjectMonitor<T>::~ObjectMonitor()
|
||||
{
|
||||
Guard guard;
|
||||
guard.log<Level::Debug>("destroy {} at {} after {} ms."_f
|
||||
guard.log_<Level::Debug>("destroy {} at {} after {} ms."_f
|
||||
(
|
||||
nameof::nameof_full_type<T>(), fmt::ptr(this),
|
||||
std::chrono::duration_cast<std::chrono::milliseconds>
|
||||
@@ -63,13 +65,6 @@ namespace biu
|
||||
}
|
||||
inline Atomic<std::multimap<const void*, std::string_view>> Logger::Objects_;
|
||||
|
||||
template <typename FinalException> Logger::Exception<FinalException>::Exception(const std::string& message)
|
||||
{
|
||||
Logger::Guard log(message);
|
||||
log.print_exception
|
||||
(std::pair<std::string, std::string>(nameof::nameof_full_type<FinalException>(), message), Stacktrace_);
|
||||
}
|
||||
|
||||
template <typename Function> inline void Logger::try_exec(Function&& function)
|
||||
{
|
||||
Logger::Guard log;
|
||||
@@ -77,8 +72,12 @@ namespace biu
|
||||
catch (...)
|
||||
{
|
||||
log.error(boost::current_exception_diagnostic_information());
|
||||
log.print_exception
|
||||
(std::nullopt, boost::stacktrace::stacktrace::from_current_exception());
|
||||
if (auto&& lock = LoggerConfig_.lock(); lock->Level >= Logger::Level::Error)
|
||||
{
|
||||
static_assert(std::same_as<std::size_t, std::uint64_t>);
|
||||
cpptrace::from_current_exception().print(*lock->Stream);
|
||||
*lock->Stream << std::flush;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,13 +102,13 @@ namespace biu
|
||||
else return "({})"_f(nameof::nameof_full_type<T>());
|
||||
};
|
||||
if constexpr (sizeof...(Param) > 0)
|
||||
debug("begin function with {{{}}}."_f(fmt::join({try_format(std::forward<Param>(param))...}, ", ")));
|
||||
else debug("begin function.");
|
||||
log_<Level::Debug>("begin function with {{{}}}."_f(fmt::join({try_format(std::forward<Param>(param))...}, ", ")));
|
||||
else log_<Level::Debug>("begin function.");
|
||||
}
|
||||
|
||||
Logger::Guard::~Guard()
|
||||
{
|
||||
debug("end function after {} ms."_f(get_time_ms()));
|
||||
log_<Level::Debug>("end function after {} ms."_f(get_time_ms()));
|
||||
Indent_--;
|
||||
auto&& lock = Threads_.lock();
|
||||
if (auto thread_id = get_thread_id(); lock->contains(thread_id))
|
||||
@@ -117,20 +116,20 @@ namespace biu
|
||||
else [[unlikely]]
|
||||
error("{:08x} not found in Logger::Threads."_f(thread_id % std::numeric_limits<std::uint64_t>::max()));
|
||||
}
|
||||
void Logger::Guard::operator()() const { debug("reached after {} ms."_f(get_time_ms())); }
|
||||
template <Logger::Level L> void Logger::Guard::log(const std::string& message) const
|
||||
void Logger::Guard::operator()() const { log_<Level::Debug>("reached after {} ms."_f(get_time_ms())); }
|
||||
template <Logger::Level L> void Logger::Guard::log_(const std::string& message) const
|
||||
{
|
||||
if (auto&& lock = LoggerConfig_.lock(); lock->Level >= L)
|
||||
{
|
||||
static_assert(std::same_as<std::size_t, std::uint64_t>);
|
||||
auto time = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
|
||||
boost::stacktrace::stacktrace stack;
|
||||
auto frame = cpptrace::stacktrace::current(2, 1).frames[0];
|
||||
# ifdef BIU_LOGGER_SOURCE_ROOT
|
||||
auto source_root = std::string_view(BIU_LOGGER_SOURCE_ROOT "/");
|
||||
auto source_file = stack[0].source_file().starts_with(source_root) ?
|
||||
stack[0].source_file().substr(source_root.size()) : stack[0].source_file();
|
||||
auto source_file = frame.filename.starts_with(source_root) ?
|
||||
frame.filename.substr(source_root.size()) : frame.filename;
|
||||
# else
|
||||
auto source_file = stack[0].source_file();
|
||||
auto source_file = frame.filename;
|
||||
# endif
|
||||
*lock->Stream << "[ {:%T} {:02x} {:02} ] {} (at {}:{} {} )\n"_f
|
||||
(
|
||||
@@ -139,41 +138,20 @@ namespace biu
|
||||
Indent_,
|
||||
message,
|
||||
source_file.empty() ? "??"s : source_file,
|
||||
stack[0].source_line() == 0 ? "??"s : "{}"_f(stack[0].source_line()),
|
||||
stack[0].name()
|
||||
frame.line.has_value() ? "{}"_f(frame.line.value()) : "??"s,
|
||||
frame.symbol
|
||||
) << std::flush;
|
||||
}
|
||||
}
|
||||
void Logger::Guard::error(const std::string& message) const { log<Level::Error>(message); }
|
||||
void Logger::Guard::info(const std::string& message) const { log<Level::Info>(message); }
|
||||
void Logger::Guard::debug(const std::string& message) const { log<Level::Debug>(message); }
|
||||
void Logger::Guard::error(const std::string& message) const { log_<Level::Error>(message); }
|
||||
void Logger::Guard::info(const std::string& message) const { log_<Level::Info>(message); }
|
||||
void Logger::Guard::debug(const std::string& message) const { log_<Level::Debug>(message); }
|
||||
|
||||
template <typename T> inline T Logger::Guard::rtn(T&& value) const
|
||||
template <typename T> T Logger::Guard::rtn(T&& value) const
|
||||
{
|
||||
debug("return {} after {} ms."_f(std::forward<T>(value), get_time_ms()));
|
||||
log_<Level::Debug>("return {} after {} ms."_f(std::forward<T>(value), get_time_ms()));
|
||||
return std::forward<T>(value);
|
||||
}
|
||||
|
||||
inline void Logger::Guard::print_exception
|
||||
(
|
||||
std::optional<std::pair<std::string, std::string>> type_and_message,
|
||||
const boost::stacktrace::stacktrace& stacktrace
|
||||
) const
|
||||
{
|
||||
if (type_and_message) log<Level::Error>("{}: {}"_f(type_and_message->first, type_and_message->second));
|
||||
if (auto&& lock = LoggerConfig_.lock(); lock->Level >= Logger::Level::Error)
|
||||
{
|
||||
static_assert(std::same_as<std::size_t, std::uint64_t>);
|
||||
for (auto frame : stacktrace)
|
||||
*lock->Stream << "\tfrom {}:{} {}\n"_f
|
||||
(
|
||||
frame.source_file().empty() ? "??"s : frame.source_file(),
|
||||
frame.source_line() == 0 ? "??"s : "{}"_f(frame.source_line()),
|
||||
frame.name()
|
||||
);
|
||||
*lock->Stream << std::flush;
|
||||
}
|
||||
}
|
||||
|
||||
inline Atomic<std::map<std::size_t, std::size_t>> Logger::Threads_;
|
||||
}
|
||||
|
||||
@@ -2,4 +2,6 @@
|
||||
int main()
|
||||
{
|
||||
biu::Logger::Guard log("test", nullptr, std::ofstream());
|
||||
log.info("hello world");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -14,11 +14,7 @@ inputs: rec
|
||||
};
|
||||
v-sim = inputs.pkgs.callPackage ./v-sim.nix { src = inputs.topInputs.v-sim; };
|
||||
concurrencpp = inputs.pkgs.callPackage ./concurrencpp.nix { src = inputs.topInputs.concurrencpp; };
|
||||
matplotplusplus = inputs.pkgs.callPackage ./matplotplusplus.nix
|
||||
{
|
||||
src = inputs.topInputs.matplotplusplus;
|
||||
stdenv = inputs.pkgs.clang18Stdenv;
|
||||
};
|
||||
matplotplusplus = inputs.pkgs.callPackage ./matplotplusplus.nix { src = inputs.topInputs.matplotplusplus; };
|
||||
zpp-bits = inputs.pkgs.callPackage ./zpp-bits.nix { src = inputs.topInputs.zpp-bits; };
|
||||
nameof = inputs.pkgs.callPackage ./nameof.nix { src = inputs.topInputs.nameof; };
|
||||
pslist = inputs.pkgs.callPackage ./pslist.nix { src = inputs.topInputs.self.src.pslist; };
|
||||
@@ -67,9 +63,7 @@ inputs: rec
|
||||
inherit nameof zpp-bits tgbot-cpp concurrencpp pocketfft;
|
||||
# TODO: report glaze bug to upstream
|
||||
inherit (inputs.pkgs.pkgs-2411) glaze;
|
||||
stdenv = inputs.pkgs.clang18Stdenv;
|
||||
boost = (inputs.pkgs.boost188.override { extraB2Args = [ "boost.stacktrace.backtrace=on" ]; }).overrideAttrs
|
||||
(prev: { buildInputs = prev.buildInputs ++ [(inputs.pkgs.libbacktrace.override { enableStatic = true; })]; });
|
||||
boost = inputs.pkgs.boost188;
|
||||
fmt = inputs.pkgs.fmt_11.overrideAttrs (prev: { patches = prev.patches or [] ++ [ ./biu/fmt.patch ]; });
|
||||
};
|
||||
hpcstat = inputs.pkgs.callPackage ./hpcstat
|
||||
@@ -77,13 +71,8 @@ inputs: rec
|
||||
openxlsx = inputs.pkgs.callPackage ./openxlsx.nix { src = inputs.topInputs.openxlsx; };
|
||||
sqlite-orm = inputs.pkgs.callPackage ./sqlite-orm.nix { src = inputs.topInputs.sqlite-orm; };
|
||||
mkPnpmPackage = inputs.pkgs.callPackage ./mkPnpmPackage.nix {};
|
||||
sbatch-tui = inputs.pkgs.callPackage ./sbatch-tui { inherit biu; stdenv = inputs.pkgs.clang18Stdenv; };
|
||||
ufo = inputs.pkgs.callPackage inputs.topInputs.ufo
|
||||
{
|
||||
inherit biu matplotplusplus;
|
||||
tbb = inputs.pkgs.tbb_2022;
|
||||
stdenv = inputs.pkgs.clang18Stdenv;
|
||||
};
|
||||
sbatch-tui = inputs.pkgs.callPackage ./sbatch-tui { inherit biu; };
|
||||
ufo = inputs.pkgs.callPackage inputs.topInputs.ufo { inherit biu matplotplusplus; tbb = inputs.pkgs.tbb_2022; };
|
||||
chn-bsub = inputs.pkgs.callPackage ./chn-bsub { inherit biu; };
|
||||
py4vasp = inputs.pkgs.python3Packages.callPackage ./py4vasp.nix { src = inputs.topInputs.py4vasp; };
|
||||
pocketfft = inputs.pkgs.callPackage ./pocketfft.nix { src = inputs.topInputs.pocketfft; };
|
||||
@@ -112,14 +101,14 @@ inputs: rec
|
||||
];
|
||||
};
|
||||
stickerpicker = inputs.pkgs.python3Packages.callPackage ./stickerpicker.nix { src = inputs.topInputs.stickerpicker; };
|
||||
info = inputs.pkgs.callPackage ./info { inherit biu; stdenv = inputs.pkgs.clang18Stdenv; };
|
||||
info = inputs.pkgs.callPackage ./info { inherit biu; };
|
||||
blog = inputs.pkgs.callPackage inputs.topInputs.blog
|
||||
{
|
||||
inherit (inputs.topInputs) hextra;
|
||||
buildProxy = inputs.pkgs.lib.mkBuildproxy ./blog-buildproxy.nix;
|
||||
};
|
||||
phono3py = inputs.pkgs.python3Packages.callPackage ./phono3py.nix { src = inputs.topInputs.phono3py; };
|
||||
vm = inputs.pkgs.callPackage ./vm { inherit biu; stdenv = inputs.pkgs.clang18Stdenv; };
|
||||
vm = inputs.pkgs.callPackage ./vm { inherit biu; };
|
||||
oneapiPackages = inputs.pkgs.lib.makeScope inputs.pkgs.newScope (final:
|
||||
{
|
||||
stdenv = inputs.pkgs.callPackage ./oneapi/stdenv.nix { src = inputs.topInputs.self.src.oneapi; inherit gccFull; };
|
||||
@@ -137,14 +126,14 @@ inputs: rec
|
||||
speedtest = inputs.pkgs.callPackage ./speedtest.nix { src = inputs.topInputs.speedtest; };
|
||||
atat = inputs.pkgs.callPackage ./atat.nix { src = inputs.topInputs.self.src.atat; };
|
||||
atomkit = inputs.pkgs.callPackage ./atomkit.nix { src = inputs.topInputs.self.src.atomkit; };
|
||||
xinli = inputs.pkgs.callPackage ./xinli { inherit biu; stdenv = inputs.pkgs.clang18Stdenv; };
|
||||
xinli = inputs.pkgs.callPackage ./xinli { inherit biu; };
|
||||
pybinding = inputs.pkgs.pkgs-2411.python310Packages.callPackage ./pybinding
|
||||
{
|
||||
src = inputs.topInputs.pybinding;
|
||||
buildProxy = inputs.pkgs.lib.mkBuildproxy ./pybinding/proxy.nix;
|
||||
};
|
||||
brokenaxes = inputs.pkgs.python3Packages.callPackage ./brokenaxes.nix { src = inputs.topInputs.brokenaxes; };
|
||||
missgram = inputs.pkgs.callPackage ./missgram { inherit biu sqlgen; stdenv = inputs.pkgs.clang18Stdenv; };
|
||||
missgram = inputs.pkgs.callPackage ./missgram { inherit biu sqlgen; };
|
||||
sqlgen = inputs.pkgs.callPackage ./sqlgen.nix { src = inputs.topInputs.sqlgen; inherit reflectcpp; };
|
||||
reflectcpp = inputs.pkgs.callPackage ./reflectcpp.nix { src = inputs.topInputs.reflectcpp; };
|
||||
lsf = inputs.pkgs.callPackage ./lsf.nix { src = inputs.topInputs.self.src.lsf; };
|
||||
|
||||
@@ -12,10 +12,11 @@ endif()
|
||||
find_package(biu REQUIRED)
|
||||
find_package(httplib REQUIRED)
|
||||
find_package(sqlgen REQUIRED)
|
||||
find_package(nlohmann_json REQUIRED)
|
||||
|
||||
add_executable(missgram src/main.cpp src/db.cpp src/tg.cpp)
|
||||
target_include_directories(missgram PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
|
||||
target_link_libraries(missgram PRIVATE biu::biu httplib::httplib sqlgen::sqlgen)
|
||||
target_link_libraries(missgram PRIVATE biu::biu httplib::httplib sqlgen::sqlgen nlohmann_json::nlohmann_json)
|
||||
target_compile_features(missgram PRIVATE cxx_std_23)
|
||||
if(DEFINED MISSGRAM_CONFIG_FILE)
|
||||
target_compile_definitions(missgram PRIVATE MISSGRAM_CONFIG_FILE="${MISSGRAM_CONFIG_FILE}")
|
||||
@@ -23,6 +24,15 @@ endif()
|
||||
target_compile_definitions(missgram PRIVATE BIU_LOGGER_SOURCE_ROOT="${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
install(TARGETS missgram RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
|
||||
add_executable(tg-test EXCLUDE_FROM_ALL src/tg.cpp src/tg-test.cpp)
|
||||
target_include_directories(tg-test PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
|
||||
target_link_libraries(tg-test PRIVATE biu::biu httplib::httplib nlohmann_json::nlohmann_json)
|
||||
target_compile_features(tg-test PRIVATE cxx_std_23)
|
||||
if(DEFINED MISSGRAM_CONFIG_FILE)
|
||||
target_compile_definitions(tg-test PRIVATE MISSGRAM_CONFIG_FILE="${MISSGRAM_CONFIG_FILE}")
|
||||
endif()
|
||||
target_compile_definitions(tg-test PRIVATE BIU_LOGGER_SOURCE_ROOT="${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
|
||||
get_property(ImportedTargets DIRECTORY "${CMAKE_SOURCE_DIR}" PROPERTY IMPORTED_TARGETS)
|
||||
message("Imported targets: ${ImportedTargets}")
|
||||
message("List of compile features: ${CMAKE_CXX_COMPILE_FEATURES}")
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{ lib, stdenv, cmake, pkg-config, biu, configFile ? null, httplib, sqlgen }: stdenv.mkDerivation
|
||||
{ lib, stdenv, cmake, pkg-config, biu, configFile ? null, httplib, sqlgen, nlohmann_json }: stdenv.mkDerivation
|
||||
{
|
||||
name = "missgram";
|
||||
src = ./.;
|
||||
buildInputs = [ biu httplib sqlgen ];
|
||||
buildInputs = [ biu httplib sqlgen nlohmann_json ];
|
||||
nativeBuildInputs = [ cmake pkg-config ];
|
||||
cmakeFlags = lib.optional (configFile != null) [ "-DMISSGRAM_CONFIG_FILE=${configFile}" ];
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace missgram
|
||||
std::int16_t ServerPort;
|
||||
std::string dbPassword;
|
||||
} inline config;
|
||||
struct File { std::string url; bool is_photo; bool should_hidden; };
|
||||
struct File { std::string name, url, type; bool isSensitive; };
|
||||
|
||||
void db_write(std::string misskey_note, std::int32_t telegram_message_id);
|
||||
std::optional<std::int32_t> db_read(std::string misskey_note);
|
||||
|
||||
@@ -39,7 +39,6 @@ int main()
|
||||
struct Renote { std::string id; };
|
||||
std::optional<Renote> renote;
|
||||
bool localOnly;
|
||||
struct File { bool isSensitive; std::string url; std::string type; };
|
||||
std::vector<File> files;
|
||||
};
|
||||
std::optional<Note> note;
|
||||
@@ -66,7 +65,7 @@ int main()
|
||||
// 否则(引用或普通帖子)
|
||||
else
|
||||
{
|
||||
text = *content.body.note->text;
|
||||
text = content.body.note->text.value_or("");
|
||||
// 如果有引用,则需要查找被引用的帖子是否已经被转发过,若是则直接回复被转发的消息。
|
||||
// 如果没有被转发过,则在开头附上链接
|
||||
if (content.body.note->renote)
|
||||
@@ -82,21 +81,9 @@ int main()
|
||||
text += "\n[在联邦宇宙查看]({}/notes/{})"_f(content.server, content.body.note->id);
|
||||
}
|
||||
|
||||
// 接下来整理要转发的文件
|
||||
auto files = content.body.note->files | ranges::views::transform([](auto&& file) -> File
|
||||
{
|
||||
return File
|
||||
{
|
||||
.url = file.url,
|
||||
.is_photo = file.type.starts_with("image/"),
|
||||
.should_hidden = file.isSensitive
|
||||
};
|
||||
}) | ranges::to_vector;
|
||||
|
||||
log();
|
||||
|
||||
// 异步发送消息
|
||||
std::thread([text, note_id = content.body.note->id, reply_id, files]
|
||||
std::thread([text, note_id = content.body.note->id, reply_id,
|
||||
files = content.body.note->files]
|
||||
{
|
||||
auto message_id = tg_send(text, reply_id, files);
|
||||
if (message_id) db_write(note_id, *message_id);
|
||||
|
||||
25
packages/missgram/src/tg-test.cpp
Normal file
25
packages/missgram/src/tg-test.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
# include <missgram.hpp>
|
||||
|
||||
# ifndef MISSGRAM_CONFIG_FILE
|
||||
# define MISSGRAM_CONFIG_FILE "./config.yaml"
|
||||
# endif
|
||||
|
||||
int main()
|
||||
{
|
||||
using namespace biu::literals;
|
||||
using namespace missgram;
|
||||
biu::Logger::Guard log;
|
||||
|
||||
config = YAML::LoadFile(MISSGRAM_CONFIG_FILE).as<Config>();
|
||||
// tg_send("aaaa", std::nullopt, {});
|
||||
// tg_send("aaaa", std::nullopt, {{"IMG20241013173523.jpg", "https://xn--s8w913fdga.chn.moe/files/3dd41113-4df5-4f34-a825-e4137d146172", "image/jpeg", false}});
|
||||
tg_send("aaaa", std::nullopt,
|
||||
{
|
||||
{"2026-01-07 22-02-22 1.png", "https://xn--s8w913fdga.chn.moe/files/a23d13ea-de37-4907-9d54-66417d7e0e36", "image/png", false}
|
||||
});
|
||||
// tg_send("aaaa", std::nullopt,
|
||||
// {
|
||||
// {"IMG20241013173523.jpg", "https://xn--s8w913fdga.chn.moe/files/// 3dd41113-4df5-4f34-a825-e4137d146172", "image/jpeg", true},
|
||||
// {"2026-01-07 22-02-22 1.png", "https://xn--s8w913fdga.chn.moe/files/// a23d13ea-de37-4907-9d54-66417d7e0e36", "image/png", false}
|
||||
// });
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
# include <missgram.hpp>
|
||||
# include <tgbot/tgbot.h>
|
||||
# include <httplib.h>
|
||||
# include <nlohmann/json.hpp>
|
||||
|
||||
std::optional<std::int32_t> missgram::tg_send
|
||||
(std::string text, std::optional<std::int32_t> replyId, std::vector<File> files)
|
||||
@@ -7,84 +8,120 @@ std::optional<std::int32_t> missgram::tg_send
|
||||
using namespace biu::literals;
|
||||
biu::Logger::Guard log;
|
||||
|
||||
// 整理要发送的信息
|
||||
TgBot::Bot bot(config.TelegramBotToken);
|
||||
std::shared_ptr<TgBot::ReplyParameters> reply;
|
||||
if (replyId) reply = std::make_shared<TgBot::ReplyParameters>(*replyId, config.TelegramChatId);
|
||||
auto attachs = files
|
||||
| ranges::views::transform([&](auto&& file) -> TgBot::InputMedia::Ptr
|
||||
{
|
||||
if (file.is_photo)
|
||||
{
|
||||
auto pic = std::make_shared<TgBot::InputMediaPhoto>();
|
||||
pic->media = file.url;
|
||||
pic->hasSpoiler = file.should_hidden;
|
||||
return pic;
|
||||
}
|
||||
else
|
||||
{
|
||||
auto doc = std::make_shared<TgBot::InputMediaDocument>();
|
||||
doc->media = file.url;
|
||||
return doc;
|
||||
}
|
||||
})
|
||||
| ranges::to_vector;
|
||||
|
||||
// 多次尝试运行函数,直到成功或达到最大尝试次数(5次)
|
||||
auto try_run = [&](auto&& func) -> std::optional<std::int32_t>
|
||||
auto try_run = [&](auto&& func) -> std::optional<decltype(func())>
|
||||
{
|
||||
auto retry_delay = 1s;
|
||||
int attempts = 0;
|
||||
while (attempts < 5)
|
||||
{
|
||||
TgBot::Message::Ptr message;
|
||||
biu::Logger::try_exec([&] { message = func(); });
|
||||
if (message) return message->messageId;
|
||||
std::optional<decltype(func())> result;
|
||||
biu::Logger::try_exec([&] { result = func(); });
|
||||
if (result) return result;
|
||||
std::this_thread::sleep_for(retry_delay);
|
||||
retry_delay *= 2;
|
||||
attempts++;
|
||||
}
|
||||
return std::nullopt;
|
||||
return {};
|
||||
};
|
||||
|
||||
// 如果没有附件,使用 sendMessage 发送文本消息
|
||||
if (attachs.empty()) return try_run([&] { return bot.getApi().sendMessage
|
||||
(
|
||||
config.TelegramChatId, text, nullptr, reply, nullptr,
|
||||
"MarkdownV2"
|
||||
);});
|
||||
// 如果只有一个附件并且是图片,使用 sendPhoto 发送
|
||||
else if (attachs.size() == 1 && files[0].is_photo) return try_run([&]
|
||||
// 下载一个 https 资源到内存
|
||||
auto download = [&](const std::string& url) -> std::string
|
||||
{
|
||||
return bot.getApi().sendPhoto
|
||||
(
|
||||
config.TelegramChatId, files[0].url, text, reply,
|
||||
nullptr, "MarkdownV2", false, {}, 0, false, files[0].should_hidden
|
||||
);
|
||||
});
|
||||
// 如果有多个附件,使用 sendMediaGroup 分两条消息发送,返回第一条的 id
|
||||
std::regex https_regex(R"(https://([^/]+)(/.+))");
|
||||
std::smatch match;
|
||||
if (!std::regex_match(url, match, https_regex))
|
||||
throw std::runtime_error("Only https URLs are supported");
|
||||
httplib::SSLClient cli(match[1].str());
|
||||
auto res = cli.Get(match[2].str());
|
||||
if (res && res->status == 200) return res->body;
|
||||
else throw std::runtime_error("Failed to download file from " + url);
|
||||
};
|
||||
|
||||
// 下载要发送的文件
|
||||
std::vector<std::string> file_contents;
|
||||
for (const auto& file : files)
|
||||
{
|
||||
auto content = try_run([&] { return download(file.url); });
|
||||
if (!content) throw std::runtime_error("Failed to download file from " + file.url);
|
||||
file_contents.push_back(std::move(*content));
|
||||
}
|
||||
|
||||
// 准备要发送的请求
|
||||
httplib::UploadFormDataItems items;
|
||||
std::string method;
|
||||
if (files.empty())
|
||||
{
|
||||
method = "sendMessage";
|
||||
items.push_back({"text", text});
|
||||
items.push_back({"parse_mode", "Markdown"});
|
||||
items.push_back({"link_preview_options",
|
||||
[]{ nlohmann::json j; j["is_disabled"] = true; return j.dump(); }()});
|
||||
}
|
||||
else if (files.size() == 1)
|
||||
{
|
||||
auto is_photo = files[0].type.starts_with("image/");
|
||||
method = is_photo ? "sendPhoto" : "sendDocument";
|
||||
items.push_back
|
||||
({
|
||||
is_photo ? "photo" : "document",
|
||||
file_contents[0], files[0].name, files[0].type
|
||||
});
|
||||
items.push_back({"caption", text});
|
||||
items.push_back({"parse_mode", "Markdown"});
|
||||
if (is_photo && files[0].isSensitive) items.push_back({"has_spoiler", "True"});
|
||||
}
|
||||
else
|
||||
{
|
||||
auto message = try_run([&] { return bot.getApi().sendMessage
|
||||
(
|
||||
config.TelegramChatId, text, nullptr, reply, nullptr,
|
||||
"MarkdownV2"
|
||||
);});
|
||||
if (message)
|
||||
method = "sendMediaGroup";
|
||||
auto all_photo = ranges::all_of(files,
|
||||
[](auto&& file) { return file.type.starts_with("image/"); });
|
||||
nlohmann::json media_group = files | ranges::views::enumerate | ranges::views::transform([&](auto&& file)
|
||||
{
|
||||
auto message2 = try_run([&] -> TgBot::Message::Ptr
|
||||
nlohmann::json params;
|
||||
if (all_photo)
|
||||
{
|
||||
auto msg = bot.getApi().sendMediaGroup
|
||||
(
|
||||
config.TelegramChatId, attachs, false,
|
||||
std::make_shared<TgBot::ReplyParameters>(*message, config.TelegramChatId)
|
||||
);
|
||||
if (msg.empty() || !ranges::all_of(msg, [](auto&& m) { return bool(m); }))
|
||||
return nullptr;
|
||||
else return msg[0];
|
||||
});
|
||||
if (!message2) return {};
|
||||
params["type"] = "photo";
|
||||
if (file.second.isSensitive) params["has_spoiler"] = true;
|
||||
}
|
||||
else params["type"] = "document";
|
||||
params["media"] = "attach://media-{}"_f(file.first);
|
||||
log.debug("Prepared media {}: {}"_f(file.first, params.dump()));
|
||||
if (file.first == 0) { params["caption"] = text; params["parse_mode"] = "Markdown"; }
|
||||
return params;
|
||||
}) | ranges::to_vector;
|
||||
items.push_back({"media", media_group.dump()});
|
||||
for (int i = 0; i < files.size(); i++) items.push_back
|
||||
({"media-{}"_f(i), file_contents[i], files[i].name, files[i].type});
|
||||
}
|
||||
items.push_back({"chat_id", std::to_string(config.TelegramChatId)});
|
||||
if (replyId) items.push_back({"reply_parameters", [&]
|
||||
{
|
||||
nlohmann::json j;
|
||||
j["message_id"] = *replyId;
|
||||
j["chat_id"] = config.TelegramChatId;
|
||||
return j.dump();
|
||||
}()});
|
||||
|
||||
httplib::Client cli("https://api.telegram.org");
|
||||
auto result = cli.Post("/bot{}/{}"_f(config.TelegramBotToken, method), items);
|
||||
log.debug("{} {} {}"_f(result->status, result->body, result->headers));
|
||||
if (result && result->status == 200)
|
||||
{
|
||||
auto json = nlohmann::json::parse(result->body);
|
||||
// 测试 js["result"]["message_id"] 是否存在且为整数
|
||||
if (json.contains("result") && json["result"].contains("message_id")
|
||||
&& json["result"]["message_id"].is_number_integer())
|
||||
return json["result"]["message_id"].get<std::int32_t>();
|
||||
else
|
||||
{
|
||||
log.error("Telegram API error: {}"_f(json.dump()));
|
||||
return {};
|
||||
}
|
||||
return message;
|
||||
}
|
||||
else
|
||||
{
|
||||
log.error("HTTP error: {}"_f(result ? std::to_string(result->status) : "No response"));
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{ stdenv, src, writeShellScriptBin, lib, rsync, which, wannier90, hdf5, mpi, mkl }:
|
||||
{ stdenv, src, writeShellScriptBin, lib, rsync, which, wannier90, hdf5, mpi, mkl, prrte }:
|
||||
let
|
||||
vasp = stdenv.mkDerivation
|
||||
{
|
||||
@@ -26,7 +26,7 @@ let
|
||||
};
|
||||
wrapper = writeShellScriptBin "vasp-intel"
|
||||
''
|
||||
export PATH=${vasp}/bin:${mpi}/bin''${PATH:+:$PATH}
|
||||
export PATH=${vasp}/bin:${mpi}/bin:${mpi.dev}/bin:${prrte}/bin:${prrte.dev}/bin''${PATH:+:$PATH}
|
||||
|
||||
# set OMP_NUM_THREADS if SLURM_CPUS_PER_TASK is set
|
||||
if [ -z "$OMP_NUM_THREADS" ] && [ -n "$SLURM_CPUS_PER_TASK" ]; then
|
||||
|
||||
Reference in New Issue
Block a user