npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

nm-vpn

v0.1.6

Published

Node frontend to control VPN connections via NetworkManager's cli

Downloads

8

Readme

node-nm-vpn

Control VPN connections from node using NetworkManager's cli.

Fair warning

I use this to switch VPNs on my Raspberry Pi - what will you use it for? Probably not a production app; this is very thrown-together stuff...

That said, here are a few things you'll need to bear in mind:

VPN passwords

Each VPN connection has its own configuration file (on Ubuntu, these live in /etc/NetworkManager/system-connections/). To enable automated activation of connections, NetworkManager grabs the password either from the users keyring or the configuration file. I couldn't figure out how to get the keyring method working; to set the password in the configuration file, you need something like:

/etc/NetworkManager/system-connections/My_VPN:

[vpn]
# [...] username, etc properties
password-flags=0 # Tells NetworkManager to read password from [vpn-secrets] below

[vpn-secrets]
password=my_vpn_password

Network control authorisation

If your app uses this module and is started via SSH then you may receive this error when trying to activate a connection:

Connection activation failed: Not authorized to control networking.

I believe this occurs because while desktop users get granted the CAP_NET_ADMIN capability, remote (i.e. SSH) users do not, and are therefore unable to bring connections up or down. You can get around this by having your app run as root, but I that's not recommended for obvious reasons. I've tried using setcap to add the capability manually but that results in timeout errors when (de)activating connections, so your best bet right now is to start the app as a desktop user. For me that means plugging in a keyboard and screen to my Pi and starting the app locally. If anyone knows a workaround, please feel free to submit a pull request or raise an issue. I may post on AskUbuntu when I get a sec.

Usage

var connectionManager = require('node-nm-vpn');

// Get list of available VPN connections
var connections = connectionManager.connections;

// Get active VPN connection (if any)
var activeConnection = connectionManager.active;

// Bring a connection up (will first take down any active connection)
connectionManager.up(connections[0].id);

// Take a connection down
connectionManager.down(connections[0].id);