Ik ben bezig met me website, hierin maak ik verbinding met DirectAdmin (Beheer een eige server). De connectie etc is goed, maar als mijn script de opdracht geeft om een gebruiker aan te maken op DirectAdmin geeft die aan dat de gebruikers succesvol is gewijzigd. Maar hij voegt de gebruiker niet toe op DirectAdmin. Kunnen jullie me helpen?
$Asql="UPDATE users SET activated = ".(int)$value." WHERE id = ".(int)$id;
$Aquery=mysql_query($Asql) or ($Aerror[]='Failed to update userid: <b>'.$id.'<b>; due too: <b>'.mysql_error().'</b>');
if($value==1){
$Bsql="SELECT users.*, packages.name as pName FROM users LEFT OUTER JOIN packages ON (users.package = packages.id) WHERE users.id = ".(int)$id." LIMIT 1";
$Bquery=mysql_query($Bsql) or ($Aerror[]='Failed to select data for userid: <b>'.$id.'<b>; due too: <b>'.mysql_error().'</b>');
$das['host'] maakt die verbinding mee in de configuratie bestand met DirectAdmin.
base_64 encoded vraagt die om. Ik heb daar niet zoveel verstand van. Maar dat is waarschijnlijk een verplichting voor Directadmin
Ik zou je script wat meer "verbose" maken, oftewel, dump informatie tussentijds naar je scherm, zodat je stap voor stap ziet wat er gebeurt, dat maakt het localiseren van de plaats waar er dingen fout gaan waarschijnlijk wat makkelijker.
$Bsql="SELECT users.*, packages.name as pName FROM users LEFT OUTER JOIN packages ON (users.package = packages.id) WHERE users.id = ".(int)$id." LIMIT 1";
dump('query: '.$Bsql);
$Bquery=mysql_query($Bsql) or ($Aerror[]='Failed to select data for userid: <b>'.$id.'<b>; due too: <b>'.mysql_error().'</b>');
Okee, dat is me nu allemaal gelukt, er hebben 2 variabelen een NULL gegeven. Maar nu blijf ik met de volgende melding zitten:
Notice: Undefined index: error in /home/admin/domains/svghosting.nl/public_html/acp/modules/profile/activate.php on line 40 Notice: Undefined index: text in /home/admin/domains/svghosting.nl/public_html/acp/modules/profile/activate.php on line 41 Notice: Undefined index: error in /home/admin/domains/svghosting.nl/public_html/acp/modules/profile/activate.php on line 40 Notice: Undefined index: text in /home/admin/domains/svghosting.nl/public_html/acp/modules/profile/activate.php on line 41
$Asql="UPDATE users SET activated = ".(int)$value." WHERE id = ".(int)$id;
$Aquery=mysql_query($Asql) or ($Aerror[]='Failed to update userid: <b>'.$id.'<b>; due too: <b>'.mysql_error().'</b>');
if($value==1){
$Bsql="SELECT users.*, packages.name as pName FROM users LEFT OUTER JOIN packages ON (users.package = packages.id) WHERE users.id = ".(int)$id." LIMIT 1";
$Bquery=mysql_query($Bsql) or ($Aerror[]='Failed to select data for userid: <b>'.$id.'<b>; due too: <b>'.mysql_error().'</b>');
Thomas - 12/10/2014 14:36 (laatste wijziging 12/10/2014 14:40)
Moderator
Als ik de API mag geloven, krijg je ook text terug als het toevoegen succesvol is? Het feit dat dat niet gebeurt, in combinatie met het ontbreken van je nieuwe gebruiker wil waarschijnlijk zeggen dat je DirectAdmin commando-aanroep op een of andere manier niet klopt.
Zou het zo simpel kunnen zijn dat die slash in /CMD_API_ACCOUNT_USER eruit moet?
Produceert die wrapper class zelf geen errors? Kun je die niet in een debug-modus zetten ofzo?
Zonder code/documentatie daarvan wordt dit nogal lastig lijkt mij...
EDIT: okay, hoe maak je een "connectie" met je DirectAdmin, doe je dit via poort 2222?
EDIT: laat ik de vraag anders stellen, welke klasse gebruik je voor het aanmaken van het $da object, en hoe luiden de parameters bij creatie?
Ik krijg inderdaad tekst terug als de gebruiker is toegevoegd. Alles heeft eerder al gewoon gewerkt, of kreeg de melding dat het goed gegaan was maar de gebruiker zelf was niet aan DirectAdmin toegvoegd.
Het verwijderen van de "/" heeft niks uitgehaald helaas. Tevens heb ik DA al een keer in debug mode gedraaid, wat ik wel opmerk is dat ik nergens terug vindt dat hij de class /CMD_API_ACCOUNT_USER ophaalt of pakt of hoe je het ook wilt noemen. Ik heb het al een aantal keer anagepast naar een andere waarde zoals CMD_ACCOUNT_* maar ook dat mocht niet baten.
Okee, die vraag snap ik niet echt helemaal
Ik gebruik alleen de httpsocket als class, verder gebruik ik geen classes.
Ik kwam wel dit tegen op de DA site:
Maar hoe ik dat moet integreren met het feit dat ik al een conf.php heb waarin de server host wordt opgehaald en ik html ook nog is gebruik in de aanmaak zelf en mysql querys gebruik
<?
include 'httpsocket.php';
$server_ip="11.22.33.44"; //IP that User is assigned to
$server_login="admin";
$server_pass="yourpass";
$server_host="127.0.0.1"; //where the API connects to
$server_ssl="N";
$server_port=2222;
if (isset($_POST['action']) && $_POST['action'] == "add")
{
$username=$_POST['username'];
$domain=$_POST['domain'];
$email=$_POST['email'];
$pass=$_POST['pass'];
$package=$_POST['package'];
echo "Creating user $username on $server_ip.... <br>\n";
$sock = new HTTPSocket;
if ($server_ssl == 'Y')
{
$sock->connect("ssl://".$server_host, $server_port);
}
else
{
$sock->connect($server_host, $server_port);
}
$sock->set_login($server_login,$server_pass);
$sock->query('/CMD_API_ACCOUNT_USER',
array(
'action' => 'create',
'add' => 'Submit',
'username' => $username,
'email' => $email,
'passwd' => $pass,
'passwd2' => $pass,
'domain' => $domain,
'package' => $package,
'ip' => $server_ip,
'notify' => 'yes'
));
$result = $sock->fetch_parsed_body();
if ($result['error'] != "0")
{
echo "<b>Error Creating user $username on server $server_ip:<br>\n";
echo $result['text']."<br>\n";
echo $result['details']."<br></b>\n";
}
else
{
echo "User $username created on server $server_ip<br>\n";
}
exit(0);
}
echo "Will connect to: ".($server_ssl == "Y" ? "https" : "http")."://".$server_host.":".$server_port."<br>\n";
?>
<form action='?' method="POST">
<input type=hidden name=action value="add">
Username: <input type=text name=username><br>
Domain:<input type=text name=domain><br>
Email: <input type=text name=email><br>
Pass: <input type=password name=pass><br>
Packge: <input type=text name=package><br>
</form>
**Note: do not use this php file exactly as it is. It's only to demonstrate the basics of the api.
You *must* do form checking to ensure safe values are passed.
Also, it's a really bad and very insecure practice to put a form like this publicly on your website for anyone to use.
If you do, you'll end up with a server full users you did not create (this script creates accounts without any involvment with an admin: bad)
<?
include'httpsocket.php';
$server_ip="11.22.33.44";//IP that User is assigned to
$server_login="admin";
$server_pass="yourpass";
$server_host="127.0.0.1";//where the API connects to
echo"Will connect to: ".($server_ssl=="Y" ? "https":"http")."://".$server_host.":".$server_port."<br>\n";
?>
<form action='?' method="POST">
<input type=hidden name=action value="add">
Username: <input type=text name=username><br>
Domain:<input type=text name=domain><br>
Email: <input type=text name=email><br>
Pass: <input type=password name=pass><br>
Packge: <input type=text name=package><br>
</form>
**Note: do not use this php file exactly as it is. It's only to demonstrate the basics of the api.
You *must* do form checking to ensure safe values are passed.
Also, it's a really bad and very insecure practice to put a form like this publicly on your website for anyone to use.
If you do, you'll end up with a server full users you did not create (this script creates accounts without any involvment with an admin: bad)
Thomas - 12/10/2014 14:51 (laatste wijziging 12/10/2014 14:55)
Moderator
Op regel 27 van je oorspronkelijke bericht doe je het volgende:
$da->query(<commando>, <parameters>)
en op regel 37:
$results = $da->fetch_parsed_body();
Mijn vraag: waar wordt $da gedeclareerd?
Ergens in je code staat waarschijnlijk zoiets:
$da = new <klasse>(<parameters>);
Mijn vraag: hoe luidt de klassenaam (oftewel, welke class of library gebruik je om te communiceren met DirectAdmin)?
Mijn vraag: hoe luiden de parameters (eventuele namen en wachtwoorden dien je uiteraard te anonimiseren)? Dit om uit te sluiten dat er een mogelijke configuratie-fout in zit. DirectAdmin luistert standaard op poort 2222 volgens mij. Als je daar je verzoeken niet naartoe stuurt, dan is het niet zo vreemd dat er niets gebeurt...
EDIT: Maakt jouw DirectAdmin gebruik van SSL?
EDIT: Ik weet niet of 127.0.0.1 als host zo'n strak plan is.
Dit is mijn hele code van die pagina:
Zoals ik uit jou bericht begrijp moet er dus ergens verbinding gemaakt worden met DirectAdmin met de inlog gegevens. Dit gebeurd aan de hand van de gebruiker die inlogt op de website. Mijn gebruikersnaam en wachtwoord op me website verbinden zich met DirectAdmin en loggen daardoor ook in op DirectAdmin, want hij haalt wel de gegevens op van DirectAdmin ik kan gewoon me verbruik enz zien.
EDIT: 172.0.0.1 is ook niet mijn ipadres hoor.
EDIT: Hij maakt inderdaad gebruik van SSL
$Asql="UPDATE users SET activated = ".(int)$value." WHERE id = ".(int)$id;
$Aquery=mysql_query($Asql) or ($Aerror[]='Failed to update userid: <b>'.$id.'<b>; due too: <b>'.mysql_error().'</b>');
if($value==1){
$Bsql="SELECT users.*, packages.name as pName FROM users LEFT OUTER JOIN packages ON (users.package = packages.id) WHERE users.id = ".(int)$id." LIMIT 1";
$Bquery=mysql_query($Bsql) or ($Aerror[]='Failed to select data for userid: <b>'.$id.'<b>; due too: <b>'.mysql_error().'</b>');
Dat is het admin account op DirectAdmin, dus lijkt me wel dat die dan ook standaard een nieuwe gebruiker mag aanmaken.
Thomas - 12/10/2014 15:11 (laatste wijziging 12/10/2014 15:20)
Moderator
Mja, en daar doe je dus een aanname. Daar moet je wel mee oppassen als je een probleem aan het oplossen bent waarvan je de oorzaak nog niet weet.
Volgens de documentatie zijn er 3 typen gebruikers: users, resellers en admins. Het zijn de resellers die user-accounts aanmaken. Een admin is tevens een user en een reseller, maar wie zegt dat je dan niet (tijdelijk) van "modus" moet schakelen om als admin een user aan te maken?
EDIT: Wat heb je als HOST ingesteld als je een verbinding maakt met je site? (Mogelijk probleem: als op die machine meerdere (virtual) hosts zitten kun je met "localhost" geen site aanspreken lijkt mij)
EDIT: Tevens, maakt je DirectAdmin gebruik van HTTPS? (Mogelijk probleem: je communiceert via HTTP, terwijl je DA is opgezet via HTTPS)
Dit is mijn config file:
Dus als ik het goed begrijp uit jou woorden, moet mijn account op wederverkoper niveau staan wil ik ene gebruiker kunnen laten aanmaken?
EDIT: Mijn directadmin maakt indd gebruik van HTTPS
<?php
error_reporting(E_ALL);
if(!defined('ALPHA') || ALPHA !== 1) {
die('Deze pagina is niet rechtstreeks aan roepbaar!');
}
if(!defined('BRAVO')) {
define('BRAVO', true);
}
include $_SERVER['DOCUMENT_ROOT'].'/conf/functions/datediff.php';
include $_SERVER['DOCUMENT_ROOT'].'/conf/functions/log.php';
include $_SERVER['DOCUMENT_ROOT'].'/conf/functions/ubb.php';
include $_SERVER['DOCUMENT_ROOT'].'/conf/classes/sidn_contract_gen.php';
include $_SERVER['DOCUMENT_ROOT'].'/conf/classes/package_contract_gen.php';
include $_SERVER['DOCUMENT_ROOT'].'/conf/classes/factuur_gen.php';
include $_SERVER['DOCUMENT_ROOT'].'/conf/classes/login.php';
include $_SERVER['DOCUMENT_ROOT'].'/conf/classes/httpsocket.php';
$db['host'] = 'localhost';
$db['user'] = 'root';
$db['pass'] = 'NIETZOSLIMHE';
$db['db'] = 'LALALA';
$cron['logfile'] = 'crons/logs/log.%s.'.date('d-m-Y_H-i-s').'.txt';
$das['host'] = 'ssl://svghosting.nl';
mysql_connect($db['host'], $db['user'], $db['pass']);
mysql_select_db($db['db']);
$login = new Login();
$da = new HTTPSocket();
$server_ssl="Y";
?>
Hij geeft nu weer aan dat er geen gegevens van directadmin beschikbaar zijn en hij blijft de Array foutmeldingen aangeven. (Heb dit dus in me conf bestand aangepast)
EDIT: Dus nu logt die me niet in automatisch
Thomas - 12/10/2014 15:46 (laatste wijziging 12/10/2014 15:52)
Moderator
Mja, wat je in principe doet met die HTTPSocket klasse is het simuleren van een browser (en haar requests). Maar die "virtuele browser" $da is dus niet aangemeld als admin, en mag dus ook niets doen waarvoor je admin-privileges nodig hebt.
Je moet je dus eerst op een of andere manier authenticeren voordat je admin-operaties kunt uitvoeren. Dat doe je waarschijnlijk met de set_login methode van die klasse.
Dat levert geen esultaat op. Hij haalt nog steeds geen gegevens op.
Maar het is ook de bedoeling dat hij inlogt op directadmin met de account gegevens waarmee je inlogt op de website.
Thomas - 12/10/2014 15:52 (laatste wijziging 12/10/2014 15:53)
Moderator
Lees bovenstaande aangepaste reactie. Je kunt verbindingsparameters zelf altijd nog aanpassen. Je wilt idd niet dat users inloggen als admin...
Nee, ons huidige probleem is dat de gebruiker dus niet wordt aangepast. Maar zolang hij dus ook niet inlogt op DirectAdmin met het account waarmee ik inlog op de website zal hij denk ik dus ook niet de rechten ophalen.
Ik heb trouwens me config weer terug gezet je reactie leverde geen resultaat of verbinding op. Hij heeft nu weer gewoon verbinding, dus het is de hoe we het nu kunnen aanpakken. want hij blijft met die array foutmeldingen komen... Maar zoals je al eerder zij
moet ik is een account op wederverkopersniveau maken en dan kijken wat die doet?
<?php
$da = new HTTPSocket();
$da->connect('https://svghosting.nl', 2222);
$da->set_login('<user>', '<pass>');
?>
<?php
$da=new HTTPSocket();
$da->connect('https://svghosting.nl',2222);
$da->set_login('<user>','<pass>');
?>
Die parameters uit configuratie halen in plaats van hardcoden is een triviale aanpassing voor later. Je wilt eerst iets werkends, het nadenken over een intelligentere/flexibelere oplossing kan altijd nog...
Zie mijn aangepaste reactie hierboven
Okee, met een wederverkopersniveau account werkt het dus ook niet.
Ik krijg per gebruiker dus die
Array
(
)
foutmelding.
Dus des te meer gebruikers in die lijst voorkomen, des te meer van die meldingen. Dus er gaat één ding fout bij het aanmaken van de gebruiker..
Alleen wat het precies is durf ik nog steeds niet te zeggen, ik heb de datbase en alles nagekeken en dat is gewoon goed.
Thomas - 12/10/2014 17:40 (laatste wijziging 12/10/2014 17:44)
Moderator
Het opbouwen van de connectie gaat dus nou goed, alleen kun je dus nog geen gebruiker aanmaken via /CMD_API_ACCOUNT_USER correct?
Weet je heel zeker dat je de goede <user> en <pass> invult?
Weet je heel zeker dat de gegevens die je DA voert in het correcte formaat zijn? Zie de spec voor het aanmaken van een user. Zo gebruik je bijvoorbeeld een hostname ($das['host']) voor de kolom 'ip', die een IP-adres verwacht.
Ik zou zeggen, probeer weer informatie te dumpen, wellicht vertelt die je meer.
EDIT: omdat het waarschijnlijk vrij nauw komt met wat DA accepteert als geldige invoer, loont het wellicht de moeite om de invoer eerst te valideren, voordat je deze aan DA aanbiedt.
Dat is inderdaad correct, heb me config gewoon weer terug aangepast naar wat ik had. Hij laat nu gewoon de informatie zien van mijn account op de website, dus hij logt met de juiste gegevens in op DirectAdmin.
Ik kan die ($das['host'] weghalen.. even kijken wat er dan gebeurd. Volgens directadmin zou die dan automatisch een IP moeten toewijzen.