Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Snap][Service]Service in snap can not work, because there is no default path of config file #621

Closed
yangyankui opened this issue Sep 9, 2021 · 16 comments

Comments

@yangyankui
Copy link

yangyankui commented Sep 9, 2021

there is no default path of config file,
therefore i can not use
snap start shadowsocks-rust.ssserver-daemon

debian 10,
snap,
shadowsocks-rust edge v1.11.2.r34.gf717984

@kallydev
Copy link
Contributor

kallydev commented Sep 9, 2021

You can use arguments as a temporary solution. Ref #617.

shadowsocks-rust.ssserver -s "0.0.0.0:8388" -m "aes-256-gcm" -k "********"

@yangyankui
Copy link
Author

Thank you!
Now, I am using
shadowsocks-rust.ssserver -c config.json
Is there any plan to support the default path?
Hope to add the function of the default path of config file.

@kallydev
Copy link
Contributor

kallydev commented Sep 9, 2021

Is there any plan to support the default path?
Hope to add the function of the default path of config file.

Unfortunately, I don't have a build environment for snap.

If you keep this issue open, other collaborators may be able to fix it.

@yangyankui
Copy link
Author

Ok, Thank you!

@yangyankui yangyankui changed the title there is no default path of config file [Snap][Service]there is no default path of config file Sep 9, 2021
@yangyankui yangyankui changed the title [Snap][Service]there is no default path of config file [Snap][Service]service in snap can not work, because there is no default path of config file Sep 9, 2021
@yangyankui yangyankui changed the title [Snap][Service]service in snap can not work, because there is no default path of config file [Snap][Service]Service in snap can not work, because there is no default path of config file Sep 9, 2021
@zonyitoo
Copy link
Collaborator

zonyitoo commented Sep 9, 2021

@DuckSoft

@kallydev
Copy link
Contributor

kallydev commented Sep 9, 2021

I recommend to set the default path to ~/.config/shadowsocks-rust.

@yangyankui
Copy link
Author

shadowsocks-libev default path is /etc/shadowsocks-libev/config.json

@zonyitoo
Copy link
Collaborator

zonyitoo commented Sep 9, 2021

Why snap's daemon couldn't start with command line arguments?

@kallydev
Copy link
Contributor

kallydev commented Sep 9, 2021

shadowsocks-libev default path is /etc/shadowsocks-libev/config.json

The snap default only allow application to access path under $HOME, unless the application is installed using the --classic parameter.

@orisson003
Copy link

Same problem here. It seems snap version can't automatically read configure file via a default or designated path as in Shadowsocks-libev. Neither can it pass parameters to its daemon service when invoking systemctl. Both of these methods are not currently working in the snap store version.

@zonyitoo
Copy link
Collaborator

zonyitoo commented Nov 26, 2021

It should already supported in the latest version:

pub fn get_default_config_path() -> Option<PathBuf> {
// System standard directories
if let Some(project_dirs) = ProjectDirs::from("org", "shadowsocks", "shadowsocks-rust") {
// Linux: $XDG_CONFIG_HOME/shadowsocks-rust/config.json
// $HOME/.config/shadowsocks-rust/config.json
// macOS: $HOME/Library/Application Support/org.shadowsocks.shadowsocks-rust/config.json
// Windows: {FOLDERID_RoamingAppData}/shadowsocks/shadowsocks-rust/config/config.json
let mut config_path = project_dirs.config_dir().to_path_buf();
config_path.push("config.json");
if config_path.exists() {
return Some(config_path);
}
}
// UNIX systems, XDG Base Directory
// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
#[cfg(unix)]
if let Ok(base_directories) = xdg::BaseDirectories::with_prefix("shadowsocks-rust") {
// $XDG_CONFIG_HOME/shadowsocks-rust/config.json
// for dir in $XDG_CONFIG_DIRS; $dir/shadowsocks-rust/config.json
if let Some(config_path) = base_directories.find_config_file("config.json") {
return Some(config_path);
}
}
// UNIX global configuration file
#[cfg(unix)]
{
let global_config_path = Path::new("/etc/shadowsocks-rust/config.json");
if global_config_path.exists() {
return Some(global_config_path.to_path_buf());
}
}
None
}

ref #688

@kallydev
Copy link
Contributor

The issue still exists with channels like stable and edge, but I can't see the snapcraft build logs. If edge is the latest image, then this issue may still be unresolved.

