Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • 15:51

    Badgerati on Issue-1046

    #1046: minor tweak to version s… (compare)

  • 15:42

    Badgerati on Issue-1046

    #1046: update packaging to refe… (compare)

  • 13:53
    Badgerati milestoned #1030
  • 13:53
    Badgerati demilestoned #1030
  • 13:53
    Badgerati milestoned #1007
  • 13:53
    Badgerati demilestoned #1007
  • 13:51
    Badgerati milestoned #1046
  • 13:51
    Badgerati assigned #1046
  • Jan 26 09:13
    Skakiz labeled #1073
  • Jan 26 09:13
    Skakiz opened #1073
  • Jan 25 19:01
    Badgerati commented #1007
  • Jan 25 18:54
    Badgerati commented #1046
  • Jan 25 18:29

    Badgerati on Issue-1046

    #1046: add a Pode.Internal modu… (compare)

  • Jan 23 19:14
    robpitcher commented #1007
  • Jan 22 15:20
    Badgerati commented #1046
  • Jan 22 14:17
    ili101 commented #1046
  • Jan 21 22:24
    Badgerati commented #1007
  • Jan 21 22:11

    Badgerati on Issue-1007

    #1007: set originating redirect… (compare)

  • Jan 21 21:21
    Badgerati commented #1046
  • Jan 21 20:53

    Badgerati on Issue-1046

    #1046: re-filter module list fo… (compare)

Matthew Kelly
@Badgerati

Hey @samuelleb11, that is strange 🤔 it should be working; I've got a couple containers running in k8s running fine. I was just playing with one in minikube this morning haha, it's server.ps1 looks like:

Start-PodeServer {
    Add-PodeEndpoint -Address * -Port 80 -Protocol Http

    Add-PodeRoute -Method Get -Path '/' -ScriptBlock {
        # logic
    }
}

and it's dockerfile:

FROM badgerati/pode:latest
COPY ./server.ps1 /usr/src/app/
EXPOSE 80
CMD [ "pwsh", "-c", "cd /usr/src/app; ./server.ps1" ]

in raw docker I have to have docker run -p 9000:80, or in compose:

ports:
  - "9000:80"

Are you able to show an example of your dockerfile/compose file? And is the issue that you run the container and then can't hit it from the host (but can from the container itself), or you can hit it from the host but not from another machine?

And as per Robin's comment, make sure it's running as admin :)

Robin Beismann
@RobinBeismann

Hey @Badgerati,

I am currently testing Pode as REST API for custom checks to be carried out via the monitoring systems (in our case, PRTG). We don't want to enter highly privileged credentials into the monitoring system so a REST API with certain endpoints on the servers would be a good fit.
However the memory footprint is quite important as it would run on 400 systems, I can't really get it under 90mb with atm 4 Routes and 2 Threads, I tried with both PowerShell 7.1.x and 5.1. Do you see any chance how I can tweak it to use less memory?

I already disabled all module imports and ran it with -NoProfile:

@{
    Server = @{
        FileMonitor = @{
            Enable = $false
            Include = @("*.ps1", "*.pode")
        }
        AutoImport = @{
            Modules = @{
                Enable = $false
            }            
            Snapins = @{
                Enable = $false
            }
            Functions = @{
                Enable = $false
            }
        }
    }
    Web = @{
        TransferEncoding = @{
            Default = "gzip"
        }
        Static = @{
            Cache = @{
                Enable = $false               
                Include = @(
                    "*"
                )
                MaxAge = 604800
            }
        }
    }
}
1 reply
Dementor 🇮🇱
@the-mentor:matrix.org
[m]
Since he doesn't get alerts for messages here
Robin Beismann
@RobinBeismann
Ah right, forgot about it, thanks! I'll post the same on discord in the Pode Server.
Craig Dayton
@cadayton
Hi @Badgerati, Anything special that needs to be done to run the server.ps1 as a Windows Service. It is working fine from the CLI, but when invoked as a service it doesn't remain listening for requests. Here is the code block that is creating the service using NSSM.
$powerShell  = $svr.PowerShell
$scriptPath  = $svr.ScriptPath
Write-Host "  Installing " -NoNewLine -ForegroundColor Green
Write-Host $serviceName -NoNewline -ForegroundColor Yellow
Write-Host " as a Windows service" -ForegroundColor Green
$nssm = (Get-Command nssm).Source
$pscmd = (Get-Command $powerShell).Source
$arguments = '-ExecutionPolicy Bypass -NoProfile -File "{0}"' -f $scriptPath
& $nssm install $serviceName $pscmd $arguments
& $nssm status $serviceName
Craig Dayton
@cadayton
image.png
Ended up just using Start-Process run server.ps1. Not as clean but it works.
Matthew Kelly
@Badgerati

