# wireshell - an extendable ProcessWire command line interface

## Recommended Posts

wireshell 1.0.0 is out

Quote

wireshell 1.0.0

Compatibility: ProcessWire 3.x

• Prepares wireshell for ProcessWire 3.x, adds namespace support, only supports ProcessWire 3.x
• Improves module:upgrade command, if no argument is provided it just checks for upgrades
• Extends new command, adds option --src=path/to/source to be able to use a pre-downloaded tgz/zip/folder
• Extends status command, only shows database password if --pass option is provided, shows if an upgrade is available
• Updates upgrade command, removes options dev and devns

-------- Original post -----------

Now this one could be a rather long post about only an experimental niche tool, but maybe a helpful one for some, so stay with me

Intention
Do you guys know "Artisan" (Laravel) or "Drush" (Drupal)? If not: These are command line companions for said systems, and very useful for running certain (e.g. maintenance, installation) task quickly - without having to use the Admin Interface, first and foremost when dealing with local ProcessWire installations. And since it has a powerful API and an easy way of being bootstrapped into CLIs like this, I think such a tool has a certain potential in the PW universe.

It's totally not the first approach of this kind. But: this one should be easily extendable - and is based on PHP (specifically: the Console component of the Symfony Framework). Every command is tidily wrapped in its own class, dependencies are clearly visible, and so on.

( Here was the outdated documentation. Please visit wireshell.pw for the current one )
• 32

##### Share on other sites

Just as I'm in the means to build a separate directory for bugfixes, where I just paste in disposable processwire installations. Really great. Will certainly take a look at it later. I can also see this very useful for setting up base installations in a more flexible way than siteprofiles.

• 2

##### Share on other sites

Sure I will help with what I can .

Thank you.

• 4

##### Share on other sites

Great! Thanks for this, Marcus. So far, everything looks good here on Windows - have only just installed PW-dev, going to work with other commands now. (Update: Everything works like a charm. Looking forward to seeing more Commands.)

For Windows users interested in making this global:

1. Make sure PHP is in your PATH
2. Create a wireshell folder somewhere (also added to your path), and create a wireshell.bat file:
@echo off
php "path\to\wireshell" %*


Then you can run wireshell new --dev anywhere you like.

• 6

##### Share on other sites

Thanks for the positive feedback!

• Attach roles on the fly while user creation: $wireshell create-user foo --roles=superuser,editor • Create templates and attach existing fields on the fly with$ wireshell create-template contact --fields=body,sidebar , prevent template file creation with --nofile
• Command aliases now available: c-u, c-t, c-r, s

Now planning field creation.

• 6

##### Share on other sites

Ever since I learned about drush I knew PW could benefit greatly from similar tool. Great job, Marcus!

Those "with dashes in-between" comands look a little weird for a cli interface. I saw you can easilly add aliases for commands, so maybe cr showd be included as a third one (as it is quicker to type)? Drush commands comprise of an object being manipulated followed by a "manipulation type". Not saying it is the right way to go, but it is better to choose some naming pattern explicitly.

Wireshell is a bit long too... Why not add an alias like ''wish" (for WIre SHell). It sounds magical, and isn't PW a wish come true?!

Thank you for developing this!

P.S. It kind of bugs me a little that this cli tool is written with symphony, not with PW itself. I am not even close to being able to argue here, but can it even be done?

• 1

##### Share on other sites

Ever since I learned about drush I knew PW could benefit greatly from similar tool. Great job, Marcus!

Those "with dashes in-between" comands look a little weird for a cli interface. I saw you can easilly add aliases for commands, so maybe cr showd be included as a third one (as it is quicker to type)? Drush commands comprise of an object being manipulated followed by a "manipulation type". Not saying it is the right way to go, but it is better to choose some naming pattern explicitly.

Wireshell is a bit long too... Why not add an alias like ''wish" (for WIre SHell). It sounds magical, and isn't PW a wish come true?!

