Added upnp-discover cli tool
This commit is contained in:
parent
c3531ce5fa
commit
e44becfa23
206
bin/upnp-discover
Executable file
206
bin/upnp-discover
Executable file
@ -0,0 +1,206 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
//
|
||||||
|
// Discover UPnP Devices on the network.
|
||||||
|
// Use this tool for testing when developing using noccylabs/upnp or similar.
|
||||||
|
//
|
||||||
|
// (c) 2017, NoccyLabs.info
|
||||||
|
// Licensed under GNU GPL v3 or later.
|
||||||
|
//
|
||||||
|
|
||||||
|
require_once __DIR__."/../vendor/autoload.php";
|
||||||
|
|
||||||
|
use NoccyLabs\UPnP\SSDP\Discovery;
|
||||||
|
use NoccyLabs\UPnP\SSDP\SearchTarget;
|
||||||
|
|
||||||
|
$opt_short = "hARd:s:u:D:l";
|
||||||
|
$opt_long = [
|
||||||
|
"help", // -h
|
||||||
|
"all", // -A
|
||||||
|
"root", // -R
|
||||||
|
"device:", // -d:
|
||||||
|
"service:", // -s:
|
||||||
|
"uuid:", // -u:
|
||||||
|
"domain:", // -D:
|
||||||
|
"long",
|
||||||
|
];
|
||||||
|
$help = <<<EOH
|
||||||
|
upnp-discover - Discover UPnP devices on the local network
|
||||||
|
|
||||||
|
Usage: upnp-discover [options]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
-h, --help Show this help
|
||||||
|
-A, --all Find all devices on the LAN
|
||||||
|
-R, --root Find all root devices on the LAN
|
||||||
|
-d, --device Find by device type and version
|
||||||
|
-s, --service Find by service type and version
|
||||||
|
-D, --domain Combine with -d or -s to search for specific vendor domains.
|
||||||
|
-u, --uuid Find by UUID
|
||||||
|
-l, --long Include all info in output
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
Find all devices:
|
||||||
|
--all
|
||||||
|
Find root devices:
|
||||||
|
--root
|
||||||
|
Find by UUID:
|
||||||
|
--uuid <uuid>
|
||||||
|
Find core UPnP devices or services:
|
||||||
|
--device InternetGatewayDevice:2
|
||||||
|
--service Layer3Forwarding:1
|
||||||
|
Find vendored devices or services:
|
||||||
|
--device dialreceiver:1 --domain dial-multiscreen-org
|
||||||
|
--service dial:1 --domain dial-multiscreen-org
|
||||||
|
|
||||||
|
EOH;
|
||||||
|
|
||||||
|
function show_help() {
|
||||||
|
echo $GLOBALS['help'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$opts = (object)[
|
||||||
|
'help'=>null,
|
||||||
|
'all'=>null,
|
||||||
|
'root'=>null,
|
||||||
|
'device'=>null,
|
||||||
|
'service'=>null,
|
||||||
|
'domain'=>null,
|
||||||
|
'uuid'=>null,
|
||||||
|
'long'=>null
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach (getopt($opt_short, $opt_long) as $opt=>$value) switch ($opt) {
|
||||||
|
case 'help':
|
||||||
|
case 'h':
|
||||||
|
$opts->help = true; break;
|
||||||
|
case 'all':
|
||||||
|
case 'A':
|
||||||
|
$opts->all = true; break;
|
||||||
|
case 'root':
|
||||||
|
case 'R':
|
||||||
|
$opts->root = true; break;
|
||||||
|
case 'device':
|
||||||
|
case 'd':
|
||||||
|
$opts->device = $value; break;
|
||||||
|
case 'service':
|
||||||
|
case 's':
|
||||||
|
$opts->service = $value; break;
|
||||||
|
case 'domain':
|
||||||
|
case 'd':
|
||||||
|
$opts->domain = $value; break;
|
||||||
|
case 'uuid':
|
||||||
|
case 'u':
|
||||||
|
$opts->uuid = $vaue; break;
|
||||||
|
case 'long':
|
||||||
|
case 'l':
|
||||||
|
$opts->long = true; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($opts->device && $opts->service) {
|
||||||
|
echo "You can't specify --device and --service at the same time\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($opts->domain && (!($opts->service || $opts->device))) {
|
||||||
|
echo "You need to provide --service or --device when using --domain\n";
|
||||||
|
exit(1);
|
||||||
|
} elseif ($opts->domain) {
|
||||||
|
if ($opts->device) {
|
||||||
|
discover_device($opts->device, $opts->domain);
|
||||||
|
} else {
|
||||||
|
discover_service($opts->service, $opts->domain);
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
} elseif ($opts->device) {
|
||||||
|
discover_device($opts->device, $opts->domain);
|
||||||
|
exit(0);
|
||||||
|
} elseif ($opts->service) {
|
||||||
|
discover_service($opts->service, $opts->domain);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if ($opts->uuid && ($opts->service || $opts->device || $opts->all || $opts->root)) {
|
||||||
|
echo "You can't combine --uuid with the other search types\n";
|
||||||
|
exit(1);
|
||||||
|
} elseif ($opts->uuid) {
|
||||||
|
discover_uuid($opts->uuid);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($opts->all && $opts->root) {
|
||||||
|
echo "You can't specify --all and --root at the same time\n";
|
||||||
|
exit(1);
|
||||||
|
} elseif ($opts->all) {
|
||||||
|
discover_all();
|
||||||
|
exit(0);
|
||||||
|
} elseif ($opts->root) {
|
||||||
|
discover_root();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
show_help();
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
// ---- discovery functions ---------------------------------------------------
|
||||||
|
|
||||||
|
function discover_uuid($uuid) {
|
||||||
|
echo "Discovering uuid {$uuid}...\n";
|
||||||
|
}
|
||||||
|
function discover_device($device, $domain=null) {
|
||||||
|
echo "Discovering devices for {$device}...\n";
|
||||||
|
$discovery = new Discovery();
|
||||||
|
list ($device,$version)=explode(":",$device);
|
||||||
|
if ($domain) {
|
||||||
|
$target = SearchTarget::URN_DEVICE($domain,$device,$version);
|
||||||
|
} else {
|
||||||
|
$target = SearchTarget::URN_SCHEMA_DEVICE($device,$version);
|
||||||
|
}
|
||||||
|
$discovery->discover($target);
|
||||||
|
show_results($discovery);
|
||||||
|
}
|
||||||
|
function discover_service($service, $domain=null) {
|
||||||
|
echo "Discovering services for {$service}...\n";
|
||||||
|
$discovery = new Discovery();
|
||||||
|
list ($service,$version)=explode(":",$service);
|
||||||
|
if ($domain) {
|
||||||
|
$target = SearchTarget::URN_SERVICE($domain,$service,$version);
|
||||||
|
} else {
|
||||||
|
$target = SearchTarget::URN_SCHEMA_SERVICE($service,$version);
|
||||||
|
}
|
||||||
|
$discovery->discover($target);
|
||||||
|
show_results($discovery);
|
||||||
|
}
|
||||||
|
function discover_all() {
|
||||||
|
echo "Discovering all devices...\n";
|
||||||
|
$discovery = new Discovery();
|
||||||
|
$discovery->discover(SearchTarget::ALL);
|
||||||
|
show_results($discovery);
|
||||||
|
}
|
||||||
|
function discover_root() {
|
||||||
|
echo "Discovering root devices...\n";
|
||||||
|
$discovery = new Discovery();
|
||||||
|
$discovery->discover(SearchTarget::ROOT_DEVICE);
|
||||||
|
show_results($discovery);
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_results(Discovery $discovery) {
|
||||||
|
foreach ($discovery as $device) {
|
||||||
|
printf(" %s: %s (%s) %s [%s]\n",
|
||||||
|
$device->getFriendlyName(),
|
||||||
|
$device->getModelName(),
|
||||||
|
$device->getManufacturer(),
|
||||||
|
$device->getDeviceType(),
|
||||||
|
$device->getIp()
|
||||||
|
);
|
||||||
|
foreach ($device->getServices() as $service) {
|
||||||
|
printf(" + %s\n", $service->getServiceType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -13,5 +13,8 @@
|
|||||||
"psr-4": {
|
"psr-4": {
|
||||||
"NoccyLabs\\UPnP\\": "src/"
|
"NoccyLabs\\UPnP\\": "src/"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"bin": [
|
||||||
|
"bin/upnp-discover"
|
||||||
|
]
|
||||||
}
|
}
|
@ -93,6 +93,46 @@ class Device
|
|||||||
return $this->ip;
|
return $this->ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getDevices()
|
||||||
|
{
|
||||||
|
return $this->devices;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getServices()
|
||||||
|
{
|
||||||
|
return $this->services;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFriendlyName()
|
||||||
|
{
|
||||||
|
return $this->friendlyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDeviceType()
|
||||||
|
{
|
||||||
|
return $this->deviceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getManufacturer()
|
||||||
|
{
|
||||||
|
return $this->manufacturer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getModelName()
|
||||||
|
{
|
||||||
|
return $this->modelName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getModelDescription()
|
||||||
|
{
|
||||||
|
return $this->modelDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUrl()
|
||||||
|
{
|
||||||
|
return $this->specUrl;
|
||||||
|
}
|
||||||
|
|
||||||
public function __toString()
|
public function __toString()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -35,6 +35,31 @@ class Service
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getServiceType()
|
||||||
|
{
|
||||||
|
return $this->serviceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getServiceId()
|
||||||
|
{
|
||||||
|
return $this->serviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getScpdUrl()
|
||||||
|
{
|
||||||
|
return $this->scpdUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getControlUrl()
|
||||||
|
{
|
||||||
|
return $this->controlUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEventSubUrl()
|
||||||
|
{
|
||||||
|
return $this->eventSubUrl;
|
||||||
|
}
|
||||||
|
|
||||||
public function __toString()
|
public function __toString()
|
||||||
{
|
{
|
||||||
return sprintf("Service: %s [%s]\nControl URL: %s\nEventSub URL: %s\nSCPD URL: %s\n",
|
return sprintf("Service: %s [%s]\nControl URL: %s\nEventSub URL: %s\nSCPD URL: %s\n",
|
||||||
|
Loading…
Reference in New Issue
Block a user