Hey @cadayton, that should be about all that's needed. Few questions though, is $scriptPath a relative or literal path? In the docs I used -Command instead of -File - any difference there if you change it?

On the last line you've got nssm status <name> is that a typo here and meant to be nssm start <name>?

Failing all of that, there's a change an error could be being thrown, so wrapping the whole server.ps1 in a try/catch could give some hints; something like:

try {
    Start-PodeServer, etc, etc
}
catch {
    $_.Exception.Message | Out-File C:/temp/pode_errors.txt
}
Craig Dayton
@cadayton
Thanks Matthew. It is just the literal path as seen as 'Executing' in the last screen shot. 'nssm status' is intentiional this logic is just installing the service and the service gets started when the Tor service is started. I'll try the -Command option and the try/catch combo too. Thanks again.
Craig Dayton
@cadayton
The catch statement is outputting the following. Very first statement in the server.ps1 script is Import-Module Pode -Global. So stumped as to why it is not being found.
The term 'Start-PodeServer' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
PJ
@panekj:matrix.org
[m]
you could add #Require -Modules Pode
but you could check where the Pode is installed
if it's in user scope, it might not work :>
get-module Pode -All -ListAvailable
Craig Dayton
@cadayton
Thanks!! @panekj:matrix.org . I installed module with a scope of 'currentuser'. So I think you've figured it out, so makes sense why the local system account can't find it.
PJ
@panekj:matrix.org
[m]
yup
PJ
@panekj:matrix.org
[m]
huh, thought it was easier to find out in which scope the module is, seems like looking up paths is the only way
Craig Dayton
@cadayton
Just confirming that re-installing the Pode and Pode.Web module with a scope of AllUsers has resolved my issue of not being able to run it as a Windows service.
PS>nssm start PodeWebFull
PodeWebFull: START: The operation completed successfully.
Thanks all for your second pair of eyes.
Craig Dayton
@cadayton
Now that I have a better understanding of tor and V3 Onion Services, I can get back to doing more Pode experimentation.
Samuel Gagnon
@samuelleb11
Can someone help me understand why I get this after using Reset-PodeWebPage in a Modal ?
Date: 2021-10-12 16:16:01
at Invoke-PodeScriptBlock, C:\Users\sgagnon\Documents\PowerShell\Modules\Pode\2.4.2\Public\Utilities.ps1: line 662
at <ScriptBlock>, <No file>: line 107

