Skip to content

Commit 698758a

Browse files
committed
modified: internal/cli/site_test.go
1 parent eb9d139 commit 698758a

File tree

3 files changed

+143
-10
lines changed

3 files changed

+143
-10
lines changed

internal/cli/site.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,15 @@ func newSiteCreateCmd(svc siteManager, rootOpts *rootOptions) *cobra.Command {
148148
},
149149
}
150150

151+
cmd.Flags().SortFlags = false
151152
cmd.Flags().BoolVar(&withWordPress, "wp", false, "install WordPress with required dependencies")
152153
cmd.Flags().BoolVar(&withLE, "le", false, "configure Let's Encrypt certificate")
154+
addPHPVersionFlags(cmd, php)
153155
cmd.Flags().BoolVar(&owasp.enable, "enable-owasp", false, "enable OWASP ModSecurity at virtual host level")
154-
cmd.Flags().BoolVar(&owasp.disable, "disable-owasp", false, "disable OWASP ModSecurity at virtual host level")
155156
cmd.Flags().BoolVar(&recaptcha.enable, "enable-recaptcha", false, "enable reCAPTCHA at virtual host level")
157+
cmd.Flags().BoolVar(&owasp.disable, "disable-owasp", false, "disable OWASP ModSecurity at virtual host level")
156158
cmd.Flags().BoolVar(&recaptcha.disable, "disable-recaptcha", false, "disable reCAPTCHA at virtual host level")
157159
cmd.Flags().BoolVar(&withHSTS, "hsts", false, "add recommended security extra headers to static context /")
158-
addPHPVersionFlags(cmd, php)
159160
return cmd
160161
}
161162

@@ -209,13 +210,14 @@ func newSiteUpdateCmd(svc siteManager, rootOpts *rootOptions) *cobra.Command {
209210
},
210211
}
211212

213+
cmd.Flags().SortFlags = false
212214
cmd.Flags().BoolVar(&withWordPress, "wp", false, "ensure WordPress and LiteSpeed Cache plugin are present")
215+
addPHPVersionFlags(cmd, php)
213216
cmd.Flags().BoolVar(&owasp.enable, "enable-owasp", false, "enable OWASP ModSecurity at virtual host level")
214-
cmd.Flags().BoolVar(&owasp.disable, "disable-owasp", false, "disable OWASP ModSecurity at virtual host level")
215217
cmd.Flags().BoolVar(&recaptcha.enable, "enable-recaptcha", false, "enable reCAPTCHA at virtual host level")
218+
cmd.Flags().BoolVar(&owasp.disable, "disable-owasp", false, "disable OWASP ModSecurity at virtual host level")
216219
cmd.Flags().BoolVar(&recaptcha.disable, "disable-recaptcha", false, "disable reCAPTCHA at virtual host level")
217220
cmd.Flags().BoolVar(&withHSTS, "hsts", false, "add recommended security extra headers to static context /")
218-
addPHPVersionFlags(cmd, php)
219221
return cmd
220222
}
221223

internal/cli/site_test.go

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,38 @@
11
package cli
22

3-
import "testing"
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/ols/ols-cli/internal/service"
8+
"github.com/spf13/pflag"
9+
)
10+
11+
type noopSiteManager struct{}
12+
13+
func (noopSiteManager) CreateSite(context.Context, service.CreateSiteOptions) error {
14+
return nil
15+
}
16+
17+
func (noopSiteManager) UpdateSitePHP(context.Context, service.UpdateSiteOptions) error {
18+
return nil
19+
}
20+
21+
func (noopSiteManager) SiteInfo(context.Context, service.SiteInfoOptions) error {
22+
return nil
23+
}
24+
25+
func (noopSiteManager) ShowSiteConfig(context.Context, service.ShowSiteConfigOptions) error {
26+
return nil
27+
}
28+
29+
func (noopSiteManager) ListSites(context.Context, service.ListSitesOptions) error {
30+
return nil
31+
}
32+
33+
func (noopSiteManager) DeleteSite(context.Context, service.DeleteSiteOptions) error {
34+
return nil
35+
}
436

537
func TestPHPFlagsSelected(t *testing.T) {
638
flags := phpFlags{v85: true}
@@ -59,3 +91,74 @@ func TestToggleFlagsSelectedConflict(t *testing.T) {
5991
t.Fatal("expected validation error for conflicting toggle flags")
6092
}
6193
}
94+
95+
func TestSiteCreateFlagOrder(t *testing.T) {
96+
cmd := newSiteCreateCmd(noopSiteManager{}, &rootOptions{})
97+
if cmd.Flags().SortFlags {
98+
t.Fatal("expected SortFlags=false for create command")
99+
}
100+
cmd.InitDefaultHelpFlag()
101+
102+
var got []string
103+
cmd.Flags().VisitAll(func(f *pflag.Flag) {
104+
got = append(got, f.Name)
105+
})
106+
107+
wantPrefix := []string{
108+
"wp",
109+
"le",
110+
"php81",
111+
"php82",
112+
"php83",
113+
"php84",
114+
"php85",
115+
"enable-owasp",
116+
"enable-recaptcha",
117+
"disable-owasp",
118+
"disable-recaptcha",
119+
"hsts",
120+
}
121+
if len(got) < len(wantPrefix) {
122+
t.Fatalf("expected at least %d flags, got %d: %#v", len(wantPrefix), len(got), got)
123+
}
124+
for i := range wantPrefix {
125+
if got[i] != wantPrefix[i] {
126+
t.Fatalf("unexpected create flag order at index %d: got %q want %q (full=%#v)", i, got[i], wantPrefix[i], got)
127+
}
128+
}
129+
}
130+
131+
func TestSiteUpdateFlagOrder(t *testing.T) {
132+
cmd := newSiteUpdateCmd(noopSiteManager{}, &rootOptions{})
133+
if cmd.Flags().SortFlags {
134+
t.Fatal("expected SortFlags=false for update command")
135+
}
136+
cmd.InitDefaultHelpFlag()
137+
138+
var got []string
139+
cmd.Flags().VisitAll(func(f *pflag.Flag) {
140+
got = append(got, f.Name)
141+
})
142+
143+
wantPrefix := []string{
144+
"wp",
145+
"php81",
146+
"php82",
147+
"php83",
148+
"php84",
149+
"php85",
150+
"enable-owasp",
151+
"enable-recaptcha",
152+
"disable-owasp",
153+
"disable-recaptcha",
154+
"hsts",
155+
}
156+
if len(got) < len(wantPrefix) {
157+
t.Fatalf("expected at least %d flags, got %d: %#v", len(wantPrefix), len(got), got)
158+
}
159+
for i := range wantPrefix {
160+
if got[i] != wantPrefix[i] {
161+
t.Fatalf("unexpected update flag order at index %d: got %q want %q (full=%#v)", i, got[i], wantPrefix[i], got)
162+
}
163+
}
164+
}

