[{"data":1,"prerenderedAt":2193},["ShallowReactive",2],{"\u002Fdocs\u002Fagents\u002Flinux":3},{"id":4,"title":5,"body":6,"description":2185,"extension":2186,"meta":2187,"navigation":2188,"path":2189,"seo":2190,"stem":2191,"__hash__":2192},"docs\u002Fdocs\u002Fagents\u002Flinux.md","Linux Agent",{"type":7,"value":8,"toc":2167},"minimark",[9,13,21,64,73,78,114,164,168,191,235,238,290,293,330,358,389,394,397,538,550,554,557,577,580,635,681,684,810,813,823,861,868,871,902,926,961,964,985,989,994,1063,1069,1448,1471,1474,1486,1683,1700,1704,1827,1836,1854,1881,1885,1907,1936,1939,1970,1982,1986,2078,2082,2091,2149,2163],[10,11,5],"h1",{"id":12},"linux-agent",[14,15,16,20],"p",{},[17,18,19],"code",{},"netignite-agent"," connects a Linux machine to your NetIgnite server. It has two modes:",[22,23,24,36],"ul",{},[25,26,27,31,32,35],"li",{},[28,29,30],"strong",{},"Host mode"," (always on): the dashboard sees whether this machine is online and can ",[28,33,34],{},"shut it\ndown or reboot it",".",[25,37,38,41,42,45,46,49,50,58,59,63],{},[28,39,40],{},"Wake-on-LAN mode"," (optional): the agent also ",[28,43,44],{},"wakes other devices"," in its network,\n",[28,47,48],{},"checks whether they're online"," and ",[28,51,52,53],{},"logs in to them over ",[54,55,57],"a",{"href":56},"\u002Fdocs\u002Fguides\u002Fssh","SSH"," to shut\nthem down or reboot them. That's what the ",[54,60,62],{"href":61},"\u002Fdocs\u002Fagents\u002Fesp32","ESP32 agent"," does, on a machine\nyou already run: a Raspberry Pi, a NAS or a home server.",[14,65,66,67,35],{},"The agent is a single binary that runs as a systemd service under its own unprivileged user. It\ntalks to the server over one outgoing WebSocket; nothing listens on the machine. Source and\nreleases: ",[54,68,72],{"href":69,"rel":70},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-Linux",[71],"nofollow","NetIgnite-project\u002FAgent-Linux",[74,75,77],"h2",{"id":76},"requirements","Requirements",[22,79,80,83,94,105],{},[25,81,82],{},"Linux with systemd, on a 64-bit x86 or ARM CPU.",[25,84,85,86,89,90,93],{},"polkit, for shutdown and reboot (",[17,87,88],{},"apt install polkitd"," on Debian and Ubuntu, ",[17,91,92],{},"dnf install polkit","\non Fedora). Without it, the agent runs, but shutdown and reboot fail.",[25,95,96,97,100,101,104],{},"Wake-on-LAN mode: ",[17,98,99],{},"ping"," (iputils or BusyBox) and ",[17,102,103],{},"ip"," (iproute2).",[25,106,107,49,110,113],{},[17,108,109],{},"curl",[17,111,112],{},"sha256sum"," for the install script.",[115,116,117,130],"table",{},[118,119,120],"thead",{},[121,122,123,127],"tr",{},[124,125,126],"th",{},"Binary",[124,128,129],{},"For",[131,132,133,144,154],"tbody",{},[121,134,135,141],{},[136,137,138],"td",{},[17,139,140],{},"netignite-agent-linux-x64",[136,142,143],{},"x86-64 CPUs with AVX2 (about 2013 and newer)",[121,145,146,151],{},[136,147,148],{},[17,149,150],{},"netignite-agent-linux-x64-baseline",[136,152,153],{},"Any x86-64 CPU",[121,155,156,161],{},[136,157,158],{},[17,159,160],{},"netignite-agent-linux-arm64",[136,162,163],{},"64-bit ARM, for example a Raspberry Pi 3, 4 or 5 with a 64-bit OS",[74,165,167],{"id":166},"install","Install",[169,170,171,182,188],"ol",{},[25,172,173,174,177,178,181],{},"In the dashboard, create an agent of the kind ",[28,175,176],{},"Linux agent"," (",[28,179,180],{},"Agents → Add agent",").",[25,183,184,185,35],{},"On its page, click ",[28,186,187],{},"Create setup command",[25,189,190],{},"Run the command on the Linux machine within 15 minutes:",[192,193,199],"pre",{"className":194,"code":195,"filename":196,"language":197,"meta":198,"style":198},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -fsSL https:\u002F\u002Fnetignite.example.com\u002Finstall\u002Flinux.sh | sudo sh -s -- netignite_enroll_…\n","Terminal","bash","",[17,200,201],{"__ignoreMap":198},[202,203,206,209,213,216,220,223,226,229,232],"span",{"class":204,"line":205},"line",1,[202,207,109],{"class":208},"sBMFI",[202,210,212],{"class":211},"sfazB"," -fsSL",[202,214,215],{"class":211}," https:\u002F\u002Fnetignite.example.com\u002Finstall\u002Flinux.sh",[202,217,219],{"class":218},"sMK4o"," |",[202,221,222],{"class":208}," sudo",[202,224,225],{"class":211}," sh",[202,227,228],{"class":211}," -s",[202,230,231],{"class":211}," --",[202,233,234],{"class":211}," netignite_enroll_…\n",[14,236,237],{},"The script, served by your NetIgnite server:",[169,239,240,249,263,276,283],{},[25,241,242,243,245,246,248],{},"checks that it runs on Linux as root with ",[17,244,109],{},", ",[17,247,112],{}," and systemd,",[25,250,251,252,245,255,258,259,262],{},"picks the binary for the CPU: ",[17,253,254],{},"arm64",[17,256,257],{},"x64"," if the CPU has AVX2, ",[17,260,261],{},"x64-baseline"," otherwise,",[25,264,265,266,269,270,275],{},"downloads it and ",[17,267,268],{},"SHA256SUMS"," from the\n",[54,271,274],{"href":272,"rel":273},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-Linux\u002Freleases",[71],"GitHub releases"," and checks the\nchecksum,",[25,277,278,282],{},[54,279,281],{"href":280},"#pair","pairs"," the agent with the server using the token,",[25,284,285,289],{},[54,286,288],{"href":287},"#the-systemd-service","installs"," the systemd service and starts it.",[14,291,292],{},"The agent shows up as online on its page. Then:",[22,294,295,315],{},[25,296,297,298,301,302,305,306,308,309,49,312,35],{},"To control ",[28,299,300],{},"this machine",", open (or add) the device for it, choose the agent under\n",[28,303,304],{},"Linux agent on the device",", and choose the status check ",[28,307,304],{},". The\ndevice gets ",[28,310,311],{},"Shut down",[28,313,314],{},"Reboot",[25,316,317,318,321,322,325,326,329],{},"To ",[28,319,320],{},"wake other devices",", turn on ",[54,323,40],{"href":324},"#wake-on-lan-mode"," and choose the agent as\nthe ",[28,327,328],{},"Agent"," of those devices.",[14,331,332,333,336,337,340,341,345,346,349,350,353,354,357],{},"By default, the script installs the newest stable release (a pre-release only while there is no\nstable one). The server's admin can pin a release with ",[17,334,335],{},"NETIGNITE_LINUX_AGENT_VERSION"," or use\nanother repository with ",[17,338,339],{},"NETIGNITE_LINUX_AGENT_REPO"," (see\n",[54,342,344],{"href":343},"\u002Fdocs\u002Fserver\u002Fconfiguration#linux-agent-installer","Configuration",").\nOn the machine, the variables ",[17,347,348],{},"NETIGNITE_AGENT_VERSION"," (a release tag) and\n",[17,351,352],{},"NETIGNITE_AGENT_BASE_URL"," (a mirror with the release files) override that; pass them through\n",[17,355,356],{},"sudo env",":",[192,359,361],{"className":194,"code":360,"filename":196,"language":197,"meta":198,"style":198},"curl -fsSL https:\u002F\u002Fnetignite.example.com\u002Finstall\u002Flinux.sh | sudo env NETIGNITE_AGENT_VERSION=v1.0.0 sh -s -- netignite_enroll_…\n",[17,362,363],{"__ignoreMap":198},[202,364,365,367,369,371,373,375,378,381,383,385,387],{"class":204,"line":205},[202,366,109],{"class":208},[202,368,212],{"class":211},[202,370,215],{"class":211},[202,372,219],{"class":218},[202,374,222],{"class":208},[202,376,377],{"class":211}," env",[202,379,380],{"class":211}," NETIGNITE_AGENT_VERSION=v1.0.0",[202,382,225],{"class":211},[202,384,228],{"class":211},[202,386,231],{"class":211},[202,388,234],{"class":211},[390,391,393],"h3",{"id":392},"manual-install","Manual install",[14,395,396],{},"Without the script, or if the machine reaches the server under another address than the\ndashboard's:",[192,398,400],{"className":194,"code":399,"filename":196,"language":197,"meta":198,"style":198},"arch=x64   # or x64-baseline, arm64\nbase=https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-Linux\u002Freleases\u002Flatest\u002Fdownload\ncurl -fsSLO \"$base\u002Fnetignite-agent-linux-$arch\"\ncurl -fsSLO \"$base\u002FSHA256SUMS\"\nsha256sum --check --ignore-missing SHA256SUMS\nchmod +x \"netignite-agent-linux-$arch\"\n\nsudo .\u002Fnetignite-agent-linux-$arch pair https:\u002F\u002Fnetignite.example.com netignite_enroll_…\nsudo .\u002Fnetignite-agent-linux-$arch install\n",[17,401,402,417,428,451,467,481,499,506,526],{"__ignoreMap":198},[202,403,404,408,411,413],{"class":204,"line":205},[202,405,407],{"class":406},"sTEyZ","arch",[202,409,410],{"class":218},"=",[202,412,257],{"class":211},[202,414,416],{"class":415},"sHwdD","   # or x64-baseline, arm64\n",[202,418,420,423,425],{"class":204,"line":419},2,[202,421,422],{"class":406},"base",[202,424,410],{"class":218},[202,426,427],{"class":211},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-Linux\u002Freleases\u002Flatest\u002Fdownload\n",[202,429,431,433,436,439,442,445,448],{"class":204,"line":430},3,[202,432,109],{"class":208},[202,434,435],{"class":211}," -fsSLO",[202,437,438],{"class":218}," \"",[202,440,441],{"class":406},"$base",[202,443,444],{"class":211},"\u002Fnetignite-agent-linux-",[202,446,447],{"class":406},"$arch",[202,449,450],{"class":218},"\"\n",[202,452,454,456,458,460,462,465],{"class":204,"line":453},4,[202,455,109],{"class":208},[202,457,435],{"class":211},[202,459,438],{"class":218},[202,461,441],{"class":406},[202,463,464],{"class":211},"\u002FSHA256SUMS",[202,466,450],{"class":218},[202,468,470,472,475,478],{"class":204,"line":469},5,[202,471,112],{"class":208},[202,473,474],{"class":211}," --check",[202,476,477],{"class":211}," --ignore-missing",[202,479,480],{"class":211}," SHA256SUMS\n",[202,482,484,487,490,492,495,497],{"class":204,"line":483},6,[202,485,486],{"class":208},"chmod",[202,488,489],{"class":211}," +x",[202,491,438],{"class":218},[202,493,494],{"class":211},"netignite-agent-linux-",[202,496,447],{"class":406},[202,498,450],{"class":218},[202,500,502],{"class":204,"line":501},7,[202,503,505],{"emptyLinePlaceholder":504},true,"\n",[202,507,509,512,515,518,521,524],{"class":204,"line":508},8,[202,510,511],{"class":208},"sudo",[202,513,514],{"class":211}," .\u002Fnetignite-agent-linux-",[202,516,517],{"class":406},"$arch ",[202,519,520],{"class":211},"pair",[202,522,523],{"class":211}," https:\u002F\u002Fnetignite.example.com",[202,525,234],{"class":211},[202,527,529,531,533,535],{"class":204,"line":528},9,[202,530,511],{"class":208},[202,532,514],{"class":211},[202,534,517],{"class":406},[202,536,537],{"class":211},"install\n",[14,539,540,543,544,546,547,35],{},[17,541,542],{},"releases\u002Flatest"," skips pre-releases. ",[17,545,166],{}," copies the binary to\n",[17,548,549],{},"\u002Fusr\u002Flocal\u002Fbin\u002Fnetignite-agent",[390,551,553],{"id":552},"updating","Updating",[14,555,556],{},"Run the install script again without a token. It downloads the current release and reinstalls the\nservice with the existing pairing:",[192,558,560],{"className":194,"code":559,"filename":196,"language":197,"meta":198,"style":198},"curl -fsSL https:\u002F\u002Fnetignite.example.com\u002Finstall\u002Flinux.sh | sudo sh\n",[17,561,562],{"__ignoreMap":198},[202,563,564,566,568,570,572,574],{"class":204,"line":205},[202,565,109],{"class":208},[202,567,212],{"class":211},[202,569,215],{"class":211},[202,571,219],{"class":218},[202,573,222],{"class":208},[202,575,576],{"class":211}," sh\n",[74,578,579],{"id":520},"Pair",[192,581,583],{"className":194,"code":582,"filename":196,"language":197,"meta":198,"style":198},"sudo netignite-agent pair \u003Cserver-url> \u003Cenrollment-token> [--wol] [--config \u003Cpath>]\n",[17,584,585],{"__ignoreMap":198},[202,586,587,589,592,595,598,601,604,607,609,612,615,617,620,623,626,629,632],{"class":204,"line":205},[202,588,511],{"class":208},[202,590,591],{"class":211}," netignite-agent",[202,593,594],{"class":211}," pair",[202,596,597],{"class":218}," \u003C",[202,599,600],{"class":211},"server-ur",[202,602,603],{"class":406},"l",[202,605,606],{"class":218},">",[202,608,597],{"class":218},[202,610,611],{"class":211},"enrollment-toke",[202,613,614],{"class":406},"n",[202,616,606],{"class":218},[202,618,619],{"class":406}," [--wol] ",[202,621,622],{"class":218},"[",[202,624,625],{"class":406},"--config ",[202,627,628],{"class":218},"\u003C",[202,630,631],{"class":406},"path",[202,633,634],{"class":218},">]\n",[22,636,637,652,669,672,675],{},[25,638,639,640,643,644,647,648,651],{},"The agent generates its own secret (32 random bytes), sends it with the token to\n",[17,641,642],{},"POST \u003Cserver>\u002Fapi\u002Fv1\u002Fagents\u002Fenroll"," and writes the result to ",[17,645,646],{},"\u002Fetc\u002Fnetignite\u002Fagent.json","\n(mode ",[17,649,650],{},"0600","). Neither the secret nor the token is printed.",[25,653,654,657,658,661,662,665,666,35],{},[17,655,656],{},"\u003Cserver-url>"," is the server's address, for example ",[17,659,660],{},"https:\u002F\u002Fnetignite.example.com"," or\n",[17,663,664],{},"http:\u002F\u002F192.168.1.10:18232",". A missing scheme means ",[17,667,668],{},"https:\u002F\u002F",[25,670,671],{},"Pairing again with a new token replaces the credential. The server disconnects the old one, and\nan installed service is restarted with the new one.",[25,673,674],{},"A token of an ESP32 agent is refused and stays valid for that ESP32. Create a Linux agent for this\nmachine instead.",[25,676,677,680],{},[17,678,679],{},"--wol"," turns on Wake-on-LAN mode. Without it, pairing again keeps the previous mode.",[14,682,683],{},"The config file looks like this:",[192,685,690],{"className":686,"code":687,"filename":688,"language":689,"meta":198,"style":198},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n    \"server\": \"https:\u002F\u002Fnetignite.example.com\",\n    \"agent_id\": 3,\n    \"token_id\": \"…\",\n    \"secret\": \"…\",\n    \"wol\": { \"enabled\": false }\n}\n","agent.json","json",[17,691,692,697,720,737,757,776,805],{"__ignoreMap":198},[202,693,694],{"class":204,"line":205},[202,695,696],{"class":218},"{\n",[202,698,699,702,706,709,711,713,715,717],{"class":204,"line":419},[202,700,701],{"class":218},"    \"",[202,703,705],{"class":704},"spNyl","server",[202,707,708],{"class":218},"\"",[202,710,357],{"class":218},[202,712,438],{"class":218},[202,714,660],{"class":211},[202,716,708],{"class":218},[202,718,719],{"class":218},",\n",[202,721,722,724,727,729,731,735],{"class":204,"line":430},[202,723,701],{"class":218},[202,725,726],{"class":704},"agent_id",[202,728,708],{"class":218},[202,730,357],{"class":218},[202,732,734],{"class":733},"sbssI"," 3",[202,736,719],{"class":218},[202,738,739,741,744,746,748,750,753,755],{"class":204,"line":453},[202,740,701],{"class":218},[202,742,743],{"class":704},"token_id",[202,745,708],{"class":218},[202,747,357],{"class":218},[202,749,438],{"class":218},[202,751,752],{"class":211},"…",[202,754,708],{"class":218},[202,756,719],{"class":218},[202,758,759,761,764,766,768,770,772,774],{"class":204,"line":469},[202,760,701],{"class":218},[202,762,763],{"class":704},"secret",[202,765,708],{"class":218},[202,767,357],{"class":218},[202,769,438],{"class":218},[202,771,752],{"class":211},[202,773,708],{"class":218},[202,775,719],{"class":218},[202,777,778,780,783,785,787,790,792,795,797,799,802],{"class":204,"line":483},[202,779,701],{"class":218},[202,781,782],{"class":704},"wol",[202,784,708],{"class":218},[202,786,357],{"class":218},[202,788,789],{"class":218}," {",[202,791,438],{"class":218},[202,793,794],{"class":208},"enabled",[202,796,708],{"class":218},[202,798,357],{"class":218},[202,800,801],{"class":218}," false",[202,803,804],{"class":218}," }\n",[202,806,807],{"class":204,"line":501},[202,808,809],{"class":218},"}\n",[74,811,30],{"id":812},"host-mode",[14,814,815,816,49,819,822],{},"In host mode, the agent announces the capabilities ",[17,817,818],{},"host.status",[17,820,821],{},"host.control",". The server can\nthen:",[22,824,825,832],{},[25,826,827,828,831],{},"show the machine as online while the agent is connected (status check\n",[829,830,304],"em",{},"),",[25,833,834,835,838,839,842,843,846,847,850,851,854,855,661,858,35],{},"send ",[17,836,837],{},"HOST_CONTROL"," with ",[17,840,841],{},"shutdown"," or ",[17,844,845],{},"reboot",". The agent first asks systemd-logind whether it\nmay (",[17,848,849],{},"CanPowerOff","\u002F",[17,852,853],{},"CanReboot","); if not (polkit rule missing, or a block inhibitor such as a\nrunning package upgrade), it answers with the reason, which the dashboard shows. Otherwise it\nanswers, waits about a second and runs ",[17,856,857],{},"systemctl --no-ask-password poweroff",[17,859,860],{},"systemctl --no-ask-password reboot",[14,862,863,864,867],{},"Nothing else: the server can't run commands, read files or change the configuration. If\n",[17,865,866],{},"systemctl"," still fails after the answer, the error is in the agent's journal.",[74,869,40],{"id":870},"wake-on-lan-mode",[192,872,874],{"className":194,"code":873,"filename":196,"language":197,"meta":198,"style":198},"sudo netignite-agent wol-mode on     # or: pair --wol\nsudo netignite-agent wol-mode off\n",[17,875,876,891],{"__ignoreMap":198},[202,877,878,880,882,885,888],{"class":204,"line":205},[202,879,511],{"class":208},[202,881,591],{"class":211},[202,883,884],{"class":211}," wol-mode",[202,886,887],{"class":211}," on",[202,889,890],{"class":415},"     # or: pair --wol\n",[202,892,893,895,897,899],{"class":204,"line":419},[202,894,511],{"class":208},[202,896,591],{"class":211},[202,898,884],{"class":211},[202,900,901],{"class":211}," off\n",[14,903,904,907,908,245,911,245,914,245,917,245,920,49,923,357],{},[17,905,906],{},"wol-mode"," updates the config and the installed service, and restarts it. In this mode, the agent\nalso announces ",[17,909,910],{},"wake",[17,912,913],{},"status.link_local",[17,915,916],{},"status.ip",[17,918,919],{},"status.host",[17,921,922],{},"status.tcp",[17,924,925],{},"ssh",[22,927,928,938,952],{},[25,929,930,933,934,937],{},[28,931,932],{},"Wake:"," a magic packet over UDP to ",[17,935,936],{},"255.255.255.255"," and each network interface's broadcast\naddress, three times, 100 ms apart.",[25,939,940,943,944,947,948,951],{},[28,941,942],{},"Status:"," the device is online if it answers a ping (",[17,945,946],{},"ping -c 1 -W 1",") or the TCP port (a\nrefused connection counts too). For the MAC check, the agent first looks at the neighbor table\n(",[17,949,950],{},"ip neigh","): a reachable entry for the MAC address counts as online. Otherwise it pings the\nIPv6 link-local address derived from the MAC address and the addresses the neighbor table knows\nfor it. Every check answers within 4.5 seconds.",[25,953,954,957,958,35],{},[28,955,956],{},"SSH:"," logins to devices in the network for ",[54,959,960],{"href":56},"shutdown and reboot over SSH",[14,962,963],{},"To test Wake-on-LAN from the machine itself:",[192,965,967],{"className":194,"code":966,"filename":196,"language":197,"meta":198,"style":198},"netignite-agent wol AA:BB:CC:DD:EE:FF --port 9\n",[17,968,969],{"__ignoreMap":198},[202,970,971,973,976,979,982],{"class":204,"line":205},[202,972,19],{"class":208},[202,974,975],{"class":211}," wol",[202,977,978],{"class":211}," AA:BB:CC:DD:EE:FF",[202,980,981],{"class":211}," --port",[202,983,984],{"class":733}," 9\n",[74,986,988],{"id":987},"the-systemd-service","The systemd service",[14,990,991,993],{},[17,992,166],{}," needs root and a paired config. It:",[22,995,996,1003,1009,1030,1036,1051],{},[25,997,998,999,1002],{},"creates the system user ",[17,1000,1001],{},"netignite"," (no home directory, no login shell),",[25,1004,1005,1006,1008],{},"copies the binary to ",[17,1007,549],{},",",[25,1010,1011,1012,1015,1016,1019,1020,245,1023,1015,1025,1027,1028,1008],{},"makes the config readable for the service: ",[17,1013,1014],{},"\u002Fetc\u002Fnetignite"," owned by ",[17,1017,1018],{},"root:netignite"," with mode\n",[17,1021,1022],{},"0750",[17,1024,688],{},[17,1026,1001],{}," with mode ",[17,1029,650],{},[25,1031,1032,1033,1008],{},"writes ",[17,1034,1035],{},"\u002Fetc\u002Fsystemd\u002Fsystem\u002Fnetignite-agent.service",[25,1037,1038,1039,1042,1043,1046,1047,1050],{},"writes the polkit rule ",[17,1040,1041],{},"\u002Fetc\u002Fpolkit-1\u002Frules.d\u002F50-netignite-agent.rules"," (plus a ",[17,1044,1045],{},".pkla"," file in\n",[17,1048,1049],{},"\u002Fetc\u002Fpolkit-1\u002Flocalauthority\u002F50-local.d\u002F"," on polkit older than 0.106, for example Debian 11),",[25,1052,1053,1054,245,1057,49,1060,35],{},"runs ",[17,1055,1056],{},"systemctl daemon-reload",[17,1058,1059],{},"enable",[17,1061,1062],{},"restart",[14,1064,1065,1068],{},[17,1066,1067],{},"sudo netignite-agent install --dry-run"," prints every step and the files' contents without changing\nanything. The unit for host mode (comments left out):",[192,1070,1075],{"className":1071,"code":1072,"filename":1073,"language":1074,"meta":198,"style":198},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=NetIgnite Agent\nDocumentation=https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-Linux\nWants=network-online.target\nAfter=network-online.target\n\n[Service]\nType=simple\nUser=netignite\nGroup=netignite\nExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Fnetignite-agent run --config \u002Fetc\u002Fnetignite\u002Fagent.json\nRestart=always\nRestartSec=5\nRestartPreventExitStatus=78\nTimeoutStopSec=10\n\nNoNewPrivileges=yes\nProtectSystem=strict\nProtectHome=yes\nPrivateTmp=yes\nPrivateDevices=yes\nReadOnlyPaths=\u002Fetc\u002Fnetignite\nProtectKernelTunables=yes\nProtectKernelModules=yes\nProtectKernelLogs=yes\nProtectControlGroups=yes\nProtectClock=yes\nProtectHostname=yes\nRestrictNamespaces=yes\nRestrictRealtime=yes\nRestrictSUIDSGID=yes\nLockPersonality=yes\nSystemCallArchitectures=native\nUMask=0077\nRestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK\nCapabilityBoundingSet=\n\n[Install]\nWantedBy=multi-user.target\n","netignite-agent.service","ini",[17,1076,1077,1082,1093,1103,1113,1122,1126,1131,1141,1151,1161,1172,1183,1194,1205,1216,1221,1232,1243,1253,1263,1273,1284,1294,1304,1314,1324,1334,1344,1354,1364,1374,1384,1395,1406,1417,1426,1431,1437],{"__ignoreMap":198},[202,1078,1079],{"class":204,"line":205},[202,1080,1081],{"class":218},"[Unit]\n",[202,1083,1084,1088,1090],{"class":204,"line":419},[202,1085,1087],{"class":1086},"swJcz","Description",[202,1089,410],{"class":218},[202,1091,1092],{"class":406},"NetIgnite Agent\n",[202,1094,1095,1098,1100],{"class":204,"line":430},[202,1096,1097],{"class":1086},"Documentation",[202,1099,410],{"class":218},[202,1101,1102],{"class":406},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-Linux\n",[202,1104,1105,1108,1110],{"class":204,"line":453},[202,1106,1107],{"class":1086},"Wants",[202,1109,410],{"class":218},[202,1111,1112],{"class":406},"network-online.target\n",[202,1114,1115,1118,1120],{"class":204,"line":469},[202,1116,1117],{"class":1086},"After",[202,1119,410],{"class":218},[202,1121,1112],{"class":406},[202,1123,1124],{"class":204,"line":483},[202,1125,505],{"emptyLinePlaceholder":504},[202,1127,1128],{"class":204,"line":501},[202,1129,1130],{"class":218},"[Service]\n",[202,1132,1133,1136,1138],{"class":204,"line":508},[202,1134,1135],{"class":1086},"Type",[202,1137,410],{"class":218},[202,1139,1140],{"class":406},"simple\n",[202,1142,1143,1146,1148],{"class":204,"line":528},[202,1144,1145],{"class":1086},"User",[202,1147,410],{"class":218},[202,1149,1150],{"class":406},"netignite\n",[202,1152,1154,1157,1159],{"class":204,"line":1153},10,[202,1155,1156],{"class":1086},"Group",[202,1158,410],{"class":218},[202,1160,1150],{"class":406},[202,1162,1164,1167,1169],{"class":204,"line":1163},11,[202,1165,1166],{"class":1086},"ExecStart",[202,1168,410],{"class":218},[202,1170,1171],{"class":406},"\u002Fusr\u002Flocal\u002Fbin\u002Fnetignite-agent run --config \u002Fetc\u002Fnetignite\u002Fagent.json\n",[202,1173,1175,1178,1180],{"class":204,"line":1174},12,[202,1176,1177],{"class":1086},"Restart",[202,1179,410],{"class":218},[202,1181,1182],{"class":406},"always\n",[202,1184,1186,1189,1191],{"class":204,"line":1185},13,[202,1187,1188],{"class":1086},"RestartSec",[202,1190,410],{"class":218},[202,1192,1193],{"class":406},"5\n",[202,1195,1197,1200,1202],{"class":204,"line":1196},14,[202,1198,1199],{"class":1086},"RestartPreventExitStatus",[202,1201,410],{"class":218},[202,1203,1204],{"class":406},"78\n",[202,1206,1208,1211,1213],{"class":204,"line":1207},15,[202,1209,1210],{"class":1086},"TimeoutStopSec",[202,1212,410],{"class":218},[202,1214,1215],{"class":406},"10\n",[202,1217,1219],{"class":204,"line":1218},16,[202,1220,505],{"emptyLinePlaceholder":504},[202,1222,1224,1227,1229],{"class":204,"line":1223},17,[202,1225,1226],{"class":1086},"NoNewPrivileges",[202,1228,410],{"class":218},[202,1230,1231],{"class":406},"yes\n",[202,1233,1235,1238,1240],{"class":204,"line":1234},18,[202,1236,1237],{"class":1086},"ProtectSystem",[202,1239,410],{"class":218},[202,1241,1242],{"class":406},"strict\n",[202,1244,1246,1249,1251],{"class":204,"line":1245},19,[202,1247,1248],{"class":1086},"ProtectHome",[202,1250,410],{"class":218},[202,1252,1231],{"class":406},[202,1254,1256,1259,1261],{"class":204,"line":1255},20,[202,1257,1258],{"class":1086},"PrivateTmp",[202,1260,410],{"class":218},[202,1262,1231],{"class":406},[202,1264,1266,1269,1271],{"class":204,"line":1265},21,[202,1267,1268],{"class":1086},"PrivateDevices",[202,1270,410],{"class":218},[202,1272,1231],{"class":406},[202,1274,1276,1279,1281],{"class":204,"line":1275},22,[202,1277,1278],{"class":1086},"ReadOnlyPaths",[202,1280,410],{"class":218},[202,1282,1283],{"class":406},"\u002Fetc\u002Fnetignite\n",[202,1285,1287,1290,1292],{"class":204,"line":1286},23,[202,1288,1289],{"class":1086},"ProtectKernelTunables",[202,1291,410],{"class":218},[202,1293,1231],{"class":406},[202,1295,1297,1300,1302],{"class":204,"line":1296},24,[202,1298,1299],{"class":1086},"ProtectKernelModules",[202,1301,410],{"class":218},[202,1303,1231],{"class":406},[202,1305,1307,1310,1312],{"class":204,"line":1306},25,[202,1308,1309],{"class":1086},"ProtectKernelLogs",[202,1311,410],{"class":218},[202,1313,1231],{"class":406},[202,1315,1317,1320,1322],{"class":204,"line":1316},26,[202,1318,1319],{"class":1086},"ProtectControlGroups",[202,1321,410],{"class":218},[202,1323,1231],{"class":406},[202,1325,1327,1330,1332],{"class":204,"line":1326},27,[202,1328,1329],{"class":1086},"ProtectClock",[202,1331,410],{"class":218},[202,1333,1231],{"class":406},[202,1335,1337,1340,1342],{"class":204,"line":1336},28,[202,1338,1339],{"class":1086},"ProtectHostname",[202,1341,410],{"class":218},[202,1343,1231],{"class":406},[202,1345,1347,1350,1352],{"class":204,"line":1346},29,[202,1348,1349],{"class":1086},"RestrictNamespaces",[202,1351,410],{"class":218},[202,1353,1231],{"class":406},[202,1355,1357,1360,1362],{"class":204,"line":1356},30,[202,1358,1359],{"class":1086},"RestrictRealtime",[202,1361,410],{"class":218},[202,1363,1231],{"class":406},[202,1365,1367,1370,1372],{"class":204,"line":1366},31,[202,1368,1369],{"class":1086},"RestrictSUIDSGID",[202,1371,410],{"class":218},[202,1373,1231],{"class":406},[202,1375,1377,1380,1382],{"class":204,"line":1376},32,[202,1378,1379],{"class":1086},"LockPersonality",[202,1381,410],{"class":218},[202,1383,1231],{"class":406},[202,1385,1387,1390,1392],{"class":204,"line":1386},33,[202,1388,1389],{"class":1086},"SystemCallArchitectures",[202,1391,410],{"class":218},[202,1393,1394],{"class":406},"native\n",[202,1396,1398,1401,1403],{"class":204,"line":1397},34,[202,1399,1400],{"class":1086},"UMask",[202,1402,410],{"class":218},[202,1404,1405],{"class":406},"0077\n",[202,1407,1409,1412,1414],{"class":204,"line":1408},35,[202,1410,1411],{"class":1086},"RestrictAddressFamilies",[202,1413,410],{"class":218},[202,1415,1416],{"class":406},"AF_UNIX AF_INET AF_INET6 AF_NETLINK\n",[202,1418,1420,1423],{"class":204,"line":1419},36,[202,1421,1422],{"class":1086},"CapabilityBoundingSet",[202,1424,1425],{"class":218},"=\n",[202,1427,1429],{"class":204,"line":1428},37,[202,1430,505],{"emptyLinePlaceholder":504},[202,1432,1434],{"class":204,"line":1433},38,[202,1435,1436],{"class":218},"[Install]\n",[202,1438,1440,1443,1445],{"class":204,"line":1439},39,[202,1441,1442],{"class":1086},"WantedBy",[202,1444,410],{"class":218},[202,1446,1447],{"class":406},"multi-user.target\n",[14,1449,1450,1451,1454,1455,1458,1459,1461,1462,1465,1466,49,1468,1470],{},"In Wake-on-LAN mode, the last line is replaced by ",[17,1452,1453],{},"CapabilityBoundingSet=CAP_NET_RAW"," and\n",[17,1456,1457],{},"AmbientCapabilities=CAP_NET_RAW",", which ",[17,1460,99],{}," needs. Use ",[17,1463,1464],{},"systemctl edit netignite-agent"," for local\nchanges; ",[17,1467,166],{},[17,1469,906],{}," overwrite the unit file.",[390,1472,1473],{"id":1473},"polkit",[14,1475,1476,1477,1479,1480,49,1483,357],{},"The rule lets the user ",[17,1478,1001],{},", and nobody else, use exactly the logind actions behind\n",[17,1481,1482],{},"systemctl poweroff",[17,1484,1485],{},"systemctl reboot",[192,1487,1492],{"className":1488,"code":1489,"filename":1490,"language":1491,"meta":198,"style":198},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","polkit.addRule(function (action, subject) {\n    var allowed = [\n        \"org.freedesktop.login1.power-off\",\n        \"org.freedesktop.login1.power-off-multiple-sessions\",\n        \"org.freedesktop.login1.reboot\",\n        \"org.freedesktop.login1.reboot-multiple-sessions\"\n    ];\n    if (subject.user == \"netignite\" && allowed.indexOf(action.id) >= 0) {\n        return polkit.Result.YES;\n    }\n});\n","polkit rule","js",[17,1493,1494,1527,1541,1553,1564,1575,1584,1592,1649,1669,1674],{"__ignoreMap":198},[202,1495,1496,1498,1500,1504,1507,1510,1512,1516,1518,1521,1524],{"class":204,"line":205},[202,1497,1473],{"class":406},[202,1499,35],{"class":218},[202,1501,1503],{"class":1502},"s2Zo4","addRule",[202,1505,1506],{"class":406},"(",[202,1508,1509],{"class":704},"function",[202,1511,177],{"class":218},[202,1513,1515],{"class":1514},"sHdIc","action",[202,1517,1008],{"class":218},[202,1519,1520],{"class":1514}," subject",[202,1522,1523],{"class":218},")",[202,1525,1526],{"class":218}," {\n",[202,1528,1529,1532,1535,1538],{"class":204,"line":419},[202,1530,1531],{"class":704},"    var",[202,1533,1534],{"class":406}," allowed",[202,1536,1537],{"class":218}," =",[202,1539,1540],{"class":1086}," [\n",[202,1542,1543,1546,1549,1551],{"class":204,"line":430},[202,1544,1545],{"class":218},"        \"",[202,1547,1548],{"class":211},"org.freedesktop.login1.power-off",[202,1550,708],{"class":218},[202,1552,719],{"class":218},[202,1554,1555,1557,1560,1562],{"class":204,"line":453},[202,1556,1545],{"class":218},[202,1558,1559],{"class":211},"org.freedesktop.login1.power-off-multiple-sessions",[202,1561,708],{"class":218},[202,1563,719],{"class":218},[202,1565,1566,1568,1571,1573],{"class":204,"line":469},[202,1567,1545],{"class":218},[202,1569,1570],{"class":211},"org.freedesktop.login1.reboot",[202,1572,708],{"class":218},[202,1574,719],{"class":218},[202,1576,1577,1579,1582],{"class":204,"line":483},[202,1578,1545],{"class":218},[202,1580,1581],{"class":211},"org.freedesktop.login1.reboot-multiple-sessions",[202,1583,450],{"class":218},[202,1585,1586,1589],{"class":204,"line":501},[202,1587,1588],{"class":1086},"    ]",[202,1590,1591],{"class":218},";\n",[202,1593,1594,1598,1600,1603,1605,1608,1611,1613,1615,1617,1620,1622,1624,1627,1629,1631,1633,1636,1639,1642,1645,1647],{"class":204,"line":508},[202,1595,1597],{"class":1596},"s7zQu","    if",[202,1599,177],{"class":1086},[202,1601,1602],{"class":406},"subject",[202,1604,35],{"class":218},[202,1606,1607],{"class":406},"user",[202,1609,1610],{"class":218}," ==",[202,1612,438],{"class":218},[202,1614,1001],{"class":211},[202,1616,708],{"class":218},[202,1618,1619],{"class":218}," &&",[202,1621,1534],{"class":406},[202,1623,35],{"class":218},[202,1625,1626],{"class":1502},"indexOf",[202,1628,1506],{"class":1086},[202,1630,1515],{"class":406},[202,1632,35],{"class":218},[202,1634,1635],{"class":406},"id",[202,1637,1638],{"class":1086},") ",[202,1640,1641],{"class":218},">=",[202,1643,1644],{"class":733}," 0",[202,1646,1638],{"class":1086},[202,1648,696],{"class":218},[202,1650,1651,1654,1657,1659,1662,1664,1667],{"class":204,"line":528},[202,1652,1653],{"class":1596},"        return",[202,1655,1656],{"class":406}," polkit",[202,1658,35],{"class":218},[202,1660,1661],{"class":406},"Result",[202,1663,35],{"class":218},[202,1665,1666],{"class":406},"YES",[202,1668,1591],{"class":218},[202,1670,1671],{"class":204,"line":1153},[202,1672,1673],{"class":218},"    }\n",[202,1675,1676,1679,1681],{"class":204,"line":1163},[202,1677,1678],{"class":218},"}",[202,1680,1523],{"class":406},[202,1682,1591],{"class":218},[14,1684,1685,1686,1689,1690,1693,1694,1696,1697,1699],{},"The ",[17,1687,1688],{},"*-multiple-sessions"," actions apply when other users are logged in, for example over SSH. The\n",[17,1691,1692],{},"*-ignore-inhibit"," actions aren't granted, so a block inhibitor (a running package upgrade, for\nexample) still stops a remote shutdown. ",[17,1695,866],{}," asks logind over D-Bus, and logind asks polkit;\nno setuid helper is involved, so ",[17,1698,1226],{}," doesn't get in the way.",[74,1701,1703],{"id":1702},"commands","Commands",[115,1705,1706,1716],{},[118,1707,1708],{},[121,1709,1710,1713],{},[124,1711,1712],{},"Command",[124,1714,1715],{},"What it does",[131,1717,1718,1733,1747,1764,1778,1788,1800,1817],{},[121,1719,1720,1725],{},[136,1721,1722],{},[17,1723,1724],{},"pair \u003Cserver-url> \u003Ctoken>",[136,1726,1727,1728,245,1730,181],{},"Registers with the server and writes the config (",[17,1729,679],{},[17,1731,1732],{},"--config",[121,1734,1735,1739],{},[136,1736,1737],{},[17,1738,166],{},[136,1740,1741,1742,245,1744,181],{},"Sets up and starts the systemd service (",[17,1743,1732],{},[17,1745,1746],{},"--dry-run",[121,1748,1749,1754],{},[136,1750,1751],{},[17,1752,1753],{},"uninstall",[136,1755,1756,1757,245,1760,245,1762,181],{},"Removes the service (",[17,1758,1759],{},"--purge",[17,1761,1732],{},[17,1763,1746],{},[121,1765,1766,1771],{},[136,1767,1768],{},[17,1769,1770],{},"run",[136,1772,1773,1774,245,1776,181],{},"Runs the agent in the foreground; this is what the service runs (",[17,1775,679],{},[17,1777,1732],{},[121,1779,1780,1785],{},[136,1781,1782],{},[17,1783,1784],{},"status",[136,1786,1787],{},"Shows the config, the server, the agent ID, the service state and whether the server and the credential work. Never shows the secret.",[121,1789,1790,1795],{},[136,1791,1792],{},[17,1793,1794],{},"wol-mode on|off",[136,1796,1797,1798,181],{},"Turns Wake-on-LAN mode on or off (",[17,1799,1732],{},[121,1801,1802,1807],{},[136,1803,1804],{},[17,1805,1806],{},"wol \u003Cmac>",[136,1808,1809,1810,1813,1814,181],{},"Sends a magic packet from this machine (",[17,1811,1812],{},"--port",", default ",[17,1815,1816],{},"9",[121,1818,1819,1824],{},[136,1820,1821],{},[17,1822,1823],{},"version",[136,1825,1826],{},"Prints the version.",[14,1828,1829,1830,1833,1834,35],{},"Global flags go before the command, for example ",[17,1831,1832],{},"netignite-agent --log-level debug run",". The\ndefault config path is ",[17,1835,646],{},[14,1837,1838,1839,1842,1843,1846,1847,1850,1851,1853],{},"Exit codes: ",[17,1840,1841],{},"0"," success, ",[17,1844,1845],{},"1"," error, ",[17,1848,1849],{},"78"," the server rejected the credential. The service isn't\nrestarted after ",[17,1852,1849],{},"; pair again.",[192,1855,1857],{"className":194,"code":1856,"filename":196,"language":197,"meta":198,"style":198},"sudo netignite-agent status\njournalctl -u netignite-agent -f\n",[17,1858,1859,1868],{"__ignoreMap":198},[202,1860,1861,1863,1865],{"class":204,"line":205},[202,1862,511],{"class":208},[202,1864,591],{"class":211},[202,1866,1867],{"class":211}," status\n",[202,1869,1870,1873,1876,1878],{"class":204,"line":419},[202,1871,1872],{"class":208},"journalctl",[202,1874,1875],{"class":211}," -u",[202,1877,591],{"class":211},[202,1879,1880],{"class":211}," -f\n",[74,1882,1884],{"id":1883},"connection","Connection",[14,1886,1887,1888,177,1891,1894,1895,1897,1898,1902,1903,1906],{},"The agent keeps one WebSocket to ",[17,1889,1890],{},"\u003Cserver>\u002Fws\u002Fagent",[17,1892,1893],{},"wss:\u002F\u002F"," for ",[17,1896,668],{}," servers) and speaks\nthe ",[54,1899,1901],{"href":1900},"\u002Fdocs\u002Fagents\u002Fprotocol","agent protocol",". Its ",[17,1904,1905],{},"HELLO"," reports the version, the capabilities and,\nfor the dashboard, the host name, OS, kernel, architecture, uptime, IP addresses and whether\nWake-on-LAN mode is on.",[22,1908,1909,1912,1929],{},[25,1910,1911],{},"It reconnects after 5 seconds, doubling the wait up to 60 seconds. If the server sends nothing for\n100 seconds (it pings every 30 seconds), the agent drops the connection and reconnects.",[25,1913,1914,1915,1917,1918,1921,1922,1925,1926,181],{},"It stops for good and exits with ",[17,1916,1849],{}," when the server rejects the credential (HTTP 401), revokes\nit (close code ",[17,1919,1920],{},"4003",", for example after pairing again or ",[28,1923,1924],{},"Revoke credential",") or deletes the\nagent (",[17,1927,1928],{},"4004",[25,1930,1931,1932,1935],{},"If another connection with the same credential takes over (",[17,1933,1934],{},"4000","), it waits 60 seconds before\nreconnecting, so two copies of the agent don't keep replacing each other.",[74,1937,1938],{"id":1753},"Uninstall",[192,1940,1942],{"className":194,"code":1941,"filename":196,"language":197,"meta":198,"style":198},"sudo netignite-agent uninstall           # keeps \u002Fetc\u002Fnetignite\u002Fagent.json (root-only again)\nsudo netignite-agent uninstall --purge   # also deletes the config with the credential\n",[17,1943,1944,1956],{"__ignoreMap":198},[202,1945,1946,1948,1950,1953],{"class":204,"line":205},[202,1947,511],{"class":208},[202,1949,591],{"class":211},[202,1951,1952],{"class":211}," uninstall",[202,1954,1955],{"class":415},"           # keeps \u002Fetc\u002Fnetignite\u002Fagent.json (root-only again)\n",[202,1957,1958,1960,1962,1964,1967],{"class":204,"line":419},[202,1959,511],{"class":208},[202,1961,591],{"class":211},[202,1963,1952],{"class":211},[202,1965,1966],{"class":211}," --purge",[202,1968,1969],{"class":415},"   # also deletes the config with the credential\n",[14,1971,1972,1973,1975,1976,1978,1979,1981],{},"This stops and disables the service and removes the unit, the polkit rule, the user ",[17,1974,1001],{},"\nand ",[17,1977,549],{},". ",[17,1980,1746],{}," shows the steps. Delete the agent in the dashboard\ntoo.",[74,1983,1985],{"id":1984},"security","Security",[22,1987,1988,2020,2041,2054,2063],{},[25,1989,1990,1993,1994,245,1997,177,1999,842,2001,2003,2004,245,2007,245,2010,49,2013,2016,2017,2019],{},[28,1991,1992],{},"Fixed actions only."," The server can ask for ",[17,1995,1996],{},"PING",[17,1998,837],{},[17,2000,841],{},[17,2002,845],{},")\nand, in Wake-on-LAN mode, ",[17,2005,2006],{},"WAKE",[17,2008,2009],{},"STATUS",[17,2011,2012],{},"SSH_CHECK",[17,2014,2015],{},"SSH_EXEC"," (one of four fixed commands\non another device). Every parameter is validated; commands run without a shell, and only IP\naddresses reach ",[17,2018,99],{},". There's no remote shell, no file access and no configuration change from\nthe server.",[25,2021,2022,2025,2026,2029,2030,1027,2032,2034,2035,2037,2038,2040],{},[28,2023,2024],{},"The secret"," is generated on the machine and only leaves it in the ",[17,2027,2028],{},"Authorization"," header. The\nserver stores only a hash. It's in ",[17,2031,646],{},[17,2033,650],{}," and never printed,\nnot even by ",[17,2036,1784],{},". Use an ",[17,2039,668],{}," server address outside your LAN.",[25,2042,2043,2046,2047,2049,2050,2053],{},[28,2044,2045],{},"The service"," runs as the unprivileged user ",[17,2048,1001],{}," with the hardening options above, without\ncapabilities in host mode and with only ",[17,2051,2052],{},"CAP_NET_RAW"," in Wake-on-LAN mode.",[25,2055,2056,2059,2060,35],{},[28,2057,2058],{},"SSH logins"," for other devices arrive with each request and are only kept in memory for that\nlogin; the agent never writes or logs them. See ",[54,2061,57],{"href":2062},"\u002Fdocs\u002Fguides\u002Fssh#security",[25,2064,2065,2066,842,2069,2072,2073,842,2075,2077],{},"The binary doesn't load ",[17,2067,2068],{},".env",[17,2070,2071],{},"bunfig.toml"," from the working directory, so a stray file there\ncan't change how ",[17,2074,520],{},[17,2076,166],{}," behave when run as root.",[74,2079,2081],{"id":2080},"building-from-source","Building from source",[14,2083,2084,2085,2090],{},"The agent is written in TypeScript and compiled with ",[54,2086,2089],{"href":2087,"rel":2088},"https:\u002F\u002Fbun.sh",[71],"Bun"," into single binaries.",[192,2092,2094],{"className":194,"code":2093,"filename":196,"language":197,"meta":198,"style":198},"git clone https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-Linux.git\ncd Agent-Linux\nbun install\nbun test\nbun run compile all --no-version-tag   # build\u002Fbin\u002Fnetignite-agent-linux-{x64,x64-baseline,arm64}\n",[17,2095,2096,2107,2115,2123,2130],{"__ignoreMap":198},[202,2097,2098,2101,2104],{"class":204,"line":205},[202,2099,2100],{"class":208},"git",[202,2102,2103],{"class":211}," clone",[202,2105,2106],{"class":211}," https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-Linux.git\n",[202,2108,2109,2112],{"class":204,"line":419},[202,2110,2111],{"class":1502},"cd",[202,2113,2114],{"class":211}," Agent-Linux\n",[202,2116,2117,2120],{"class":204,"line":430},[202,2118,2119],{"class":208},"bun",[202,2121,2122],{"class":211}," install\n",[202,2124,2125,2127],{"class":204,"line":453},[202,2126,2119],{"class":208},[202,2128,2129],{"class":211}," test\n",[202,2131,2132,2134,2137,2140,2143,2146],{"class":204,"line":469},[202,2133,2119],{"class":208},[202,2135,2136],{"class":211}," run",[202,2138,2139],{"class":211}," compile",[202,2141,2142],{"class":211}," all",[202,2144,2145],{"class":211}," --no-version-tag",[202,2147,2148],{"class":415},"   # build\u002Fbin\u002Fnetignite-agent-linux-{x64,x64-baseline,arm64}\n",[14,2150,2151,2152,2155,2156,2158,2159,2162],{},"Releases are built by the repository's release workflow when a tag ",[17,2153,2154],{},"v\u003Cversion>"," is pushed; it\nattaches the three binaries and ",[17,2157,268],{},". Versions with a suffix, such as ",[17,2160,2161],{},"1.0.0-beta.1",", are\npublished as pre-releases.",[2164,2165,2166],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":198,"searchDepth":419,"depth":419,"links":2168},[2169,2170,2174,2175,2176,2177,2180,2181,2182,2183,2184],{"id":76,"depth":419,"text":77},{"id":166,"depth":419,"text":167,"children":2171},[2172,2173],{"id":392,"depth":430,"text":393},{"id":552,"depth":430,"text":553},{"id":520,"depth":419,"text":579},{"id":812,"depth":419,"text":30},{"id":870,"depth":419,"text":40},{"id":987,"depth":419,"text":988,"children":2178},[2179],{"id":1473,"depth":430,"text":1473},{"id":1702,"depth":419,"text":1703},{"id":1883,"depth":419,"text":1884},{"id":1753,"depth":419,"text":1938},{"id":1984,"depth":419,"text":1985},{"id":2080,"depth":419,"text":2081},"The NetIgnite agent for Linux: install it with one command, pair it, host mode and Wake-on-LAN mode, the systemd service, polkit, uninstalling and security.","md",{},{"title":5},"\u002Fdocs\u002Fagents\u002Flinux",{"title":5,"description":2185},"docs\u002Fagents\u002Flinux","RVddUojpy07uzJVo2oEjVOjMwosHtTINQn96bl_VE5Y",1792614953003]