A varlink implementation for Python.
From pypi:
$ pip3 install --user varlink
With Fedora 28/rawhide:
$ sudo dnf install python3-varlink
See the tests directory.
$ python3 -m varlink.tests.test_orgexamplemore --varlink="unix:/tmp/test" &
[1] 6434
$ python -m varlink.cli help unix:/tmp/test/org.example.more
# Example Varlink service
interface org.example.more
# Enum, returning either start, progress or end
# progress: [0-100]
type State (
start: ?bool,
progress: ?int,
end: ?bool
)
# Returns the same string
method Ping(ping: string) -> (pong: string)
# Dummy progress method
# n: number of progress steps
method TestMore(n: int) -> (state: State)
# Stop serving
method StopServing() -> ()
# Something failed in TestMore
error TestMoreError (reason: string)
$ python -m varlink.cli call unix:/tmp/test/org.example.more.Ping '{ "ping": "Ping"}'
{
"pong": "Ping"
}
$ fg
python3 -m varlink.tests.test_orgexamplemore --varlink="unix:/tmp/test"
^C
$ python3 -m varlink.tests.test_orgexamplemore --client -A 'python3 -m varlink.tests.test_orgexamplemore --varlink=$VARLINK_ADDRESS'
Connecting to unix:/tmp/tmppxrbqk9p/4927
Listening on /tmp/tmppxrbqk9p/4927
--- Start ---
Progress: 0
Progress: 10
Progress: 20
Progress: 30
Progress: 40
Progress: 50
Progress: 60
Ping: Test
Progress: 70
Ping: Test
Progress: 80
Ping: Test
Progress: 90
Ping: Test
Progress: 100
Ping: Test
--- End ---
$ PYTHONPATH=$(pwd) python3 ./varlink/tests/test_orgexamplemore.py
Connecting to unix:/tmp/tmp7n6zc67d/5257
Listening on /tmp/tmp7n6zc67d/5257
--- Start ---
Progress: 0
Progress: 10
Progress: 20
Progress: 30
Progress: 40
Progress: 50
Progress: 60
Ping: Test
Progress: 70
Ping: Test
Progress: 80
Ping: Test
Progress: 90
Ping: Test
Progress: 100
Ping: Test
--- End ---
$ python3 -m varlink.tests.test_orgexamplemore --varlink="unix:/tmp/test" &
Listening on /tmp/test
[1] 6434
python3 -m varlink.tests.test_orgexamplemore --client --varlink="unix:/tmp/test"
Connecting to unix:/tmp/test
Ping: Test
--- Start ---
Progress: 0
Progress: 10
Progress: 20
Progress: 30
Progress: 40
Progress: 50
Progress: 60
Ping: Test
Progress: 70
Ping: Test
Progress: 80
Ping: Test
Progress: 90
Ping: Test
Progress: 100
Ping: Test
--- End ---
$ python3 -m varlink.cli call --more unix:/tmp/test/org.example.more.TestMore '{ "n": 10 }'
{'state': {'start': True}}
{'state': {'progress': 0}}
{'state': {'progress': 10}}
{'state': {'progress': 20}}
{'state': {'progress': 30}}
{'state': {'progress': 40}}
{'state': {'progress': 50}}
{'state': {'progress': 60}}
{'state': {'progress': 70}}
{'state': {'progress': 80}}
{'state': {'progress': 90}}
{'state': {'progress': 100}}
{'state': {'end': True}}
$ fg
python3 -m varlink.tests.test_orgexamplemore --varlink="unix:/tmp/test"
^C
You can also start the clients and server with URLs following the varlink URL standard with unix:
and tcp:
.
E.g.
- unix:@anonuds
- unix:/run/myserver/socketfile
- tcp:127.0.0.1:12345
- tcp:[::1]:12345
Activation mode starts the service to connect to and passes the socket via socket activation.
The VARLINK_ADDRESS
environment variable contains the varlink address URI.
$ python3 -m varlink.cli --activate 'python3 -m varlink.tests.test_orgexamplemore --varlink=$VARLINK_ADDRESS' call org.example.more.Ping '{ "ping": "Ping"}'
Listening on @00352
{'pong': 'Ping'}
Bridge mode allows to tunnel to a remote point via stdin/stdout and call a method.
Running varlink bridge
allows to connect stdio to the host services via org.varlink.resolver
interface resolving.
# python3 -m varlink.cli -b "ssh host.example.org varlink bridge" call com.redhat.machine.GetInfo '{}'
{
"hostname": "host.example.org",
"system": {
"id": "fedora",
"kernel_version": "4.18.0-0.rc5.git1.2.fc29.x86_64",
"name": "Fedora",
"version": "29"
},
"virtualization": {
"name": "none"
}
}
$ python3 -m varlink.tests.test_certification --varlink=tcp:127.0.0.1:12345
$ python3 -m varlink.tests.test_certification --varlink=tcp:127.0.0.1:12345 --client