{"record":{"id":"3270cd3542a9619c","repo":"google/tsunami-security-scanner","slug":"language-server-path-s-does-not-exist","errorCode":null,"errorMessage":"Language server path %s does not exist","messagePattern":"Language server path (.+?) does not exist","errorType":"validation","errorClass":"ParameterException","httpStatus":null,"severity":"error","filePath":"main/src/main/java/com/google/tsunami/main/cli/LanguageServerOptions.java","lineNumber":71,"sourceCode":"  public List<String> remotePluginServerAddress = ImmutableList.of();\n\n  @Parameter(\n      names = {\"--remote-plugin-server-ports\", \"--python-plugin-server-port\"},\n      description = \"The port of the remote plugin server to open connection with.\")\n  public List<Integer> remotePluginServerPort = ImmutableList.of();\n\n  @Parameter(\n      names = \"--remote-plugin-server-rpc-deadline-seconds\",\n      description = \"The RPC deadline in seconds for this plugin server.\")\n  public List<Integer> remotePluginServerRpcDeadlineSeconds = ImmutableList.of();\n\n  @Override\n  public void validate() {\n    if (!pluginServerFilenames.isEmpty() || !pluginServerPorts.isEmpty()) {\n      if (pluginServerFilenames != null && !pluginServerFilenames.isEmpty()) {\n        for (String pluginServerFilename : pluginServerFilenames) {\n          if (!Files.exists(Paths.get(pluginServerFilename))) {\n            throw new ParameterException(\n                String.format(\"Language server path %s does not exist\", pluginServerFilename));\n          }\n        }\n      }\n\n      if (pluginServerPorts != null && !pluginServerPorts.isEmpty()) {\n        for (String pluginServerPort : pluginServerPorts) {\n          try {\n            int port = Integer.parseInt(pluginServerPort);\n            if (!(port <= NetworkEndpointUtils.MAX_PORT_NUMBER && port > 0)) {\n              throw new ParameterException(\n                  String.format(\n                      \"Port out of range. Expected [0, %s], actual %s.\",\n                      NetworkEndpointUtils.MAX_PORT_NUMBER, pluginServerPort));\n            }\n          } catch (NumberFormatException e) {\n            throw new ParameterException(\n                String.format(\"Port number must be an integer. Got %s instead.\", pluginServerPort),","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/google/tsunami-security-scanner/blob/363ba87b3543f8ae8e4304d3416818f03da7f262/main/src/main/java/com/google/tsunami/main/cli/LanguageServerOptions.java#L53-L89","documentation":"LanguageServerOptions.validate() checks each configured --plugin-server-filename path and throws a ParameterException (picocli) if the path does not exist on the local filesystem. This ensures Tsunami only starts configured language/plugin servers that actually point to a file.","triggerScenarios":"Running the Tsunami CLI with --plugin-server-filename pointing to a nonexistent file path, or a path that was moved/renamed after configuration.","commonSituations":"Deploying Tsunami with a config copied from another machine, relative paths resolved from the wrong working directory, or plugin server scripts not built/installed yet.","solutions":["Verify the path exists (ls / Files.exists) and correct the --plugin-server-filename value.","Use absolute paths in the Tsunami config to avoid working-directory confusion.","Build or install the missing plugin server script before launching."],"exampleFix":"// before\n--plugin-server-filename=./python_plugins/pyserver.py  # file missing\n// after\n--plugin-server-filename=/opt/tsunami/plugins/pyserver.py  # verified existing","handlingStrategy":"validation","validationCode":"if (!Files.exists(Paths.get(path))) { throw new IllegalStateException(\"Language server path missing: \" + path); }","typeGuard":"boolean serverPathExists(String p) { return p != null && Files.exists(Paths.get(p)); }","tryCatchPattern":"try { options.validate(); } catch (ParameterException e) { log.error(\"CLI validation failed: {}\", e.getMessage()); }","preventionTips":["Use absolute paths for plugin server scripts.","Verify file existence after deploy/mount before starting Tsunami.","Build plugin server scripts as part of the launch pipeline."],"tags":["cli","configuration","file-not-found"],"backgroundTag":"file-not-found","analyzedSha":"363ba87b3543f8ae8e4304d3416818f03da7f262","analyzedAt":"2026-09-13T01:50:53.990Z","contentChangedAt":"2026-09-13T01:50:53.990Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}