123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599 |
- <?php
- /** DOCKERENVIRONMENT / DOCKERENVIRONMENT **/
- //Récuperation d'une liste de DockerEnvironment
- Action::register('docker_environment_search',function(&$response){
- global $_;
- User::check_access('docker','read');
- Plugin::need('client/Client');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
-
- // OPTIONS DE RECHERCHE, A ACTIVER POUR UNE RECHERCHE AVANCEE
- $query = 'SELECT {{table}}.*,'.Client::joinString('c').' FROM '.DockerEnvironment::tableName().' LEFT JOIN '.Client::tableName().' c ON {{table}}.client = c.id WHERE 1';
- $data = array();
- //Recherche simple
- if(!empty($_['filters']['keyword'])){
- $query .= ' AND label LIKE ?';
- $data[] = '%'.$_['filters']['keyword'].'%';
- }
- //Recherche avancée
- if(isset($_['filters']['advanced'])) filter_secure_query($_['filters']['advanced'],array('machine','client','domain','port','git','memory','cpu','ssl','state'),$query,$data);
- //Tri des colonnes
- if(isset($_['sort'])) sort_secure_query($_['sort'],array('machine','client','domain','port','mysqlRootPassword','mysqlPassword','git','memory','cpu','ssl','state','certificate'),$query,$data);
- //Pagination
- $response['pagination'] = DockerEnvironment::paginate(20,(!empty($_['page'])?$_['page']:0),$query,$data);
- $DockerEnvironments = DockerEnvironment::staticQuery($query,$data,true,1);
-
- foreach($DockerEnvironments as $dockerEnvironment){
- $row = $dockerEnvironment->toArray();
- $row['state'] = DockerEnvironment::states($row['state']);
- $row['client'] = $dockerEnvironment->join('client')->toArray();
- $response['rows'][] = $row;
- }
-
- /* Mode export */
- if($_['export'] == 'true'){
- $stream = Excel::exportArray($response['rows'],null,'Export');
- File::downloadStream($stream,'export-demandes-'.date('d-m-Y').'.xlsx');
- exit();
- }
-
- });
- //Affichage d'un tab
- Action::register('docker_environment_tab',function(&$response){
- User::check_access('docker','read');
- global $myUser,$_;
- global $conf;
- User::check_access('docker','read');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
- $environment = DockerEnvironment::provide();
- $machine = new DockerMachine();
- if($environment->id == 0){
- $environment->memory = '256';
- $environment->cpu = '0.5';
- $environment->port = DockerEnvironment::lastPort()+2;
- }else{
- $machine = DockerMachine::getById($environment->machine);
- }
- $_['tab'] = str_replace('.', '', $_['tab']);
- $tab = __DIR__.SLASH.'tab.environment.'.$_['tab'].'.php';
- if(!file_exists($tab)) throw new Exception("$tab n'existe pas");
- require_once($tab);
- exit();
- });
-
- //Ajout ou modification d'élément DockerEnvironment
- Action::register('docker_environment_save',function(&$response){
-
- global $myUser,$_;
- User::check_access('docker','edit');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- $item = DockerEnvironment::provide();
- //if(empty($_['domain'])) throw new Exception("Domaine obligatoire");
- if(empty($_['machine'])) throw new Exception("Machine obligatoire");
- //if(empty($_['memory'])) throw new Exception("Mémoire obligatoire");
- //if(!is_numeric($_['memory'])) throw new Exception("La mémoire doit être numérique");
-
- $item->client = $_['client'];
- if($item->id==0) $item->state = DockerEnvironment::ACTIVE;
- $item->machine = $_['machine'];
- if(!empty($_['memory'])) $item->memory = $_['memory'];
- if(!empty($_['ssl'])){
- $item->ssl = $_['ssl'];
- $item->certificate = $_['certificate'];
- }
- $item->comment = $_['comment'];
-
- //déduction automatique du port interne, on laisse un interval de deux (port web + port phpmyadmin)
- if($item->id==0){
- $item->port = DockerEnvironment::lastPort()+2;
- //génération des mots de passes mysql
- $item->mysqlPassword = sha1('mysql'.mt_rand(0,10000).'hash');
- $item->mysqlRootPassword = sha1('root'.time().$item->mysqlPassword.'hash');
- if(strlen($item->mysqlPassword)>10) $item->mysqlPassword = substr($item->mysqlPassword, 0,9);
- if(strlen($item->mysqlRootPassword)>10) $item->mysqlRootPassword = substr($item->mysqlRootPassword, 0,9);
- }else{
- if(!empty($_['port'])) $item->port = $_['port'];
- if(!empty($_['mysqlRootPassword'])) $item->mysqlRootPassword = $_['mysqlRootPassword'];
- if(!empty($_['mysqlPassword'])) $item->mysqlPassword = $_['mysqlPassword'];
- }
- $item->mysqlRootPassword = encrypt($item->mysqlRootPassword);
- $item->mysqlPassword = encrypt($item->mysqlPassword);
- if(!empty($_['domain'])){
- $item->domain = $_['domain'];
- //suppression du http ou https si existant
- $item->domain = trim(mb_strtolower(preg_replace('/http[s]?:\/\//iU', '', $item->domain)));
- ///suppression du www. si existant
- $item->domain = preg_replace('/www\./iU', '', $item->domain);
- }
- $item->save();
- $response = $item->toArray();
- });
-
-
- //Suppression d'élement DockerEnvironment
- Action::register('docker_environment_delete',function(&$response){
- global $_;
- User::check_access('docker','delete');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- if(empty($_['id']) || !is_numeric($_['id'])) throw new Exception("Identifiant incorrect");
- DockerEnvironment::deleteById($_['id']);
- });
- //Recherche des certificats installés sur l'utm
- Action::register('docker_environment_certificate_search',function(&$response){
- global $myUser,$_,$conf;
- User::check_access('docker','read');
- require_once(__DIR__.SLASH.'SophosUtm.class.php');
- $utm = new SophosUtm();
- $utm->host = $conf->get('docker_sophos_host');
- $utm->port = $conf->get('docker_sophos_port');
- $utm->login = $conf->get('docker_sophos_login');
- $utm->password = $conf->get('docker_sophos_password');
- foreach ($utm->getCertificates() as $line) {
- $response['rows'][] = array(
- 'ref' => $line['_ref'],
- 'label' => $line['name']
- );
- };
- });
-
-
- //Ajout ou modification d'élément DockerEnvironment
- Action::register('docker_environment_docker_create',function(&$response){
- global $myUser,$_,$conf;
- User::check_access('docker','edit');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
- require_once(__DIR__.SLASH.'SshClient.class.php');
- if(empty($_['id'])) throw new Exception("Environnement obligatoire");
- $environment = DockerEnvironment::provide();
- if(!$environment) throw new Exception("Environnement introuvable");
-
- if(empty($environment->domain)) throw new Exception("Veuillez spécifier un nom de domaine dans l'onglet domaine et enregistrer avant de génerer un environnement");
-
- $ssh = new SshClient();
- $logs = array();
-
- $machine = DockerMachine::getById($environment->machine);
- $logs[]= $ssh->connect(
- $machine->ip,
- $machine->port,
- File::dir().'docker'.SLASH.'machine'.SLASH.$machine->id.SLASH.'id_rsa.pub',
- File::dir().'docker'.SLASH.'machine'.SLASH.$machine->id.SLASH.'id_rsa',
- !empty($machine->password)? decrypt($machine->password) : ''
- );
- $logs[]= $environment->createContainer($ssh);
- $logs[]= $environment->execute($ssh);
-
- $ssh->disconnect();
- $response['logs'] = implode('<br>',$logs);
- });
-
- //Suppression de l'environnement docker
- Action::register('docker_environment_docker_remove',function(&$response){
- global $myUser,$_,$conf;
- User::check_access('docker','edit');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
- require_once(__DIR__.SLASH.'SshClient.class.php');
- if(empty($_['id'])) throw new Exception("Environnement obligatoire");
- $environment = DockerEnvironment::provide();
- if(!$environment) throw new Exception("Environnement introuvable");
-
- $ssh = new SshClient();
- $logs = array();
-
- $machine = DockerMachine::getById($environment->machine);
- $logs[]= $ssh->connect(
- $machine->ip,
- $machine->port,
- File::dir().'docker'.SLASH.'machine'.SLASH.$machine->id.SLASH.'id_rsa.pub',
- File::dir().'docker'.SLASH.'machine'.SLASH.$machine->id.SLASH.'id_rsa',
- !empty($machine->password)? decrypt($machine->password) : ''
- );
- $logs[]= $environment->removeContainer($ssh);
-
-
- $ssh->disconnect();
- $response['logs'] = implode('<br>',$logs);
- });
- //Ajout ou modification d'élément DockerEnvironment
- Action::register('docker_environment_pma_create',function(&$response){
- global $myUser,$_,$conf;
- User::check_access('docker','edit');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
- require_once(__DIR__.SLASH.'SshClient.class.php');
- if(empty($_['id'])) throw new Exception("Environnement obligatoire");
- $environment = DockerEnvironment::provide();
- if(!$environment) throw new Exception("Environnement introuvable");
-
- $ssh = new SshClient();
- $logs = array();
-
- $machine = DockerMachine::getById($environment->machine);
- $logs[]= $ssh->connect(
- $machine->ip,
- $machine->port,
- File::dir().'docker'.SLASH.'machine'.SLASH.$machine->id.SLASH.'id_rsa.pub',
- File::dir().'docker'.SLASH.'machine'.SLASH.$machine->id.SLASH.'id_rsa',
- !empty($machine->password)? decrypt($machine->password) : ''
- );
- $logs[]= $environment->createPma($ssh);
-
- $ssh->disconnect();
- $response['logs'] = implode('<br>',$logs);
- });
-
- //Ajout ou modification d'élément DockerEnvironment
- Action::register('docker_environment_pma_remove',function(&$response){
- global $myUser,$_,$conf;
- User::check_access('docker','edit');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
- require_once(__DIR__.SLASH.'SshClient.class.php');
- if(empty($_['id'])) throw new Exception("Environnement obligatoire");
- $environment = DockerEnvironment::provide();
- if(!$environment) throw new Exception("Environnement introuvable");
-
- $ssh = new SshClient();
- $logs = array();
-
- $machine = DockerMachine::getById($environment->machine);
- $logs[]= $ssh->connect(
- $machine->ip,
- $machine->port,
- File::dir().'docker'.SLASH.'machine'.SLASH.$machine->id.SLASH.'id_rsa.pub',
- File::dir().'docker'.SLASH.'machine'.SLASH.$machine->id.SLASH.'id_rsa',
- !empty($machine->password)? decrypt($machine->password) : ''
- );
- $logs[]= $environment->removePma($ssh);
-
-
- $ssh->disconnect();
- $response['logs'] = implode('<br>',$logs);
- });
- //Ajout ou modification d'élément DockerEnvironment
- Action::register('docker_environment_utm_create',function(&$response){
- global $myUser,$_,$conf;
- User::check_access('docker','edit');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
- require_once(__DIR__.SLASH.'SophosUtm.class.php');
- Plugin::need('client/Client');
- if(empty($_['id'])) throw new Exception("Environnement obligatoire");
- $environment = DockerEnvironment::provide('id',1);
- if(!$environment) throw new Exception("Environnement introuvable");
-
- $machine = $environment->join('machine');
- $utm = new SophosUtm();
- $utm->host = $conf->get('docker_sophos_host');
- $utm->port = $conf->get('docker_sophos_port');
- $utm->login = $conf->get('docker_sophos_login');
- $utm->password = $conf->get('docker_sophos_password');
-
- $hostReference = $machine->sophosReference; // ex : REF_RevFroDockeWordpMulti
-
- if(empty($hostReference)) throw new Exception("Référence du vhost ciblé non renseignée, merci de templir dans réglages ce parametre", 1);
-
- $domains = array($environment->domain,'www.'.$environment->domain);
-
- $response = $utm->createVHost($environment->domain.' ('.($environment->ssl?'443':'80').') ',$domains,$environment->ssl?443:80,$hostReference, $environment->certificate);
-
- $logs = array('<pre>'.json_encode($response,JSON_PRETTY_PRINT).'</pre>' );
-
- $history = new History();
- $history->scope = 'docker';
- $history->uid = $environment->id;
- $history->comment = 'Création du host utm : '.$environment->domain;
- $history->type = 'utm-save';
- $history->save();
-
- $response['logs'] = implode('<br>',$logs);
- });
- Action::register('docker_ovh_consumerKey_generate',function(&$response){
-
- global $myUser,$_,$conf;
- User::check_access('docker','edit');
- require_once(__DIR__.SLASH.'Ovh.class.php');
- $ovh = new Ovh();
- $ovh->host = $conf->get('docker_ovh_host');
- $ovh->applicationKey = $conf->get('docker_ovh_application_key');
- $ovh->applicationSecret = $conf->get('docker_ovh_application_secret');
- $consumerKey= $ovh->consumerKey();
- //pour genrer cette clé, executer la méthode $ovh->consumerKey() puis aller manuellement sur l'url retournée et valider en mode illimité
- $conf->put('docker_ovh_consumer_key',$consumerKey['consumerKey']);
- header('location: '.$consumerKey['validationUrl']);
- });
- Action::register('docker_environment_domain_create',function(&$response){
- global $myUser,$_,$conf;
- User::check_access('docker','edit');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
- require_once(__DIR__.SLASH.'Ovh.class.php');
- Plugin::need('client/Client');
- if(empty($_['id'])) throw new Exception("Environnement obligatoire");
- $environment = DockerEnvironment::provide('id',1);
- if(!$environment) throw new Exception("Environnement introuvable");
- $machine = $environment->join('machine');
-
- $ovh = new Ovh();
- $ovh->host = $conf->get('docker_ovh_host');
- //generée grace à https://eu.api.ovh.com/createApp/
- $ovh->applicationKey = $conf->get('docker_ovh_application_key');
- $ovh->applicationSecret = $conf->get('docker_ovh_application_secret');
- //pour genrer cette clé, executer la méthode $ovh->consumerKey() puis aller manuellement sur l'url retournée et valider en mode illimité
- $ovh->consumerKey= $conf->get('docker_ovh_consumer_key');
- $subdomain = '';
- $domain = $environment->domain;
- $infos = explode('.',$domain);
- if(count($infos)>2){
- $subdomain = array_shift($infos);
- $domain = implode('.',$infos);
- }
-
- $existingDomains = $ovh->getDomain($domain);
- if(isset($existingDomains['message'])) throw new Exception("Erreur de creation : ".$existingDomains['message']);
-
-
- //ex pour test.kiss.biz CNAME vers docker-wordpress.kiss.fr => 'kiss.byz','test','docker-wordpress.kiss.fr'
- $response = $ovh->setDomain($domain,$subdomain,$machine->domain);
- //$response = $ovh->domain();
- $logs = array('<pre>'.json_encode($response,JSON_PRETTY_PRINT).'</pre>' );
-
- $history = new History();
- $history->scope = 'docker';
- $history->uid = $environment->id;
- $history->comment = 'Création du host ovh : '.$environment->domain;
- $history->type = 'ovh-save';
- $history->save();
- $response['logs'] = implode('<br>',$logs);
- });
-
- Action::register('docker_environment_git_create',function(&$response){
-
- global $myUser,$_,$conf;
- User::check_access('docker','edit');
- require_once(__DIR__.SLASH.'DockerEnvironment.class.php');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
- require_once(__DIR__.SLASH.'GitLab.class.php');
- Plugin::need('client/Client');
- if(empty($_['id'])) throw new Exception("Environnement obligatoire");
- $environment = DockerEnvironment::provide();
- if(!$environment) throw new Exception("Environnement introuvable");
-
-
- if(empty($environment->client)) throw new Exception("Vous devez spécifier un client pour créer un dépot");
-
- $client = Client::getById($environment->client);
- if(!$client) throw new Exception("Client introuvable");
-
- $git = new Gitlab();
- $git->host = $conf->get('docker_git_host');
- $git->token = $conf->get('docker_git_token');
- $groupName = mb_strtolower($client->getSlug());
- $groups = $git->groups();
- $clientGroup = null;
-
- foreach ($groups as $group) {
- if($group['path'] == $groupName){
- $clientGroup = $group;
- break;
- }
- }
-
- if(!isset($clientGroup)){
- $clientGroup = $git->groupe_save($client->label,$groupName);
- }
-
- $projects = $git->projects();
- foreach ($projects as $project) {
- if($project['name'] == $environment->domain && $project['namespace']['id'] == $clientGroup['id']) throw new Exception("Ce dépot existe déja");
- }
- $project = $git->project_save($clientGroup['id'],$environment->domain,$environment->domain);
-
-
- $environment->git = $project['ssh_url_to_repo'];
- $environment->save();
-
- $logs = array('<pre>'.json_encode($response,JSON_PRETTY_PRINT).'</pre>' );
- $history = new History();
- $history->scope = 'docker';
- $history->uid = $environment->id;
- $history->comment = 'Création du dépot git : '.$environment->domain;
- $history->type = 'git-save';
- $history->save();
- $response['logs'] = implode('<br>',$logs);
-
- });
- /** machine / MACHINE **/
- //Récuperation d'une liste de machine
- Action::register('docker_machine_search',function(&$response){
- global $_;
- User::check_access('docker','read');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
-
- // OPTIONS DE RECHERCHE, A ACTIVER POUR UNE RECHERCHE AVANCEE
- $query = 'SELECT * FROM '.DockerMachine::tableName().' WHERE 1';
- $data = array();
- //Recherche simple
- if(!empty($_['filters']['keyword'])){
- $query .= ' AND label LIKE ?';
- $data[] = '%'.$_['filters']['keyword'].'%';
- }
- //Recherche avancée
- if(isset($_['filters']['advanced'])) filter_secure_query($_['filters']['advanced'],array('label','ip','port','private_key','public_key','domain','sophosReference','description'),$query,$data);
- //Tri des colonnes
- if(isset($_['sort'])) sort_secure_query($_['sort'],array('label','ip','port','private_key','public_key','domain','sophosReference','description'),$query,$data);
- //Pagination
- $response['pagination'] = DockerMachine::paginate(20,(!empty($_['page'])?$_['page']:0),$query,$data);
- $machines = DockerMachine::staticQuery($query,$data,true,0);
-
- foreach($machines as $machine){
- $row = $machine->toArray();
-
-
- $publicKey = File::dir().'docker'.SLASH.'machine'.SLASH.$row['id'].SLASH.'id_rsa.pub';
- $row['public_key'] = file_exists($publicKey)? file_get_contents($publicKey):'';
-
-
-
- $row['description'] = html_entity_decode($row['description']);
- $response['rows'][] = $row;
- }
-
- /* Mode export */
- if($_['export'] == 'true'){
- $stream = Excel::exportArray($response['rows'],null,'Export');
- File::downloadStream($stream,'export-demandes-'.date('d-m-Y').'.xlsx');
- exit();
- }
-
- });
-
-
- //Ajout ou modification d'élément machine
- Action::register('docker_machine_save',function(&$response){
- global $_;
- User::check_access('docker','edit');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
- $item = DockerMachine::provide();
- $item->label = $_['label'];
- $item->ip = $_['ip'];
- $item->port = $_['port'];
- $item->domain = $_['domain'];
- $item->sophosReference = $_['sophosReference'];
- $item->description = $_['description'];
- $item->save();
- //Ajout upload Clé privée
- if(!empty($_['private_key']))
- File::save_component('private_key', 'docker/machine/'.$item->id.'/id_rsa');
- //Ajout upload Clé publique
- if(!empty($_['public_key']))
- File::save_component('public_key', 'docker/machine/'.$item->id.'/id_rsa.pub');
- $response = $item->toArray();
- });
-
-
- //Suppression d'élement machine
- Action::register('docker_machine_delete',function(&$response){
- global $_;
- User::check_access('docker','delete');
- require_once(__DIR__.SLASH.'DockerMachine.class.php');
- if(empty($_['id']) || !is_numeric($_['id'])) throw new Exception("Identifiant incorrect");
- DockerMachine::deleteById($_['id']);
- });
-
-
- //machine : Gestion upload Clé privée
- Action::register('docker_machine_private_key',function(&$response){
- File::handle_component(array(
- 'namespace' => 'docker', //stockés dans file/docker/*.*
- 'access' => 'docker', // crud sur docker,
- 'size' => '1000000000', // taille max
- 'extension' => 'ppk,id_rsa', // extension
- 'storage' => 'docker/machine/{{data.id}}/id_rsa' //chemin complet vers le fichier stocké
- ),$response);
- });
- //machine : Gestion upload Clé publique
- Action::register('docker_machine_public_key',function(&$response){
- File::handle_component(array(
- 'namespace' => 'docker', //stockés dans file/docker/*.*
- 'access' => 'docker', // crud sur docker,
- 'size' => '1000000000', // taille max
- 'extension' => 'pub,id_rsa', // extension
- 'storage' => 'docker/machine/{{data.id}}/id_rsa.pub' //chemin complet vers le fichier stocké
- ),$response);
- });
-
- //Sauvegarde des configurations de Docker
- Action::register('docker_setting_save',function(&$response){
- global $_,$conf;
- User::check_access('docker','configure');
- //Si input file "multiple", possibilité de normaliser le
- //tableau $_FILES récupéré avec la fonction => normalize_php_files();
- foreach(Configuration::setting('docker') as $key=>$value){
- if(!is_array($value)) continue;
- $allowed[] = $key;
- }
- foreach ($_['fields'] as $key => $value) {
- if(in_array($key, $allowed))
- $conf->put($key,$value);
- }
- });
-
- ?>
|