Move cli commands to HTTP post WIP

pull/83/head
Thibault Duplessis 2012-12-19 05:45:44 +01:00
parent 8c4187d1a3
commit a5e21b5d18
18 changed files with 80 additions and 48 deletions

View File

@ -1,9 +1,10 @@
package lila.cli
package lila
package cli
import lila.forum.ForumEnv
import scalaz.effects._
case class Forum(env: ForumEnv) {
private[cli] case class Forum(env: ForumEnv) {
def denormalize: IO[Unit] = env.denormalize

View File

@ -1,9 +1,10 @@
package lila.cli
package lila
package cli
import lila.core.CoreEnv
import scalaz.effects._
case class Games(env: CoreEnv) {
private[cli] case class Games(env: CoreEnv) {
def perDay(days: Int): IO[Unit] = for {
nbs env.game.gameRepo.nbPerDay(days)

View File

@ -1,4 +1,5 @@
package lila.cli
package lila
package cli
import lila.parseIntOption
import lila.i18n.I18nEnv
@ -6,7 +7,7 @@ import play.api.i18n.Lang
import java.io._
import scalaz.effects._
case class I18n(i18n: I18nEnv) {
private[cli] case class I18n(i18n: I18nEnv) {
def jsDump: IO[Unit] = for {
_ putStrLn("Dumping JavaScript translations")

View File

@ -1,9 +1,10 @@
package lila.cli
package lila
package cli
import lila.core.CoreEnv
import scalaz.effects._
case class Infos(env: CoreEnv) {
private[cli] case class Infos(env: CoreEnv) {
def averageElo: IO[Unit] = for {
avg env.user.userRepo.averageElo

View File

@ -1,15 +1,14 @@
package lila.cli
package lila
package cli
import scalaz.effects._
import play.api.{ Mode, Application, Play }
import java.io.File
import lila.parseIntOption
import lila.core.{ Global, CoreEnv }
object Main {
def main(args: Array[String]): Unit = withApp { env
def main(env: CoreEnv)(args: Array[String]): IO[Unit] = {
def users = Users(env.user.userRepo, env.security.store)
def games = Games(env)
@ -47,20 +46,4 @@ object Main {
case _ putStrLn("Unknown command: " + args.mkString(" "))
}
}
private def withApp(op: CoreEnv IO[_]): Int = {
val app = new Application(
path = new File("."),
classloader = this.getClass.getClassLoader,
sources = None,
mode = Mode.Dev)
try {
Play start app
op(Global.env).unsafePerformIO
0
}
finally {
Play.stop()
}
}
}

View File

@ -1,10 +1,11 @@
package lila.cli
package lila
package cli
import lila.search.SearchEnv
import lila.search.Query
import scalaz.effects._
case class Search(env: SearchEnv) {
private[cli] case class Search(env: SearchEnv) {
def reset: IO[Unit] = env.indexer.rebuildAll

View File

@ -5,7 +5,7 @@ import user.{ User, UserRepo }
import team.{ Team, TeamRepo, TeamApi }
import scalaz.effects._
case class Teams(
private[cli] case class Teams(
teamRepo: TeamRepo,
userRepo: UserRepo,
api: TeamApi) {

View File

@ -1,10 +1,11 @@
package lila.cli
package lila
package cli
import lila.user.{ User, UserRepo }
import lila.security.Store
import scalaz.effects._
case class Users(userRepo: UserRepo, securityStore: Store) {
private[cli] case class Users(userRepo: UserRepo, securityStore: Store) {
def enable(username: String): IO[Unit] =
perform(username, userRepo.enable)

View File

@ -1,9 +1,10 @@
package lila.cli
package lila
package cli
import lila.wiki.WikiEnv
import scalaz.effects._
case class Wiki(env: WikiEnv) {
private[cli] case class Wiki(env: WikiEnv) {
def fetch: IO[Unit] = for {
_ putStrLn("Fetching wiki from github")

View File

@ -0,0 +1,39 @@
package controllers
import lila._
import views._
import play.api.mvc._
import play.api.mvc.Results._
import play.api.data._
import play.api.data.Forms._
import scalaz.effects._
object Cli extends LilaController {
private def userRepo = env.user.userRepo
private def runCommand = lila.cli.Main.main(env) _
private lazy val form = Form(tuple(
"command" -> nonEmptyText,
"password" -> nonEmptyText
))
def command = OpenBody { implicit ctx
implicit val req = ctx.body
IOResult {
form.bindFromRequest.fold(
err io(Ok("bad request")), {
case (command, password) CliAuth(password) {
runCommand(command.split(" ")) map { res Ok(res) }
}
})
}
}
private def CliAuth(password: String)(op: IO[Result]): IO[Result] =
userRepo.checkPassword(env.settings.CliUsername, password) flatMap {
_.fold(op, io(Ok("permission denied")))
}
}

View File

@ -9,8 +9,12 @@ import play.api.libs.json._
import play.api.libs.iteratee._
import play.api.libs.concurrent.Akka
import scalaz.effects.io
object Main extends LilaController {
private lazy val runCommand = lila.cli.Main.main(env) _
def websocket = WebSocket.async[JsValue] { implicit req
implicit val ctx = reqToCtx(req)
env.site.socket.join(

View File

@ -136,6 +136,8 @@ final class Settings(config: Config, val IsDev: Boolean) {
val CoreCollectionCache = getString("core.collection.cache")
val CoreCronEnabled = getBoolean("core.cron.enabled")
val CliUsername = getString("cli.username")
val NetDomain = getString("net.domain")
val NetBaseUrl = getString("net.base_url")

View File

@ -133,10 +133,7 @@ class UserRepo(collection: MongoCollection)
salt data.getAs[String]("salt")
enabled data.getAs[Boolean]("enabled")
sha512 = data.getAs[Boolean]("sha512") | false
} yield enabled && hashed == sha512.fold(
hash512(password, salt),
hash(password, salt)
)
} yield enabled && hashed == sha512.fold(hash512(password, salt), hash(password, salt))
} map (_ | false)
def create(username: String, password: String): IO[Option[User]] = for {

View File

@ -1,7 +1,6 @@
#!/bin/sh
if [ -z "$*" ]; then
bin/play -Dcore.cron.enabled=false
else
bin/play -Dcore.cron.enabled=false ";project cli;run $*"
fi
COMMAND=$*
PASSWORD=$LILA_CLI_PASSWORD
curl -d "password=$PASSWORD&command=$COMMAND" http://en.l.org/cli

3
bin/cli-prod 100755
View File

@ -0,0 +1,3 @@
#!/bin/sh
curl -d "c=$*" http://en.lichess.org

View File

@ -174,5 +174,7 @@ GET /monitor/players controllers.Monitor.nbPlayers
GET /monitor/mps controllers.Monitor.nbMoves
GET /monitor/status controllers.Monitor.status
POST /cli controllers.Cli.command
# Assets
GET /assets/*file controllers.Assets.at(path="/public", file)

View File

@ -75,8 +75,4 @@ object ApplicationBuild extends Build with Resolvers with Dependencies {
resolvers := Seq(iliaz),
libraryDependencies := Seq(scalaz, scalalib, hasher, jodaTime, jodaConvert)
)
lazy val cli = Project("cli", file("cli"), settings = buildSettings).settings(
libraryDependencies ++= Seq(scalastic)
) dependsOn lila
}