configuration.nix/configuration.nix
2025-12-27 05:10:14 +03:00

566 lines
20 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
lib,
config,
pkgs,
#simintech,
#stm32cubemx,
packettracer7,
inputs,
...
}:
let
serverIP = "10.0.174.12";
hasBootPartition = config.fileSystems ? "/boot";
isNvidia = (builtins.readFile (pkgs.runCommandLocal "isNvidia" {} ''
${pkgs.pciutils}/bin/lspci | ${pkgs.busybox}/bin/grep NVIDIA | ${pkgs.busybox}/bin/grep VGA > $out || true
'')) != "";
in
{
users.users.student = {
isNormalUser = true;
initialPassword = "student"; # вход беспарольный, но пароль student
extraGroups = [ "video" "sound" "input" "storage" ];
packages =
let
# определение как скачивать плагины jetbrains (скачивать с нашего сервера копию)
customJBPlugin =
nam: ver: sha:
pkgs.stdenv.mkDerivation {
name = nam;
version = ver;
src = pkgs.fetchurl {
url = "http://${serverIP}/custom-jetbrains-plugins/${nam}-${ver}.zip";
sha256 = sha;
};
nativeBuildInputs = with pkgs; [ unzip ];
dontUnpack = true;
installPhase = "unzip $src; mkdir -p $out; mv ./${nam}/* $out";
};
in
with pkgs;
[
(pkgs.jetbrains.plugins.addPlugins pkgs.jetbrains.idea-community (
# набор плагинов, я бы сказал, богат до избыточности, но главное есть Python
# и Database Nagivator. Остальное - любителям и любознательным.
(with inputs.nix-jetbrains-plugins.plugins."${system}"; [
#idea-community."2024.1"."mobi.hsz.idea.gitignore"
idea-community."2024.1"."org.jetbrains.erlang"
idea-community."2024.1"."JProfiler"
idea-community."2024.1"."DBN"
idea-community."2024.1"."MatlabSupport"
#idea-community."2024.1"."com.intellij.notebooks.core"
idea-community."2024.1"."PlantUML integration"
idea-community."2024.1"."org.intellij.scala"
idea-community."2024.1"."PythonCore"
#idea-community."2024.1"."net.sjrx.intellij.plugins.systemdunitfiles"
idea-community."2024.1"."com.intellij.jsonpath"
idea-community."2024.1"."Lombook Plugin"
idea-community."2024.1"."org.mapstruct.intellij"
idea-community."2024.1"."ski.chrzanow.foldableprojectview"
idea-community."2024.1"."String Manipulation"
idea-community."2024.1"."quokka.js"
idea-community."2024.1"."org.asciidoctor.intellij.asciidoc"
#idea-community."2024.1"."R4Intellij"
idea-community."2024.1"."com.redhat.devtools.lsp4ij"
])
++
[
# поддежка языка C/C++ на уровне подсветки синтаксиса и автодополнения
(customJBPlugin "clsp" "1.0.1" "sha256-AU/Q61YYsGn2BAYykCGm4XGNyeSwd5K/txGNzP2dJg0=")
# поддежка фреймворка Spring через opensource-плагин Explyt. пусть будет
(customJBPlugin "spring-tool" "241-b3085-signed"
"sha256-u9Hqy4BN1johA7e8proMekyERXkE6gXRnqGRNR7FouE="
)
]
))
chromium # браузер
pinta # графический редактор
sakura # терминал
unzipNLS # поддержка zip
unrar # поддержка rar
gtk3 whitesur-icon-theme # необходимо для иконок
(pkgs.writeShellScriptBin "powermenu" (builtins.readFile inputs.mireadesktop.packages.x86_64-linux.powermenu))
(pkgs.writeShellScriptBin "resethome" (builtins.readFile inputs.mireadesktop.packages.x86_64-linux.resethome))
pandoc
#onlyoffice-desktopeditors # к сожалению, пока у OnlyOffice баг со шрифтами. Ждём фикс
libreoffice # поэтому пока что у нас Libreoffice...
# Напоминаю что у нас есть СЕТЕВОЙ ДИСК по адресу 10.0.174.12
# и для студентов пока есть единая учётка student@mirea.ru,
# рассматривается вариант авторизации через login.mirea.ru.
# Преподаватели могут зарегистрироваться ОТДЕЛЬНО
seafile-client
# утилиты разработчика
git
cmakeWithGui
gnumake
###### ЯЗЫКИ ПРОГРАММИРОВАНИЯ #####
# поставка Python, полный список возможностей
# см. на github.com/gregorybednov/mireapython
inputs.mireapython.packages.x86_64-linux.mireapython
# базовая поддержка C/C++ и дебага
clang
clang-tools
lldb
cpplint
cppcheck
gcc-arm-embedded # компиляция С/C++ под STM32 и прочие arm
octaveFull # GNU Octave
shellcheck # проверка шелл-кода (bash, POSIX sh, ...)
# Другие возможные языки и инструменты, например:
# rustc # - Rust
# go gopls delve golint go-tools # - Go
jdk kotlin # - Java, Kotlin (идут вместе с IJ IDEA)
# ghc haskell-language-server # - Haskell
# nodePackages.intelephense # - PHP
# dotnet-sdk # - C#
####### Проектирование и разработка баз данных, ИУС, ... #######
# Workbench для управления и ER-моделирования БД на mysql
# у КАЖДОГО nixos есть свой локальный сервер mysql, см. ниже по файлу
mysql-workbench
# аналог Bizagi Modeler, расширенный вариант bpmn.io
camunda-modeler
# графическое моделирование UML-диаграмм
# также доступно моделирование BPMN и ER
staruml
# Язык текстового описания UML-диаграмм
# актуально для разработчиков ПО (встраивание диаграмм в код)
# поддерживается нашей поставкой IJ IDEA CE
plantuml
archi # поддержка archimate
##### Утилиты и программы для STM32 #####
# 1) STM32CubeIDE упаковать не удалось
# 2) есть основания полагать, что её функциональность лучше встроить
# в IJ IDEA CE, как это сделано в настоящем Clion;
#stm32cubemx.packages.x86_64-linux.stm32cubemx
stm32flash
stlink
stlink-gui
stm32loader
##### СЕТЕВЫЕ УТИЛИТЫ ######
# установлен Cisco Packet Tracer, обернут в firejail чтобы не стучался на Netacad.com
nodePackages.node-red # - лоукод-платформа программирования устройств, в частности интернета вещей
httpie httpie-desktop # - передовой клиент HTTP-запросов
netcat socat # - низкоуровневые простейшие утилиты установления TCP или UDP между компьютерами или с ПЛК
opcua-client-gui # - простой графический клиент OPC UA
###### Другой софт #######
logisim-evolution
unityhub # UnityHub - 3D-моделирование, визуализация, геймдев, AR/VR
(pkgs.stdenv.mkDerivation rec {
pname = "cnc_vmc_sim";
version = "1.0.0-share";
src = builtins.fetchTarball {
url = "http://${serverIP}/linux_cnc_vmc_share.tar.xz";
sha256 = "sha256:1hjkm2wq6dfmddb2van1q8hdvf41bp4snslcbkj0b1myi3zpi1md";
};
installPhase = ''
runHook preInstall
mkdir -p $out/bin
mkdir -p $out/share/applications
mkdir -p $out/share/icons
cp ${src}/icon.png $out/share/icons/${pname}.png
cp ${fhsEnv}/bin/${pname}-fhs $out/bin/${pname}
cp ${desktopItem}/share/applications/*.desktop $out/share/applications
'';
fhsEnv = pkgs.buildFHSEnv {
name = "${pname}-fhs";
targetPkgs = p: with p; [
eudev.out
libGL.out
openal.out
xorg.libX11.out
];
runScript = "${src}/${pname}";
};
desktopItem = pkgs.makeDesktopItem {
name = "CNC VMC (free)";
exec = "${pname}";
desktopName = "CNC VMC (free)";
categories = [ "Development" ];
icon = "${pname}";
terminal = false;
startupNotify = false;
};
})
(pkgs.stdenv.mkDerivation rec {
pname = "ramus";
version = "0.1.3";
src = builtins.fetchTarball {
url = "http://${serverIP}/ramus.tar.xz";
sha256 = "sha256:1a9fha7zwyyag0q4glk58pzigqdczshxpnax7cdzg1bry4aw6f9d";
};
installPhase = ''
sed -e "s~ramus.ico~$out/share/icons/ramus.ico~; s~Other~Database~" -i share/applications/ramus.desktop
mkdir $out
cp -r share bin lib $out
echo "JDK_JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel' ${pkgs.jre8}/bin/java -jar $out/bin/ramus-startup.jar" > $out/bin/ramus
chmod +x $out/bin/ramus
'';
})
# поставка SimInTech. Кодогенерация библиотек для ПК работает,
# но несовместима с .dll из windows!
#simintech.packages.x86_64-linux.simintech
(pkgs.stdenv.mkDerivation rec {
pname = "simintech";
version = "2.23.13";
src = builtins.fetchTarball {
url = "http://kafpi.local/simintech_rus_linux.tgz";
sha256 = "sha256:1i9plx6vx6jm38bx4kbh4piak5jwrpc4hxxjd3b89zyng1g4abvs";
};
dontFixLibtool = true;
fhsEnv = pkgs.buildFHSEnv {
name = "${pname}-fhs-env";
targetPkgs = p: with p; [
at-spi2-atk.out
gdk-pixbuf.out
glamoroustoolkit.out
glib.out
gtk2.out
libGL.out
libGLU.out
pango.out
xorg.libX11.out
zlib.out
(pkgs.writeShellScriptBin "firefox" "exec ${pkgs.chromium}/bin/chromium \"$@\"") # похоже, что SimInTech захардкодил Firefox, но не все так юзают Firefox
];
runScript = "${src}/bin/mmain";
};
desktopItem = pkgs.makeDesktopItem {
name = "SimInTech";
exec = "simintech";
desktopName = "SimInTech";
categories = [ "Development" ];
icon = "simintech";
terminal = false;
startupNotify = false;
mimeTypes = [ "x-scheme-handler/prt" ];
};
installPhase = ''
runHook preInstall
mkdir -p $out/bin
mkdir -p $out/share/applications
mkdir -p $out/share/icons
#cp ${src}/share/icon.svg $out/share/icons/simintech.svg
cp ${fhsEnv}/bin/${pname}-fhs-env $out/bin/simintech
cp ${desktopItem}/share/applications/*.desktop $out/share/applications
runHook postInstall
'';
})
(vscode-with-extensions.override {
vscodeExtensions = with vscode-extensions; [
ms-vscode.cpptools-extension-pack
zainchen.json
ms-dotnettools.csharp
];
})
# POSIX утилиты для совместимости
om4
pax
mailutils
sharutils
flex
bison
universal-ctags
inetutils
uucp
util-linux
cflow
ncompress
];
};
# вставленные флешки автоматически монтируются
services.devmon.enable = true;
# необходимо для совместимости с POSIX по команде at, при отсутствии необходимости можно удалить
services.atd = {
enable = true;
allowEveryone = true;
};
# на каждой машине свой сервер mysql и postgresql
services.mysql = {
enable = true;
package = pkgs.mysql80;
};
services.postgresql = {
enable = true;
authentication = pkgs.lib.mkOverride 10 ''
#type database DBuser auth-method
local all all trust
'';
};
# и оба поддерживают вход без пароля в "руты"
system.userActivationScripts.mycnf = {
text = ''
printf "[client]\nport=3306\nuser=root" > /home/student/.my.cnf
echo "\set user postgres" > /home/student/.psqlrc
'';
deps = [ ];
};
environment = {
etc."gtk-3.0/settings.ini" = {
text = ''
[Settings]
gtk-icon-theme-name = WhiteSur
'';
mode = "0644";
};
variables = {
PGUSER = "postgres";
};
};
imports = [ ./hardware-configuration.nix ];
programs.tmux = {
enable = true;
withUtempter = true;
historyLimit = 5000;
clock24 = true;
};
# если машина установлена на диск с Windows,
# то она позволяет "увидеть" и выбрать Windows в течение 30 с
# иначе - 5 c таймаута (для виртуалок)
boot.loader = if hasBootPartition then {
efi.canTouchEfiVariables = true;
timeout = 30;
grub = {
enable = true;
efiSupport = true;
device = "nodev";
useOSProber = true;
theme = "${pkgs.sleek-grub-theme.override{ withStyle = "orange"; withBanner = "Выберите ОС"; }}";
};
} else {
timeout = 5;
grub = {
enable = true;
device = "/dev/sda";
theme = "${pkgs.sleek-grub-theme.override{ withStyle = "orange"; withBanner = "Загрузчик Linux"; }}";
};
};
time.hardwareClockInLocalTime = hasBootPartition;
# настройки Nix
nixpkgs.config = {
allowUnfree = true;
nvidia.acceptLicense = true;
};
nix.settings = {
substituters = [
"https://cache.nixos.org"
];
trusted-public-keys = ["kafpi.local:PttR9S1eDyint3v0LCp5zfBGG+xfxzQ+cxKAQARNpyw="];
auto-optimise-store = true;
};
nix.extraOptions = ''
experimental-features = nix-command flakes
'';
##### НАСТРОЙКИ ГРАФИКИ И РАБОЧЕГО СТОЛА ######
hardware.graphics = {
enable = true;
#enable32Bit = true;
extraPackages = if isNvidia then with pkgs; [ nvidia-vaapi-driver vaapiVdpau libvdpau-va-gl] else [];
};
services.xserver = {
enable = true;
videoDrivers = if isNvidia then [ "nvidia" ] else [ "modesetting" "fbdev" ];
xkb.layout = "us,ru";
xkb.options = "grp:alt_shift_toggle";
};
hardware.enableAllFirmware = true;
#hardware.nvidia = {
# package = config.boot.kernelPackages.nvidiaPackages.legacy_470;
# modesetting.enable = true;
# powerManagement.enable = true;
# open = false;
# nvidiaSettings = false;
#};
hardware.nvidia = {
package = config.boot.kernelPackages.nvidiaPackages.stable;
modesetting.enable = true;
powerManagement.enable = true;
open = false;
nvidiaSettings = false;
};
boot.kernelParams = if isNvidia then ["nvidia-drm.modeset=1" ] else [];
boot.blacklistedKernelModules = if isNvidia then [ "nouveau" ] else [];
boot.extraModprobeConfig = if isNvidia then "options nvidia " + lib.concatStringsSep " " [
"NVreg_UsePageAttributeTable=1"
"NVreg_EnablePCIeGen3=1"
"NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100"
] else "";
services.displayManager.autoLogin.user = "student";
services.getty.autologinUser = "student";
services.xserver.displayManager.lightdm.enable = true;
services.xserver.displayManager.startx.enable = true;
services.displayManager.defaultSession = "MIREA-WindowsLike+Metacity";
services.xserver.displayManager.session = [
{
manage = "desktop";
name = "MIREA-WindowsLike";
# подробности настроек рабочего стола см. на github.com/gregorybednov/mireadesktop
start = ''
${inputs.mireadesktop.packages.x86_64-linux.tint2} &
${inputs.mireadesktop.packages.x86_64-linux.pcmanfm} &
waitPID=$!
'';
}
{
manage = "window";
name = "Metacity";
start = ''
${pkgs.metacity}/bin/metacity &
waitPID=$!
'';
}
];
##### СЕТЕВЫЕ НАСТРОЙКИ #######
services.yggdrasil = {
enable = true;
persistentKeys = true;
settings = { Peers = [ "tcp://10.0.174.12:12345" ]; };
};
services.avahi = {
enable = false;
hostName = "nixos"
+ builtins.readFile ((pkgs.runCommandLocal "uuid" {} ''
mkdir $out
cat /proc/sys/kernel/random/uuid > $out/uuid
'')+"/uuid");
nssmdns4 = true;
openFirewall = true;
publish = {
enable = true;
hinfo = true;
workstation = true;
domain = true;
addresses = true;
};
};
# каждый компьютер имеет выход в интернет
networking.networkmanager.enable = true;
networking.hostName = "nixos";
# каждый компьютер ресолвит DNS-запросы СТРОГО через наш сервер
networking.nameservers = [ serverIP ];
# каждый компьютер знает, что kafpi.local - это адрес нашего сервера
networking.hosts."${serverIP}" = [ "kafpi.local" "hydra.kafpi.local" ];
#security.pki.certificateFiles = [
# (builtins.fetchurl {
# url = "http://${serverIP}/server.crt";
# sha256 = "sha256:0qx4acdhiciffvk1l7wkxyzapjwjy9zisq0mwyl727x97zrmi5ds";
# })
# (builtins.fetchurl {
# url = "http://${serverIP}/hydra.crt";
# sha256 = "sha256:1l5cvsikb5dnf49ajjjmz50avfkxm28jy65vnb9xidlv5vapi1zp";
# })
#];
#### ЛОКАЛИЗАЦИЯ #####
time.timeZone = "Europe/Moscow";
i18n.defaultLocale = "ru_RU.UTF-8";
console = {
font = "cyr-sun16";
useXkbConfig = true;
};
# установлены шрифты Microsoft (corefonts),
# установлен ГОСТ Тип А (задел на будущее),
# установлены базовые свободные шрифты,
# установлен шрифт Jetbrains Mono
fonts.packages = with pkgs; [
jetbrains-mono
inputs.gostfont.packages.x86_64-linux.gostfont
corefonts
liberation_ttf
];
####### ПРОЧИЕ НАСТРОЙКИ #######
environment.systemPackages = with pkgs; [
vim
tree
wget
git
];
# удаленный доступ в пределах нашей сети
services.openssh = {
enable = true;
settings.PermitRootLogin = "yes";
};
services.gnome.gnome-keyring.enable = true;
programs = {
firejail = {
enable = true;
wrappedBinaries = {
packettracer7 = {
executable = "${packettracer7.packages.x86_64-linux.default}/bin/packettracer7";
extraArgs = [ "--net=none" "--noprofile" ];
};
};
};
java.enable = true;
gnupg.agent = {
enable = true;
enableSSHSupport = true;
};
chromium = {
enable = true;
extraOpts = {
"SyncDisabled" = true;
"PasswordManagerEnabled" = false;
"SpellcheckEnabled" = false;
"homepageLocation" = "https://ya.ru";
};
};
udevil.enable = true; # тоже нужно для флешек
};
# НЕ МЕНЯТЬ, иначе придётся все компы переустанавливать, а не обновлять
system.stateVersion = "24.05";
}