mirror of
https://github.com/anikeen-com/print-cli.git
synced 2026-03-14 14:16:19 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bbc50dc6dd | ||
|
|
5d0caeda1c | ||
|
|
a4451e3556 | ||
|
|
60ace31331 | ||
|
|
cc20006f3d | ||
|
|
2433ec846c |
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Commands;
|
namespace App\Commands;
|
||||||
|
|
||||||
|
use Illuminate\Http\Client\ConnectionException;
|
||||||
use Illuminate\Http\Client\RequestException;
|
use Illuminate\Http\Client\RequestException;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Illuminate\Support\Facades\Http;
|
use Illuminate\Support\Facades\Http;
|
||||||
@@ -35,16 +36,33 @@ class ServeCommand extends Command
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the console command.
|
* Execute the console command.
|
||||||
* @throws RequestException
|
|
||||||
*/
|
*/
|
||||||
public function handle(): void
|
public function handle(): void
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->serve();
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
if ($e instanceof RequestException && $e->response->status() === 422) {
|
||||||
|
$this->error('Please check your configuration and try again.');
|
||||||
|
$this->error($e->response->json()['message']);
|
||||||
|
} else {
|
||||||
|
$this->error($e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws RequestException
|
||||||
|
* @throws ConnectionException
|
||||||
|
*/
|
||||||
|
private function serve(): void
|
||||||
{
|
{
|
||||||
$this->info('Starting service...');
|
$this->info('Starting service...');
|
||||||
|
|
||||||
$yaml = $this->getConfiguration();
|
$yaml = $this->getConfiguration();
|
||||||
$printerIds = array_map(fn($printer) => $printer['id'], $yaml['printers']);
|
$printerIds = array_map(fn($printer) => $printer['id'], $yaml['printers']);
|
||||||
|
|
||||||
$response = Http::patch(sprintf('%s/api/printers/register', $yaml['base_url']), [
|
$response = Http::acceptJson()->patch(sprintf('%s/api/printers/register', $yaml['base_url']), [
|
||||||
'printers' => $yaml['printers'],
|
'printers' => $yaml['printers'],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -54,7 +72,7 @@ class ServeCommand extends Command
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
try {
|
try {
|
||||||
$response = Http::get(sprintf('%s/api/printers/jobs', $yaml['base_url']), [
|
$response = Http::acceptJson()->get(sprintf('%s/api/printers/jobs', $yaml['base_url']), [
|
||||||
'printer_ids' => $printerIds,
|
'printer_ids' => $printerIds,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -92,12 +110,13 @@ class ServeCommand extends Command
|
|||||||
private function getConfiguration(): array
|
private function getConfiguration(): array
|
||||||
{
|
{
|
||||||
$this->info('Reading configuration...');
|
$this->info('Reading configuration...');
|
||||||
$yaml = file_get_contents(base_path('print-cli.yml'));
|
$yaml = file_get_contents(getcwd() . '/print-cli.yml');
|
||||||
return Yaml::parse($yaml);
|
return Yaml::parse($yaml);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RequestException
|
* @throws RequestException
|
||||||
|
* @throws ConnectionException
|
||||||
*/
|
*/
|
||||||
private function handleJob(array $job, mixed $yaml): void
|
private function handleJob(array $job, mixed $yaml): void
|
||||||
{
|
{
|
||||||
@@ -150,10 +169,11 @@ class ServeCommand extends Command
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RequestException
|
* @throws RequestException
|
||||||
|
* @throws ConnectionException
|
||||||
*/
|
*/
|
||||||
private function markCompleted(array $job, mixed $yaml, int $jobId): void
|
private function markCompleted(array $job, mixed $yaml, int $jobId): void
|
||||||
{
|
{
|
||||||
$response = Http::patch(sprintf('%s/api/printers/jobs/%s/complete', $yaml['base_url'], $job['id']), [
|
$response = Http::acceptJson()->patch(sprintf('%s/api/printers/jobs/%s/complete', $yaml['base_url'], $job['id']), [
|
||||||
'job_id' => $jobId,
|
'job_id' => $jobId,
|
||||||
]);
|
]);
|
||||||
$response->throw();
|
$response->throw();
|
||||||
@@ -161,10 +181,11 @@ class ServeCommand extends Command
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RequestException
|
* @throws RequestException
|
||||||
|
* @throws ConnectionException
|
||||||
*/
|
*/
|
||||||
private function markFailed(array $job, mixed $yaml, string $reason): void
|
private function markFailed(array $job, mixed $yaml, string $reason): void
|
||||||
{
|
{
|
||||||
$response = Http::patch(sprintf('%s/api/printers/jobs/%s/fail', $yaml['base_url'], $job['id']), [
|
$response = Http::acceptJson()->patch(sprintf('%s/api/printers/jobs/%s/fail', $yaml['base_url'], $job['id']), [
|
||||||
'reason' => $reason,
|
'reason' => $reason,
|
||||||
]);
|
]);
|
||||||
$response->throw();
|
$response->throw();
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
"guzzlehttp/guzzle": "^7.8",
|
"guzzlehttp/guzzle": "^7.8",
|
||||||
"illuminate/http": "^11.5",
|
"illuminate/http": "^11.5",
|
||||||
"laravel-zero/framework": "^11.0.0",
|
"laravel-zero/framework": "^11.0.0",
|
||||||
"smalot/cups-ipp": "dev-master",
|
"ghostzero/cups-ipp": "^1.0",
|
||||||
"symfony/yaml": "^7.1"
|
"symfony/yaml": "^7.1"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
@@ -28,12 +28,6 @@
|
|||||||
"mockery/mockery": "^1.6.11",
|
"mockery/mockery": "^1.6.11",
|
||||||
"pestphp/pest": "^2.34.7"
|
"pestphp/pest": "^2.34.7"
|
||||||
},
|
},
|
||||||
"repositories": [
|
|
||||||
{
|
|
||||||
"type": "vcs",
|
|
||||||
"url": "https://github.com/ghostzero/cups-ipp.git"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"App\\": "app/",
|
"App\\": "app/",
|
||||||
|
|||||||
631
composer.lock
generated
631
composer.lock
generated
File diff suppressed because it is too large
Load Diff
152
raspberry.md
Normal file
152
raspberry.md
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
# Installation
|
||||||
|
|
||||||
|
Installing Print-CLI on a Raspberry Pi is a quite simple process but requires some time installing the required
|
||||||
|
packages. This guide will help you to install Print-CLI on a Raspberry Pi.
|
||||||
|
|
||||||
|
Estimated time: 30-60 minutes
|
||||||
|
|
||||||
|
## Step 1: Install the Raspberry Pi OS
|
||||||
|
|
||||||
|
Before we start, make sure you have created a bootable SD card with the **Ubuntu Server 22.04 LTS 64-bit** image. The
|
||||||
|
simplest way is to use the Raspberry Pi Imager which enables you to select an Ubuntu image when flashing your SD card.
|
||||||
|
|
||||||
|
Recommended configuration:
|
||||||
|
|
||||||
|
- **OS**: Ubuntu Server 22.04 LTS 64-bit
|
||||||
|
- **Username**: print-cli
|
||||||
|
|
||||||
|
## Step 2: Install Required Packages
|
||||||
|
|
||||||
|
Next, we need to install the required packages for Print-CLI to work. Run the following commands and grab a coffee while
|
||||||
|
the packages are being installed (it may take a while):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo add-apt-repository ppa:ondrej/php
|
||||||
|
sudo apt-get install -y git cups zip unzip supervisor \
|
||||||
|
composer php-zip php-curl php-xml php-mbstring
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally, add the Composer bin directory to your PATH, so you can run the `print-cli` command from anywhere:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo 'export PATH="$PATH:$HOME/.config/composer/vendor/bin"' >> ~/.bashrc
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 3: Ensure CUPS is Running
|
||||||
|
|
||||||
|
Now we need to ensure that the CUPS service is running. CUPS is the printing system used by Print-CLI to send print jobs
|
||||||
|
to the printer. This is the most important step, so make sure you follow it carefully, otherwise, Print-CLI won't work
|
||||||
|
as expected, and you won't be able to print anything.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo cupsctl --remote-admin --remote-any
|
||||||
|
sudo usermod -aG lpadmin print-cli
|
||||||
|
sudo /etc/init.d/cups restart
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure the CUPS service is running by visiting the following URL in your browser:
|
||||||
|
|
||||||
|
```text
|
||||||
|
https://10.20.0.195:631/printers/
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see a page with a list of printers. If you don't see any printers, you may need to add one manually.
|
||||||
|
|
||||||
|
Ensure that you can print a test page by clicking on the printer name and selecting "Print Test Page".
|
||||||
|
|
||||||
|
### Find the Printer Address
|
||||||
|
|
||||||
|
To find the printer address, visit your Printers page in CUPS, and click on the printer name. The address in the browser
|
||||||
|
should look like this:
|
||||||
|
|
||||||
|
```text
|
||||||
|
https://10.20.0.195:631/printers/EPSON_ET_2720_Series
|
||||||
|
```
|
||||||
|
|
||||||
|
It contains the Name of the printer, which is the `printer-name` part. You can use this address in the configuration
|
||||||
|
file for Print-CLI. In most cases, just replace the `https` with `ipp` and replace the ip to `127.0.0.1`:
|
||||||
|
|
||||||
|
```text
|
||||||
|
ipp://127.0.0.1:631/printers/EPSON_ET_2720_Series
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 4: Install Print-CLI
|
||||||
|
|
||||||
|
So far, we have installed all the required packages and ensured that CUPS is running. Now we can install Print-CLI using
|
||||||
|
Composer, the PHP package manager. Run the following command to install Print-CLI globally:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer global require anikeen/print-cli
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also use the same command to update Print-CLI to the latest version:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer global require anikeen/print-cli
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 5: Configure Print-CLI
|
||||||
|
|
||||||
|
In this tutorial, we're using the home directory of the `print-cli` user to store the configuration file. If you're
|
||||||
|
using a different user, make sure to replace `print-cli` with the correct username.
|
||||||
|
|
||||||
|
Next create a configuration file `~/print-cli.yml`, and add the following content:
|
||||||
|
|
||||||
|
> Make sure to replace the `license_key`, `your-printer-uuid`, `address`, `username`, and `password` with your own
|
||||||
|
> values. Also make sure to replace the `base_url` with the correct URL to our events platform.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
base_url: 'https://events.anikeen.com'
|
||||||
|
license_key: 'your-license-key'
|
||||||
|
printers:
|
||||||
|
- id: 'your-printer-uuid'
|
||||||
|
name: EPSON ET 2750
|
||||||
|
driver: cups
|
||||||
|
address: 'ipp://127.0.0.1:631/printers/EPSON_ET_2720_Series'
|
||||||
|
username: 'print-cli'
|
||||||
|
password: 'password'
|
||||||
|
```
|
||||||
|
|
||||||
|
To test the configuration, run the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
print-cli serve
|
||||||
|
```
|
||||||
|
|
||||||
|
If everything is configured correctly, you should see the following output:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Starting service...
|
||||||
|
Reading configuration...
|
||||||
|
Service started!
|
||||||
|
```
|
||||||
|
|
||||||
|
You can exit the service by pressing `Ctrl+C`.
|
||||||
|
|
||||||
|
## Step 6: Supervisor Configuration
|
||||||
|
|
||||||
|
To run Print-CLI as a service, we can use Supervisor. Supervisor is a process control system that allows you to monitor
|
||||||
|
and control a number of processes on UNIX-like operating systems.
|
||||||
|
|
||||||
|
Create a new configuration file `/etc/supervisor/conf.d/print-cli.conf`:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[program:print-cli]
|
||||||
|
directory = /home/print-cli
|
||||||
|
command = /usr/bin/php /home/print-cli/.config/composer/vendor/bin/print-cli serve
|
||||||
|
autostart = true
|
||||||
|
autorestart = true
|
||||||
|
stderr_logfile = /var/log/print-cli.err.log
|
||||||
|
stdout_logfile = /var/log/print-cli.out.log
|
||||||
|
stopwaitsecs = 3600
|
||||||
|
user = print-cli
|
||||||
|
```
|
||||||
|
|
||||||
|
Now, update Supervisor to read the new configuration file and start the Print-CLI service:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo supervisorctl reread
|
||||||
|
sudo supervisorctl update
|
||||||
|
sudo supervisorctl start print-cli
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user