Thank you for developing this!

P.S. It kind of bugs me a little that this cli tool is written with symphony, not with PW itself. I am not even close to being able to argue here, but can it even be done?

Regarding aliases: Yeah, I'm aware of the dash, and wanted to try cr, cu, ct first, but in the case of "cr" Symfony Console bugged me with the following error:

So in favor of consistency (cu. ct. cro?) I went for the dash.

• 14

##### Share on other sites

Great! Thanks for this, Marcus. So far, everything looks good here on Windows - have only just installed PW-dev, going to work with other commands now. (Update: Everything works like a charm. Looking forward to seeing more Commands.)

For Windows users interested in making this global:

1. Make sure PHP is in your PATH
2. Create a wireshell folder somewhere (also added to your path), and create a wireshell.bat file:
@echo off
php "path\to\wireshell" %*


Then you can run wireshell new --dev anywhere you like.

Since Wireshell is on packagist now and "composer global require wireshell/wireshell" installs it into "~/.composer/vendor/bin/wireshell" on Linux, could you test/check what the comparable Windows path or workflow would be? I'm currently rewriting (simplifying) the installation guide. Cheers!

• 2

##### Share on other sites

On Windows, it installs to C:\Users\<user>\AppData\Roaming\Composer\vendor\wireshell\wireshell\ ... Not sure what the best way of making this global is, other than making a batch file look specifically in that directory. I must admit: I'm not a composer fundi, but I get the basics...

Update: In fact, if I run wireshell directly from the above directory (using php wireshell), it doesn't run because it's looking for vendor/autoload.php in that directory too. If I run the nasty php vendor/wireshell/wireshell/wireshell from the C:\Users\<user>\AppData\Roaming\Composer directory, it works. Phew, quite messy. But, like I said, I'm no fundi - there must be a better way to do this.

• 1

##### Share on other sites

On Windows, it installs to C:\Users\<user>\AppData\Roaming\Composer\vendor\wireshell\wireshell\ ... Not sure what the best way of making this global is, other than making a batch file look specifically in that directory. I must admit: I'm not a composer fundi, but I get the basics...

Update: In fact, if I run wireshell directly from the above directory (using php wireshell), it doesn't run because it's looking for vendor/autoload.php in that directory too. If I run the nasty php vendor/wireshell/wireshell/wireshell from the C:\Users\<user>\AppData\Roaming\Composer directory, it works. Phew, quite messy. But, like I said, I'm no fundi - there must be a better way to do this.

Thanks so far! I discovered an installation guide for "laravel install" on windows: http://www.bitspedia.com/2014/09/how-to-install-and-make-first-laravel.html :

1. Add your ~/.composer/vendor/bin path into Path environmental variable, so that Windows Command Prompt could identify laravel command that would be used later to install Laravel and doing other tasks. In my case the path where its located is: C:\Users\UserName\AppData\Roaming\Composer\vendor\bin

so I added it into my Path environmental variable. Must restart your Shell or Command-Prompt so that updated Path variables is loaded.

And when I googled "windows Path environmental variable", got this: http://www.computerhope.com/issues/ch000549.htm. This GUI/matrix seems to be the counterpart to .bashrc.

## Create an account

Register a new account

• ### Similar Content

• By noelboss
Short description of the issue
Since PW 3.0.88: When I try to retrive a croped file using the api filesManager() and it's basename, I get the original version instead of the croped variation.
Expected behaviour
Looking up a variation using the path and filesManager should return the variation file.
$page->filesManager->getFile("/path/to/filebasename.400x400.jpg"); //$file->basename > filebasename.400x400.jpg Actual behavior
The variation is returned.
$page->filesManager->getFile("/path/to/filebasename.400x400.jpg"); //$file->basename > filebasename.jpg
» Is this a bug or do I miss something here?