internal/service/site.go

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ const (
4848
defaultVHRecaptchaReqLimit = 500
4949
defaultOWASPModSecRulesFile = "/usr/local/lsws/conf/owasp/modsec_includes.conf"
5050
defaultModSecurityModuleFile = "/usr/local/lsws/modules/mod_security.so"
51+
defaultLiteSpeedRepoScript = "https://repo.litespeed.sh"
52+
defaultRepoScriptTempPath = "/tmp/ols-cli-litespeed-repo.sh"
5153
wpArchiveURL = "https://wordpress.org/latest.tar.gz"
5254
wpArchiveSHA1URL = "https://wordpress.org/latest.tar.gz.sha1"
5355
wpCLIPharURL = "https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar"
@@ -967,10 +969,36 @@ func upsertINIValue(content, key, value string) (string, bool) {
967969
}
968970

969971
func (s SiteService) configureLiteSpeedRepo(ctx context.Context, info platform.Info) error {
970-
s.console.Bullet("Using hardened mode: repository bootstrap scripts are disabled")
971-
if err := verifyLiteSpeedPackageAvailability(ctx, s.runner, info); err != nil {
972+
if err := verifyLiteSpeedPackageAvailability(ctx, s.runner, info); err == nil {
973+
s.console.Bullet("LiteSpeed package repository is already configured")
974+
return nil
975+
}
976+
s.console.Bullet("Configuring LiteSpeed package repository")
977+
if err := s.bootstrapLiteSpeedRepo(ctx); err != nil {
972978
return err
973979
}
980+
if err := verifyLiteSpeedPackageAvailability(ctx, s.runner, info); err != nil {
981+
return apperr.Wrap(
982+
apperr.CodeCommand,
983+
"LiteSpeed repository bootstrap completed but openlitespeed is still unavailable",
984+
err,
985+
)
986+
}
987+
s.console.Bullet("LiteSpeed package repository configured")
988+
return nil
989+
}
990+
991+
func (s SiteService) bootstrapLiteSpeedRepo(ctx context.Context) error {
992+
if err := downloadToFile(defaultLiteSpeedRepoScript, defaultRepoScriptTempPath, 0o700); err != nil {
993+
return apperr.Wrap(apperr.CodeCommand, "failed to download LiteSpeed repository bootstrap script", err)
994+
}
995+
defer func() {
996+
_ = os.Remove(defaultRepoScriptTempPath)
997+
}()
998+
999+
if _, err := s.runner.Run(ctx, "bash", defaultRepoScriptTempPath); err != nil {
1000+
return apperr.Wrap(apperr.CodeCommand, "failed to execute LiteSpeed repository bootstrap script", err)
1001+
}
9741002
return nil
9751003
}
9761004

@@ -980,23 +1008,23 @@ func verifyLiteSpeedPackageAvailability(ctx context.Context, run runner.Runner,
9801008
if _, err := run.Run(ctx, "apt-cache", "show", "openlitespeed"); err != nil {
9811009
return apperr.Wrap(
9821010
apperr.CodeCommand,
983-
"openlitespeed package is not available via apt repositories; configure the LiteSpeed repository manually",
1011+
"openlitespeed package is not available via apt repositories",
9841012
err,
9851013
)
9861014
}
9871015
case platform.PackageManagerYUM:
9881016
if _, err := run.Run(ctx, "yum", "-q", "info", "openlitespeed"); err != nil {
9891017
return apperr.Wrap(
9901018
apperr.CodeCommand,
991-
"openlitespeed package is not available via yum repositories; configure the LiteSpeed repository manually",
1019+
"openlitespeed package is not available via yum repositories",
9921020
err,
9931021
)
9941022
}
9951023
case platform.PackageManagerDNF:
9961024
if _, err := run.Run(ctx, "dnf", "-q", "info", "openlitespeed"); err != nil {
9971025
return apperr.Wrap(
9981026
apperr.CodeCommand,
999-
"openlitespeed package is not available via dnf repositories; configure the LiteSpeed repository manually",
1027+
"openlitespeed package is not available via dnf repositories",
10001028
err,
10011029
)
10021030
}

0 commit comments

Comments
 (0)