this repo has no description smallweb.run
smallweb
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

add ssh logs

+118 -145
+1 -1
example/mcp/deno.json
··· 1 1 { 2 2 "imports": { 3 - "@modelcontextprotocol/sdk": "npm:@modelcontextprotocol/sdk@^1.11.1", 3 + "@modelcontextprotocol/sdk": "npm:@modelcontextprotocol/sdk@^1.11.2", 4 4 "zod": "npm:zod@^3.24.4" 5 5 } 6 6 }
+52 -93
example/mcp/deno.lock
··· 1 1 { 2 2 "version": "5", 3 3 "specifiers": { 4 + "jsr:@smallweb/sandbox@0.1.0": "0.1.0", 4 5 "jsr:@std/bytes@^1.0.5": "1.0.5", 5 6 "jsr:@std/encoding@1.0.8": "1.0.8", 6 7 "jsr:@std/html@1.0.3": "1.0.3", 7 8 "jsr:@std/http@1.0.12": "1.0.12", 8 9 "jsr:@std/streams@*": "1.0.9", 9 - "npm:@modelcontextprotocol/sdk@^1.11.1": "1.11.1_express@5.0.1_zod@3.24.3", 10 + "npm:@modelcontextprotocol/sdk@^1.11.1": "1.11.2_express@5.1.0_zod@3.24.4", 11 + "npm:@modelcontextprotocol/sdk@^1.11.2": "1.11.2_express@5.1.0_zod@3.24.4", 10 12 "npm:zod@^3.24.4": "3.24.4" 11 13 }, 12 14 "jsr": { 15 + "@smallweb/sandbox@0.1.0": { 16 + "integrity": "840a6120563b20be994fdac3fa858d2cc2e815c6f9b5ea8f14bd02ddd7f71be8", 17 + "dependencies": [ 18 + "jsr:@std/encoding", 19 + "jsr:@std/html", 20 + "jsr:@std/http" 21 + ] 22 + }, 13 23 "@std/bytes@1.0.5": { 14 24 "integrity": "4465dd739d7963d964c809202ebea6d5c6b8e3829ef25c6a224290fbb8a1021e" 15 25 }, ··· 30 40 } 31 41 }, 32 42 "npm": { 33 - "@modelcontextprotocol/sdk@1.11.1_express@5.0.1_zod@3.24.3": { 34 - "integrity": "sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==", 43 + "@modelcontextprotocol/sdk@1.11.2_express@5.1.0_zod@3.24.4": { 44 + "integrity": "sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ==", 35 45 "dependencies": [ 36 46 "content-type", 37 47 "cors", ··· 41 51 "express-rate-limit", 42 52 "pkce-challenge", 43 53 "raw-body", 44 - "zod@3.24.3", 54 + "zod", 45 55 "zod-to-json-schema" 46 56 ] 47 57 }, 48 58 "accepts@2.0.0": { 49 59 "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 50 60 "dependencies": [ 51 - "mime-types@3.0.0", 61 + "mime-types", 52 62 "negotiator" 53 63 ] 54 64 }, 55 - "body-parser@2.1.0": { 56 - "integrity": "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==", 65 + "body-parser@2.2.0": { 66 + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", 57 67 "dependencies": [ 58 68 "bytes", 59 69 "content-type", 60 - "debug@4.4.0", 70 + "debug", 61 71 "http-errors", 62 - "iconv-lite@0.5.2", 72 + "iconv-lite", 63 73 "on-finished", 64 - "qs@6.14.0", 74 + "qs", 65 75 "raw-body", 66 76 "type-is" 67 77 ] ··· 95 105 "cookie-signature@1.2.2": { 96 106 "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==" 97 107 }, 98 - "cookie@0.7.1": { 99 - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" 108 + "cookie@0.7.2": { 109 + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" 100 110 }, 101 111 "cors@2.8.5": { 102 112 "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", ··· 113 123 "which" 114 124 ] 115 125 }, 116 - "debug@4.3.6": { 117 - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 126 + "debug@4.4.1": { 127 + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 118 128 "dependencies": [ 119 - "ms@2.1.2" 120 - ] 121 - }, 122 - "debug@4.4.0": { 123 - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 124 - "dependencies": [ 125 - "ms@2.1.3" 129 + "ms" 126 130 ] 127 131 }, 128 132 "depd@2.0.0": { 129 133 "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 130 - }, 131 - "destroy@1.2.0": { 132 - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 133 134 }, 134 135 "dunder-proto@1.0.1": { 135 136 "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", ··· 172 173 "eventsource-parser" 173 174 ] 174 175 }, 175 - "express-rate-limit@7.5.0_express@5.0.1": { 176 + "express-rate-limit@7.5.0_express@5.1.0": { 176 177 "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", 177 178 "dependencies": [ 178 179 "express" 179 180 ] 180 181 }, 181 - "express@5.0.1": { 182 - "integrity": "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==", 182 + "express@5.1.0": { 183 + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", 183 184 "dependencies": [ 184 185 "accepts", 185 186 "body-parser", ··· 187 188 "content-type", 188 189 "cookie", 189 190 "cookie-signature", 190 - "debug@4.3.6", 191 - "depd", 191 + "debug", 192 192 "encodeurl", 193 193 "escape-html", 194 194 "etag", 195 195 "finalhandler", 196 - "fresh@2.0.0", 196 + "fresh", 197 197 "http-errors", 198 198 "merge-descriptors", 199 - "methods", 200 - "mime-types@3.0.0", 199 + "mime-types", 201 200 "on-finished", 202 201 "once", 203 202 "parseurl", 204 203 "proxy-addr", 205 - "qs@6.13.0", 204 + "qs", 206 205 "range-parser", 207 206 "router", 208 - "safe-buffer", 209 207 "send", 210 208 "serve-static", 211 - "setprototypeof", 212 209 "statuses", 213 210 "type-is", 214 - "utils-merge", 215 211 "vary" 216 212 ] 217 213 }, 218 214 "finalhandler@2.1.0": { 219 215 "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", 220 216 "dependencies": [ 221 - "debug@4.4.0", 217 + "debug", 222 218 "encodeurl", 223 219 "escape-html", 224 220 "on-finished", ··· 228 224 }, 229 225 "forwarded@0.2.0": { 230 226 "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 231 - }, 232 - "fresh@0.5.2": { 233 - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 234 227 }, 235 228 "fresh@2.0.0": { 236 229 "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==" ··· 282 275 "toidentifier" 283 276 ] 284 277 }, 285 - "iconv-lite@0.5.2": { 286 - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", 287 - "dependencies": [ 288 - "safer-buffer" 289 - ] 290 - }, 291 278 "iconv-lite@0.6.3": { 292 279 "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 293 280 "dependencies": [ ··· 315 302 "merge-descriptors@2.0.0": { 316 303 "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==" 317 304 }, 318 - "methods@1.1.2": { 319 - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 320 - }, 321 - "mime-db@1.52.0": { 322 - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 323 - }, 324 305 "mime-db@1.54.0": { 325 306 "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" 326 307 }, 327 - "mime-types@2.1.35": { 328 - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 329 - "dependencies": [ 330 - "mime-db@1.52.0" 331 - ] 332 - }, 333 - "mime-types@3.0.0": { 334 - "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", 308 + "mime-types@3.0.1": { 309 + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", 335 310 "dependencies": [ 336 - "mime-db@1.54.0" 311 + "mime-db" 337 312 ] 338 - }, 339 - "ms@2.1.2": { 340 - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 341 313 }, 342 314 "ms@2.1.3": { 343 315 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" ··· 382 354 "ipaddr.js" 383 355 ] 384 356 }, 385 - "qs@6.13.0": { 386 - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 387 - "dependencies": [ 388 - "side-channel" 389 - ] 390 - }, 391 357 "qs@6.14.0": { 392 358 "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 393 359 "dependencies": [ ··· 402 368 "dependencies": [ 403 369 "bytes", 404 370 "http-errors", 405 - "iconv-lite@0.6.3", 371 + "iconv-lite", 406 372 "unpipe" 407 373 ] 408 374 }, 409 375 "router@2.2.0": { 410 376 "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", 411 377 "dependencies": [ 412 - "debug@4.4.0", 378 + "debug", 413 379 "depd", 414 380 "is-promise", 415 381 "parseurl", ··· 422 388 "safer-buffer@2.1.2": { 423 389 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 424 390 }, 425 - "send@1.1.0": { 426 - "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", 391 + "send@1.2.0": { 392 + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", 427 393 "dependencies": [ 428 - "debug@4.4.0", 429 - "destroy", 394 + "debug", 430 395 "encodeurl", 431 396 "escape-html", 432 397 "etag", 433 - "fresh@0.5.2", 398 + "fresh", 434 399 "http-errors", 435 - "mime-types@2.1.35", 436 - "ms@2.1.3", 400 + "mime-types", 401 + "ms", 437 402 "on-finished", 438 403 "range-parser", 439 404 "statuses" 440 405 ] 441 406 }, 442 - "serve-static@2.1.0": { 443 - "integrity": "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==", 407 + "serve-static@2.2.0": { 408 + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", 444 409 "dependencies": [ 445 410 "encodeurl", 446 411 "escape-html", ··· 502 467 "toidentifier@1.0.1": { 503 468 "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 504 469 }, 505 - "type-is@2.0.0": { 506 - "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", 470 + "type-is@2.0.1": { 471 + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", 507 472 "dependencies": [ 508 473 "content-type", 509 474 "media-typer", 510 - "mime-types@3.0.0" 475 + "mime-types" 511 476 ] 512 477 }, 513 478 "unpipe@1.0.0": { 514 479 "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 515 - }, 516 - "utils-merge@1.0.1": { 517 - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 518 480 }, 519 481 "vary@1.1.2": { 520 482 "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" ··· 529 491 "wrappy@1.0.2": { 530 492 "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 531 493 }, 532 - "zod-to-json-schema@3.24.5_zod@3.24.3": { 494 + "zod-to-json-schema@3.24.5_zod@3.24.4": { 533 495 "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", 534 496 "dependencies": [ 535 - "zod@3.24.3" 497 + "zod" 536 498 ] 537 - }, 538 - "zod@3.24.3": { 539 - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==" 540 499 }, 541 500 "zod@3.24.4": { 542 501 "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==" ··· 547 506 }, 548 507 "workspace": { 549 508 "dependencies": [ 550 - "npm:@modelcontextprotocol/sdk@^1.11.1", 509 + "npm:@modelcontextprotocol/sdk@^1.11.2", 551 510 "npm:zod@^3.24.4" 552 511 ] 553 512 }
+65 -51
internal/cmd/up.go
··· 280 280 } 281 281 282 282 authorizedKey := string(gossh.MarshalAuthorizedKey(signer.PublicKey())) 283 + sshLogger := logger.With("logger", "ssh") 283 284 srv, err := wish.NewServer( 284 285 wish.WithAddress(flags.sshAddr), 285 286 wish.WithHostKeyPath(sshPrivateKeyPath), ··· 304 305 return false 305 306 }), 306 307 sftp.SSHOption(k.String("dir"), nil), 307 - wish.WithMiddleware(func(next ssh.Handler) ssh.Handler { 308 - return func(sess ssh.Session) { 309 - if sess.User() != "_" { 310 - a, err := app.LoadApp(sess.User(), k.String("dir"), k.String("domain")) 311 - if err != nil { 312 - fmt.Fprintf(sess, "failed to load app: %v\n", err) 313 - sess.Exit(1) 308 + wish.WithMiddleware( 309 + func(next ssh.Handler) ssh.Handler { 310 + return func(sess ssh.Session) { 311 + if sess.User() != "_" { 312 + a, err := app.LoadApp(sess.User(), k.String("dir"), k.String("domain")) 313 + if err != nil { 314 + fmt.Fprintf(sess, "failed to load app: %v\n", err) 315 + sess.Exit(1) 316 + return 317 + } 318 + 319 + wk := worker.NewWorker(a, k.Bool(fmt.Sprintf("apps.%s.admin", a.Name)), nil) 320 + cmd, err := wk.Command(sess.Context(), sess.Command()) 321 + if err != nil { 322 + fmt.Fprintf(sess, "failed to get command: %v\n", err) 323 + sess.Exit(1) 324 + return 325 + } 326 + 327 + cmd.Stdout = sess 328 + cmd.Stderr = sess.Stderr() 329 + stdin, err := cmd.StdinPipe() 330 + if err != nil { 331 + fmt.Fprintf(sess, "failed to get stdin: %v\n", err) 332 + sess.Exit(1) 333 + return 334 + } 335 + 336 + go func() { 337 + defer stdin.Close() 338 + io.Copy(stdin, sess) 339 + }() 340 + 341 + if err := cmd.Run(); err != nil { 342 + var exitErr *exec.ExitError 343 + if errors.As(err, &exitErr) { 344 + sess.Exit(exitErr.ExitCode()) 345 + return 346 + } 347 + 348 + fmt.Fprintf(sess, "failed to run command: %v", err) 349 + sess.Exit(1) 350 + return 351 + } 352 + 314 353 return 315 354 } 316 355 317 - wk := worker.NewWorker(a, k.Bool(fmt.Sprintf("apps.%s.admin", a.Name)), nil) 318 - cmd, err := wk.Command(sess.Context(), sess.Command()) 356 + execPath, err := os.Executable() 319 357 if err != nil { 320 - fmt.Fprintf(sess, "failed to get command: %v\n", err) 358 + fmt.Fprintf(sess.Stderr(), "failed to get executable path: %v\n", err) 321 359 sess.Exit(1) 322 360 return 323 361 } 324 362 363 + cmd := exec.Command(execPath, "--dir", k.String("dir"), "--domain", k.String("domain")) 364 + cmd.Args = append(cmd.Args, sess.Command()...) 365 + cmd.Env = os.Environ() 366 + cmd.Env = append(cmd.Env, "SMALLWEB_DISABLE_PLUGINS=true") 367 + 325 368 cmd.Stdout = sess 326 369 cmd.Stderr = sess.Stderr() 327 370 stdin, err := cmd.StdinPipe() ··· 347 390 sess.Exit(1) 348 391 return 349 392 } 350 - 351 - return 352 393 } 353 - 354 - execPath, err := os.Executable() 355 - if err != nil { 356 - fmt.Fprintf(sess.Stderr(), "failed to get executable path: %v\n", err) 357 - sess.Exit(1) 358 - return 359 - } 360 - 361 - cmd := exec.Command(execPath, "--dir", k.String("dir"), "--domain", k.String("domain")) 362 - cmd.Args = append(cmd.Args, sess.Command()...) 363 - cmd.Env = os.Environ() 364 - cmd.Env = append(cmd.Env, "SMALLWEB_DISABLE_PLUGINS=true") 365 - 366 - cmd.Stdout = sess 367 - cmd.Stderr = sess.Stderr() 368 - stdin, err := cmd.StdinPipe() 369 - if err != nil { 370 - fmt.Fprintf(sess, "failed to get stdin: %v\n", err) 371 - sess.Exit(1) 372 - return 373 - } 374 - 375 - go func() { 376 - defer stdin.Close() 377 - io.Copy(stdin, sess) 378 - }() 379 - 380 - if err := cmd.Run(); err != nil { 381 - var exitErr *exec.ExitError 382 - if errors.As(err, &exitErr) { 383 - sess.Exit(exitErr.ExitCode()) 384 - return 385 - } 386 - 387 - fmt.Fprintf(sess, "failed to run command: %v", err) 388 - sess.Exit(1) 389 - return 394 + }, 395 + func(next ssh.Handler) ssh.Handler { 396 + return func(sess ssh.Session) { 397 + sshLogger.Info( 398 + "ssh connection", 399 + "user", sess.User(), 400 + "remote addr", sess.RemoteAddr().String(), 401 + "command", sess.Command(), 402 + ) 403 + next(sess) 390 404 } 391 - } 392 - }), 405 + }, 406 + ), 393 407 ) 394 408 395 409 if err != nil {