Skip to content

Commit

Permalink
Merge pull request #1433 from mosen/feature/package_discovery
Browse files Browse the repository at this point in the history
Package discovery and more testing
  • Loading branch information
mosen authored Jan 11, 2022
2 parents 02cc679 + 9fa5c87 commit 46c8894
Show file tree
Hide file tree
Showing 20 changed files with 442 additions and 63 deletions.
10 changes: 6 additions & 4 deletions app/Http/Controllers/Api/BusinessUnitsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
use App\Http\Controllers\Controller;
use App\Http\Resources\BusinessUnits;
use App\Http\Resources\BusinessUnit as BusinessUnitResource;
use Illuminate\Contracts\Support\Responsable;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class BusinessUnitsController extends Controller
{
Expand Down Expand Up @@ -48,12 +50,12 @@ public function update(Request $request, BusinessUnit $businessUnit)
/**
* Remove the specified resource from storage.
*
* @param \App\BusinessUnit $businessUnit
* @return \Illuminate\Http\Response
* @param \App\BusinessUnit $businessUnit
* @return Response
*/
public function destroy(BusinessUnit $businessUnit)
public function destroy(BusinessUnit $businessUnit): Response
{
$businessUnit->delete();
return abort(204);
return response(null, 204);
}
}
2 changes: 1 addition & 1 deletion app/Http/Controllers/Api/MachineGroupsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,6 @@ public function update(Request $request, MachineGroup $machineGroup)
public function destroy(MachineGroup $machineGroup)
{
$machineGroup->delete();
return abort(204);
return response(null, 204);
}
}
16 changes: 15 additions & 1 deletion app/Http/Controllers/Api/ModulesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,23 @@
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Resources\UserContactMethods;
use App\Packages;
use App\Http\Resources\Packages as PackagesResource;
use App\User;
use Illuminate\Contracts\Support\Responsable;
use Illuminate\Http\Request;

class ModulesController extends Controller
{
//
public function __construct(Packages $packages)
{
$this->packages = $packages;
}

public function index()
{
$modules = $this->packages->modules();
return new PackagesResource(collect($modules));
}
}
2 changes: 1 addition & 1 deletion app/Http/Controllers/Api/UsersContactMethodsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,6 @@ public function update(Request $request, int $userId, UserContactMethod $contact
public function destroy(int $userId, UserContactMethod $contactMethod)
{
$contactMethod->delete();
return abort(204);
return response(null, 204);
}
}
2 changes: 1 addition & 1 deletion app/Http/Controllers/Api/UsersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,6 @@ public function update(Request $request, User $user)
public function destroy(User $user)
{
$user->delete();
return abort(204);
return response(null, 204);
}
}
28 changes: 28 additions & 0 deletions app/Http/Resources/Packages.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace App\Http\Resources;

use Composer\Package\CompletePackage;
use Illuminate\Http\Resources\Json\ResourceCollection;

class Packages extends ResourceCollection
{
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return $this->collection->map(function (CompletePackage $package) {
return [
'name' => $package->getName(),
'prettyName' => $package->getPrettyName(),
'version' => $package->getVersion(),
'prettyVersion' => $package->getPrettyVersion(),
'description' => $package->getDescription(),
];
})->toArray();
}
}
100 changes: 100 additions & 0 deletions app/Packages.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
<?php

namespace App;

use Composer\Composer;
use Composer\Factory;
use Composer\IO\BufferIO;
use Composer\Package\Link;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;

/**
* The packages model provides an index of installed packages via composer which provide modules.
*
* It is registered into the DI container by PackageServiceProvider
*/
class Packages
{
public function __construct()
{
$io = new BufferIO();

// When invoked from the web application, Composer will assume public/ contains a composer.json
// So, we need to hint the actual location of composer.json
$composer = Factory::create($io);

$this->composer = $composer;
$this->io = $io;
}

/**
* Get a list of all Composer packages installed.
*
* @return array|null
*/
public function index()
{
$mr = $this->composer->getPackage();

if ($mr === null) {
Log::alert('composer returned a null package, maybe you have removed composer.json/composer.lock or it is not accessible by the webserver');
Log::info($this->io->getOutput());

return null;
}

$packages = [];

$localRepo = $this->composer->getRepositoryManager()->getLocalRepository();

foreach ($this->composer->getPackage()->getRequires() as $required) {
if ($required instanceof Link)
{
$p = $localRepo->findPackage($required->getTarget(), $required->getConstraint());
if ($p === null) continue;
$packages[] = $p->getPrettyString();
}
}

return $packages;
}

/**
* Get a list of Composer packages installed which are MunkiReport PHP modules, either:
*
* - Name starts `munkireport/`
* - composer.json extras contains `munkireport` key
*
* @return array|null
*/
public function modules()
{
$mr = $this->composer->getPackage();

if ($mr === null) {
Log::alert('composer returned a null package, maybe you have removed composer.json/composer.lock or it is not accessible by the webserver');
Log::info($this->io->getOutput());

return null;
}

$packages = [];
$localRepo = $this->composer->getRepositoryManager()->getLocalRepository();
foreach ($this->composer->getPackage()->getRequires() as $required) {
if ($required instanceof Link) {
$p = $localRepo->findPackage($required->getTarget(), $required->getConstraint());
if ($p === null) continue;
if (Arr::has($p->getExtra(), 'munkireport')) {
$packages[] = $p;
} else {
if (!Str::startsWith($p->getName(), 'munkireport/')) continue;
$packages[] = $p;
}
}
}

return $packages;
}
}
38 changes: 38 additions & 0 deletions app/Providers/PackageServiceProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace App\Providers;

use App\Packages;
use Composer\Composer;
use Composer\Factory;
use Composer\IO\BufferIO;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\ServiceProvider;

class PackageServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}

/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
$config = realpath(__DIR__ . '/../../composer.json');
Log::alert($config);

$this->app->singleton(Packages::class, function ($app) use ($config) {
return new Packages;
});
}
}
21 changes: 18 additions & 3 deletions app/Providers/RouteServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ public function boot()
*/
public function map()
{
$this->mapClientRoutes();

$this->mapApiRoutes();

$this->mapWebRoutes();
Expand Down Expand Up @@ -96,9 +98,7 @@ protected function mapApiRoutes()
}

/**
* Define the "checkin" routes for the application.
*
* These routes don't use normal authentication middleware.
* Define the unauthenticated routes for the application.
*
* @return void
*/
Expand All @@ -108,4 +108,19 @@ protected function mapOpenRoutes()
->namespace($this->namespace)
->group(base_path('routes/open.php'));
}


/**
* Define the client inventory reporting/submission routes.
*
* These routes use AuthN methods supported by clients.
*
* @return void
*/
protected function mapClientRoutes()
{
Route::middleware('client.passphrase')
->namespace($this->namespace)
->group(base_path('routes/client.php'));
}
}
53 changes: 27 additions & 26 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,31 @@
},
"require": {
"php": ">=7.3",
"ext-dom": "*",
"ext-json": "*",
"ext-pdo": "*",
"aacotroneo/laravel-saml2": "^2.1",
"adldap2/adldap2": "^10",
"adldap2/adldap2-laravel": "^6.1",
"anhskohbo/no-captcha": "^3.2",
"bordoni/phpass": "^0.3",
"composer/composer": "^2.2",
"defuse/php-encryption": "^2.1",
"doctrine/dbal": "^2.10",
"fideloper/proxy": "^4.4",
"fruitcake/laravel-cors": "^2.0",
"ext-dom": "*",
"guzzlehttp/guzzle": "^7.0.1",
"laravel-notification-channels/microsoft-teams": "^1.1",
"laravel/framework": "^8.0",
"laravel/legacy-factories": "^1.1",
"laravel/sanctum": "^2.13",
"laravel/scout": "8.6",
"laravel/slack-notification-channel": "^2.3",
"laravel/tinker": "^2.5",
"bordoni/phpass": "^0.3",
"rodneyrehm/plist": "^2.0",
"defuse/php-encryption": "^2.1",
"munkireport/ard": "^3.0",
"munkireport/event": "dev-master",
"munkireport/disk_report": "dev-master",
"munkireport/munkireport": "dev-master",
"laravel/ui": "^3.0",
"munkireport/applications": "dev-master",
"munkireport/appusage": "dev-master",
"munkireport/ard": "^3.0",
"munkireport/backup2go": "dev-master",
"munkireport/bluetooth": "^2.0",
"munkireport/caching": "dev-master",
Expand All @@ -47,7 +57,9 @@
"munkireport/detectx": "dev-master",
"munkireport/devtools": "^1.0",
"munkireport/directory_service": "dev-master",
"munkireport/disk_report": "dev-master",
"munkireport/displays_info": "dev-master",
"munkireport/event": "dev-master",
"munkireport/extensions": "dev-master",
"munkireport/fan_temps": "dev-master",
"munkireport/filevault_escrow": "^1.0",
Expand All @@ -69,6 +81,7 @@
"munkireport/mdm_status": "^1.6",
"munkireport/munki_facts": "^1.0",
"munkireport/munkiinfo": "^1.0",
"munkireport/munkireport": "dev-master",
"munkireport/munkireportinfo": "^1.0",
"munkireport/network": "^3.0",
"munkireport/network_shares": "^1.0",
Expand All @@ -90,27 +103,15 @@
"munkireport/user_sessions": "^1.0",
"munkireport/warranty": "^4.0",
"munkireport/wifi": "^1.0",
"symfony/yaml": "^5.1",
"adldap2/adldap2": "^10",
"onelogin/php-saml": "^3.0",
"ext-json": "*",
"ext-pdo": "*",
"laravel/ui": "^3.0",
"doctrine/dbal": "^2.10",
"aacotroneo/laravel-saml2": "^2.1",
"adldap2/adldap2-laravel": "^6.1",
"anhskohbo/no-captcha": "^3.2",
"nuwave/lighthouse": "^5.33.0",
"composer/composer": "^2.2",
"onelogin/php-saml": "^3.0",
"pragmarx/firewall": "^2.3",
"laravel/sanctum": "^2.13",
"xkerman/restricted-unserialize": "^1.1",
"laravel/slack-notification-channel": "^2.3",
"laravel-notification-channels/microsoft-teams": "^1.1",
"wikimedia/composer-merge-plugin": "^2.0",
"laravel/scout": "8.6",
"rodneyrehm/plist": "^2.0",
"rybakit/msgpack": "^0.9.0",
"symfony/yaml": "^5.1",
"teamtnt/laravel-scout-tntsearch-driver": "^11.3",
"laravel/legacy-factories": "^1.1"
"wikimedia/composer-merge-plugin": "^2.0",
"xkerman/restricted-unserialize": "^1.1"
},
"autoload": {
"classmap": [],
Expand Down
1 change: 1 addition & 0 deletions routes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
});

Route::group(['prefix' => 'v6', 'namespace' => 'Api', 'middleware' => 'auth:sanctum'], function () {
Route::apiResource('modules', 'ModulesController');
Route::apiResource('business_units', 'BusinessUnitsController');
Route::apiResource('machine_groups', 'MachineGroupsController');
Route::apiResource('users', 'UsersController');
Expand Down
Loading

0 comments on commit 46c8894

Please sign in to comment.