#!/usr/bin/perl use strict; use FindBin qw($Bin); use Getopt::Long; require "$Bin/misc/devlib.pl"; sub usage { die "Usage: dev-server [--wipe] [--mongo|--memory] [--tls] -- [other_blobserver_opts]"; } chdir $Bin or die; my $opt_wipe; my $opt_tls; my $opt_nobuild; my $opt_all; # listen on all interfaces my $opt_staticres; # use static resources, not those on disk # keep indexes in memory only. often used with --wipe, but not # necessarily. if --wipe isn't used, all blobs are re-indexed # on start-up. my $opt_memory; my $opt_mongo; my $opt_postgres; my $opt_mysql; GetOptions("wipe" => \$opt_wipe, "tls" => \$opt_tls, "all" => \$opt_all, "nobuild" => \$opt_nobuild, "memory" => \$opt_memory, "mongo" => \$opt_mongo, "postgres" => \$opt_postgres, "mysql" => \$opt_mysql, "staticres" => \$opt_staticres, ) or usage(); $opt_memory = 1 unless $opt_memory || $opt_mongo || $opt_postgres || $opt_mysql; my $port = shift; $port = "3179" unless defined($port); usage() unless $port =~ /^\d+$/; unless ($ENV{GOPATH}) { $ENV{GOPATH} = "$Bin/gopath" } my $camlistored; my $camdbinit; if ($opt_nobuild) { $camlistored = find_bin("./server/camlistored"); $camdbinit = find_bin("./cmd/camdbinit"); } else { $camlistored = build_bin("./server/camlistored"); $camdbinit = build_bin("./cmd/camdbinit"); } my $root = "/tmp/camliroot-$ENV{USER}/port$port/"; if ($opt_wipe && -d $root) { print "Wiping $root\n"; system("rm", "-rf", $root) and die "Failed to wipe $root.\n"; } my $suffixdir = sub { my $suffix = shift; my $root = "$root/$suffix"; unless (-d $root) { system("mkdir", "-p", $root) and die "Failed to create $root.\n"; } return $root; }; my $DBNAME = "devcamli$ENV{USER}"; my @opts; if ($opt_wipe) { push @opts, "-wipe"; } else { push @opts, "-ignoreexists"; } $ENV{"CAMLI_MYSQL_ENABLED"} = "false"; $ENV{"CAMLI_MONGO_ENABLED"} = "false"; $ENV{"CAMLI_POSTGRES_ENABLED"} = "false"; if ($opt_memory) { $ENV{"CAMLI_INDEXER_PATH"} = "/index-mem/"; } elsif ($opt_mongo) { $ENV{"CAMLI_MONGO_ENABLED"} = "true"; $ENV{"CAMLI_INDEXER_PATH"} = "/index-mongo/"; if ($opt_wipe) { $ENV{"CAMLI_MONGO_WIPE"} = "true"; } else { $ENV{"CAMLI_MONGO_WIPE"} = "false"; } } elsif ($opt_postgres) { $ENV{"CAMLI_POSTGRES_ENABLED"} = "true"; $ENV{"CAMLI_INDEXER_PATH"} = "/index-postgres/"; system("$camdbinit", "-postgres", "-user=postgres", "-password=postgres", "-host=localhost", "-database=$DBNAME", @opts) and die "Failed to run camdbinit.\n"; } else { $ENV{"CAMLI_MYSQL_ENABLED"} = "true"; $ENV{"CAMLI_INDEXER_PATH"} = "/index-mysql/"; system("$camdbinit", "-user=root", "-password=root", "-host=localhost", "-database=$DBNAME", @opts) and die "Failed to run camdbinit.\n"; } my $base = "http://localhost:$port"; my $listen = "127.0.0.1:$port"; if ($opt_all) { $listen = "0.0.0.0:$port"; my $host = `hostname`; chomp $host; $base = "http://$host:$port"; } if ($opt_tls) { $base =~ s/^http/https/; } print "Starting dev server on $base/ui/ with password \"pass$port\"\n"; $ENV{CAMLI_TLS} = "false"; if ($opt_tls) { $ENV{CAMLI_TLS} = "true"; } $ENV{CAMLI_BASEURL} = $base; $ENV{CAMLI_AUTH} = "userpass:camlistore:pass$port:+localhost"; $ENV{CAMLI_ADVERTISED_PASSWORD} = "pass$port"; # public password $ENV{CAMLI_ROOT} = $suffixdir->("bs"); $ENV{CAMLI_ROOT_SHARD1} = $suffixdir->("s1"); $ENV{CAMLI_ROOT_SHARD2} = $suffixdir->("s2"); $ENV{CAMLI_ROOT_REPLICA1} = $suffixdir->("r1"); $ENV{CAMLI_ROOT_REPLICA2} = $suffixdir->("r2"); $ENV{CAMLI_ROOT_REPLICA3} = $suffixdir->("r3"); $ENV{CAMLI_ROOT_CACHE} = $suffixdir->("cache"); $ENV{CAMLI_PORT} = $port; $ENV{CAMLI_SECRET_RING} = "$Bin/pkg/jsonsign/testdata/test-secring.gpg"; $ENV{CAMLI_DBNAME} = $DBNAME; # To use resources from disk, instead of the copies linked into the # binary: unless ($opt_staticres) { $ENV{CAMLI_DEV_UI_FILES} = "$FindBin::Bin/server/camlistored/ui"; # set in server/camlistored/ui/fileembed.go } exec("$camlistored", "-configfile=$Bin/config/dev-server-config.json", "-listen=$listen", @ARGV); die "exec failure: $!\n";