Date: 2021-10-12 16:16:01
Level: Error
ThreadId: 3
Server: WH-DESK04
Category: System.Private.CoreLib
Message: Collection was modified; enumeration operation may not execute.
StackTrace:    at System.Collections.Hashtable.HashtableEnumerator.MoveNext()
   at System.Management.Automation.EnumerableOps.FlattenResults(Object o, List`1 result)
   at System.Management.Automation.EnumerableOps.PropertyGetterWorker(CallSite`1 getMemberBinderSite, IEnumerator enumerator, ExecutionContext context, List`1 result)
   at System.Management.Automation.EnumerableOps.PropertyGetter(PSGetMemberBinder binder, IEnumerator enumerator)
   at Get-PodeRoute(Closure , FunctionContext )
Samuel Gagnon
@samuelleb11
And, is there a way of passing more then one argument to Modals ?
Matthew Kelly
@Badgerati
Oooo, that's interesting! I'll test reset-page in a modal when I get chance, because that shouldn't be happening; especially in Get-PodeRoute as well 🤔
By arguments, do you mean -ArgumentList, or something else?
Samuel Gagnon
@samuelleb11
Yes, now the only option I have is -DataValue
My solution is to merge objects properties that I need into one object and the convert it to JSON. Then in the modal ScriptBlock section I do a ConvertFrom-Json
Samuel Gagnon
@samuelleb11
Also, it seems that using custom modules cmdlets in a modal's ScriptBlock tends to block it. I then use Invoke-Command and pipe it into Out-Null to fix the issue.
Matthew Kelly
@Badgerati
the -ArgumentList is an object[], so you shouldbe able to do something like the following 🤔
New-PodeWebModal -ArgumentList $obj1, $obj2, $obj3 -ScriptBlock {
    param($obj1, $obj2, $obj3)
}
They shouldn't block, what's the cmdlet doing?
Samuel Gagnon
@samuelleb11
But then how do I pass the object from a foreach while building the page ?
Matthew Kelly
@Badgerati
Have you got a script example of what you're trying to achieve?
Holger Voges
@hvoges
I´ve got a problem with creating Tabs from an array. I read the configuration from a csv-file and create a list of WebTabs from it. But Pode.web is creating only one tab. Something I have missed or misunderstood here? This is the code-Snippet:
    $RoomList = Import-Csv -Path D:\Deployment\Rooms.csv -Delimiter ";" -Encoding UTF8
    $Tabs = @( Foreach ( $Room in $RoomList )
    {
        New-PodeWebTab -Name $Room.Name -Icon $Room.Icon -Layouts @(
            New-PodeWebCard -Content @(
                New-PodeWebText -Value 'Here is some Normal text.'
            )
        )

    } )

    Add-PodeWebPage -Name 'Rooms' -Icon google-classroom -ArgumentList $Tabs -ScriptBlock {
        param ($Tabs)
        New-PodeWebTabs -Tabs @($Tabs)
    }
Matthew Kelly
@Badgerati
Hi @hvoges, it'll be because -ArgumentList takes an array of objects and is then splatted onto the scriptblock. To keep the current way -ArgumentList @(,$Tabs) should do the trick, or use a hashtable instead: -ArgumentList @{ Tabs = $Tabs }
Veers01
@Veers01
Hi! I have a question about implementing AzureAD auth with Pode and Pode.web. I have a multipage site and I want to have define access control by page, not sitewide. If I use Active Directory auth, I can use the -AccessGroup or -AccessUser in add-PodeWebPage cmdlet. Is there anything equivalent for AAD? Thank you!
Matthew Kelly
@Badgerati
Hey @Veers01, it should be possible to use -AccessUsers with AAD, though you might need to set -UsernameProperty on Set-PodeWebLoginPage to either "preferred_username" or "email" to force a username property, rather than just use Pode.Web's default. For groups, it breaks a little bit there at the moment. The access_token I think should be a JWT and contains claims like the groups, but will need parsing - in the next version of Pode its ConvertFrom-PodeJwt should hopefully be moved to public :)
Veers01
@Veers01
@Badgerati Thank you, I'll try that!
Holger Voges
@hvoges
Hi @badgerati, thank you! Another Question: I want to use the chosen Value of a select-Element as an Input for another Element (Codeditor). Is there any way to preserver a value outside of a scriptblock?
New-PodeWebSelect -Name Job -Options "One","Two","Three"
In this special case I want to use the Chosen Value for an input for the Codeditior, but as there is currently no update-PodeWebCodeEditor, I cannot edit the Element inside the PodeWebSelect-Scriptblock.
2 replies
Miodrag Milić
@majkinetor
Hi @Badgerati , long time no see. I was thinking of creating web cron via Pode, like task scheduler on Windows just via web. So i am interested in the following : di you try to stress test scheduler ? Will it be able to run lets say 100 jobs, or job every second without losing executions, skipping them etc. I am currently using Rundeck but since they got new owners it started to suck a lot so I need alternative
image.png
As an example, here is what I want to recreated
this is a rundeck project that executes 8 powershell jobs, all are scheduled and organized into folders based on environment name. Bellow you see individual executions of jobs
each job has its properties and its own execution
image.png
and you can see CLI logs. And that it.
I tested several years ago its quartz scheduler and it was awesome.... executing thousands of jobs per day without any problem.
Do you think pode could menage something like that ?
Matthew Kelly
@Badgerati

Hey @majkinetor :D, the lowest Pode's can go down to is a minute using cron; I've never stress tested it to extreme limits but I do have a health probe running on numerous web servers which runs a minutely schedule and it's not suffered any; plus another, which is a timer, that runs every 20secs, which does the bulk of CPU/IIS/Service checks, and also running fine. The most schedules I've seen was in a Pingdom-esque site someone built, which was running like 10-20 minutely schedules without issue.

As Pode triggers schedules, they're run in their own runspace, in a pool which allows up to a max of 10 to run at the same time (we could allow this to be customised), and then queues them if the pool is full. If you did have a schedule run every minute, and one of the times it triggered it did happen to run for 2mins, then Pode would trigger the schedule another 2 times during the running one.

I've been thinking about building a scheduler like this as well in Pode, so will be interesting to see how schedules/timers perform under load 🤔

Robin Beismann
@RobinBeismann
Hey @majkinetor, we're using Jenkins for this purpose, I finally managed to onboard all jobs that have previously been running on task schedulers on various servers within the the last 2 years, now we're at 80 jobs in Jenkins and it works out great for us.
It takes a bit to get used to, especially the credential handling, but it was defo worth the effort.
Since Jenkins works a lot with Nodes, you can have the nodes as close as possible to the application you're automating. Let's say, you're automating stuff on SCCM, have a Jenkins Node on the SCCM Server and it can even use the servers local identity.
I've looked into Rundeck before too, but it has a cost so I looked into Jenkins instead.