Code:
dump($page->filesManager->path.$input->get->filename('f')); $file =$page->filesManager->getFile($page->filesManager->path.$input->get->filename('f')); dump($file); dump($page->filesManager->path.$file->basename); Output: "/home/ubuntu/workspace/www/site/assets/files/-1579/colin-rex-434063.400x400.jpg" (79) ProcessWire\Pageimage #796f pageimages protected => ProcessWire\Pageimages #d195 original protected => ProcessWire\Pageimage #796f { RECURSION } variations private => null imageInfo private => array (2) width => 0 height => 0 error protected => "" pagefiles protected => ProcessWire\Pageimages #d195 data protected => array (6) basename => "colin-rex-434063.jpg" (20) description => "" tags => "" formatted => true modified => 1516025386 created => 1516025386 useFuel protected => true _instanceNum private => 870 localHooks protected => array () trackChanges private => 2 changes private => array (1) formatted => array (1) 0 => null _notices protected => array (3) errors => null warnings => null messages => null _wire protected => ProcessWire\ProcessWire #28d0 in .../www/site/templates/app/utils/download.php:29 "/home/ubuntu/workspace/www/site/assets/files/-1579/colin-rex-434063.jpg" (71) • Hi all, Im a bit confused by an issue I have come across today. I have a module which connects to a third party (once an hour using LazyCron), parses a publicly available XML file, turns it into useable information which I then use the API to save as PW Pages. On the whole this has been working great however today I noticed that it kept failing on one of the imports. After doing some investigation I realised its appears to be dying at the save page stage. From the documentation$page-save() should return either True/False, so I thought I would update the code to reflect this while debugging.
$this->log(1);$bool = $p->save(); if($bool){ $this->log('Saved successfully'); } else {$this->log('Fail to save'); } \$this->log(2); However the script only gets to the save() part and then appears to terminate. Then when checking the error log the latest entry is always just '1'
Any ideas as i'm a tad confused why I at least don't get a response of some kind?

• By iNoize
Hello,
for an Project i need help for an Script.
There is an XML File with all the Objects Data and Images for every object.

This is the Data Structure
http://prntscr.com/hvfo31

One XML file and Pictures.
So every Time the new Data is Uploadet via ImmoTool there have to be maybe an batch or something or an button in the Sitebackend to check the new files.

If the Status is  NEW then create an Object
if the Status is CHANGE  then make some changes
If the Status is Delete then remove the Object in other Parent

There are Basic infos in XML like Description Rooms etc.
Also the latitude and attitude for the maps.
After succsessful changes the Folder schould be empty for the next upload.

I need only help to create and handle the sites with some data (PW API ). The output I will generate by myself.

I have some basic php code

Need somebody to fix it ready for me in PW.

Tnx

• I recently started to build Vue SPAs with ProcessWire as the backend, connected with a REST API. Thanks to code and the help of @LostKobrakai (How to use FastRoute with ProcessWire) and @clsource (REST-Helper) I got it up and running pretty quickly and now have put all of it in a site profile for others to use. It includes the REST API with routing for different endpoints, JWT Auth and a simple Vue SPA which shows the process of logging in a user (nevertheless, you don't have to use the Vue part, the API will work on it's own).
Check it out here: https://github.com/thomasaull/RestApiProfile
I'm pretty sure, it's not the perfect or most sophisticsted solution, but it gets the job done for me…
Feedback or Improvements are very welcome

• In the admin, I am trying to access data from a page that contains an inputfieldand autofill that data into the modal edit window for a new entry.
For instance, I have a template which contains a PageTable field. When I add a new entry to the PageTable, I want to capture the ID from the originating admin page and add it to a field in the edit modal as a way of linking the new entry back to the originating page. The new PageTable entries are NOT children of the originating page, and cannot be for structural reasons. I have attached an image which I hope will help to clarify the basic result I want to achieve.
Is there a practical means of accomplishing this? I've been able to achieve something similar with the ConnectPageFields module, but it does not work with PageTable fields. Any input would be much appreciated.