kallydev@ubuntu:~$ sudo snap install shadowsocks-rust --edge
shadowsocks-rust (edge) v1.12.2.r12.g1eff9b1 from DuckSoft installed
kallydev@ubuntu:~$ shadowsocks-rust.ssserver --version
shadowsocks 1.12.3
kallydev@ubuntu:~$ cat .config/shadowsocks-rust/config.json 
{
    "server": "127.0.0.1",
    "server_port": 8388,
    "password": "password",
    "method": "aes-256-gcm"
}
kallydev@ubuntu:~$ shadowsocks-rust.ssserver 
missing proxy servers, consider specifying it by --server-addr, --encrypt-method, --password command line option, or configuration file, check more details in https://shadowsocks.org/en/config/quick-guide.html
USAGE:
    ssserver [FLAGS] [OPTIONS]

@zonyitoo
Copy link
Collaborator

zonyitoo commented Nov 26, 2021

Please try again with the global configuration path /etc/shadowsocks-rust/config.json

@kallydev
Copy link
Contributor

Please try again with the global configuration path /etc/shadowsocks-rust/config.json

kallydev@ubuntu:~$ sudo vim /etc/shadowsocks-rust/config.json
kallydev@ubuntu:~$ shadowsocks-rust.ssserver
missing proxy servers, consider specifying it by --server-addr, --encrypt-method, --password command line option, or configuration file, check more details in https://shadowsocks.org/en/config/quick-guide.html
USAGE:
    ssserver [FLAGS] [OPTIONS]

This should be because the image does not have permission to read these configuration files.

kallydev@ubuntu:~$ shadowsocks-rust.ssserver -c .config/shadowsocks-rust/config.json 
loading config ".config/shadowsocks-rust/config.json", error while reading file, Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
kallydev@ubuntu:~$ shadowsocks-rust.ssserver -c /etc/
Display all 230 possibilities? (y or n)
kallydev@ubuntu:~$ shadowsocks-rust.ssserver -c /etc/shadowsocks-rust/config.json 
loading config "/etc/shadowsocks-rust/config.json", error while reading file, Os { code: 2, kind: NotFound, message: "No such file or directory" }

I don't understand why snap's home permissions can't access $HOME/.config/shadowsocks-rust/config.json, but it can access $HOME/config.json.

Ref https://snapcraft.io/docs/home-interface, only "non-hidden files" can be accessed.

The home interface allows access to non-hidden files owned by the user in the user’s home ($HOME) directory where a user normally stores their personal files and documents.

kallydev@ubuntu:~$ shadowsocks-rust.ssserver -c ~/config.json 
2021-11-25T17:37:52.484976149-08:00 INFO  shadowsocks server 1.12.3 build 2021-11-25T16:55:04.297088322+00:00
2021-11-25T17:37:52.486770036-08:00 INFO  shadowsocks tcp server listening on 127.0.0.1:8388, inbound address 127.0.0.1:8388

@yangyankui
Copy link
Author

It's OK.
shadowsock-rust v1.12.2.r12.g1eff9b1 edge
config.json :
{
"address": "0.0.0.0",
"port": 8388,
"password": "password",
"method": "chacha20-ietf-poly1305"
}
root@localhost:~#snap install shadowsocks-rust --edge
root@localhost:~#cp config.json /var/snap/shadowsocks-rust/common/etc/shadowsocks-rust/config.json
root@localhost:~#snap start --enable shadowsocks-rust.ssserver-daemon

@kallydev
Copy link
Contributor

kallydev commented Nov 26, 2021

We can completely resolve the $HOME/.config/shadowsocks-rust permissions issue using https://snapcraft.io/docs/personal-files-interface, but this needs to be done via https://snapcraft.io/docs/process-for-aliases-auto-connections-and-tracks.

So, I just reviewed qv2ray's solution, then replaced $HOME/.config/shadowsocks-rust/config.json with $HOME/snap/shadowsocks-rust/common/.config/shadowsocks-rust/config.json, which successfully bypasses the issue.

kallydev@ubuntu:~$ shadowsocks-rust.ssserver -c ./snap/shadowsocks-rust/common/.config/shadowsocks-rust/config.json 
2021-11-25T18:30:58.789058481-08:00 INFO  shadowsocks server 1.12.3 build 2021-11-25T16:55:04.297088322+00:00
2021-11-25T18:30:58.790422140-08:00 INFO  shadowsocks tcp server listening on 127.0.0.1:8388, inbound address 127.0.0.1:8388

Of course, I think /var/snap/shadowsocks-rust/common/etc/shadowsocks-rust/config.json is also good, because fa3a2a8 makes managing profiles much easier than before.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants