2022-08-16 23:39:18 +00:00
const http = require ( "http" )
const { request } = require ( "https" )
2025-02-10 16:34:24 +00:00
// this comment is for the test issue
2022-08-16 23:39:18 +00:00
const app = ( req , res ) => {
const [ email , key ] = Buffer . from ( req . headers . authorization . replace ( /[Bb]asic / , "" ) , "base64" ) . toString ( ) . split ( ":" )
const CFHeaders = { "X-Auth-Key" : key , "X-Auth-Email" : email , "Content-Type" : "application/json" }
const url = new URL ( req . url , ` http:// ${ req . headers . host } ` )
//console.log(url.searchParams.d)
const CFReq = request ( ` https://api.cloudflare.com/client/v4/zones?name= ${ url . searchParams . get ( "d" ) . match ( /\w+\.\w+\.?$/ ) [ 0 ] } ` , { method : "GET" , headers : CFHeaders } , ( response ) => {
const data = [ ] ;
response . on ( "data" , ( d ) => {
data . push ( d )
} )
response . on ( "end" , ( ) => {
const { success , result } = JSON . parse ( data . map ( ( Buf ) => Buffer . from ( Buf ) . toString ( ) ) . join ( "" ) )
data . splice ( 0 , data . length ) ;
if ( success ) {
const ZCReq = request ( ` https://api.cloudflare.com/client/v4/zones/ ${ result [ 0 ] . id } /dns_records?proxied=false&name= ${ url . searchParams . get ( "d" ) } &match=all ` , { method : "GET" , headers : CFHeaders } , ( response ) => {
response . on ( "data" , ( d ) => {
data . push ( d )
} )
response . on ( "end" , ( ) => {
const ZCReqRes = JSON . parse ( data . map ( ( Buf ) => Buffer . from ( Buf ) . toString ( ) ) . join ( "" ) )
if ( ZCReqRes . success ) {
if ( ZCReqRes . result . length == 0 || ! ZCReqRes . result . find ( ( { type } ) => type == "A" || type == "CNAME" ) ) {
const createCFEntryReq = request ( ` https://api.cloudflare.com/client/v4/zones/ ${ result [ 0 ] . id } /dns_records ` , { method : "POST" , headers : CFHeaders } , ( response ) => {
data . splice ( 0 , data . length ) ;
response . on ( "data" , ( d ) => {
data . push ( d )
} )
response . on ( "end" , ( ) => {
const createCFEntryReqRes = JSON . parse ( data . map ( ( Buf ) => Buffer . from ( Buf ) . toString ( ) ) . join ( "" ) )
if ( ! createCFEntryReqRes . success ) {
res . writeHead ( 500 , "An Error occurred while creating an A record" )
}
res . end ( )
} )
} )
createCFEntryReq . write ( JSON . stringify ( { type : "A" , name : url . searchParams . get ( "d" ) , content : url . searchParams . get ( "ip" ) , ttl : 60 } ) )
createCFEntryReq . end ( )
} else {
const updateCFEntryReq = request ( ` https://api.cloudflare.com/client/v4/zones/ ${ result [ 0 ] . id } /dns_records/ ${ ZCReqRes . result . find ( ( { type } ) => type == "A").id} ` , { method : "PATCH" , headers : CFHeaders } , ( response ) => {
data . splice ( 0 , data . length ) ;
response . on ( "data" , ( d ) => {
data . push ( d )
} )
response . on ( "end" , ( ) => {
const updateCFEntryReqRes = JSON . parse ( data . map ( ( Buf ) => Buffer . from ( Buf ) . toString ( ) ) . join ( "" ) )
if ( ! updateCFEntryReqRes . success ) {
res . writeHead ( 500 , "An Error occurred while patching an A record" )
}
res . end ( )
} )
} )
updateCFEntryReq . write ( JSON . stringify ( { content : url . searchParams . get ( "ip" ) , ttl : 60 , type : "A" } ) )
updateCFEntryReq . end ( )
}
} else {
res . writeHead ( 500 , "An Error occurred while querying CloudFlare Zone Records" )
res . end ( )
}
} )
} )
ZCReq . end ( )
} else {
console . log ( data . map ( ( Buf ) => Buffer . from ( Buf ) . toString ( ) ) . join ( "" ) )
res . writeHead ( 500 , "An Error occurred while querying the Zone List" )
res . end ( )
}
} )
} )
CFReq . end ( )
}
const server = http . createServer ( app )
server . listen ( 5555 )